briar 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +29 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +36 -0
  5. data/README.md +25 -0
  6. data/Rakefile +12 -0
  7. data/briar.gemspec +26 -0
  8. data/dotirbc_briar_additions +31 -0
  9. data/features/step_definitions/alerts_and_sheets/action_sheet_steps.rb +8 -0
  10. data/features/step_definitions/alerts_and_sheets/alert_view_steps.rb +25 -0
  11. data/features/step_definitions/bars/navbar_steps.rb +95 -0
  12. data/features/step_definitions/bars/tabbar_steps.rb +32 -0
  13. data/features/step_definitions/bars/toolbar_steps.rb +17 -0
  14. data/features/step_definitions/briar_core_steps.rb +9 -0
  15. data/features/step_definitions/control/button_steps.rb +57 -0
  16. data/features/step_definitions/control/segmented_control_steps.rb +85 -0
  17. data/features/step_definitions/control/slider_steps.rb +9 -0
  18. data/features/step_definitions/email_steps.rb +59 -0
  19. data/features/step_definitions/image_view_steps.rb +9 -0
  20. data/features/step_definitions/keyboard_steps.rb +21 -0
  21. data/features/step_definitions/label_steps.rb +21 -0
  22. data/features/step_definitions/picker/date_picker_steps.rb +216 -0
  23. data/features/step_definitions/picker/picker_steps.rb +58 -0
  24. data/features/step_definitions/scroll_view_steps.rb +20 -0
  25. data/features/step_definitions/table_steps.rb +186 -0
  26. data/features/step_definitions/text_field_steps.rb +37 -0
  27. data/features/step_definitions/text_view_steps.rb +44 -0
  28. data/features/support/env.rb +0 -0
  29. data/features/support/hooks.rb +0 -0
  30. data/features/support/launch.rb +0 -0
  31. data/lib/briar.rb +72 -0
  32. data/lib/briar/alerts_and_sheets/alert_view.rb +16 -0
  33. data/lib/briar/bars/navbar.rb +104 -0
  34. data/lib/briar/bars/tabbar.rb +38 -0
  35. data/lib/briar/bars/toolbar.rb +36 -0
  36. data/lib/briar/briar_core.rb +56 -0
  37. data/lib/briar/briar_steps.rb +26 -0
  38. data/lib/briar/control/button.rb +47 -0
  39. data/lib/briar/control/segmented_control.rb +22 -0
  40. data/lib/briar/control/slider.rb +34 -0
  41. data/lib/briar/cucumber.rb +49 -0
  42. data/lib/briar/email.rb +58 -0
  43. data/lib/briar/gestalt.rb +80 -0
  44. data/lib/briar/image_view.rb +27 -0
  45. data/lib/briar/keyboard.rb +104 -0
  46. data/lib/briar/label.rb +34 -0
  47. data/lib/briar/picker/date_picker.rb +598 -0
  48. data/lib/briar/picker/picker.rb +32 -0
  49. data/lib/briar/picker/picker_shared.rb +34 -0
  50. data/lib/briar/scroll_view.rb +10 -0
  51. data/lib/briar/table.rb +237 -0
  52. data/lib/briar/text_field.rb +57 -0
  53. data/lib/briar/text_view.rb +21 -0
  54. data/lib/briar/version.rb +3 -0
  55. data/spec/briar/gestalt_spec.rb +62 -0
  56. data/spec/spec_helper.rb +17 -0
  57. metadata +164 -0
