page_magic 2.0.6 → 2.0.9

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 (53) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/lib/page_magic/session.rb +0 -6
  4. metadata +55 -90
  5. data/.codeclimate.yml +0 -4
  6. data/.pullreview.yml +0 -14
  7. data/.rspec +0 -1
  8. data/.rubocop.yml +0 -39
  9. data/.simplecov +0 -10
  10. data/.zsh_config +0 -6
  11. data/Dockerfile +0 -11
  12. data/Gemfile +0 -24
  13. data/Gemfile.lock +0 -175
  14. data/Makefile +0 -17
  15. data/Rakefile +0 -32
  16. data/circle.yml +0 -8
  17. data/page_magic.gemspec +0 -128
  18. data/spec/lib/active_support/core_ext/object/to_query_test.rb +0 -78
  19. data/spec/page_magic/class_methods_spec.rb +0 -92
  20. data/spec/page_magic/comparator/fuzzy_spec.rb +0 -44
  21. data/spec/page_magic/comparator/literal_spec.rb +0 -41
  22. data/spec/page_magic/comparator/null_spec.rb +0 -35
  23. data/spec/page_magic/comparator/parameter_map_spec.rb +0 -75
  24. data/spec/page_magic/driver_spec.rb +0 -40
  25. data/spec/page_magic/drivers/poltergeist_spec.rb +0 -8
  26. data/spec/page_magic/drivers/rack_test_spec.rb +0 -8
  27. data/spec/page_magic/drivers/selenium_spec.rb +0 -15
  28. data/spec/page_magic/drivers_spec.rb +0 -48
  29. data/spec/page_magic/element/locators_spec.rb +0 -36
  30. data/spec/page_magic/element/not_found_spec.rb +0 -24
  31. data/spec/page_magic/element/query/multiple_results_spec.rb +0 -14
  32. data/spec/page_magic/element/query/single_result_spec.rb +0 -21
  33. data/spec/page_magic/element/query_spec.rb +0 -38
  34. data/spec/page_magic/element/selector_spec.rb +0 -166
  35. data/spec/page_magic/element_context_spec.rb +0 -72
  36. data/spec/page_magic/element_definition_builder_spec.rb +0 -19
  37. data/spec/page_magic/element_spec.rb +0 -256
  38. data/spec/page_magic/elements/config_spec.rb +0 -203
  39. data/spec/page_magic/elements_spec.rb +0 -125
  40. data/spec/page_magic/instance_methods_spec.rb +0 -90
  41. data/spec/page_magic/mapping_spec.rb +0 -181
  42. data/spec/page_magic/session_methods_spec.rb +0 -40
  43. data/spec/page_magic/session_spec.rb +0 -164
  44. data/spec/page_magic/transitions_spec.rb +0 -43
  45. data/spec/page_magic/utils/string_spec.rb +0 -29
  46. data/spec/page_magic/utils/url_spec.rb +0 -9
  47. data/spec/page_magic/wait_methods_spec.rb +0 -35
  48. data/spec/page_magic/watcher_spec.rb +0 -22
  49. data/spec/page_magic/watchers_spec.rb +0 -80
  50. data/spec/page_magic_spec.rb +0 -115
  51. data/spec/spec_helper.rb +0 -15
  52. data/spec/support/shared_contexts.rb +0 -5
  53. data/spec/support/shared_examples.rb +0 -25
