page_magic 1.2.8 → 2.0.2

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 (101) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +23 -4
  3. data/.simplecov +5 -3
  4. data/.zsh_config +6 -0
  5. data/Dockerfile +11 -0
  6. data/Gemfile +13 -13
  7. data/Gemfile.lock +136 -148
  8. data/Makefile +17 -0
  9. data/README.md +26 -5
  10. data/Rakefile +12 -2
  11. data/VERSION +1 -1
  12. data/circle.yml +3 -1
  13. data/lib/active_support/core_ext/object/to_query.rb +84 -0
  14. data/lib/page_magic.rb +31 -24
  15. data/lib/page_magic/class_methods.rb +5 -2
  16. data/lib/page_magic/comparator.rb +37 -0
  17. data/lib/page_magic/comparator/fuzzy.rb +23 -0
  18. data/lib/page_magic/comparator/literal.rb +22 -0
  19. data/lib/page_magic/comparator/null.rb +26 -0
  20. data/lib/page_magic/comparator/parameter_map.rb +52 -0
  21. data/lib/page_magic/driver.rb +3 -0
  22. data/lib/page_magic/drivers.rb +6 -5
  23. data/lib/page_magic/drivers/poltergeist.rb +2 -0
  24. data/lib/page_magic/drivers/rack_test.rb +3 -1
  25. data/lib/page_magic/drivers/selenium.rb +4 -2
  26. data/lib/page_magic/element.rb +35 -15
  27. data/lib/page_magic/element/locators.rb +8 -5
  28. data/lib/page_magic/element/not_found.rb +38 -0
  29. data/lib/page_magic/element/query.rb +21 -20
  30. data/lib/page_magic/element/query/multiple_results.rb +21 -0
  31. data/lib/page_magic/element/query/prefetched_result.rb +26 -0
  32. data/lib/page_magic/element/query/single_result.rb +20 -0
  33. data/lib/page_magic/element/selector.rb +41 -16
  34. data/lib/page_magic/element/selector/methods.rb +18 -0
  35. data/lib/page_magic/element/selector/model.rb +21 -0
  36. data/lib/page_magic/element_context.rb +7 -21
  37. data/lib/page_magic/element_definition_builder.rb +20 -24
  38. data/lib/page_magic/elements.rb +65 -69
  39. data/lib/page_magic/elements/config.rb +103 -0
  40. data/lib/page_magic/elements/inheritance_hooks.rb +15 -0
  41. data/lib/page_magic/elements/types.rb +25 -0
  42. data/lib/page_magic/exceptions.rb +6 -1
  43. data/lib/page_magic/instance_methods.rb +8 -3
  44. data/lib/page_magic/mapping.rb +79 -0
  45. data/lib/page_magic/session.rb +15 -35
  46. data/lib/page_magic/session_methods.rb +3 -1
  47. data/lib/page_magic/transitions.rb +49 -0
  48. data/lib/page_magic/utils/string.rb +18 -0
  49. data/lib/page_magic/utils/url.rb +20 -0
  50. data/lib/page_magic/wait_methods.rb +3 -0
  51. data/lib/page_magic/watcher.rb +12 -17
  52. data/lib/page_magic/watchers.rb +31 -15
  53. data/page_magic.gemspec +15 -11
  54. data/spec/lib/active_support/core_ext/object/to_query_test.rb +78 -0
  55. data/spec/page_magic/class_methods_spec.rb +66 -37
  56. data/spec/page_magic/comparator/fuzzy_spec.rb +44 -0
  57. data/spec/page_magic/comparator/literal_spec.rb +41 -0
  58. data/spec/page_magic/comparator/null_spec.rb +35 -0
  59. data/spec/page_magic/comparator/parameter_map_spec.rb +75 -0
  60. data/spec/page_magic/driver_spec.rb +26 -28
  61. data/spec/page_magic/drivers/poltergeist_spec.rb +6 -7
  62. data/spec/page_magic/drivers/rack_test_spec.rb +6 -9
  63. data/spec/page_magic/drivers/selenium_spec.rb +11 -12
  64. data/spec/page_magic/drivers_spec.rb +38 -29
  65. data/spec/page_magic/element/locators_spec.rb +28 -25
  66. data/spec/page_magic/element/not_found_spec.rb +24 -0
  67. data/spec/page_magic/element/query/multiple_results_spec.rb +14 -0
  68. data/spec/page_magic/element/query/single_result_spec.rb +21 -0
  69. data/spec/page_magic/element/query_spec.rb +26 -45
  70. data/spec/page_magic/element/selector_spec.rb +120 -110
  71. data/spec/page_magic/element_context_spec.rb +47 -87
  72. data/spec/page_magic/element_definition_builder_spec.rb +14 -71
  73. data/spec/page_magic/element_spec.rb +256 -0
  74. data/spec/page_magic/elements/config_spec.rb +203 -0
  75. data/spec/page_magic/elements_spec.rb +90 -134
  76. data/spec/page_magic/instance_methods_spec.rb +65 -63
  77. data/spec/page_magic/mapping_spec.rb +181 -0
  78. data/spec/page_magic/session_methods_spec.rb +29 -25
  79. data/spec/page_magic/session_spec.rb +109 -199
  80. data/spec/page_magic/transitions_spec.rb +43 -0
  81. data/spec/page_magic/utils/string_spec.rb +29 -0
  82. data/spec/page_magic/utils/url_spec.rb +9 -0
  83. data/spec/page_magic/wait_methods_spec.rb +16 -22
  84. data/spec/page_magic/watcher_spec.rb +22 -0
  85. data/spec/page_magic/watchers_spec.rb +58 -62
  86. data/spec/page_magic_spec.rb +37 -29
  87. data/spec/spec_helper.rb +9 -2
  88. data/spec/support/shared_contexts.rb +3 -1
  89. data/spec/support/shared_examples.rb +17 -17
  90. metadata +101 -48
  91. data/lib/page_magic/element/query_builder.rb +0 -48
  92. data/lib/page_magic/element/selector_methods.rb +0 -13
  93. data/lib/page_magic/matcher.rb +0 -121
  94. data/spec/element_spec.rb +0 -249
  95. data/spec/page_magic/element/query_builder_spec.rb +0 -108
  96. data/spec/page_magic/matcher_spec.rb +0 -336
  97. data/spec/support/shared_contexts/files_context.rb +0 -7
  98. data/spec/support/shared_contexts/nested_elements_html_context.rb +0 -16
  99. data/spec/support/shared_contexts/rack_application_context.rb +0 -9
  100. data/spec/support/shared_contexts/webapp_fixture_context.rb +0 -39
  101. data/spec/watcher_spec.rb +0 -61
