page_magic 2.0.3 → 2.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/lib/page_magic/drivers/selenium.rb +1 -1
  4. data/lib/page_magic/session.rb +12 -3
  5. metadata +55 -90
  6. data/.codeclimate.yml +0 -4
  7. data/.pullreview.yml +0 -14
  8. data/.rspec +0 -1
  9. data/.rubocop.yml +0 -39
  10. data/.simplecov +0 -10
  11. data/.zsh_config +0 -6
  12. data/Dockerfile +0 -11
  13. data/Gemfile +0 -24
  14. data/Gemfile.lock +0 -178
  15. data/Makefile +0 -17
  16. data/Rakefile +0 -32
  17. data/circle.yml +0 -8
  18. data/page_magic.gemspec +0 -128
  19. data/spec/lib/active_support/core_ext/object/to_query_test.rb +0 -78
  20. data/spec/page_magic/class_methods_spec.rb +0 -92
  21. data/spec/page_magic/comparator/fuzzy_spec.rb +0 -44
  22. data/spec/page_magic/comparator/literal_spec.rb +0 -41
  23. data/spec/page_magic/comparator/null_spec.rb +0 -35
  24. data/spec/page_magic/comparator/parameter_map_spec.rb +0 -75
  25. data/spec/page_magic/driver_spec.rb +0 -40
  26. data/spec/page_magic/drivers/poltergeist_spec.rb +0 -8
  27. data/spec/page_magic/drivers/rack_test_spec.rb +0 -8
  28. data/spec/page_magic/drivers/selenium_spec.rb +0 -15
  29. data/spec/page_magic/drivers_spec.rb +0 -48
  30. data/spec/page_magic/element/locators_spec.rb +0 -36
  31. data/spec/page_magic/element/not_found_spec.rb +0 -24
  32. data/spec/page_magic/element/query/multiple_results_spec.rb +0 -14
  33. data/spec/page_magic/element/query/single_result_spec.rb +0 -21
  34. data/spec/page_magic/element/query_spec.rb +0 -38
  35. data/spec/page_magic/element/selector_spec.rb +0 -166
  36. data/spec/page_magic/element_context_spec.rb +0 -72
  37. data/spec/page_magic/element_definition_builder_spec.rb +0 -19
  38. data/spec/page_magic/element_spec.rb +0 -256
  39. data/spec/page_magic/elements/config_spec.rb +0 -203
  40. data/spec/page_magic/elements_spec.rb +0 -125
  41. data/spec/page_magic/instance_methods_spec.rb +0 -90
  42. data/spec/page_magic/mapping_spec.rb +0 -181
  43. data/spec/page_magic/session_methods_spec.rb +0 -40
  44. data/spec/page_magic/session_spec.rb +0 -149
  45. data/spec/page_magic/transitions_spec.rb +0 -43
  46. data/spec/page_magic/utils/string_spec.rb +0 -29
  47. data/spec/page_magic/utils/url_spec.rb +0 -9
  48. data/spec/page_magic/wait_methods_spec.rb +0 -35
  49. data/spec/page_magic/watcher_spec.rb +0 -22
  50. data/spec/page_magic/watchers_spec.rb +0 -80
  51. data/spec/page_magic_spec.rb +0 -115
  52. data/spec/spec_helper.rb +0 -15
  53. data/spec/support/shared_contexts.rb +0 -5
  54. data/spec/support/shared_examples.rb +0 -25