@@ -1,72 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe PageMagic::ElementContext do
4
- describe '#method_missing' do
5
- let(:element_class) do
6
- Class.new(PageMagic::Element)
7
- end
8
-
9
- context 'when method is a element definition' do
10
- it 'returns the sub page element' do
11
- element_class.link(:a_link, text: 'a link')
12
- element = described_class.new(element_class.load("<a href='#'>a link</a>")).a_link
13
- expect(element.text).to eq('a link')
14
- end
15
-
16
- it 'passes arguments through to the element definition' do
17
- element_class.link(:pass_through, css: 'a') { |args| args[:passed_through] = true }
18
-
19
- args = {}
20
- described_class.new(element_class.load("<a href='#'>a link</a>")).pass_through(args)
21
- expect(args[:passed_through]).to eq(true)
22
- end
23
-
24
- it 'does not evaluate any of the other definitions' do
25
- element_class.link(:a_link, text: 'a link')
26
- element_class.link(:another_link, :selector) { raise('should not have been evaluated') }
27
-
28
- described_class.new(element_class.load("<a href='#'>a link</a>")).a_link
29
- end
30
- end
31
-
32
- context 'when the method is found on page_element' do
33
- it 'calls page_element method' do
34
- element_class.define_method(:page_method) do
35
- :called
36
- end
37
-
38
- expect(described_class.new(element_class.load("<a href='#'>a link</a>")).page_method).to eq(:called)
39
- end
40
- end
41
-
42
- context 'when the method is not found on page_element or as a element definition' do
43
- it 'raises an error' do
44
- expect do
45
- described_class.new(PageMagic::Element.load('')).missing_method
46
- end.to raise_error(PageMagic::ElementMissingException)
47
- end
48
- end
49
- end
50
-
51
- describe '#respond_to?' do
52
- let(:page_element_class) do
53
- Class.new(PageMagic::Element) do
54
- link(:a_link, text: 'a link')
55
- end
56
- end
57
-
58
- context 'when the page_element responds to method name' do
59
- it 'returns true' do
60
- element = described_class.new(page_element_class.load("<a href='#'>a link</a>"))
61
- expect(element).to respond_to(:a_link)
62
- end
63
- end
64
-
65
- context 'when the method is not on the page_element' do
66
- it 'calls super' do
67
- element = described_class.new(page_element_class.load("<a href='#'>a link</a>")).a_link
68
- expect(element.text).to respond_to(:methods)
69
- end
70
- end
71
- end
72
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe PageMagic::ElementDefinitionBuilder do
4
- describe '#build' do
5
- it 'returns an instance of `definition_class`' do
6
- options = { count: 1 }
7
- builder = described_class.new(
8
- definition_class: PageMagic::Element,
9
- selector: PageMagic::Element::Selector.find(:xpath).build(:text_field, '//xpath', options: options)
10
- )
11
-
12
- allow_any_instance_of(PageMagic::Element::Query::SingleResult).to receive(:execute) do |_query, element, &block|
13
- block.call(element)
14
- end
15
-
16
- expect(builder.build(:capybara_object)).to have_attributes(browser_element: :capybara_object)
17
- end
18
- end
19
- end
@@ -1,256 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe PageMagic::Element do
4
- let(:described_class) do
5
- Class.new(PageMagic::Element) # rubocop:disable RSpec/DescribedClass
6
- end
7
-
8
- it_behaves_like 'session accessor'
9
- it_behaves_like 'element watcher'
10
- it_behaves_like 'waiter'
11
- it_behaves_like 'element locator'
12
-
13
- describe '.after_events' do
14
- context 'when a hook is registered' do
15
- it 'returns that hook' do
16
- hook = proc {}
17
- described_class.after_events(&hook)
18
- expect(described_class.after_events).to eq([described_class::DEFAULT_HOOK, hook])
19
- end
20
- end
21
-
22
- context 'when a hook is not registered' do
23
- it 'returns the default hook' do
24
- expect(described_class.after_events).to eq([described_class::DEFAULT_HOOK])
25
- end
26
- end
27
- end
28
-
29
- describe '.before_events' do
30
- context 'when a is hook registered' do
31
- it 'returns that hook' do
32
- hook = proc {}
33
- described_class.before_events(&hook)
34
- expect(described_class.before_events).to eq([described_class::DEFAULT_HOOK, hook])
35
- end
36
- end
37
-
38
- context 'when a hook is not registered' do
39
- it 'returns the default hook' do
40
- expect(described_class.before_events).to eq([described_class::DEFAULT_HOOK])
41
- end
42
- end
43
- end
44
-
45
- describe '.inherited' do
46
- it 'copies before hooks on to the inheritor' do
47
- before_hook = proc {}
48
- described_class.before_events(&before_hook)
49
- sub_class = Class.new(described_class)
50
- expect(sub_class.before_events).to include(before_hook)
51
- end
52
-
53
- it 'copies after hooks on to the inheritor' do
54
- after_hook = proc {}
55
- described_class.after_events(&after_hook)
56
- sub_class = Class.new(described_class)
57
- expect(sub_class.after_events).to include(after_hook)
58
- end
59
-
60
- context 'when subclasses define their own elements' do
61
- it 'puts the element definition on the sub class' do
62
- custom_element = Class.new(described_class) do
63
- text_field :form_field, id: 'field_id'
64
- end
65
- expect(custom_element.new(:page_element).element_definitions).to include(:form_field)
66
- end
67
-
68
- it 'does not put the definition on the parent class' do
69
- Class.new(described_class) do
70
- text_field :form_field, id: 'field_id'
71
- end
72
- expect(described_class.new(:page_element).element_definitions).not_to include(:form_field)
73
- end
74
- end
75
- end
76
-
77
- describe '.load' do
78
- let(:page_source) do
79
- <<-HTML
80
- <div id='links'>
81
- <a class='cta'>link text</a>
82
- </div>
83
- HTML
84
- end
85
-
86
- it 'returns an instance that works against the supplied string' do
87
- subject = Class.new(described_class) do
88
- element(:links, id: 'links') { link(:cta, css: '.cta') }
89
- end
90
- expect(subject.load(page_source).links.cta.text).to eq('link text')
91
- end
92
- end
93
-
94
- describe '.watch' do
95
- it 'adds a before hook' do
96
- watch_block = described_class.watch(:object_id).last
97
- expect(described_class.before_events).to include(watch_block)
98
- end
99
-
100
- describe 'the before hook that is added' do
101
- it 'contains a watcher' do
102
- watch_block = described_class.watch(:object_id).last
103
- instance = described_class.new(:element)
104
- instance.instance_exec(&watch_block)
105
-
106
- watcher = instance.watchers.first
107
- expect(watcher.observed_value).to eq(instance.object_id)
108
- end
109
- end
110
- end
111
-
112
- describe 'EVENT_TYPES' do
113
- it 'creates methods for each of the event types' do
114
- instance = described_class.new(:capybara_element)
115
- missing = described_class::EVENT_TYPES.find_all { |event| !instance.respond_to?(event) }
116
- expect(missing).to be_empty
117
- end
118
-
119
- context 'when one of the methods are called' do
120
- it 'calls the browser_element passing on all args' do
121
- browser_element = instance_double(Capybara::Node::Actions)
122
- allow(browser_element).to receive(:select)
123
- described_class.new(browser_element).select :args
124
- expect(browser_element).to have_received(:select).with(:args)
125
- end
126
- end
127
-
128
- context 'when the underlying capybara element does not respond to the method' do
129
- it 'raises an error' do
130
- expected_message = (described_class::EVENT_NOT_SUPPORTED_MSG % 'click')
131
- browser_element = instance_double(Capybara::Node::Element)
132
- page_element = described_class.new(browser_element)
133
- expect { page_element.click }.to raise_error(PageMagic::NotSupportedException, expected_message)
134
- end
135
- end
136
- end
137
-
138
- describe 'hooks' do
139
- context 'when a method called from within a before_events hook' do
140
- let(:page_element_class) do
141
- Class.new(described_class) do
142
- before_events do
143
- call_in_before_events
144
- end
145
- end
146
- end
147
-
148
- it 'delegates to the `PageMagic::Element`' do
149
- capybara_button = instance_double(Capybara::Node::Element, click: true)
150
- page_element = page_element_class.new(capybara_button)
151
- allow(page_element).to receive(:call_in_before_events)
152
- page_element.click
153
- expect(page_element).to have_received(:call_in_before_events)
154
- end
155
- end
156
-
157
- context 'when a method called from within a after_events hook' do
158
- let(:page_element_class) do
159
- Class.new(described_class) do
160
- after_events do
161
- call_in_after_events
162
- end
163
- end
164
- end
165
-
166
- it 'delegates to the `PageMagic::Element`' do
167
- capybara_button = instance_double(Capybara::Node::Element, click: true)
168
- page_element = page_element_class.new(capybara_button)
169
- allow(page_element).to receive(:call_in_after_events)
170
- page_element.click
171
- expect(page_element).to have_received(:call_in_after_events)
172
- end
173
- end
174
- end
175
-
176
- describe '#initialize' do
177
- it 'sets the parent element' do
178
- described_class.parent_element(:page)
179
- instance = described_class.new(:element)
180
- expect(instance.parent_element).to eq(:page)
181
- end
182
-
183
- describe 'inherited items' do
184
- it 'copies the before hooks' do
185
- before_hook = proc {}
186
- described_class.before_events(&before_hook)
187
-
188
- instance = described_class.new(:element)
189
- expect(instance.before_events).to include(before_hook)
190
- end
191
-
192
- it 'copies the after hooks' do
193
- after_hook = proc {}
194
- described_class.after_events(&after_hook)
195
-
196
- instance = described_class.new(:element)
197
- expect(instance.after_events).to include(after_hook)
198
- end
199
- end
200
- end
201
-
202
- describe '#method_missing' do
203
- context 'when no sub element definition found' do
204
- it 'delegates to the capybara element' do
205
- instance = described_class.new(instance_double(Capybara::Node::Element, visible?: true))
206
- expect(instance).to be_visible
207
- end
208
- end
209
-
210
- context 'when method not found on the capybara element' do
211
- it 'calls method on parent element' do
212
- element = Struct.new(:parent_method).new(:called)
213
- described_class.parent_element(element)
214
- instance = described_class.new(:capybara_element)
215
- expect(instance.parent_method).to eq(:called)
216
- end
217
- end
218
-
219
- context 'when the method is not found on parent' do
220
- it 'throws and exception' do
221
- described_class.parent_element(:parent_element)
222
- instance = described_class.new(:capybara_element)
223
- expect { instance.bobbins }.to raise_exception NoMethodError
224
- end
225
- end
226
- end
227
-
228
- describe '#respond_to?' do
229
- subject(:instance) do
230
- capybara_element = Struct.new(:element_method).new(:called)
231
- Class.new(described_class) do
232
- element :sub_element, css: '.sub-element'
233
- end.new(capybara_element)
234
- end
235
-
236
- it 'checks for methods on self' do
237
- expect(instance).to respond_to(:session)
238
- end
239
-
240
- it 'checks against registered elements' do
241
- expect(instance).to respond_to(:sub_element)
242
- end
243
-
244
- it 'checks for the method of the browser_element' do
245
- expect(instance).to respond_to(:element_method)
246
- end
247
- end
248
-
249
- describe '#session' do
250
- it 'has a handle to the session' do
251
- described_class.parent_element(instance_double(PageMagic::InstanceMethods, session: :session))
252
- instance = described_class.new(:capybara_element)
253
- expect(instance.session).to eq(:session)
254
- end
255
- end
256
- end
@@ -1,203 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe PageMagic::Elements::Config do
4
- describe '.build' do
5
- it 'sets of the type' do
6
- options = described_class.build([], :field)
7
- expect(options.type).to eq(:field)
8
- end
9
-
10
- it 'sets the options' do
11
- user_options = { option: 1 }
12
- options = described_class.build([{ id: 'child' }, user_options], :field)
13
- expect(options.options).to eq(user_options)
14
- end
15
-
16
- describe 'name' do
17
- context 'when supplied' do
18
- it 'sets it' do
19
- options = described_class.build([:name], :field)
20
- expect(options.name).to eq(:name)
21
- end
22
-
23
- context 'when an element class supplied' do
24
- it 'uses the supplied name' do
25
- element_class = Class.new(PageMagic::Element) do
26
- selector({ css: 'class' })
27
- def self.name
28
- 'PageSection'
29
- end
30
- end
31
-
32
- options = described_class.build([:supplied_name, element_class], :field)
33
- expect(options.name).to eq(:supplied_name)
34
- end
35
- end
36
- end
37
-
38
- context 'when not supplied' do
39
- context 'when an element class supplied' do
40
- it 'uses the name of the class' do
41
- element_class = Class.new(PageMagic::Element) do
42
- selector({ css: 'class' })
43
- def self.name
44
- 'PageSection'
45
- end
46
- end
47
-
48
- options = described_class.build([element_class], :field)
49
- expect(options.name).to eq(:page_section)
50
- end
51
- end
52
- end
53
- end
54
-
55
- describe 'selector' do
56
- context 'when selector supplied' do
57
- it 'sets the selector' do
58
- options = described_class.build([{ id: 'child' }], :field)
59
- expect(options.selector).to eq(PageMagic::Element::Selector.find(:id).build(:field, 'child'))
60
- end
61
-
62
- context 'when is empty hash' do
63
- it 'raises an error' do
64
- options = described_class.build([{}], :field)
65
- expect { options.selector }.to raise_exception(PageMagic::InvalidConfigurationException,
66
- described_class::INVALID_SELECTOR_MSG)
67
- end
68
- end
69
-
70
- context 'when defined on both class and as parameter' do
71
- it 'uses the supplied selector' do
72
- options = described_class.build([{ css: 'supplied_selector' }], :field)
73
- options.definition_class = Class.new(PageMagic::Element) do
74
- selector css: 'class_selector'
75
- end
76
- expect(options.selector).to eq(PageMagic::Element::Selector.find(:css).build(:field, 'supplied_selector'))
77
- end
78
- end
79
-
80
- context 'when page_element class supplied' do
81
- it 'uses the selector on the class' do
82
- expected_selector = { css: 'class' }
83
- element_class = Class.new(PageMagic::Element) do
84
- selector({ css: 'class' })
85
- def self.name
86
- 'PageSection'
87
- end
88
- end
89
- options = described_class.build([element_class, expected_selector], :field)
90
-
91
- expect(options.selector).to eq(PageMagic::Element::Selector.find(:css).build(:field, 'class'))
92
- end
93
- end
94
- end
95
-
96
- context 'when no selector supplied' do
97
- context 'when page_element class supplied' do
98
- it 'uses the selector on the class' do
99
- element_class = Class.new(PageMagic::Element) do
100
- selector({ css: 'class' })
101
-
102
- def self.name
103
- 'PageSection'
104
- end
105
- end
106
- options = described_class.build([element_class], :field)
107
-
108
- expect(options.selector).to eq(PageMagic::Element::Selector.find(:css).build(:field, 'class'))
109
- end
110
- end
111
- end
112
-
113
- context 'when no selector on class or page_element' do
114
- context 'when dynamically assigned element definition block' do
115
- it 'uses it' do
116
- options = described_class.build([], :field)
117
-
118
- options.definition_class = Class.new(PageMagic::Element) do
119
- selector({ css: 'class' })
120
- end
121
-
122
- expect(options.selector).to eq(PageMagic::Element::Selector.find(:css).build(:field, 'class'))
123
- end
124
- end
125
-
126
- context 'when not dynamically assigned' do
127
- it 'raises and exception' do
128
- options = described_class.build([], :field)
129
- options.definition_class = Class.new(PageMagic::Element)
130
- expect { options.selector }.to raise_exception(PageMagic::InvalidConfigurationException,
131
- described_class::INVALID_SELECTOR_MSG)
132
- end
133
- end
134
- end
135
- end
136
-
137
- it 'sets prefetched options' do
138
- options = described_class.build(%i[page_section prefetched_element], :field)
139
- expect(options.element).to eq(:prefetched_element)
140
- end
141
-
142
- context 'complex elements' do
143
- let!(:element_class) do
144
- Class.new(PageMagic::Element) do
145
- def self.name
146
- 'PageSection'
147
- end
148
- end
149
- end
150
- end
151
- end
152
-
153
- describe '.validate!' do
154
- let(:options) do
155
- {
156
- type: :type,
157
- selector: { css: 'css' },
158
- element: :object,
159
- element_class: Class.new(PageMagic::Element)
160
- }
161
- end
162
-
163
- context 'when type nil' do
164
- it 'raise an error' do
165
- subject = described_class.new(options.except(:type))
166
- expect { subject.validate! }.to raise_exception(PageMagic::InvalidConfigurationException,
167
- described_class::TYPE_REQUIRED_MESSAGE)
168
- end
169
- end
170
-
171
- describe '`element_class`' do
172
- context 'when nil' do
173
- it 'raise and error' do
174
- subject = described_class.new(options.except(:element_class))
175
- expect { subject.validate! }.to raise_exception(PageMagic::InvalidConfigurationException,
176
- described_class::INVALID_ELEMENT_CLASS_MSG)
177
- end
178
- end
179
-
180
- context 'not a type of `PageMagic::Element`' do
181
- it 'raise and error' do
182
- subject = described_class.new(options.update(element_class: Object))
183
- expect { subject.validate! }.to raise_exception(PageMagic::InvalidConfigurationException,
184
- described_class::INVALID_ELEMENT_CLASS_MSG)
185
- end
186
- end
187
- end
188
- end
189
-
190
- describe '#selector' do
191
- it 'returns a selector' do
192
- input_options = {
193
- type: :type,
194
- selector: { css: 'css' },
195
- options: { a: :b },
196
- element: :object,
197
- element_class: Class.new(PageMagic::Element)
198
- }
199
- options = described_class.new(input_options)
200
- expect(options.selector).to eq(PageMagic::Element::Selector.find(:css).build(:type, 'css', options: { a: :b }))
201
- end
202
- end
203
- end