@@ -0,0 +1,38 @@
1
+ require 'calabash-cucumber'
2
+
3
+ module Briar
4
+ module Bars
5
+ def tabbar_visible?
6
+ element_exists("tabBar")
7
+ end
8
+
9
+ def should_see_tabbar
10
+ unless tabbar_visible?
11
+ screenshot_and_raise "i do not see the tabbar"
12
+ end
13
+ end
14
+
15
+ def index_of_tabbar_item(name)
16
+ if tabbar_visible?
17
+ tabs = query('tabBarButton', :accessibilityLabel)
18
+ tabs.index(name)
19
+ end
20
+ end
21
+
22
+ def touch_tabbar_item(name)
23
+ idx = index_of_tabbar_item name
24
+ if idx
25
+ touch "tabBarButton index:#{idx}"
26
+ step_pause
27
+ else
28
+ screenshot_and_raise "tabbar button with name #{name} does not exist"
29
+ end
30
+ end
31
+
32
+ def tabbar_item_is_at_index(name, index)
33
+ tabs = query('tabBarButton', :accessibilityLabel)
34
+ tabs.index(name) == index.to_i
35
+ end
36
+ end
37
+ end
38
+
@@ -0,0 +1,36 @@
1
+ require 'calabash-cucumber'
2
+
3
+ module Briar
4
+ module Bars
5
+ def toolbar_exists? (id)
6
+ !query("toolbar marked:'#{id}'").empty?
7
+ end
8
+
9
+ def should_see_toolbar (id)
10
+ screenshot_and_raise "expected to see toolbar with id '#{id}'" unless toolbar_exists? id
11
+ end
12
+
13
+ def should_not_see_toolbar (id)
14
+ screenshot_and_raise "did not expect to see toolbar with id '#{id}'" if toolbar_exists? id
15
+ end
16
+
17
+ def toolbar_button_exists? (name_or_id)
18
+ query("toolbar descendant view marked:#{name_or_id}")
19
+ ## look for text button
20
+ #text_button_arr = query("toolbar child toolbarTextButton child button child buttonLabel", :text)
21
+ #has_text_button = text_button_arr.index(name_or_id) != nil
22
+ ## look for non_text button
23
+ #toolbar_button_arr = query("toolbar child toolbarButton", :accessibilityLabel)
24
+ #has_toolbar_button = toolbar_button_arr.index(name_or_id) != nil
25
+ #
26
+ #has_text_button or has_toolbar_button
27
+ end
28
+
29
+ def should_see_toolbar_button (name_or_id)
30
+ res = toolbar_button_exists? name_or_id
31
+ unless res
32
+ screenshot_and_raise "could not see toolbar button with name '#{name_or_id}'"
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,56 @@
1
+ require 'calabash-cucumber'
2
+
3
+ module Briar
4
+ module Core
5
+ STEP_PAUSE = (ENV['STEP_PAUSE'] || 0.4).to_f
6
+ ANIMATION_PAUSE = (ENV['ANIMATION_PAUSE'] || 0.6).to_f
7
+
8
+ def step_pause
9
+ sleep(STEP_PAUSE)
10
+ end
11
+
12
+ def wait_for_animation
13
+ sleep(ANIMATION_PAUSE)
14
+ end
15
+
16
+
17
+ def view_exists? (view_id)
18
+ !query("view marked:'#{view_id}'").empty?
19
+ end
20
+
21
+ def should_see_view (view_id)
22
+ unless view_exists? view_id
23
+ screenshot_and_raise "no view found with id #{view_id}"
24
+ end
25
+ end
26
+
27
+ def view_exists_with_text? (text)
28
+ element_exists("view text:'#{text}'")
29
+ end
30
+
31
+
32
+ def should_see_view_after_animation (view_id)
33
+ wait_for_animation
34
+ should_see_view view_id
35
+ end
36
+
37
+ def should_not_see_view_after_animation (view_id)
38
+ wait_for_animation
39
+ if view_exists? view_id
40
+ screenshot_and_raise "did not expect to see view '#{view_id}'"
41
+ end
42
+ end
43
+
44
+ def should_see_view_with_text (text)
45
+ res = view_exists_with_text? text
46
+ unless res
47
+ screenshot_and_raise "No view found with text #{text}"
48
+ end
49
+ end
50
+
51
+ def touch_view_named(view_id)
52
+ touch("view marked:'#{view_id}'")
53
+ end
54
+
55
+ end
56
+ end
@@ -0,0 +1,26 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions', "briar_core_steps")
2
+
3
+ require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"alerts_and_sheets", "action_sheet_steps")
4
+ require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"alerts_and_sheets", "alert_view_steps")
5
+
6
+ require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"bars", "tabbar_steps")
7
+ require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"bars", "navbar_steps")
8
+ require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"bars", "toolbar_steps")
9
+
10
+ require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"control", "button_steps")
11
+ require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"control", "segmented_control_steps")
12
+ require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"control", "slider_steps")
13
+
14
+
15
+ require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"picker", "picker_steps")
16
+ require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"picker", "date_picker_steps")
17
+
18
+
19
+ require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"email_steps")
20
+ require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"image_view_steps")
21
+ require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"keyboard_steps")
22
+ require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"label_steps")
23
+ require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"scroll_view_steps")
24
+
25
+ require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"table_steps")
26
+ require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',"text_field_steps")
@@ -0,0 +1,47 @@
1
+ require 'calabash-cucumber'
2
+
3
+ module Briar
4
+ module Control
5
+ module Button
6
+ include Briar::Core
7
+ def button_exists? (name)
8
+ res = query("button marked:'#{name}'", :alpha)
9
+ if res.empty?
10
+ false
11
+ else
12
+ res.first.to_i != 0
13
+ end
14
+ end
15
+
16
+ def should_see_button (name)
17
+ unless button_exists? name
18
+ screenshot_and_raise "i did not see a button with marked #{name}"
19
+ end
20
+ end
21
+
22
+ def should_not_see_button (button_id)
23
+ screenshot_and_raise "i should not see button marked '#{button_id}'" if button_exists?(button_id)
24
+ end
25
+
26
+ def button_is_enabled (name)
27
+ enabled = query("button marked:'#{name}' isEnabled:1", :accessibilityIdentifier).first
28
+ enabled.eql? name
29
+ end
30
+
31
+ def should_see_button_with_title(name, title)
32
+ should_see_button name
33
+ if query("button marked:'#{title}' child label", :text).empty?
34
+ screenshot_and_raise "i do not see a button marked #{name} with title #{title}"
35
+ end
36
+ end
37
+
38
+ def touch_button (name)
39
+ should_see_button name
40
+ touch("button marked:'#{name}'")
41
+ step_pause
42
+ end
43
+
44
+ end
45
+ end
46
+ end
47
+
@@ -0,0 +1,22 @@
1
+ require "calabash-cucumber"
2
+
3
+ module Briar
4
+ module Control
5
+ module Segmented_Control
6
+ def index_of_control_with_name (control_name)
7
+ controls = query("segmentedControl", :accessibilityIdentifier)
8
+ controls.index(control_name)
9
+ end
10
+
11
+ def index_of_segment_with_name_in_control_with_name(segment_name, control_name)
12
+ control_idx = index_of_control_with_name (control_name)
13
+ if control_idx
14
+ titles = query("segmentedControl index:#{control_idx} child segment child segmentLabel", :text).reverse
15
+ titles.index(segment_name)
16
+ else
17
+ nil
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,34 @@
1
+ require 'calabash-cucumber'
2
+
3
+ module Briar
4
+ module Control
5
+ module Slider
6
+ def change_slider_value_to(slider_id, value)
7
+ target = value.to_f
8
+ if target < 0
9
+ pending "value '#{value}' must be >= 0"
10
+ end
11
+ min_val = query("slider marked:'#{slider_id}'", :minimumValue).first
12
+ # will not work for min_val != 0
13
+ if min_val != 0
14
+ pending "sliders with non-zero minimum values are not supported - slider '#{slider_id}' has minimum value of '#{min_val}'"
15
+ end
16
+ max_val = query("slider marked:'#{slider_id}'", :maximumValue).first
17
+ if target > max_val
18
+ screenshot_and_raise "cannot change slider '#{slider_id}' to '#{value}' because the maximum allowed value is '#{max_val}'"
19
+ end
20
+ # the x offset is from the middle of the slider.
21
+ # ex. slider from 0 to 5
22
+ # to touch 3, x must be 0
23
+ # to touch 0, x must be -2.5
24
+ # to touch 5, x must be 2.5
25
+ half_val = (max_val/2)
26
+ width = query("slider marked:'#{slider_id}'", :frame).first["Width"]
27
+ x = ((width/2) * ((target - half_val)/half_val)).ceil
28
+ touch("slider marked:'#{slider_id}'", {:offset => {:x => x, :y => 0}})
29
+ #current = query("slider marked:'#{slider_id}'", :value).first
30
+ #puts "current => at '#{current}' with x => '#{x}'"
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,49 @@
1
+ require 'briar/gestalt'
2
+ require 'briar/briar_core'
3
+
4
+ require 'briar/alerts_and_sheets/alert_view'
5
+
6
+ require 'briar/bars/tabbar'
7
+ require 'briar/bars/navbar'
8
+ require 'briar/bars/toolbar'
9
+
10
+ require 'briar/control/button'
11
+ require 'briar/control/segmented_control'
12
+ require 'briar/control/slider'
13
+
14
+ require 'briar/picker/picker_shared'
15
+ require 'briar/picker/picker'
16
+ require 'briar/picker/date_picker'
17
+
18
+ require 'briar/email'
19
+ require 'briar/image_view'
20
+ require 'briar/keyboard'
21
+ require 'briar/label'
22
+ require 'briar/scroll_view'
23
+
24
+ require 'briar/table'
25
+ require 'briar/text_field'
26
+ require 'briar/text_view'
27
+
28
+ World(Briar)
29
+ World(Briar::Core)
30
+ World(Briar::Alerts_and_Sheets)
31
+ World(Briar::Bars)
32
+ World(Briar::Control::Button)
33
+ World(Briar::Control::Segmented_Control)
34
+ World(Briar::Control::Slider)
35
+ World(Briar::Picker::Date)
36
+ World(Briar::Picker_Shared)
37
+ World(Briar::Picker)
38
+ World(Briar::Email)
39
+ World(Briar::ImageView)
40
+ World(Briar::Keyboard)
41
+ World(Briar::Label)
42
+ World(Briar::ScrollView)
43
+ World(Briar::Table)
44
+ World(Briar::TextField)
45
+ World(Briar::TextView)
46
+
47
+ AfterConfiguration do
48
+ require 'briar/briar_steps'
49
+ end
@@ -0,0 +1,58 @@
1
+ require 'calabash-cucumber'
2
+
3
+ module Briar
4
+ module Email
5
+ def email_body_first_line_is? (text)
6
+ if gestalt.is_ios6?
7
+ puts "WARN: cannot test for email body text on iOS 6 - see https://groups.google.com/d/topic/calabash-ios/Ff3XFsjp-B0/discussion"
8
+ else
9
+ actual_tokens = query("view:'MFComposeTextContentView'", :text).first.split("\n")
10
+ actual_tokens.include?(text)
11
+ end
12
+ end
13
+
14
+ def email_subject_is? (text)
15
+ if gestalt.is_ios6?
16
+ puts "WARN: cannot test for email subject text on iOS 6 - see https://groups.google.com/d/topic/calabash-ios/Ff3XFsjp-B0/discussion"
17
+ else
18
+ actual = query("view marked:'subjectField'", :text)
19
+ actual.length == 1 && actual.first.eql?(text)
20
+ end
21
+ end
22
+
23
+ def email_subject_has_text_like? (text)
24
+ if gestalt.is_ios6?
25
+ puts "WARN: cannot test for email subject text on iOS 6 - see https://groups.google.com/d/topic/calabash-ios/Ff3XFsjp-B0/discussion"
26
+ else
27
+ !query("view marked:'subjectField' {text LIKE '*#{text}*'}").empty?
28
+ end
29
+ end
30
+
31
+ def email_to_field_is? (text)
32
+ if gestalt.is_ios6?
33
+ puts "WARN: iOS6 detected - cannot test for email 'to' field on iOS simulator or devices"
34
+ else
35
+ actual = query("view marked:'toField'", :text)
36
+ actual.length == 1 && actual.first.eql?(text)
37
+ end
38
+ end
39
+
40
+ def is_ios5_mail_view ()
41
+ query("view:'MFMailComposeRecipientView'").count == 3
42
+ #access_ids = query("view", :accessibilityIdentifier)
43
+ #access_ids.member?("toField") || access_ids.member?("subjectField")
44
+ end
45
+
46
+ def is_ios6_mail_view()
47
+ access_ids = query("view", :accessibilityIdentifier)
48
+ access_ids.member?("RemoteViewBridge")
49
+ end
50
+
51
+ def should_see_mail_view
52
+ wait_for_animation
53
+ unless is_ios5_mail_view || is_ios6_mail_view
54
+ screenshot_and_raise "expected to see email view"
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,80 @@
1
+ require 'json'
2
+
3
+ module Briar
4
+ GESTALT_IPHONE = "iPhone"
5
+ GESTALT_IPAD = "iPad"
6
+ GESTALT_IPHONE5 = "Retina 4-inch"
7
+ GESTALT_SIM_SYS = "x86_64"
8
+
9
+ class Gestalt
10
+
11
+ attr_accessor :device_family
12
+ attr_accessor :simulator_details, :ios_version
13
+ attr_accessor :system
14
+
15
+ def initialize (json)
16
+ ht = JSON.parse json
17
+ simulator_device = ht["simulator_device"]
18
+ @system = ht["system"]
19
+ @device_family = @system.eql?(GESTALT_SIM_SYS) ? simulator_device : @system.split(/[\d,.]/).first
20
+ @simulator_details = ht["simulator"]
21
+ @ios_version = ht["iOS_version"]
22
+ end
23
+
24
+ def is_simulator?
25
+ self.system.eql?(GESTALT_SIM_SYS)
26
+ end
27
+
28
+ def is_device?
29
+ not self.is_simulator?
30
+ end
31
+
32
+ def is_iphone?
33
+ self.device_family.eql? GESTALT_IPHONE
34
+ end
35
+
36
+ def is_ipad?
37
+ self.device_family.eql? GESTALT_IPAD
38
+ end
39
+
40
+ def is_iphone_5?
41
+ return self.simulator_details.split(/[(),]/)[3].eql? GESTALT_IPHONE5 if self.is_simulator?
42
+ return self.system.split(/[\D]/).delete_if { |x| x.eql?("") }.first.eql?("5") if self.is_device?
43
+ end
44
+
45
+ def version_hash (version_str)
46
+ tokens = version_str.split(/[,.]/)
47
+ {:major_version => tokens[0],
48
+ :minor_version => tokens[1],
49
+ :bug_version => tokens[2]}
50
+ end
51
+
52
+ def ios_major_version
53
+ self.version_hash(self.ios_version)[:major_version]
54
+ end
55
+
56
+ def is_ios6?
57
+ self.version_hash(self.ios_version)[:major_version].eql?("6")
58
+ end
59
+
60
+ def is_ios5?
61
+ self.version_hash(self.ios_version)[:major_version].eql?("5")
62
+ end
63
+
64
+ end
65
+ end
66
+
67
+ #{"outcome":"SUCCESS","app_name":"Rise Up CAL","iOS_version":"5.1.1","app_version":"1.0","system":"iPad1,1","app_id":"org.recoverywarrriors.RiseUp-cal","version":"0.9.125"}=> true
68
+
69
+ # "iPhone Simulator 358.4, iPhone OS 6.0 (iPhone (Retina 4-inch)\/10A403)".split(/[(),]/)
70
+ # => ["iPhone Simulator 358.4", " iPhone OS 6.0 ", "iPhone ", "Retina 4-inch", "/10A403"]
71
+
72
+ # system ("curl --insecure #{url}")
73
+ # {"outcome":"SUCCESS","app_name":"Rise Up CAL","simulator_device":"iPhone","iOS_version":"6.0",
74
+ #"app_version":"1.0","system":"x86_64","app_id":"org.recoverywarrriors.RiseUp-cal",
75
+ #"version":"0.9.126","simulator":"iPhone Simulator 358.4, iPhone OS 6.0 (iPhone (Retina 4-inch)\/10A403)"}=> true
76
+
77
+ #{"outcome":"SUCCESS","app_name":"Rise Up CAL","iOS_version":"6.0.1","app_version":"1.0",
78
+ #"system":"iPhone4,1","app_id":"org.recoverywarrriors.RiseUp-cal","version":"0.9.125"}
79
+
80
+