@@ -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
@@ -1,125 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe PageMagic::Elements do
4
- subject do
5
- Class.new do
6
- extend PageMagic::Elements
7
- include PageMagic::Element::Locators
8
- end
9
- end
10
-
11
- let(:instance) do
12
- subject.new
13
- end
14
- let(:child_selector) { { id: 'child' } }
15
-
16
- context 'element types' do
17
- it 'provides all of the type provided by capybara' do
18
- capybara_elements = Capybara::Selector.all.except(*%i[element datalist_input datalist_option id xpath css]).keys
19
- expect(described_class::TYPES).to include(*capybara_elements)
20
- end
21
- end
22
-
23
- describe '#element' do
24
- it 'converts arguments in to options' do
25
- allow(PageMagic::Elements::Config)
26
- .to receive(:build)
27
- .with([:alias, child_selector, { visible: true }], :text_field)
28
- .and_call_original
29
- subject.text_fields :alias, child_selector, visible: true
30
- end
31
-
32
- context 'complex elements' do
33
- let!(:section_class) do
34
- Class.new(PageMagic::Element) do
35
- def self.name
36
- 'PageSection'
37
- end
38
- end
39
- end
40
-
41
- context 'using a predefined class' do
42
- it 'adds an element using that class section' do
43
- subject.element section_class, :page_section, child_selector
44
- element_definition_builder = instance.element_by_name(:page_section)
45
- expect(element_definition_builder.send(:definition_class)).to be < section_class
46
- end
47
- end
48
- end
49
-
50
- context 'using a block' do
51
- it 'passes the parent element in as the last argument' do
52
- expected_element = instance
53
- subject.element :page_section, child_selector do |_arg1|
54
- extend RSpec::Matchers
55
- expect(parent_element).to eq(expected_element)
56
- end
57
- instance.element_by_name(:page_section, :arg1)
58
- end
59
-
60
- it 'passes args through to the block' do
61
- subject.element :page_section, child_selector do |arg|
62
- extend RSpec::Matchers
63
- expect(arg).to eq(:arg1)
64
- end
65
-
66
- instance.element_by_name(:page_section, :arg1)
67
- end
68
- end
69
-
70
- describe 'restrictions' do
71
- subject do
72
- Class.new.tap do |clazz|
73
- clazz.extend(described_class)
74
- end
75
- end
76
-
77
- it 'does not allow method names that match element names' do
78
- expect do
79
- subject.class_eval do
80
- link(:hello, text: 'world')
81
-
82
- def hello; end
83
- end
84
- end.to raise_error(PageMagic::InvalidMethodNameException)
85
- end
86
-
87
- it 'does not allow element names that match method names' do
88
- expect do
89
- subject.class_eval do
90
- def hello; end
91
-
92
- link(:hello, text: 'world')
93
- end
94
- end.to raise_error(PageMagic::InvalidElementNameException)
95
- end
96
-
97
- it 'does not allow duplicate element names' do
98
- expect do
99
- subject.class_eval do
100
- link(:hello, text: 'world')
101
- link(:hello, text: 'world')
102
- end
103
- end.to raise_error(PageMagic::InvalidElementNameException)
104
- end
105
-
106
- it 'does not evaluate the elements when applying naming checks' do
107
- subject.class_eval do
108
- link(:link1, :selector) do
109
- raise('should not have been evaluated')
110
- end
111
- link(:link2, :selector)
112
- end
113
- end
114
- end
115
- end
116
-
117
- describe '#element_definitions' do
118
- it 'returns your a copy of the core definition' do
119
- subject.text_field :alias, child_selector
120
- first = instance.element_by_name(:alias)
121
- second = instance.element_by_name(:alias)
122
- expect(first).not_to equal(second)
123
- end
124
- end
125
- end
@@ -1,90 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe PageMagic::InstanceMethods do
4
- let(:page_class) do
5
- Class.new.tap do |klass|
6
- klass.include(described_class)
7
- end
8
- end
9
-
10
- it_behaves_like 'session accessor'
11
- it_behaves_like 'element watcher'
12
- it_behaves_like 'waiter'
13
- it_behaves_like 'element locator'
14
-
15
- describe 'execute_on_load' do
16
- let(:page_class) do
17
- Class.new.tap do |klass|
18
- klass.extend(PageMagic::ClassMethods)
19
- klass.include(described_class)
20
- klass.include RSpec::Matchers
21
- end
22
- end
23
-
24
- it 'runs the on_load_hook in the context of self' do
25
- instance = page_class.new
26
- page_class.on_load do
27
- expect(self).to be(instance)
28
- end
29
-
30
- instance.execute_on_load
31
- end
32
-
33
- it 'returns self' do
34
- instance = page_class.new
35
- expect(instance.execute_on_load).to be(instance)
36
- end
37
- end
38
-
39
- describe '#respond_to?' do
40
- it 'checks element definitions' do
41
- instance = page_class.new
42
- allow(instance).to receive(:contains_element?).and_return(true)
43
- expect(instance).to respond_to(:next_page)
44
- end
45
- end
46
-
47
- describe '#text' do
48
- it 'returns the text on the page' do
49
- session = PageMagic::Session.new(instance_double(Capybara::Session, text: 'text'))
50
- instance = page_class.new(session)
51
- expect(instance.text).to eq('text')
52
- end
53
- end
54
-
55
- describe '#text_on_page?' do
56
- it 'returns true if the text is present' do
57
- session = PageMagic::Session.new(instance_double(Capybara::Session, text: 'text'))
58
- instance = page_class.new(session)
59
-
60
- expect(instance.text_on_page?('text')).to eq(true)
61
- end
62
-
63
- it 'returns false if the text is not present' do
64
- session = PageMagic::Session.new(instance_double(Capybara::Session, text: 'text'))
65
- instance = page_class.new(session)
66
-
67
- expect(instance.text_on_page?('not on page')).to eq(false)
68
- end
69
- end
70
-
71
- describe 'title' do
72
- it 'returns the title' do
73
- session = PageMagic::Session.new(instance_double(Capybara::Session, title: 'page1'))
74
- instance = page_class.new(session)
75
-
76
- expect(instance.title).to eq('page1')
77
- end
78
- end
79
-
80
- describe 'method_missing' do
81
- let(:spy_element_context) { spy }
82
-
83
- it 'gives access to element definitions' do
84
- instance = page_class.new
85
- allow(PageMagic::ElementContext).to receive(:new).with(instance).and_return(spy_element_context)
86
- instance.next_page(:arg1, :arg2)
87
- expect(spy_element_context).to have_received(:next_page).with(:arg1, :arg2)
88
- end
89
- end
90
- end
@@ -1,181 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe PageMagic::Mapping do
4
- describe '#can_compute_uri?' do
5
- context 'when there is a regex in the path' do
6
- it 'returns false' do
7
- expect(described_class.new(//).can_compute_uri?).to eq(false)
8
- end
9
- end
10
-
11
- context 'when there is a regex in `parameters`' do
12
- it 'returns false' do
13
- expect(described_class.new(parameters: { param: // }).can_compute_uri?).to eq(false)
14
- end
15
- end
16
-
17
- context 'when there is a regexp in `fragment`' do
18
- it 'returns false' do
19
- expect(described_class.new(fragment: //).can_compute_uri?).to eq(false)
20
- end
21
- end
22
-
23
- context 'when matching element is a regexp' do
24
- it 'returns true' do
25
- expect(described_class.new('/').can_compute_uri?).to eq(true)
26
- end
27
- end
28
- end
29
-
30
- describe '<=>' do
31
- context 'when other does not have a `path`' do
32
- it 'is greater' do
33
- expect(described_class.new('/') <=> described_class.new(parameters: {})).to be 1
34
- end
35
- end
36
-
37
- context 'other has a `path`' do
38
- it 'compares them' do
39
- expect(described_class.new('/', parameters: { param: 1 }) <=> described_class.new('/')).to be 1
40
- end
41
-
42
- context 'other has does not have a fragment' do
43
- it 'is lesser' do
44
- expect(described_class.new('/', parameters: { param: 1 },
45
- fragment: '') <=> described_class.new('/', parameters: { param: 1 })).to be 1
46
- end
47
- end
48
-
49
- context 'other has a fragment' do
50
- it 'is compares them' do
51
- expect(described_class.new('/', parameters: { param: 1 },
52
- fragment: '') <=> described_class.new('/', parameters: { param: 1 },
53
- fragment: //)).to be 1
54
- end
55
- end
56
- end
57
- end
58
-
59
- describe 'compute_uri' do
60
- context 'when path present' do
61
- it 'returns a uri' do
62
- expect(described_class.new('/').compute_uri).to eq('/')
63
- end
64
- end
65
-
66
- context 'when matching on parameters' do
67
- context 'when matching on 1 parameter' do
68
- it 'returns a uri' do
69
- expect(described_class.new(parameters: { a: 1 }).compute_uri).to eq('?a=1')
70
- end
71
- end
72
-
73
- context 'when matching on more than 1 parameter' do
74
- it 'returns a uri' do
75
- expect(described_class.new(parameters: { a: 1, b: 2 }).compute_uri).to eq('?a=1&b=2')
76
- end
77
- end
78
- end
79
-
80
- context 'when matching on a fragment' do
81
- it 'returns a uri' do
82
- expect(described_class.new(fragment: 'fragment').compute_uri).to eq('#fragment')
83
- end
84
- end
85
- end
86
-
87
- describe '#matches?' do
88
- let(:matching_url) { 'http://www.example.com/path?foo=bar#fragment' }
89
- let(:incompatible_url) { 'http://www.example.com/mismatch?miss=match#mismatch' }
90
-
91
- context 'when matching on path' do
92
- context 'when using a literal' do
93
- subject do
94
- described_class.new('/path')
95
- end
96
-
97
- it 'returns true for an exact match' do
98
- expect(subject.match?(matching_url)).to eq(true)
99
- end
100
-
101
- it 'returns false when not an exact match' do
102
- expect(subject.match?(incompatible_url)).to eq(false)
103
- end
104
- end
105
-
106
- context 'when using a regexp' do
107
- subject do
108
- described_class.new(/\d/)
109
- end
110
-
111
- it 'returns true for a match on the regexp' do
112
- expect(subject.match?('3')).to eq(true)
113
- end
114
-
115
- it 'returns false when regexp is not a match' do
116
- expect(subject.match?('/mismatch')).to eq(false)
117
- end
118
- end
119
- end
120
-
121
- context 'when matching on the query string' do
122
- context 'parameter requirement is a literal' do
123
- subject do
124
- described_class.new(parameters: { foo: 'bar' })
125
- end
126
-
127
- it 'returns true for a match' do
128
- expect(subject.match?(matching_url)).to eq(true)
129
- end
130
-
131
- it 'returns false when regexp is not a match' do
132
- expect(subject.match?(incompatible_url)).to eq(false)
133
- end
134
- end
135
-
136
- context 'when matching on parameters' do
137
- subject do
138
- described_class.new(parameters: { foo: /bar/ })
139
- end
140
-
141
- it 'returns true for a match on the regexp' do
142
- expect(subject.match?(matching_url)).to eq(true)
143
- end
144
-
145
- it 'returns false when regexp is not a match' do
146
- expect(subject.match?(incompatible_url)).to eq(false)
147
- end
148
- end
149
- end
150
-
151
- context 'when matching on the fragment' do
152
- context 'when the fragment requirement is a literal' do
153
- subject do
154
- described_class.new(fragment: 'fragment')
155
- end
156
-
157
- it 'returns true for a match' do
158
- expect(subject.match?(matching_url)).to eq(true)
159
- end
160
-
161
- it 'returns false when regexp is not a match' do
162
- expect(subject.match?(incompatible_url)).to eq(false)
163
- end
164
- end
165
-
166
- context 'when the fragment requirement is a regexp' do
167
- subject do
168
- described_class.new(fragment: /fragment/)
169
- end
170
-
171
- it 'returns true for a match on the regexp' do
172
- expect(subject.match?(matching_url)).to eq(true)
173
- end
174
-
175
- it 'returns false when regexp is not a match' do
176
- expect(subject.match?(incompatible_url)).to eq(false)
177
- end
178
- end
179
- end
180
- end
181
- end