data/spec/element_spec.rb DELETED
@@ -1,249 +0,0 @@
1
- # rubocop:disable Metrics/ModuleLength
2
- module PageMagic
3
- describe Element do
4
- include_context :webapp_fixture
5
-
6
- let(:page_class) do
7
- Class.new do
8
- include PageMagic
9
- url '/elements'
10
- end
11
- end
12
-
13
- let(:session) { page_class.visit(application: rack_app) }
14
-
15
- let(:page) { session.current_page }
16
-
17
- let(:described_class) do
18
- Class.new(Element).tap { |clazz| clazz.parent_element(page) }
19
- end
20
-
21
- subject do
22
- described_class.new(:page_element)
23
- end
24
-
25
- it_behaves_like 'session accessor'
26
- it_behaves_like 'element watcher'
27
- it_behaves_like 'waiter'
28
- it_behaves_like 'element locator'
29
-
30
- describe '.after_events' do
31
- subject do
32
- Class.new(described_class)
33
- end
34
-
35
- context 'hook set' do
36
- it 'returns that hook' do
37
- hook = proc {}
38
- subject.after_events(&hook)
39
- expect(subject.after_events).to eq([described_class::DEFAULT_HOOK, hook])
40
- end
41
- end
42
- context 'hook not registered' do
43
- it 'returns the default hook' do
44
- expect(subject.after_events).to eq([described_class::DEFAULT_HOOK])
45
- end
46
- end
47
- end
48
-
49
- describe '.before_events' do
50
- subject do
51
- Class.new(described_class)
52
- end
53
-
54
- context 'hook set' do
55
- it 'returns that hook' do
56
- hook = proc {}
57
- subject.before_events(&hook)
58
- expect(subject.before_events).to eq([described_class::DEFAULT_HOOK, hook])
59
- end
60
- end
61
- context 'hook not registered' do
62
- it 'returns the default hook' do
63
- expect(subject.before_events).to eq([described_class::DEFAULT_HOOK])
64
- end
65
- end
66
- end
67
-
68
- describe '.inherited' do
69
- it 'copies before hooks' do
70
- before_hook = proc {}
71
- described_class.before_events(&before_hook)
72
- sub_class = Class.new(described_class)
73
- expect(sub_class.before_events).to include(before_hook)
74
- end
75
-
76
- it 'copies after hooks' do
77
- after_hook = proc {}
78
- described_class.after_events(&after_hook)
79
- sub_class = Class.new(described_class)
80
- expect(sub_class.after_events).to include(after_hook)
81
- end
82
-
83
- it 'lets sub classes defined their own elements' do
84
- custom_element = Class.new(described_class) do
85
- text_field :form_field, id: 'field_id'
86
-
87
- def self.name
88
- 'Form'
89
- end
90
- end
91
-
92
- page_class.class_eval do
93
- element custom_element, css: '.form'
94
- end
95
-
96
- expect(page.form.form_field).to be_visible
97
- end
98
- end
99
-
100
- describe '.watch' do
101
- let(:described_class) { Class.new(Element) }
102
- it 'adds a before hook with the watcher in it' do
103
- described_class.watch(:object_id)
104
- instance = described_class.new(:element)
105
-
106
- watcher_block = instance.before_events.last
107
- instance.instance_exec(&watcher_block)
108
- expect(instance.watchers.first.last).to eq(instance.object_id)
109
- end
110
- end
111
-
112
- describe 'EVENT_TYPES' do
113
- context 'methods created' do
114
- it 'creates methods for each of the event types' do
115
- missing = described_class::EVENT_TYPES.find_all { |event| !subject.respond_to?(event) }
116
- expect(missing).to be_empty
117
- end
118
-
119
- context 'method called' do
120
- let(:browser_element) { instance_double(Capybara::Node::Element) }
121
- subject do
122
- described_class.new(browser_element)
123
- end
124
- it 'calls the browser_element passing on all args' do
125
- expect(browser_element).to receive(:select).with(:args)
126
- subject.select :args
127
- end
128
- end
129
-
130
- context 'Capybara element does not respond to the method' do
131
- it 'raises an error' do
132
- expected_message = (described_class::EVENT_NOT_SUPPORTED_MSG % 'click')
133
- expect { subject.click }.to raise_error(NotSupportedException, expected_message)
134
- end
135
- end
136
- end
137
- end
138
-
139
- describe 'hooks' do
140
- subject do
141
- Class.new(described_class) do
142
- before_events do
143
- call_in_before_events
144
- end
145
- end.new(double('button', click: true))
146
- end
147
- context 'method called in before_events' do
148
- it 'calls methods on the page element' do
149
- expect(subject).to receive(:call_in_before_events)
150
- subject.click
151
- end
152
- end
153
-
154
- context 'method called in after_events' do
155
- subject do
156
- Class.new(described_class) do
157
- after_events do
158
- call_in_after_events
159
- end
160
- end.new(double('button', click: true))
161
- end
162
-
163
- it 'calls methods on the page element' do
164
- expect(subject).to receive(:call_in_after_events)
165
- subject.click
166
- end
167
- end
168
- end
169
-
170
- describe '#initialize' do
171
- it 'sets the parent element' do
172
- instance = described_class.new(:element)
173
- expect(instance.parent_element).to eq(page)
174
- end
175
-
176
- context 'inherited items' do
177
- let(:described_class) do
178
- Class.new(Element)
179
- end
180
-
181
- it 'copies the event hooks from the class' do
182
- before_hook = proc {}
183
- after_hook = proc {}
184
- described_class.before_events(&before_hook)
185
- described_class.after_events(&after_hook)
186
-
187
- instance = described_class.new(:element)
188
-
189
- expect(instance.before_events).to include(before_hook)
190
- expect(instance.after_events).to include(after_hook)
191
- end
192
- end
193
- end
194
-
195
- describe '#method_missing' do
196
- before do
197
- page_class.class_eval do
198
- element :form_by_css, css: '.form' do
199
- def parent_method
200
- :parent_method_called
201
- end
202
- link(:link_in_form, text: 'link in a form')
203
- end
204
- end
205
- end
206
-
207
- it 'can delegate to capybara' do
208
- expect(page.form_by_css).to be_visible
209
- end
210
-
211
- context 'no element definition and not a capybara method' do
212
- it 'calls method on parent element' do
213
- expect(page.form_by_css.link_in_form.parent_method).to eq(:parent_method_called)
214
- end
215
-
216
- context 'method not found on parent' do
217
- it 'throws and exception' do
218
- expect { page.form_by_css.link_in_a_form.bobbins }.to raise_exception ElementMissingException
219
- end
220
- end
221
- end
222
- end
223
-
224
- describe '#respond_to?' do
225
- subject do
226
- Class.new(described_class) do
227
- element :sub_element, css: '.sub-element'
228
- end.new(double(element_method: ''))
229
- end
230
- it 'checks for methods on self' do
231
- expect(subject.respond_to?(:session)).to eq(true)
232
- end
233
-
234
- it 'checks against registered elements' do
235
- expect(subject.respond_to?(:sub_element)).to eq(true)
236
- end
237
-
238
- it 'checks for the method of the browser_element' do
239
- expect(subject.respond_to?(:element_method)).to eq(true)
240
- end
241
- end
242
-
243
- describe '#session' do
244
- it 'should have a handle to the session' do
245
- expect(subject.session).to eq(page.session)
246
- end
247
- end
248
- end
249
- end
@@ -1,108 +0,0 @@
1
- module PageMagic
2
- class Element
3
- describe QueryBuilder do
4
- it 'has a predefined query for each element type' do
5
- missing = PageMagic::Elements::TYPES.dup.delete_if { |type| type.to_s.end_with?('s') }.find_all do |type|
6
- described_class.constants.include?(type)
7
- end
8
- expect(missing).to be_empty
9
- end
10
-
11
- describe '.find' do
12
- it 'finds the constant with the given name' do
13
- expect(described_class.find(:button)).to be(described_class::BUTTON)
14
- end
15
-
16
- context 'constant not found' do
17
- it 'returns a default' do
18
- expect(described_class.find(:billy)).to be(described_class::ELEMENT)
19
- end
20
- end
21
- end
22
-
23
- describe '#build' do
24
- let(:selector) { Selector.new }
25
- before do
26
- expect(Selector).to receive(:find).with(:css).and_return(selector)
27
- end
28
- let(:locator) { { css: '.css' } }
29
-
30
- it 'builds a query using the correct selector' do
31
- expected = Query.new(locator.values)
32
- expect(subject.build(locator)).to eq(expected)
33
- end
34
-
35
- it 'adds options to the result' do
36
- expected = Query.new(locator.values.concat([:options]))
37
- expect(subject.build(locator, :options)).to eq(expected)
38
- end
39
-
40
- context 'selector support element type' do
41
- subject do
42
- described_class.new(:field)
43
- end
44
-
45
- it 'passes element type through to the selector' do
46
- expect(selector).to receive(:build).with(:field, '.css').and_call_original
47
- subject.build(locator)
48
- end
49
- end
50
- end
51
- end
52
-
53
- class QueryBuilder
54
- describe BUTTON do
55
- it 'has an element type' do
56
- expect(described_class.type).to eq(:button)
57
- end
58
- end
59
-
60
- describe ELEMENT do
61
- it ' does not has an element type' do
62
- expect(described_class.type).to be_nil
63
- end
64
- end
65
-
66
- describe LINK do
67
- it 'has an element type' do
68
- expect(described_class.type).to eq(:link)
69
- end
70
- end
71
-
72
- describe TEXT_FIELD do
73
- it 'has an element type' do
74
- expect(described_class.type).to eq(:field)
75
- end
76
-
77
- it 'the same as all form field types' do
78
- expect(described_class).to eq(CHECKBOX).and eq(SELECT_LIST).and eq(RADIO).and eq(TEXTAREA)
79
- end
80
- end
81
- end
82
-
83
- context 'integration' do
84
- include_context :webapp_fixture
85
- let(:capybara_session) { Capybara::Session.new(:rack_test, rack_app).tap { |s| s.visit('/elements') } }
86
-
87
- it 'finds fields' do
88
- query = QueryBuilder.find(:text_field).build(name: 'field_name')
89
- expect(query.execute(capybara_session).tag_name).to eq('input')
90
- end
91
-
92
- it 'finds buttons' do
93
- query = QueryBuilder.find(:button).build(text: 'a button')
94
- expect(query.execute(capybara_session).tag_name).to eq('button')
95
- end
96
-
97
- it 'finds links' do
98
- query = QueryBuilder.find(:link).build(text: 'a link')
99
- expect(query.execute(capybara_session).tag_name).to eq('a')
100
- end
101
-
102
- it 'finds elements' do
103
- query = QueryBuilder.find(:element).build(name: 'field_name')
104
- expect(query.execute(capybara_session).tag_name).to eq('input')
105
- end
106
- end
107
- end
108
- end
@@ -1,336 +0,0 @@
1
- # rubocop:disable Metrics/ModuleLength
2
- module PageMagic
3
- describe Matcher do
4
- describe '#initialize' do
5
- context 'no componentes specified' do
6
- it 'raises an exeception' do
7
- expect { described_class.new }.to raise_exception(MatcherInvalidException)
8
- end
9
- end
10
- end
11
- describe '#can_compute_uri?' do
12
- context 'regex in path' do
13
- it 'returns false' do
14
- expect(described_class.new(//).can_compute_uri?).to eq(false)
15
- end
16
- end
17
-
18
- context 'regex in parameters' do
19
- it 'returns false' do
20
- expect(described_class.new(parameters: { param: // }).can_compute_uri?).to eq(false)
21
- end
22
- end
23
-
24
- context 'regexp in fragment' do
25
- it 'returns false' do
26
- expect(described_class.new(fragment: //).can_compute_uri?).to eq(false)
27
- end
28
- end
29
-
30
- context 'regexp not present' do
31
- it 'returns true' do
32
- expect(described_class.new('/').can_compute_uri?).to eq(true)
33
- end
34
- end
35
- end
36
-
37
- describe 'compare' do
38
- subject { described_class.new('/') }
39
- context 'param 1 not nil' do
40
- context 'param 2 not nil' do
41
- context 'literal to fuzzy' do
42
- it 'returns -1' do
43
- expect(subject.instance_eval { compare('/', //) }).to eq(-1)
44
- end
45
- end
46
-
47
- context 'literal to literal' do
48
- it 'returns 0' do
49
- expect(subject.instance_eval { compare('/', '/') }).to eq(0)
50
- end
51
- end
52
-
53
- context 'fuzzy to fuzzy' do
54
- it 'returns 0' do
55
- expect(subject.instance_eval { compare(//, //) }).to eq(0)
56
- end
57
- end
58
-
59
- context 'fuzzy to literal' do
60
- it 'returns 1' do
61
- expect(subject.instance_eval { compare(//, '/') }).to eq(1)
62
- end
63
- end
64
- end
65
-
66
- context 'param2 is nil' do
67
- it 'returns -1' do
68
- expect(subject.instance_eval { compare('/', nil) }).to eq(-1)
69
- end
70
- end
71
- end
72
-
73
- context 'param1 is nil' do
74
- context 'param2 not nil' do
75
- it 'returns 1' do
76
- expect(subject.instance_eval { compare(nil, '/') }).to eq(1)
77
- end
78
- end
79
-
80
- context 'param2 nil' do
81
- it 'returns 0' do
82
- expect(subject.instance_eval { compare(nil, nil) }).to eq(0)
83
- end
84
- end
85
- end
86
- end
87
-
88
- describe 'compute_uri' do
89
- context 'path present' do
90
- it 'returns a uri' do
91
- expect(described_class.new('/').compute_uri).to eq('/')
92
- end
93
- end
94
-
95
- context 'params present' do
96
- context '1 param' do
97
- it 'returns a uri' do
98
- expect(described_class.new(parameters: { a: 1 }).compute_uri).to eq('?a=1')
99
- end
100
- end
101
-
102
- context 'more than 1 param' do
103
- it 'returns a uri' do
104
- expect(described_class.new(parameters: { a: 1, b: 2 }).compute_uri).to eq('?a=1&b=2')
105
- end
106
- end
107
- end
108
-
109
- context 'fragment present' do
110
- it 'returns a uri' do
111
- expect(described_class.new(fragment: 'fragment').compute_uri).to eq('#fragment')
112
- end
113
- end
114
- end
115
-
116
- describe '#matches?' do
117
- let(:matching_url) { 'http://www.example.com/path?foo=bar#fragment' }
118
- let(:incompatible_url) { 'http://www.example.com/mismatch?miss=match#mismatch' }
119
- context 'path requirement exists' do
120
- context 'path is literal' do
121
- subject do
122
- described_class.new('/path')
123
- end
124
- it 'returns true for an exact match' do
125
- expect(subject.match?(matching_url)).to eq(true)
126
- end
127
-
128
- it 'returns false when not an exact match' do
129
- expect(subject.match?(incompatible_url)).to eq(false)
130
- end
131
- end
132
-
133
- context 'path is regexp' do
134
- subject do
135
- described_class.new(/\d/)
136
- end
137
- it 'returns true for a match on the regexp' do
138
- expect(subject.match?('3')).to eq(true)
139
- end
140
-
141
- it 'returns false when regexp is not a match' do
142
- expect(subject.match?('/mismatch')).to eq(false)
143
- end
144
- end
145
- end
146
-
147
- context 'query string requirement exists' do
148
- context 'parameter requirement is a literal' do
149
- subject do
150
- described_class.new(parameters: { foo: 'bar' })
151
- end
152
-
153
- it 'returns true for a match' do
154
- expect(subject.match?(matching_url)).to eq(true)
155
- end
156
-
157
- it 'returns false when regexp is not a match' do
158
- expect(subject.match?(incompatible_url)).to eq(false)
159
- end
160
- end
161
-
162
- context 'parameter requirement is a regexp' do
163
- subject do
164
- described_class.new(parameters: { foo: /b[a]r/ })
165
- end
166
-
167
- it 'returns true for a match on the regexp' do
168
- expect(subject.match?(matching_url)).to eq(true)
169
- end
170
-
171
- it 'returns false when regexp is not a match' do
172
- expect(subject.match?(incompatible_url)).to eq(false)
173
- end
174
- end
175
- end
176
-
177
- context 'fragment requirement exists' do
178
- context 'fragment requirement is a literal' do
179
- subject do
180
- described_class.new(fragment: 'fragment')
181
- end
182
-
183
- it 'returns true for a match' do
184
- expect(subject.match?(matching_url)).to eq(true)
185
- end
186
-
187
- it 'returns false when regexp is not a match' do
188
- expect(subject.match?(incompatible_url)).to eq(false)
189
- end
190
- end
191
-
192
- context 'fragment requirement is a regexp' do
193
- subject do
194
- described_class.new(fragment: /fragment/)
195
- end
196
-
197
- it 'returns true for a match on the regexp' do
198
- expect(subject.match?(matching_url)).to eq(true)
199
- end
200
-
201
- it 'returns false when regexp is not a match' do
202
- expect(subject.match?(incompatible_url)).to eq(false)
203
- end
204
- end
205
- end
206
- end
207
-
208
- describe '<=>' do
209
- let(:literal_path_matcher) { '/' }
210
- let(:fuzzy_path_matcher) { // }
211
- let(:literal_parameter_matchers) { { param: 'value' } }
212
- let(:fuzzy_parameter_matchers) { { param: // } }
213
-
214
- let(:literal_fragment_matcher) { 'fragment' }
215
- let(:fuzzy_fragment_matcher) { // }
216
-
217
- context 'path' do
218
- context 'path is of same class as path on other' do
219
- subject(:a) { described_class.new('/a') }
220
- subject(:b) { described_class.new('/b') }
221
- it 'returns self and other as equivalent' do
222
- expect(a <=> b).to eq(0)
223
- end
224
- end
225
-
226
- context 'path on other is fuzzy' do
227
- subject(:a) { described_class.new(literal_path_matcher) }
228
- subject(:b) { described_class.new(fuzzy_path_matcher) }
229
- it 'returns other as lesser' do
230
- expect(a <=> b).to eq(-1)
231
- end
232
- end
233
- end
234
-
235
- context 'parameters' do
236
- context 'parameters on self and other contain literal values' do
237
- subject(:a) do
238
- described_class.new(literal_path_matcher,
239
- parameters: literal_parameter_matchers)
240
- end
241
- subject(:b) do
242
- described_class.new(literal_path_matcher,
243
- parameters: literal_parameter_matchers)
244
- end
245
- it 'returns self and other as equivalent' do
246
- expect(a <=> b).to eq(0)
247
- end
248
- end
249
-
250
- context 'parameters on self literal values and other has fuzzy values' do
251
- subject(:a) do
252
- described_class.new(literal_path_matcher,
253
- parameters: literal_parameter_matchers)
254
- end
255
- subject(:b) do
256
- described_class.new(literal_path_matcher,
257
- parameters: fuzzy_parameter_matchers)
258
- end
259
- it 'returns other as lesser' do
260
- expect(a <=> b).to eq(-1)
261
- end
262
- end
263
- context 'parameters on self fuzzy values and other has literal values' do
264
- subject(:a) do
265
- described_class.new(literal_path_matcher,
266
- parameters: fuzzy_parameter_matchers)
267
- end
268
-
269
- subject(:b) do
270
- described_class.new(literal_path_matcher,
271
- parameters: literal_parameter_matchers)
272
- end
273
-
274
- it 'returns other as greater' do
275
- expect(a <=> b).to eq(1)
276
- end
277
- end
278
- end
279
-
280
- context 'fragment' do
281
- context 'fragment is of same class as path on other' do
282
- subject(:a) do
283
- described_class.new(literal_path_matcher,
284
- parameters: literal_parameter_matchers,
285
- fragment: literal_fragment_matcher)
286
- end
287
-
288
- subject(:b) do
289
- described_class.new(literal_path_matcher,
290
- parameters: literal_parameter_matchers,
291
- fragment: literal_fragment_matcher)
292
- end
293
-
294
- it 'returns self and other as equivalent' do
295
- expect(a <=> b).to eq(0)
296
- end
297
- end
298
-
299
- context 'fragment is literal on self and fuzzy on other' do
300
- subject(:a) do
301
- described_class.new(literal_path_matcher,
302
- parameters: literal_parameter_matchers,
303
- fragment: literal_fragment_matcher)
304
- end
305
-
306
- subject(:b) do
307
- described_class.new(literal_path_matcher,
308
- parameters: literal_parameter_matchers,
309
- fragment: fuzzy_fragment_matcher)
310
- end
311
-
312
- it 'returns other as lesser' do
313
- expect(a <=> b).to eq(-1)
314
- end
315
- end
316
-
317
- context 'fragment is fuzzy on self and literal on other' do
318
- subject(:a) do
319
- described_class.new(literal_path_matcher,
320
- parameters: literal_parameter_matchers,
321
- fragment: fuzzy_fragment_matcher)
322
- end
323
-
324
- subject(:b) do
325
- described_class.new(literal_path_matcher,
326
- parameters: literal_parameter_matchers,
327
- fragment: literal_fragment_matcher)
328
- end
329
- it 'returns other as lesser' do
330
- expect(a <=> b).to eq(1)
331
- end
332
- end
333
- end
334
- end
335
- end
336
- end