watirmark 5.14.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. data/app_generators/create_project/create_project_generator.rb +115 -0
  2. data/app_generators/create_project/templates/features/env.rb.erb +8 -0
  3. data/app_generators/create_project/templates/features/model_steps.rb.erb +9 -0
  4. data/app_generators/create_project/templates/features/post_error_steps.rb.erb +15 -0
  5. data/app_generators/create_project/templates/features/sample.feature.erb +5 -0
  6. data/app_generators/create_project/templates/features/site_steps.rb.erb +7 -0
  7. data/app_generators/create_project/templates/generators/controller.rb.erb +9 -0
  8. data/app_generators/create_project/templates/generators/generate.rb.erb +9 -0
  9. data/app_generators/create_project/templates/generators/model.rb.erb +7 -0
  10. data/app_generators/create_project/templates/generators/mvc_generator.rb.erb +100 -0
  11. data/app_generators/create_project/templates/generators/rbeautify.rb.erb +212 -0
  12. data/app_generators/create_project/templates/generators/view.rb.erb +16 -0
  13. data/app_generators/create_project/templates/generators/workflow_loader.rb.erb +1 -0
  14. data/app_generators/create_project/templates/library/base_controller.rb.erb +9 -0
  15. data/app_generators/create_project/templates/library/base_view.rb.erb +6 -0
  16. data/app_generators/create_project/templates/library/configuration.rb.erb +6 -0
  17. data/app_generators/create_project/templates/library/core_libraries.rb.erb +9 -0
  18. data/app_generators/create_project/templates/library/loader.rb.erb +23 -0
  19. data/app_generators/create_project/templates/library/page_load_checker.rb.erb +11 -0
  20. data/app_generators/create_project/templates/library/post_errors_checker.rb.erb +23 -0
  21. data/app_generators/create_project/templates/library/project_require_file.rb.erb +8 -0
  22. data/app_generators/create_project/templates/library/search_controller.rb.erb +12 -0
  23. data/app_generators/create_project/templates/library/workflows.rb.erb +0 -0
  24. data/app_generators/create_project/templates/project/config.yml.erb +3 -0
  25. data/app_generators/create_project/templates/project/gemfile.rb.erb +11 -0
  26. data/app_generators/create_project/templates/project/rakefile.rb.erb +21 -0
  27. data/bin/etapestry/Gemfile +11 -0
  28. data/bin/etapestry/config.yml +3 -0
  29. data/bin/etapestry/features/etapestry_home.feature +5 -0
  30. data/bin/etapestry/features/step_definitions/model_steps.rb +9 -0
  31. data/bin/etapestry/features/step_definitions/post_error_steps.rb +15 -0
  32. data/bin/etapestry/features/step_definitions/site_steps.rb +7 -0
  33. data/bin/etapestry/features/support/env.rb +8 -0
  34. data/bin/etapestry/generators/mvc/mvc_generator.rb +100 -0
  35. data/bin/etapestry/generators/mvc/rbeautify.rb +212 -0
  36. data/bin/etapestry/generators/mvc/templates/controller.rb.erb +9 -0
  37. data/bin/etapestry/generators/mvc/templates/model.rb.erb +7 -0
  38. data/bin/etapestry/generators/mvc/templates/view.rb.erb +16 -0
  39. data/bin/etapestry/generators/mvc/templates/workflow_loader.rb.erb +1 -0
  40. data/bin/etapestry/lib/etapestry.rb +8 -0
  41. data/bin/etapestry/lib/etapestry/checkers/page_load_checker.rb +11 -0
  42. data/bin/etapestry/lib/etapestry/checkers/post_errors_checker.rb +23 -0
  43. data/bin/etapestry/lib/etapestry/configuration.rb +6 -0
  44. data/bin/etapestry/lib/etapestry/core_libraries.rb +9 -0
  45. data/bin/etapestry/lib/etapestry/loader.rb +23 -0
  46. data/bin/etapestry/lib/etapestry/site/base_controller.rb +9 -0
  47. data/bin/etapestry/lib/etapestry/site/base_view.rb +6 -0
  48. data/bin/etapestry/lib/etapestry/site/search_controller.rb +12 -0
  49. data/bin/etapestry/lib/etapestry/workflows.rb +0 -0
  50. data/bin/etapestry/rakefile.rb +21 -0
  51. data/bin/etapestry/script/generate.rb +9 -0
  52. data/bin/twitter/features/hashtag_search.feature +93 -0
  53. data/bin/twitter/features/step_definitions/hashtag_steps.rb +9 -0
  54. data/bin/twitter/lib/twitter/workflows/search/result_controller.rb +13 -0
  55. data/bin/twitter/lib/twitter/workflows/search/result_model.rb +5 -0
  56. data/bin/twitter/lib/twitter/workflows/search/result_view.rb +19 -0
  57. data/bin/watirmark +10 -0
  58. data/lib/watirmark.rb +26 -0
  59. data/lib/watirmark/at_exit.rb +13 -0
  60. data/lib/watirmark/configuration.rb +201 -0
  61. data/lib/watirmark/controller/actions.rb +172 -0
  62. data/lib/watirmark/controller/assertions.rb +116 -0
  63. data/lib/watirmark/controller/controller.rb +191 -0
  64. data/lib/watirmark/controller/dialogs.rb +33 -0
  65. data/lib/watirmark/controller/matcher.rb +19 -0
  66. data/lib/watirmark/cucumber/cuke_helper.rb +150 -0
  67. data/lib/watirmark/cucumber/email_helper.rb +103 -0
  68. data/lib/watirmark/cucumber/env.rb +9 -0
  69. data/lib/watirmark/cucumber/hooks.rb +16 -0
  70. data/lib/watirmark/cucumber/model_helper.rb +34 -0
  71. data/lib/watirmark/cucumber/transforms.rb +55 -0
  72. data/lib/watirmark/exceptions.rb +15 -0
  73. data/lib/watirmark/extensions/ruby_extensions.rb +129 -0
  74. data/lib/watirmark/extensions/webdriver_extensions.rb +150 -0
  75. data/lib/watirmark/formatters/snapshot_formatter.rb +23 -0
  76. data/lib/watirmark/loader.rb +87 -0
  77. data/lib/watirmark/model.rb +3 -0
  78. data/lib/watirmark/models/cucumber_helper.rb +49 -0
  79. data/lib/watirmark/models/debug_methods.rb +21 -0
  80. data/lib/watirmark/models/default_values.rb +21 -0
  81. data/lib/watirmark/models/factory.rb +168 -0
  82. data/lib/watirmark/models/factory_method_generators.rb +84 -0
  83. data/lib/watirmark/models/factory_methods.rb +72 -0
  84. data/lib/watirmark/models/trait.rb +35 -0
  85. data/lib/watirmark/models/upload_csv.rb +24 -0
  86. data/lib/watirmark/page/keyed_element.rb +63 -0
  87. data/lib/watirmark/page/page.rb +50 -0
  88. data/lib/watirmark/page/page_definition.rb +187 -0
  89. data/lib/watirmark/page/process_page.rb +112 -0
  90. data/lib/watirmark/page/radio_maps.rb +53 -0
  91. data/lib/watirmark/profile.rb +22 -0
  92. data/lib/watirmark/rake/smoketest.rb +17 -0
  93. data/lib/watirmark/screenshot.rb +127 -0
  94. data/lib/watirmark/session.rb +115 -0
  95. data/lib/watirmark/version.rb +5 -0
  96. data/spec/assertions_spec.rb +95 -0
  97. data/spec/config_spec.rb +82 -0
  98. data/spec/controller_actions_spec.rb +91 -0
  99. data/spec/controller_spec.rb +426 -0
  100. data/spec/controllers_and_models_spec.rb +52 -0
  101. data/spec/model_factory_spec.rb +568 -0
  102. data/spec/model_traits_spec.rb +141 -0
  103. data/spec/page_spec.rb +127 -0
  104. data/spec/process_page_spec.rb +163 -0
  105. data/spec/spec_helper.rb +17 -0
  106. metadata +238 -0
