howitzer 1.1.1 → 2.0.0

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 (166) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +32 -0
  4. data/.travis.yml +1 -4
  5. data/.yardopts +1 -2
  6. data/CHANGELOG.md +28 -1
  7. data/Gemfile +6 -0
  8. data/LICENSE +1 -1
  9. data/README.md +55 -85
  10. data/Rakefile +7 -7
  11. data/bin/howitzer +56 -31
  12. data/features/cli_new.feature +162 -79
  13. data/features/cli_update.feature +114 -21
  14. data/features/step_definitions/common_steps.rb +29 -9
  15. data/features/support/env.rb +1 -1
  16. data/features/support/transformers.rb +2 -2
  17. data/generators/base_generator.rb +121 -49
  18. data/generators/config/config_generator.rb +8 -5
  19. data/generators/config/templates/boot.rb +14 -0
  20. data/generators/config/templates/capybara.rb +156 -0
  21. data/generators/config/templates/custom.yml +2 -3
  22. data/generators/config/templates/default.yml +50 -82
  23. data/generators/cucumber/cucumber_generator.rb +9 -9
  24. data/generators/cucumber/templates/common_steps.rb +4 -4
  25. data/generators/cucumber/templates/cucumber.rake +63 -54
  26. data/generators/cucumber/templates/env.rb +24 -23
  27. data/generators/cucumber/templates/transformers.rb +23 -15
  28. data/generators/emails/emails_generator.rb +4 -2
  29. data/generators/emails/templates/example_email.rb +4 -4
  30. data/generators/prerequisites/prerequisites_generator.rb +24 -0
  31. data/generators/prerequisites/templates/base.rb +22 -0
  32. data/generators/prerequisites/templates/factory_girl.rb +30 -0
  33. data/generators/prerequisites/templates/user.rb +7 -0
  34. data/generators/prerequisites/templates/users.rb +12 -0
  35. data/generators/root/root_generator.rb +11 -7
  36. data/generators/root/templates/.rubocop.yml +32 -0
  37. data/generators/root/templates/Gemfile.erb +27 -0
  38. data/generators/root/templates/Rakefile +6 -8
  39. data/generators/rspec/rspec_generator.rb +7 -7
  40. data/generators/rspec/templates/example_spec.rb +1 -1
  41. data/generators/rspec/templates/rspec.rake +48 -29
  42. data/generators/rspec/templates/spec_helper.rb +33 -32
  43. data/generators/tasks/tasks_generator.rb +4 -2
  44. data/generators/tasks/templates/common.rake +1 -16
  45. data/generators/turnip/templates/.rspec +1 -0
  46. data/generators/turnip/templates/common_steps.rb +25 -0
  47. data/generators/turnip/templates/example.feature +8 -0
  48. data/generators/turnip/templates/spec_helper.rb +56 -0
  49. data/generators/turnip/templates/turnip.rake +61 -0
  50. data/generators/turnip/templates/turnip_helper.rb +6 -0
  51. data/generators/turnip/turnip_generator.rb +26 -0
  52. data/generators/web/templates/example_page.rb +15 -0
  53. data/generators/web/templates/menu_section.rb +13 -0
  54. data/generators/web/web_generator.rb +22 -0
  55. data/howitzer.gemspec +14 -21
  56. data/lib/howitzer.rb +47 -7
  57. data/lib/howitzer/cache.rb +70 -0
  58. data/lib/howitzer/capybara_helpers.rb +194 -0
  59. data/lib/howitzer/email.rb +96 -104
  60. data/lib/howitzer/exceptions.rb +10 -6
  61. data/lib/howitzer/log.rb +120 -0
  62. data/lib/howitzer/mail_adapters.rb +7 -0
  63. data/lib/howitzer/mail_adapters/abstract.rb +84 -0
  64. data/lib/howitzer/mail_adapters/mailgun.rb +115 -0
  65. data/lib/howitzer/mailgun_api.rb +9 -0
  66. data/lib/howitzer/mailgun_api/client.rb +79 -0
  67. data/lib/howitzer/mailgun_api/connector.rb +37 -0
  68. data/lib/howitzer/mailgun_api/response.rb +28 -0
  69. data/lib/howitzer/tasks/framework.rake +2 -2
  70. data/lib/howitzer/utils.rb +7 -1
  71. data/lib/howitzer/utils/string_extensions.rb +66 -0
  72. data/lib/howitzer/version.rb +2 -1
  73. data/lib/howitzer/web.rb +11 -0
  74. data/lib/howitzer/web/base_section.rb +27 -0
  75. data/lib/howitzer/web/blank_page.rb +12 -0
  76. data/lib/howitzer/web/capybara_methods_proxy.rb +29 -0
  77. data/lib/howitzer/web/element_dsl.rb +109 -0
  78. data/lib/howitzer/web/iframe_dsl.rb +93 -0
  79. data/lib/howitzer/web/page.rb +173 -0
  80. data/lib/howitzer/web/page_dsl.rb +64 -0
  81. data/lib/howitzer/web/page_validator.rb +118 -0
  82. data/lib/howitzer/web/section.rb +27 -0
  83. data/lib/howitzer/web/section_dsl.rb +154 -0
  84. data/spec/config/custom.yml +10 -1
  85. data/spec/spec_helper.rb +37 -19
  86. data/spec/support/generator_helper.rb +12 -11
  87. data/spec/support/logger_helper.rb +10 -9
  88. data/spec/support/mailgun_unit_client.rb +52 -44
  89. data/spec/support/shared_examples/capybara_context_holder.rb +33 -0
  90. data/spec/support/shared_examples/capybara_methods_proxy.rb +94 -0
  91. data/spec/support/shared_examples/dynamic_section_methods.rb +35 -0
  92. data/spec/support/shared_examples/element_dsl.rb +119 -0
  93. data/spec/unit/generators/base_generator_spec.rb +64 -33
  94. data/spec/unit/generators/config_generator_spec.rb +11 -7
  95. data/spec/unit/generators/cucumber_generator_spec.rb +26 -17
  96. data/spec/unit/generators/emails_generator_spec.rb +10 -6
  97. data/spec/unit/generators/prerequisites_generator_spec.rb +53 -0
  98. data/spec/unit/generators/root_generator_spec.rb +50 -13
  99. data/spec/unit/generators/rspec_generator_spec.rb +9 -9
  100. data/spec/unit/generators/tasks_generator_spec.rb +6 -6
  101. data/spec/unit/generators/turnip_generator_spec.rb +52 -0
  102. data/spec/unit/generators/web_generator_spec.rb +52 -0
  103. data/spec/unit/lib/cache_spec.rb +85 -0
  104. data/spec/unit/lib/capybara_helpers_spec.rb +696 -0
  105. data/spec/unit/lib/email_spec.rb +104 -91
  106. data/spec/unit/lib/howitzer.rb +31 -0
  107. data/spec/unit/lib/init_spec.rb +0 -1
  108. data/spec/unit/lib/log_spec.rb +122 -0
  109. data/spec/unit/lib/mail_adapters/abstract_spec.rb +62 -0
  110. data/spec/unit/lib/mail_adapters/mailgun_spec.rb +163 -0
  111. data/spec/unit/lib/mailgun_api/client_spec.rb +58 -0
  112. data/spec/unit/lib/mailgun_api/connector_spec.rb +54 -0
  113. data/spec/unit/lib/mailgun_api/response_spec.rb +28 -0
  114. data/spec/unit/lib/utils/string_extensions_spec.rb +77 -0
  115. data/spec/unit/lib/web/base_section_spec.rb +41 -0
  116. data/spec/unit/lib/web/element_dsl_spec.rb +17 -0
  117. data/spec/unit/lib/web/iframe_dsl_spec.rb +99 -0
  118. data/spec/unit/lib/web/page_dsl_spec.rb +52 -0
  119. data/spec/unit/lib/web/page_spec.rb +304 -0
  120. data/spec/unit/lib/web/page_validator_spec.rb +218 -0
  121. data/spec/unit/lib/web/section_dsl_spec.rb +165 -0
  122. data/spec/unit/lib/web/section_spec.rb +61 -0
  123. data/spec/unit/version_spec.rb +1 -1
  124. metadata +116 -203
  125. data/GETTING_STARTED.md +0 -774
  126. data/generators/cucumber/templates/cucumber.yml +0 -10
  127. data/generators/pages/pages_generator.rb +0 -21
  128. data/generators/pages/templates/example_menu.rb +0 -15
  129. data/generators/pages/templates/example_page.rb +0 -15
  130. data/generators/root/templates/Gemfile +0 -7
  131. data/generators/root/templates/boot.rb +0 -10
  132. data/lib/howitzer/blank_page.rb +0 -6
  133. data/lib/howitzer/capybara/dsl_ex.rb +0 -15
  134. data/lib/howitzer/capybara/settings.rb +0 -343
  135. data/lib/howitzer/helpers.rb +0 -230
  136. data/lib/howitzer/init.rb +0 -1
  137. data/lib/howitzer/mailgun/client.rb +0 -65
  138. data/lib/howitzer/mailgun/connector.rb +0 -34
  139. data/lib/howitzer/mailgun/response.rb +0 -28
  140. data/lib/howitzer/patches/rawler_patched.rb +0 -86
  141. data/lib/howitzer/settings.rb +0 -27
  142. data/lib/howitzer/utils/data_generator/data_storage.rb +0 -88
  143. data/lib/howitzer/utils/data_generator/gen.rb +0 -135
  144. data/lib/howitzer/utils/locator_store.rb +0 -217
  145. data/lib/howitzer/utils/log.rb +0 -139
  146. data/lib/howitzer/utils/page_validator.rb +0 -133
  147. data/lib/howitzer/vendor/firebug-1.12.1-fx.xpi +0 -0
  148. data/lib/howitzer/vendor/firepath-0.9.7-fx.xpi +0 -0
  149. data/lib/howitzer/web_page.rb +0 -253
  150. data/spec/active_resource.rb +0 -0
  151. data/spec/config/default.yml +0 -26
  152. data/spec/support/boot_helper.rb +0 -15
  153. data/spec/unit/generators/pages_generator_spec.rb +0 -33
  154. data/spec/unit/lib/capybara/dsl_ex_spec.rb +0 -60
  155. data/spec/unit/lib/capybara/settings_spec.rb +0 -441
  156. data/spec/unit/lib/helpers_spec.rb +0 -1129
  157. data/spec/unit/lib/mailgun/client_spec.rb +0 -36
  158. data/spec/unit/lib/mailgun/connector_spec.rb +0 -70
  159. data/spec/unit/lib/mailgun/response_spec.rb +0 -28
  160. data/spec/unit/lib/settings_spec.rb +0 -17
  161. data/spec/unit/lib/utils/data_generator/data_storage_spec.rb +0 -80
  162. data/spec/unit/lib/utils/data_generator/gen_spec.rb +0 -90
  163. data/spec/unit/lib/utils/locator_store_spec.rb +0 -157
  164. data/spec/unit/lib/utils/log_spec.rb +0 -107
  165. data/spec/unit/lib/utils/page_validator_spec.rb +0 -265
  166. data/spec/unit/lib/web_page_spec.rb +0 -346