@@ -0,0 +1,141 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe "Traits" do
4
+
5
+ before :all do
6
+ module Watirmark::Model
7
+ trait :contact_name do
8
+ first_name { "first" }
9
+ last_name { "last_#{uuid}" }
10
+ end
11
+
12
+ trait :credit_card do
13
+ cardnumber { 4111111111111111 }
14
+ end
15
+ end
16
+
17
+ module FactoryTest
18
+ class TraitsA < Watirmark::Model::Factory
19
+ keywords :first_name, :last_name, :middle_name, :cardnumber
20
+ traits :contact_name, :credit_card
21
+ defaults do
22
+ middle_name { "A" }
23
+ end
24
+ end
25
+
26
+ class TraitsB < Watirmark::Model::Factory
27
+ keywords :first_name, :last_name, :middle_name, :cardnumber
28
+ traits :contact_name, :credit_card
29
+ defaults do
30
+ middle_name { "B" }
31
+ end
32
+ end
33
+
34
+ class TraitsC < Watirmark::Model::Factory
35
+ keywords :first_name
36
+ defaults do
37
+ first_name { "C" }
38
+ end
39
+ traits :contact_name, :credit_card
40
+ end
41
+
42
+ class TraitsD < Watirmark::Model::Factory
43
+ keywords :first_name
44
+ traits :contact_name, :credit_card
45
+ defaults do
46
+ first_name { "D" }
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ specify "should have different last names" do
53
+ a = FactoryTest::TraitsA.new
54
+ b = FactoryTest::TraitsB.new
55
+ a.middle_name.should_not == b.middle_name
56
+ end
57
+
58
+ specify "should have same first names" do
59
+ a = FactoryTest::TraitsA.new
60
+ b = FactoryTest::TraitsB.new
61
+ a.first_name.should == b.first_name
62
+ end
63
+
64
+ specify "should have same last name but with different UUID" do
65
+ a = FactoryTest::TraitsA.new
66
+ b = FactoryTest::TraitsB.new
67
+ a.last_name.should include "last"
68
+ b.last_name.should include "last"
69
+ a.last_name.should_not == b.last_name
70
+ end
71
+
72
+ specify "should have same credit card number" do
73
+ a = FactoryTest::TraitsA.new
74
+ b = FactoryTest::TraitsB.new
75
+ a.cardnumber.should == b.cardnumber
76
+ end
77
+
78
+ specify "defaults should take precedence over traits" do
79
+ FactoryTest::TraitsC.new.first_name.should == "C"
80
+ FactoryTest::TraitsD.new.first_name.should == "D"
81
+ end
82
+ end
83
+
84
+ describe "Nested Traits" do
85
+
86
+ before :all do
87
+ module Watirmark::Model
88
+ trait :credit_card do
89
+ credit_card {4111111111111111}
90
+ end
91
+
92
+ trait :donor_address do
93
+ donor_address { "123 Sunset St" }
94
+ donor_state { "TX" }
95
+ end
96
+
97
+ trait :donor_jim do
98
+ traits :donor_address
99
+ first_name { "Jim" }
100
+ last_name { "Smith" }
101
+ end
102
+
103
+ trait :donor_jane do
104
+ first_name { "Jane" }
105
+ last_name { "Baker" }
106
+ traits :donor_address, :credit_card
107
+ end
108
+ end
109
+
110
+ module FactoryTest
111
+ class Jim < Watirmark::Model::Factory
112
+ keywords :first_name, :last_name, :donor_address, :donor_state, :credit_card
113
+ traits :donor_jim
114
+ end
115
+
116
+ class Jane < Watirmark::Model::Factory
117
+ keywords :first_name, :last_name, :donor_address, :donor_state, :credit_card
118
+ traits :donor_jane
119
+ end
120
+ end
121
+
122
+ end
123
+
124
+ specify "should have different first and last name" do
125
+ jim = FactoryTest::Jim.new
126
+ jane = FactoryTest::Jane.new
127
+ jim.first_name.should_not == jane.first_name
128
+ jim.last_name.should_not == jane.last_name
129
+ end
130
+
131
+ specify "should have same address due to same trait" do
132
+ jim = FactoryTest::Jim.new
133
+ jane = FactoryTest::Jane.new
134
+ jim.donor_address.should == "123 Sunset St"
135
+ jim.donor_state.should == "TX"
136
+ jim.donor_address.should == jim.donor_address
137
+ jim.donor_state.should == jim.donor_state
138
+ jane.credit_card.should == 4111111111111111
139
+ end
140
+ end
141
+
data/spec/page_spec.rb ADDED
@@ -0,0 +1,127 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe 'Page' do
4
+
5
+ before :all do
6
+ class Page1 < Page
7
+ keyword(:a) { "a" }
8
+ keyword(:b) { "b" }
9
+ end
10
+ class Page2 < Page
11
+ keyword(:c) { "c" }
12
+ end
13
+ class Page3 < Page
14
+ populate_keyword(:d) { "d" }
15
+ verify_keyword(:e) { "e" }
16
+ end
17
+ class Page4 < Page
18
+ navigation_keyword(:f) { "f" }
19
+ private_keyword(:g) { "g" }
20
+ keyword(:h) { "h" }
21
+ end
22
+ class Page5 < Page1
23
+ keyword(:i) { "i" }
24
+ end
25
+
26
+ @page1 = Page1.new
27
+ @page2 = Page2.new
28
+ @page3 = Page3.new
29
+ @page4 = Page4.new
30
+ @page5 = Page5.new
31
+ end
32
+
33
+ it "should list its keywords" do
34
+ @page1.keywords.should == [:a, :b]
35
+ @page2.keywords.should == [:c]
36
+ end
37
+
38
+ it "should list its parent's keywords" do
39
+ @page5.keywords.should == [:a, :b, :i]
40
+ end
41
+
42
+
43
+ it "should list its own keywords" do
44
+ @page5.native_keywords.should == [:i]
45
+ end
46
+
47
+
48
+ it "should list populate and verify keywords" do
49
+ @page3.keywords.should == [:d, :e]
50
+ end
51
+
52
+ it 'should create a method for the keyword' do
53
+ @page1.a.should == 'a'
54
+ @page2.c.should == 'c'
55
+ @page4.h.should == 'h'
56
+ end
57
+
58
+ it 'should be able to get and set the browser' do
59
+ old_browser = Page.browser
60
+ begin
61
+ Page.browser = 'browser'
62
+ Page1.new.browser.should == 'browser'
63
+ Page2.new.browser.should == 'browser'
64
+ Page3.new.browser.should == 'browser'
65
+ Page4.new.browser.should == 'browser'
66
+ ensure
67
+ Page.browser = old_browser
68
+ end
69
+ end
70
+
71
+ it 'should not leak keywords to other classes' do
72
+ lambda { @page2.a }.should raise_error
73
+ lambda { @page1.c }.should raise_error
74
+ end
75
+
76
+ it 'should support aliasing keywords' do
77
+ class Page1 < Page
78
+ keyword_alias :aliased_keyword, :a
79
+ end
80
+ page1 = Page1.new
81
+ page1.a.should == 'a'
82
+ page1.aliased_keyword.should == 'a'
83
+ end
84
+ end
85
+
86
+ describe "keyword metadata inheritance" do
87
+
88
+ before :all do
89
+ class Parent < Page
90
+ keyword(:a) { "a" }
91
+ keyword(:b) { "b" }
92
+ keyword(:same) { "c1" }
93
+ end
94
+
95
+ class Child < Parent
96
+ keyword(:c) { "c" }
97
+ keyword(:same) { "c1-child" }
98
+ end
99
+
100
+ class Child2 < Parent
101
+ keyword(:g) { "g" }
102
+ end
103
+ end
104
+
105
+ it 'should get declared keywords' do
106
+ parent = Parent.new
107
+ parent.keywords.should == [:a, :b, :same]
108
+ end
109
+
110
+ it 'should allow child to override superclass' do
111
+ child = Child.new
112
+ child.keywords.sort_by{|k| k.to_s}.should == [:a, :b, :c, :same]
113
+ child.a.should == "a"
114
+ child.same.should == 'c1-child'
115
+ end
116
+
117
+ it 'should not bleed settings between children' do
118
+ child2 = Child2.new
119
+ child2.keywords.sort_by{|k| k.to_s}.should == [:a, :b, :g, :same]
120
+ child2.g.should == 'g'
121
+ child2.same.should == 'c1'
122
+ end
123
+ end
124
+
125
+
126
+
127
+
@@ -0,0 +1,163 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe 'ProcessPage' do
4
+
5
+ it 'should implement a process page interface' do
6
+ lambda{Watirmark::ProcessPage.new('pp')}.should_not raise_error
7
+ end
8
+
9
+ it 'should support an activate method' do
10
+ p = Watirmark::ProcessPage.new('pp')
11
+ lambda{p.activate}.should_not raise_error(NoMethodError)
12
+ end
13
+
14
+ end
15
+
16
+ describe 'Process Page Views' do
17
+
18
+ before :all do
19
+ class ProcessPageTest < Watirmark::Page
20
+ keyword(:a) {'a'}
21
+ process_page('ProcessPage 1') do
22
+ keyword(:b) {'b'}
23
+ end
24
+ process_page('ProcessPage 2') do
25
+ keyword(:c) {'c'}
26
+ keyword(:d) {'d'}
27
+ end
28
+ keyword(:e) {'e'}
29
+ end
30
+
31
+ class NestedProcessPageTest < Watirmark::Page
32
+ keyword(:a) {'a'}
33
+ process_page('ProcessPage 1') do
34
+ keyword(:b) {'b'}
35
+ process_page('ProcessPage 1.1') do
36
+ keyword(:b1) {'b1'}
37
+ keyword(:b2) {'b2'}
38
+ process_page('ProcessPage 1.1.1') do
39
+ keyword(:b3) {'b3'}
40
+ end
41
+ end
42
+ end
43
+ keyword(:c) {'c'}
44
+ end
45
+
46
+ class DefaultView < Watirmark::Page
47
+ keyword(:a) {'a'}
48
+ keyword(:b) {'b'}
49
+ end
50
+
51
+ class ProcessPageView < Watirmark::Page
52
+ process_page 'page 1' do
53
+ keyword(:a) {'a'}
54
+ end
55
+ process_page 'page 2' do
56
+ keyword(:b) {'b'}
57
+ end
58
+ end
59
+
60
+ class ProcessPageAliasView < Watirmark::Page
61
+ process_page 'page 1' do
62
+ process_page_alias 'page a'
63
+ process_page_alias 'page b'
64
+ keyword(:a) {'a'}
65
+ end
66
+ process_page 'page 2' do
67
+ keyword(:b) {'b'}
68
+ end
69
+ end
70
+
71
+ class ProcessPageSubclassView < ProcessPageView
72
+ process_page 'page 3' do
73
+ keyword(:c) {'c'}
74
+ end
75
+ end
76
+
77
+ class ProcessPageCustomNav < Watirmark::Page
78
+ process_page_navigate_method Proc.new {}
79
+ process_page_submit_method Proc.new {}
80
+ process_page_active_page_method Proc.new {}
81
+ process_page 'page 4' do
82
+ keyword(:d) {'d'}
83
+ end
84
+ end
85
+
86
+ @processpagetest = ProcessPageTest.new
87
+ @nestedprocesspagetest = NestedProcessPageTest.new
88
+ @processpage = ProcessPageView.new
89
+ @processpagealias = ProcessPageAliasView.new
90
+ @processpagesubclass = ProcessPageSubclassView.new
91
+ @processpagecustomnav = ProcessPageCustomNav.new
92
+ end
93
+
94
+ it 'should only activate process_page when in the closure' do
95
+ @processpagetest.a.should == 'a'
96
+ @processpagetest.b.should == 'b'
97
+ @processpagetest.c.should == 'c'
98
+ @processpagetest.d.should == 'd'
99
+ @processpagetest.e.should == 'e'
100
+ @processpagetest.keywords.should == [:a,:b,:c,:d,:e]
101
+ end
102
+
103
+ it 'should show all keywords for a given process page' do
104
+ @processpagetest.process_page('ProcessPage 1').keywords.should == [:b]
105
+ @processpagetest.process_page('ProcessPage 2').keywords.should == [:c, :d]
106
+ end
107
+
108
+ it 'should activate the nested process_page where appropriate' do
109
+ @nestedprocesspagetest.a.should == 'a'
110
+ @nestedprocesspagetest.b.should == 'b'
111
+ @nestedprocesspagetest.b1.should == 'b1'
112
+ @nestedprocesspagetest.b2.should == 'b2'
113
+ @nestedprocesspagetest.b3.should == 'b3'
114
+ @nestedprocesspagetest.c.should == 'c'
115
+ end
116
+
117
+ it 'should support defining the process page navigate method' do
118
+ custom_method_called = false
119
+ Watirmark::ProcessPage.navigate_method_default = Proc.new { custom_method_called = true }
120
+ @processpagetest.a.should == 'a'
121
+ custom_method_called.should be_false
122
+ @processpagetest.b.should == 'b'
123
+ custom_method_called.should be_true
124
+ end
125
+
126
+ it 'should support defining the process page submit method' do
127
+ process_page = @processpagealias.process_page('page 1')
128
+ process_page.alias.should == ['page a', 'page b']
129
+ end
130
+
131
+ it 'should be able to report all process pages' do
132
+ @processpage.process_pages[0].name.should == ''
133
+ @processpage.process_pages[1].name.should == 'page 1'
134
+ @processpage.process_pages[2].name.should == 'page 2'
135
+ @processpage.process_pages.size.should == 3
136
+ end
137
+
138
+ it 'should include process page keywords in subclasses' do
139
+ @processpagesubclass.process_pages[0].name.should == ''
140
+ @processpagesubclass.process_pages[1].name.should == 'page 1'
141
+ @processpagesubclass.process_pages[2].name.should == 'page 2'
142
+ @processpagesubclass.process_pages[3].name.should == ''
143
+ @processpagesubclass.process_pages[4].name.should == 'page 3'
144
+ @processpagesubclass.process_pages.size.should == 5
145
+ @processpagesubclass.keywords.should == [:a, :b, :c]
146
+ end
147
+
148
+ it 'should honor overriding default process page behavior' do
149
+ @processpagesubclass.c.should == 'c'
150
+ @processpagesubclass.class.instance_variable_get(:@process_page_active_page_method).should_not be_kind_of(Proc)
151
+ @processpagesubclass.class.instance_variable_get(:@process_page_navigate_method).should_not be_kind_of(Proc)
152
+ @processpagesubclass.class.instance_variable_get(:@process_page_submit_method).should_not be_kind_of(Proc)
153
+
154
+ @processpagecustomnav.d.should == 'd'
155
+ @processpagecustomnav.class.instance_variable_get(:@process_page_active_page_method).should be_kind_of(Proc)
156
+ @processpagecustomnav.class.instance_variable_get(:@process_page_navigate_method).should be_kind_of(Proc)
157
+ @processpagecustomnav.class.instance_variable_get(:@process_page_submit_method).should be_kind_of(Proc)
158
+ end
159
+ end
160
+
161
+
162
+
163
+
@@ -0,0 +1,17 @@
1
+ lib_dir = File.join(File.dirname(__FILE__), '..', 'lib')
2
+ $: << File.expand_path(lib_dir)
3
+
4
+ ENV['WEBDRIVER'] = 'firefox'
5
+
6
+
7
+ require 'rspec/autorun'
8
+ require 'watirmark'
9
+ require 'watirmark/configuration'
10
+
11
+ Watirmark.logger.level = Logger::FATAL
12
+
13
+ RSpec.configure do |config|
14
+ config.mock_with :mocha
15
+ end
16
+
17
+ Watirmark.add_exit_task { Page.browser.close if Page.browser_exists? }