@@ -1,107 +0,0 @@
1
- require 'spec_helper'
2
- require 'howitzer/utils/log'
3
- include LoggerHelper
4
-
5
- RSpec.describe 'Logger' do
6
- let(:path) { File.join(log_path,'log.txt') }
7
- context '#log' do
8
- subject { log }
9
- let(:other_log) { Howitzer::Log.instance }
10
- it { is_expected.to be_a_kind_of(Howitzer::Log) }
11
- it { is_expected.to equal(other_log) }
12
- end
13
-
14
- context '.print_feature_name' do
15
- let(:feature) { 'Some feature' }
16
- let(:expected_result) { "*** Feature: SOME FEATURE ***\n"}
17
- subject { read_file(path) }
18
- before { log.print_feature_name(feature) }
19
- after { clear_file(path) }
20
- it { is_expected.to include(expected_result) }
21
- end
22
-
23
- context '.settings_as_formatted_text' do
24
- let(:formatted_text) { FFaker::Lorem.sentence }
25
- let(:as_formatted_text) { double }
26
- let(:expected_result) { formatted_text }
27
- subject { read_file(path) }
28
- before do
29
- expect(settings).to receive(:as_formatted_text).and_return(formatted_text)
30
- log.settings_as_formatted_text
31
- end
32
- after { clear_file(path) }
33
- it { is_expected.to include(expected_result) }
34
- end
35
-
36
- context '.print_scenario_name' do
37
- let(:expected_result) { " => Scenario: Some scenario\n" }
38
- let(:scenario) { 'Some scenario' }
39
- subject { read_file(path) }
40
- before { log.print_scenario_name(scenario) }
41
- after { clear_file(path) }
42
- it { is_expected.to include(expected_result) }
43
- end
44
-
45
- context '.error' do
46
- context 'when one argument given' do
47
- subject { log.error(*args) }
48
- context 'when exception given as argument' do
49
- let(:args) { [StandardError.new('Exception_error_message')] }
50
- it { expect {subject}.to raise_error(StandardError, 'Exception_error_message') }
51
- end
52
- context 'when message given as argument' do
53
- let(:args) { ['Runtime_error_message'] }
54
- it { expect {subject}.to raise_error(RuntimeError, 'Runtime_error_message') }
55
- end
56
- context 'when error object given as arg ' do
57
- let(:error_object) { ErrorObject = StandardError.new }
58
- let(:args) { error_object }
59
- it { expect {subject}.to raise_error(StandardError) }
60
- it { expect(read_file(path)).to include('[ERROR] [StandardError] StandardError') }
61
- end
62
- context 'when number given as arg' do
63
- let(:args) { 123 }
64
- it { expect {subject}.to raise_error(RuntimeError) }
65
- end
66
- end
67
- context 'when two arguments given' do
68
- subject { log.error(*args) }
69
- context 'when given text as first arg and caller as second' do
70
- let(:args) { %w(Some_text two_args_caller) }
71
- it { expect {subject}.to raise_error(RuntimeError) }
72
- it { expect(read_file(path)).to include('[ERROR] [RuntimeError] Some_text') }
73
- it { expect(read_file(path)).to include('two_args_caller') }
74
- end
75
- context 'when given class inherited from Exception as first arg and message as second' do
76
- let(:error_class) {SomeError = Class.new(Exception) }
77
- let(:args) { [error_class, 'some text'] }
78
- it { expect { subject }.to raise_error(error_class, 'some text') }
79
- it { expect(read_file(path)).to include('[ERROR] [SomeError] some text') }
80
- end
81
- context 'when given some class as first arg and (message) as second' do
82
- let(:some_class) { SomeClass = Class.new }
83
- let(:args) { [some_class, 'some text'] }
84
- it { expect{subject}.to raise_error(RuntimeError) }
85
- it { expect(read_file(path)).to include("[ERROR] [RuntimeError] SomeClass\n\tsome text") }
86
- end
87
- context 'when number given as first arg and message as second' do
88
- let(:args) { [123, 'some text' ] }
89
- it { expect{subject}.to raise_error(RuntimeError) }
90
- it { expect(read_file(path)).to include("[ERROR] [RuntimeError] 123\n\tsome text") }
91
- end
92
- context 'when nubmers given as args' do
93
- let(:args) { [123,123] }
94
- it { expect{subject}.to raise_error(TypeError) }
95
- end
96
- end
97
- context 'when three arguments given' do
98
- subject { log.error(*args) }
99
- context 'when NameError given as first arg, message as second and caller as third' do
100
- let(:args) { [NameError, 'Name_error_text', 'three_args_caller'] }
101
- it { expect {subject}.to raise_error(NameError) }
102
- it { expect(read_file(path)).to include('[ERROR] [NameError] Name_error_text') }
103
- it { expect(read_file(path)).to include('three_args_caller') }
104
- end
105
- end
106
- end
107
- end
@@ -1,265 +0,0 @@
1
- require 'spec_helper'
2
- require 'howitzer/utils/page_validator'
3
- require 'howitzer/utils/locator_store'
4
-
5
- RSpec.describe Howitzer::Utils::PageValidator do
6
- describe '.validations' do
7
- it { expect(subject.validations).to eql({}) }
8
- end
9
- end
10
-
11
- RSpec.describe 'PageValidator' do
12
- let(:web_page_class) do
13
- Class.new do
14
- include LocatorStore
15
- include Howitzer::Utils::PageValidator
16
- def self.name
17
- 'TestWebPageClass'
18
- end
19
- end
20
- end
21
- let(:web_page) { web_page_class.new }
22
- describe '#check_validations_are_defined!' do
23
- subject { web_page.check_validations_are_defined! }
24
- context 'when no validation specified' do
25
- it do
26
- expect(log).to receive(:error).with(Howitzer::NoValidationError, "No any page validation was found for 'TestWebPageClass' page").once.and_call_original
27
- expect { subject }.to raise_error(Howitzer::NoValidationError)
28
- end
29
- end
30
- context 'when old validation style is using' do
31
- before { web_page_class.const_set('URL_PATTERN',/Foo/) }
32
- after { web_page_class.send :remove_const, 'URL_PATTERN' }
33
- it do
34
- expect(web_page_class).to receive(:validates).with(:url, pattern: /Foo/){ Howitzer::Utils::PageValidator.validations['TestWebPageClass'] = {}}
35
- expect{subject}.to_not raise_error
36
- end
37
- end
38
- context 'when title validation is specified' do
39
- before do
40
- web_page.class.validates :title, pattern: /Foo/
41
- end
42
- it { expect{subject}.to_not raise_error }
43
- end
44
- context 'when url validation is specified' do
45
- before do
46
- web_page.class.validates :url, pattern: /Foo/
47
- end
48
- it { expect{subject}.to_not raise_error }
49
- end
50
- context 'when element_presence validation is specified' do
51
- before do
52
- web_page.class.validates :element_presence, locator: :test_locator
53
- end
54
- it { expect{subject}.to_not raise_error }
55
- end
56
- end
57
-
58
- describe '.validates' do
59
- before do
60
- Howitzer::Utils::PageValidator.validations[web_page.class.name] = nil
61
- end
62
- subject { web_page.class.validates(name, options) }
63
- context 'when name = :url' do
64
- context 'as string' do
65
- let(:name) { 'url' }
66
- context 'when options is correct' do
67
- context '(as string)' do
68
- let(:options) { {'pattern' => /foo/} }
69
- it do
70
- is_expected.to be_a(Proc)
71
- expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:url]).to be_a Proc
72
- end
73
- end
74
- context '(as symbol)' do
75
- let(:options) { {pattern: /foo/} }
76
- it do
77
- is_expected.to be_a(Proc)
78
- expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:url]).to be_a Proc
79
- end
80
- end
81
- end
82
- context 'when options is incorrect' do
83
- context '(missing pattern)' do
84
- let(:options) { {} }
85
- it do
86
- expect(log).to receive(:error).with(Howitzer::WrongOptionError, "Please specify ':pattern' option as Regexp object").once.and_call_original
87
- expect { subject }.to raise_error(Howitzer::WrongOptionError)
88
- end
89
- end
90
- context '(string pattern)' do
91
- let(:options) { {pattern: 'foo'} }
92
- it do
93
- expect(log).to receive(:error).with(Howitzer::WrongOptionError, "Please specify ':pattern' option as Regexp object").once.and_call_original
94
- expect { subject }.to raise_error(Howitzer::WrongOptionError)
95
- end
96
- end
97
- context '(not hash)' do
98
- let(:options) { 'foo' }
99
- it { expect{subject}.to raise_error(TypeError, "Expected options to be Hash, actual is 'String'") }
100
- end
101
- end
102
- end
103
- context 'as symbol' do
104
- let(:name) { :url }
105
- let(:options) { {pattern: /foo/} }
106
- it do
107
- is_expected.to be_a(Proc)
108
- expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:url]).to be_a Proc
109
- end
110
- end
111
- end
112
- context 'when name = :element_presence' do
113
- let(:name) { :element_presence }
114
- context 'when options is correct' do
115
- context '(as string)' do
116
- let(:options) { {'locator' => 'test_locator'} }
117
- it do
118
- is_expected.to be_a(Proc)
119
- expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:element_presence]).to eql(subject)
120
- end
121
- end
122
- context '(as symbol)' do
123
- let(:options) { {locator: :test_locator} }
124
- it do
125
- is_expected.to be_a(Proc)
126
- expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:element_presence]).to eql(subject)
127
- end
128
- end
129
- end
130
- context 'when options is incorrect' do
131
- context '(missing locator)' do
132
- let(:options) { {} }
133
- it do
134
- expect(log).to receive(:error).with(Howitzer::WrongOptionError, "Please specify ':locator' option as one of page locator names").once.and_call_original
135
- expect { subject }.to raise_error(Howitzer::WrongOptionError)
136
- end
137
- end
138
- context '(blank locator name)' do
139
- let(:options) { {locator: ''} }
140
- it do
141
- expect(log).to receive(:error).with(Howitzer::WrongOptionError, "Please specify ':locator' option as one of page locator names").once.and_call_original
142
- expect { subject }.to raise_error(Howitzer::WrongOptionError)
143
- end
144
- end
145
- end
146
- end
147
- context 'when name = :title' do
148
- let(:name) { :title }
149
- context 'when options is correct' do
150
- context '(as string)' do
151
- let(:options) { {'pattern' => /foo/} }
152
- it do
153
- is_expected.to be_a(Proc)
154
- expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:title]).to be_a Proc
155
- end
156
- end
157
- context '(as symbol)' do
158
- let(:options) { {pattern: /foo/} }
159
- it do
160
- is_expected.to be_a(Proc)
161
- expect(Howitzer::Utils::PageValidator.validations[web_page.class.name][:title]).to be_a Proc
162
- end
163
- end
164
- end
165
- context 'when options is incorrect' do
166
- context '(missing pattern)' do
167
- let(:options) { {} }
168
- it do
169
- expect(log).to receive(:error).with(Howitzer::WrongOptionError, "Please specify ':pattern' option as Regexp object").once.and_call_original
170
- expect { subject }.to raise_error(Howitzer::WrongOptionError)
171
- end
172
- end
173
- context '(string pattern)' do
174
- let(:options) { {pattern: 'foo'} }
175
- it do
176
- expect(log).to receive(:error).with(Howitzer::WrongOptionError, "Please specify ':pattern' option as Regexp object").once.and_call_original
177
- expect { subject }.to raise_error(Howitzer::WrongOptionError)
178
- end
179
- end
180
- end
181
- end
182
- context 'when other name' do
183
- let(:name) { :unknown }
184
- let(:options) { {} }
185
- it do
186
- expect(log).to receive(:error).with(Howitzer::UnknownValidationError, "unknown 'unknown' validation name").once.and_call_original
187
- expect { subject }.to raise_error(Howitzer::UnknownValidationError)
188
- end
189
- end
190
- end
191
-
192
- describe '.pages' do
193
- subject { Howitzer::Utils::PageValidator.pages }
194
- it { is_expected.to eq([]) }
195
- it do
196
- subject << Class
197
- is_expected.to eql([Class])
198
- end
199
- end
200
-
201
- describe '.opened?' do
202
- subject { web_page_class.opened? }
203
- context 'when no one validation is defined' do
204
- it do
205
- expect(log).to receive(:error).with(Howitzer::NoValidationError, "No any page validation was found for 'TestWebPageClass' page").once.and_call_original
206
- expect { subject }.to raise_error(Howitzer::NoValidationError)
207
- end
208
- end
209
- context 'when all validations are defined' do
210
- before do
211
- web_page_class.class_eval do
212
- add_locator :login, '#id'
213
- validates :url, pattern: /foo/
214
- validates :title, pattern: /Foo page/
215
- validates :element_presence, locator: :login
216
- end
217
- end
218
- context 'when all matches' do
219
- before do
220
- allow(web_page_class).to receive(:url){ 'http://test.com/foo' }
221
- allow(web_page_class).to receive(:title){ 'Foo page' }
222
- allow(web_page_class).to receive(:first_element).with(:login){ true }
223
- end
224
- it { is_expected.to be_truthy }
225
- end
226
- context 'when first does not match' do
227
- before do
228
- expect(web_page_class).to receive(:url).once{ 'http://test.com/bar' }
229
- expect(web_page_class).to receive(:title).never
230
- expect(web_page_class).to receive(:first_element).never
231
- end
232
- it { is_expected.to be_falsey }
233
- end
234
- end
235
- end
236
-
237
- describe '#matched_pages' do
238
- let!(:web_page1_class) do
239
- Class.new do
240
- include Howitzer::Utils::PageValidator
241
- def self.name
242
- 'TestWebPage1Class'
243
- end
244
- def self.opened?
245
- true
246
- end
247
- end
248
- end
249
-
250
- let!(:web_page2_class) do
251
- Class.new do
252
- include Howitzer::Utils::PageValidator
253
- def self.name
254
- 'TestWebPage2Class'
255
- end
256
- def self.opened?
257
- false
258
- end
259
- end
260
- end
261
- subject {web_page2_class.matched_pages }
262
- before { Howitzer::Utils::PageValidator.instance_variable_set(:@pages, [web_page1_class, web_page2_class]) }
263
- it { is_expected.to eq([web_page1_class]) }
264
- end
265
- end
@@ -1,346 +0,0 @@
1
- require 'spec_helper'
2
- require 'howitzer/web_page'
3
- require 'howitzer/capybara/settings'
4
-
5
- RSpec.describe 'WebPage' do
6
- describe '.open' do
7
- let(:url_value) { 'google.com' }
8
- let(:retryable) { double }
9
- let(:check_correct_page_loaded) { double }
10
- let(:other_instance) { WebPage.instance }
11
- subject { WebPage.open(url_value) }
12
- it do
13
- expect(log).to receive(:info).with("Open WebPage page by 'google.com' url").once.ordered
14
- expect(WebPage).to receive(:retryable).ordered.once.and_call_original
15
- expect(WebPage).to receive(:visit).with(url_value).once.ordered
16
- expect(WebPage).to receive(:given).once.ordered
17
- subject
18
- end
19
- end
20
-
21
- describe '.given' do
22
- subject { WebPage.given }
23
- before do
24
- expect(WebPage).to receive(:wait_for_opened).with(no_args).once
25
- expect(WebPage).to receive(:instance) { true }
26
- end
27
- it { is_expected.to be_truthy }
28
- end
29
-
30
- describe '.title' do
31
- let(:page) { double }
32
- subject { WebPage.instance.title }
33
- before do
34
- allow_any_instance_of(WebPage).to receive(:check_validations_are_defined!) { true }
35
- allow(WebPage.instance).to receive(:current_url) { 'google.com' }
36
- end
37
- it do
38
- expect(WebPage.instance).to receive(:page) { page }
39
- expect(page).to receive(:title)
40
- subject
41
- end
42
- end
43
-
44
- describe '.url' do
45
- let(:page) { double }
46
- subject { WebPage.url }
47
- it do
48
- expect(WebPage).to receive(:page) { page }
49
- expect(page).to receive(:current_url) { 'google.com' }
50
- is_expected.to eq('google.com')
51
- end
52
- end
53
-
54
- describe '.current_url' do
55
- let(:page) { double }
56
- subject { WebPage.current_url }
57
- it do
58
- expect(WebPage).to receive(:page) { page }
59
- expect(page).to receive(:current_url) { 'google.com' }
60
- is_expected.to eq('google.com')
61
- end
62
- end
63
-
64
- describe '.text' do
65
- let(:page) { double }
66
- let(:find) { double }
67
- subject { WebPage.text }
68
- it do
69
- expect(WebPage).to receive(:page) { page }
70
- expect(page).to receive(:find).with('body') { find }
71
- expect(find).to receive(:text) { 'some body text' }
72
- is_expected.to eq('some body text')
73
- end
74
- end
75
-
76
- describe '.current_page' do
77
- subject { WebPage.current_page }
78
- context 'when matched_pages has no pages' do
79
- before { allow(WebPage).to receive(:matched_pages){ [] } }
80
- it { is_expected.to eq(WebPage::UnknownPage) }
81
- end
82
- context 'when matched_pages has more than 1 page' do
83
- let(:foo_page) { double(inspect: 'FooPage') }
84
- let(:bar_page) { double(inspect: 'BarPage') }
85
- before do
86
- allow(WebPage).to receive(:current_url) { 'http://test.com' }
87
- allow(WebPage).to receive(:title) { 'Test site' }
88
- allow(WebPage).to receive(:matched_pages){ [foo_page, bar_page] }
89
- end
90
- it do
91
- expect(log).to receive(:error).with(
92
- Howitzer::AmbiguousPageMatchingError,
93
- "Current page matches more that one page class (FooPage, BarPage).\n\tCurrent url: http://test.com\n\tCurrent title: Test site"
94
- ).once
95
- subject
96
- end
97
- end
98
- context 'when matched_pages has only 1 page' do
99
- let(:foo_page) { double(to_s: 'FooPage') }
100
- before { allow(WebPage).to receive(:matched_pages){ [foo_page] } }
101
- it { is_expected.to eq(foo_page) }
102
- end
103
- end
104
-
105
- describe '.wait_for_opened' do
106
- subject { WebPage.wait_for_opened }
107
- context 'when page is opened' do
108
- before { allow(WebPage).to receive(:opened?) { true } }
109
- it { is_expected.to be_nil }
110
- end
111
- context 'when page is not opened' do
112
- before do
113
- allow(WebPage).to receive(:current_page) { 'FooPage' }
114
- allow(WebPage).to receive(:current_url) { 'http://test.com' }
115
- allow(WebPage).to receive(:title) { 'Test site' }
116
- allow(settings).to receive(:timeout_small) { 0.1 }
117
- allow(WebPage).to receive(:opened?) { false }
118
- end
119
- it do
120
- expect(log).to receive(:error).with(
121
- Howitzer::IncorrectPageError,
122
- "Current page: FooPage, expected: WebPage.\n\tCurrent url: http://test.com\n\tCurrent title: Test site"
123
- )
124
- subject
125
- end
126
- end
127
- end
128
-
129
- describe '#initialize' do
130
- subject { WebPage.send(:new) }
131
- before do
132
- expect_any_instance_of(WebPage).to receive(:check_validations_are_defined!).once { true }
133
- end
134
- context 'when maximized_window is true' do
135
- before { allow(settings).to receive(:maximized_window) { true } }
136
- it do
137
- expect_any_instance_of(WebPage).to receive_message_chain('page.driver.browser.manage.window.maximize')
138
- subject
139
- end
140
- end
141
- context 'when maximized_window is false' do
142
- before { allow(settings).to receive(:maximized_window) { false } }
143
- it do
144
- expect_any_instance_of(WebPage).not_to receive('page')
145
- subject
146
- end
147
- end
148
- end
149
-
150
- describe 'inherited callback' do
151
- let!(:page_class) do
152
- Howitzer::Utils::PageValidator.instance_variable_set(:@pages, [])
153
- Class.new(WebPage)
154
- end
155
- it { expect(Howitzer::Utils::PageValidator.pages).to eq([page_class]) }
156
- it 'can not be instantiated with new' do
157
- expect { page_class.new }.to raise_error(NoMethodError, "private method `new' called for #{page_class}")
158
- end
159
- end
160
-
161
- describe '#tinymce_fill_in' do
162
- subject { WebPage.instance.tinymce_fill_in(name,options) }
163
- let(:name) { 'name' }
164
- let(:options) { {with: 'some content'} }
165
- before do
166
- allow(WebPage.instance).to receive(:current_url) { 'google.com' }
167
- allow(settings).to receive(:driver) { driver_name }
168
- end
169
- context 'when correct driver specified' do
170
- let(:driver_name) { 'selenium' }
171
- let(:page) { double }
172
- let(:driver) { double }
173
- let(:browser) { double }
174
- let(:switch_to) { double }
175
- let(:find) { double }
176
- let(:native) { double }
177
- it do
178
- expect(WebPage.instance).to receive(:page).exactly(3).times { page }
179
- expect(page).to receive(:driver).ordered { driver }
180
- expect(driver).to receive(:browser).ordered { browser }
181
- expect(browser).to receive(:switch_to).ordered { switch_to }
182
- expect(switch_to).to receive(:frame).with('name_ifr').once
183
-
184
- expect(page).to receive(:find).with(:css, '#tinymce').ordered { find }
185
- expect(find).to receive(:native).ordered { native }
186
- expect(native).to receive(:send_keys).with('some content').once
187
-
188
- expect(page).to receive(:driver) { driver }
189
- expect(driver).to receive(:browser) { browser }
190
- expect(browser).to receive(:switch_to) { switch_to }
191
- expect(switch_to).to receive(:default_content)
192
-
193
- subject
194
- end
195
- end
196
- context 'when incorrect driver specified' do
197
- let(:driver_name) { 'ff' }
198
- let(:page) { double }
199
- it do
200
- expect(WebPage.instance).to receive(:page) { page }
201
- expect(page).to receive(:execute_script).with("tinyMCE.get('name').setContent('some content')")
202
- subject
203
- end
204
- end
205
- end
206
- describe '#click_alert_box' do
207
- subject { WebPage.instance.click_alert_box(flag_value) }
208
- before do
209
- allow(settings).to receive(:driver) { driver_name }
210
- allow(settings).to receive(:timeout_tiny) { 0 }
211
- allow(WebPage.instance).to receive(:current_url) { 'google.com' }
212
- end
213
- context 'when flag true and correct driver specified' do
214
- let(:flag_value) { true }
215
- let(:page) { double }
216
- let(:alert) { double }
217
- let(:driver) { double }
218
- let(:browser) { double }
219
- let(:switch_to) { double }
220
- let(:driver_name) { 'selenium' }
221
- it do
222
- expect(WebPage.instance).to receive(:page) { page }
223
- expect(page).to receive(:driver).ordered { driver }
224
- expect(driver).to receive(:browser).ordered { browser }
225
- expect(browser).to receive(:switch_to).ordered { switch_to }
226
- expect(switch_to).to receive(:alert).ordered { alert }
227
- expect(alert).to receive(:accept).once
228
- subject
229
- end
230
- end
231
- context 'when flag false and correct driver specified' do
232
- let(:flag_value) { false }
233
- let(:page) { double }
234
- let(:alert) { double }
235
- let(:driver) { double }
236
- let(:browser) { double }
237
- let(:switch_to) { double }
238
- let(:driver_name) { 'selenium' }
239
- it do
240
- expect(WebPage.instance).to receive(:page) { page }
241
- expect(page).to receive(:driver).ordered { driver }
242
- expect(driver).to receive(:browser).ordered { browser }
243
- expect(browser).to receive(:switch_to).ordered { switch_to }
244
- expect(switch_to).to receive(:alert).ordered { alert }
245
- expect(alert).to receive(:dismiss).once
246
- subject
247
- end
248
- end
249
- context 'when flag true and wrong driver specified' do
250
- let(:flag_value) { true }
251
- let(:page) { double }
252
- let(:driver_name) { 'ff' }
253
- it do
254
- expect(WebPage.instance).to receive(:page) { page }
255
- expect(page).to receive(:evaluate_script).with('window.confirm = function() { return true; }')
256
- subject
257
- end
258
- end
259
- context 'when flag false and wrong driver specified' do
260
- let(:driver_name) { 'ff' }
261
- let(:flag_value) { false }
262
- let(:page) { double }
263
- it do
264
- expect(WebPage.instance).to receive(:page) { page }
265
- expect(page).to receive(:evaluate_script).with('window.confirm = function() { return false; }')
266
- subject
267
- end
268
- end
269
- end
270
-
271
- describe '#js_click' do
272
- subject { WebPage.instance.js_click('.some_class') }
273
- before do
274
- allow(settings).to receive(:timeout_tiny) { 0.1 }
275
- allow(WebPage.instance).to receive(:current_url) { 'google.com' }
276
- end
277
- let(:page) { double }
278
- it do
279
- expect(WebPage.instance).to receive(:page) { page }
280
- expect(page).to receive(:execute_script).with("$('.some_class').trigger('click')")
281
- subject
282
- end
283
-
284
- end
285
-
286
- describe '#wait_for_title' do
287
- subject { WebPage.instance.wait_for_title(expected_title) }
288
- before do
289
- allow(settings).to receive(:timeout_small) { 0.1 }
290
- allow(WebPage.instance).to receive(:title) { 'title' }
291
- end
292
- context 'when title equals expected title' do
293
- let(:expected_title) { 'title' }
294
- it do
295
- is_expected.to be_truthy
296
- end
297
- end
298
- context 'when title not equals expected title' do
299
- let(:expected_title) { 'bad title' }
300
- let(:error) { Howitzer::IncorrectPageError }
301
- let(:error_message) { 'Current title: title, expected: bad title' }
302
- it do
303
- expect(log).to receive(:error).with(error,error_message).once.and_call_original
304
- expect { subject }.to raise_error(error)
305
- end
306
- end
307
- end
308
-
309
- describe '#wait_for_url' do
310
- subject { WebPage.instance.wait_for_url(expected_url) }
311
- before do
312
- allow(settings).to receive(:timeout_small) { 0.1 }
313
- allow(WebPage.instance).to receive(:current_url) { 'google.com' }
314
- end
315
- context 'when current_url equals expected_url' do
316
- let(:expected_url) { 'google.com' }
317
- it { is_expected.to be_truthy }
318
- end
319
- context 'when current_url not equals expected_url' do
320
- let(:expected_url) { 'bad_url' }
321
- let(:error) { Howitzer::IncorrectPageError }
322
- let(:error_message) { "Current url: google.com, expected: #{expected_url}" }
323
- it do
324
- expect(log).to receive(:error).with(error, error_message).once.and_call_original
325
- expect { subject }.to raise_error(error)
326
- end
327
- end
328
- end
329
-
330
- describe '#reload' do
331
- let(:wait_for_url) { double }
332
- subject { WebPage.instance.reload }
333
- let(:visit) { double }
334
- let(:webpage) { double }
335
- before do
336
- allow(WebPage.instance).to receive(:current_url) { 'google.com' }
337
- stub_const('WebPage::URL_PATTERN', 'pattern')
338
- allow(wait_for_url).to receive('pattern') { true }
339
- end
340
- it do
341
- expect(log).to receive(:info) { "Reload 'google.com'" }
342
- expect(WebPage.instance).to receive(:visit).with('google.com')
343
- subject
344
- end
345
- end
346
- end