page_magic 2.0.0.alpha1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +5 -2
- data/.zsh_config +5 -5
- data/Dockerfile +2 -1
- data/Gemfile +2 -1
- data/Gemfile.lock +9 -5
- data/Makefile +7 -3
- data/README.md +16 -4
- data/VERSION +1 -1
- data/lib/active_support/core_ext/object/to_query.rb +6 -6
- data/lib/page_magic.rb +15 -16
- data/lib/page_magic/class_methods.rb +1 -1
- data/lib/page_magic/comparator.rb +37 -0
- data/lib/page_magic/comparator/fuzzy.rb +23 -0
- data/lib/page_magic/comparator/literal.rb +22 -0
- data/lib/page_magic/comparator/null.rb +26 -0
- data/lib/page_magic/comparator/parameter_map.rb +52 -0
- data/lib/page_magic/drivers.rb +2 -2
- data/lib/page_magic/element.rb +19 -8
- data/lib/page_magic/element/locators.rb +4 -4
- data/lib/page_magic/element/not_found.rb +38 -0
- data/lib/page_magic/element/query.rb +19 -27
- data/lib/page_magic/element/query/multiple_results.rb +21 -0
- data/lib/page_magic/element/query/prefetched_result.rb +26 -0
- data/lib/page_magic/element/query/single_result.rb +20 -0
- data/lib/page_magic/element/selector.rb +38 -16
- data/lib/page_magic/element/selector/methods.rb +18 -0
- data/lib/page_magic/element/selector/model.rb +21 -0
- data/lib/page_magic/element_context.rb +5 -21
- data/lib/page_magic/element_definition_builder.rb +17 -24
- data/lib/page_magic/elements.rb +62 -102
- data/lib/page_magic/elements/config.rb +103 -0
- data/lib/page_magic/elements/inheritance_hooks.rb +15 -0
- data/lib/page_magic/elements/types.rb +25 -0
- data/lib/page_magic/exceptions.rb +3 -0
- data/lib/page_magic/instance_methods.rb +2 -2
- data/lib/page_magic/mapping.rb +79 -0
- data/lib/page_magic/session.rb +10 -32
- data/lib/page_magic/session_methods.rb +1 -1
- data/lib/page_magic/transitions.rb +49 -0
- data/lib/page_magic/utils/string.rb +4 -0
- data/lib/page_magic/utils/url.rb +20 -0
- data/lib/page_magic/watcher.rb +10 -17
- data/lib/page_magic/watchers.rb +28 -15
- data/spec/page_magic/class_methods_spec.rb +64 -37
- data/spec/page_magic/comparator/fuzzy_spec.rb +44 -0
- data/spec/page_magic/comparator/literal_spec.rb +41 -0
- data/spec/page_magic/comparator/null_spec.rb +35 -0
- data/spec/page_magic/comparator/parameter_map_spec.rb +75 -0
- data/spec/page_magic/driver_spec.rb +25 -29
- data/spec/page_magic/drivers/poltergeist_spec.rb +4 -7
- data/spec/page_magic/drivers/rack_test_spec.rb +4 -9
- data/spec/page_magic/drivers/selenium_spec.rb +9 -12
- data/spec/page_magic/drivers_spec.rb +36 -29
- data/spec/page_magic/element/locators_spec.rb +26 -25
- data/spec/page_magic/element/not_found_spec.rb +24 -0
- data/spec/page_magic/element/query/multiple_results_spec.rb +14 -0
- data/spec/page_magic/element/query/single_result_spec.rb +21 -0
- data/spec/page_magic/element/query_spec.rb +26 -47
- data/spec/page_magic/element/selector_spec.rb +118 -110
- data/spec/page_magic/element_context_spec.rb +46 -88
- data/spec/page_magic/element_definition_builder_spec.rb +12 -71
- data/spec/page_magic/element_spec.rb +256 -0
- data/spec/page_magic/elements/config_spec.rb +200 -0
- data/spec/page_magic/elements_spec.rb +87 -138
- data/spec/page_magic/instance_methods_spec.rb +63 -63
- data/spec/page_magic/mapping_spec.rb +181 -0
- data/spec/page_magic/session_methods_spec.rb +27 -25
- data/spec/page_magic/session_spec.rb +109 -198
- data/spec/page_magic/transitions_spec.rb +43 -0
- data/spec/page_magic/utils/string_spec.rb +20 -27
- data/spec/page_magic/utils/url_spec.rb +9 -0
- data/spec/page_magic/wait_methods_spec.rb +14 -22
- data/spec/page_magic/watcher_spec.rb +22 -0
- data/spec/page_magic/watchers_spec.rb +56 -62
- data/spec/page_magic_spec.rb +27 -24
- data/spec/spec_helper.rb +7 -3
- data/spec/support/shared_examples.rb +15 -17
- metadata +48 -15
- data/lib/page_magic/element/query_builder.rb +0 -61
- data/lib/page_magic/element/selector_methods.rb +0 -16
- data/lib/page_magic/matcher.rb +0 -130
- data/spec/element_spec.rb +0 -251
- data/spec/page_magic/element/query_builder_spec.rb +0 -110
- data/spec/page_magic/matcher_spec.rb +0 -338
- data/spec/support/shared_contexts/files_context.rb +0 -9
- data/spec/support/shared_contexts/nested_elements_html_context.rb +0 -18
- data/spec/support/shared_contexts/rack_application_context.rb +0 -11
- data/spec/support/shared_contexts/webapp_fixture_context.rb +0 -41
- data/spec/watcher_spec.rb +0 -64
data/lib/page_magic/session.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'forwardable'
|
4
|
-
|
4
|
+
require_relative 'transitions'
|
5
|
+
|
5
6
|
module PageMagic
|
6
7
|
# class Session - coordinates access to the browser though page objects.
|
7
8
|
class Session
|
8
9
|
URL_MISSING_MSG = 'a path must be mapped or a url supplied'
|
9
|
-
|
10
|
+
|
10
11
|
INVALID_MAPPING_MSG = 'mapping must be a string or regexp'
|
11
12
|
UNSUPPORTED_OPERATION_MSG = 'execute_script not supported by driver'
|
12
13
|
|
@@ -20,13 +21,13 @@ module PageMagic
|
|
20
21
|
def initialize(capybara_session, base_url = nil)
|
21
22
|
@raw_session = capybara_session
|
22
23
|
@base_url = base_url
|
23
|
-
|
24
|
+
define_page_mappings({})
|
24
25
|
end
|
25
26
|
|
26
27
|
# @return [Object] returns page object representing the currently loaded page on the browser. If no mapping
|
27
28
|
# is found then nil returned
|
28
29
|
def current_page
|
29
|
-
mapping =
|
30
|
+
mapping = transitions.mapped_page(current_url)
|
30
31
|
@current_page = initialize_page(mapping) if mapping
|
31
32
|
@current_page
|
32
33
|
end
|
@@ -50,10 +51,7 @@ module PageMagic
|
|
50
51
|
# @option transitions [String] path as literal
|
51
52
|
# @option transitions [Regexp] path as a regexp for dynamic matching.
|
52
53
|
def define_page_mappings(transitions)
|
53
|
-
@transitions = transitions
|
54
|
-
key = key.is_a?(Matcher) ? key : Matcher.new(key)
|
55
|
-
[key, value]
|
56
|
-
end.to_h
|
54
|
+
@transitions = Transitions.new(transitions)
|
57
55
|
end
|
58
56
|
|
59
57
|
# execute javascript on the browser
|
@@ -74,7 +72,7 @@ module PageMagic
|
|
74
72
|
|
75
73
|
# @param args see {::Object#respond_to?}
|
76
74
|
# @return [Boolean] true if self or the current page object responds to the give method name
|
77
|
-
def
|
75
|
+
def respond_to_missing?(*args)
|
78
76
|
super || current_page.respond_to?(*args)
|
79
77
|
end
|
80
78
|
|
@@ -92,39 +90,19 @@ module PageMagic
|
|
92
90
|
# @raise [InvalidURLException] if neither a page or url are supplied
|
93
91
|
# @raise [InvalidURLException] if the mapped path for a page is a Regexp
|
94
92
|
def visit(page = nil, url: nil)
|
95
|
-
|
96
|
-
if (mapping = transitions.key(page))
|
97
|
-
raise InvalidURLException, REGEXP_MAPPING_MSG unless mapping.can_compute_uri?
|
98
|
-
|
99
|
-
url(base_url, mapping.compute_uri)
|
100
|
-
end
|
101
|
-
end
|
93
|
+
url ||= transitions.url_for(page, base_url: base_url)
|
102
94
|
|
103
|
-
raise InvalidURLException, URL_MISSING_MSG unless
|
95
|
+
raise InvalidURLException, URL_MISSING_MSG unless url
|
104
96
|
|
105
|
-
raw_session.visit(
|
97
|
+
raw_session.visit(url)
|
106
98
|
@current_page = initialize_page(page) if page
|
107
99
|
self
|
108
100
|
end
|
109
101
|
|
110
102
|
private
|
111
103
|
|
112
|
-
def find_mapped_page(url)
|
113
|
-
matches(url).first
|
114
|
-
end
|
115
|
-
|
116
|
-
def matches(url)
|
117
|
-
transitions.keys.find_all { |matcher| matcher.match?(url) }.sort.collect { |match| transitions[match] }
|
118
|
-
end
|
119
|
-
|
120
104
|
def initialize_page(page_class)
|
121
105
|
page_class.new(self).execute_on_load
|
122
106
|
end
|
123
|
-
|
124
|
-
def url(base_url, path)
|
125
|
-
path = path.sub(%r{^/}, '')
|
126
|
-
base_url = base_url.sub(%r{/$}, '')
|
127
|
-
"#{base_url}/#{path}"
|
128
|
-
end
|
129
107
|
end
|
130
108
|
end
|
@@ -6,7 +6,7 @@ module PageMagic
|
|
6
6
|
module SessionMethods
|
7
7
|
extend Forwardable
|
8
8
|
|
9
|
-
# @!method execute_script
|
9
|
+
# @!method execute_script(script)
|
10
10
|
# execute javascript on the browser
|
11
11
|
# @param [String] script the script to be executed
|
12
12
|
# @return [Object] object returned by the {Session#execute_script}
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'utils/url'
|
4
|
+
require_relative 'mapping'
|
5
|
+
|
6
|
+
module PageMagic
|
7
|
+
# class Transitions - used for registering the page classes that should be used against particular paths
|
8
|
+
class Transitions < Hash
|
9
|
+
REGEXP_MAPPING_MSG = 'URL could not be derived because mapping contains Regexps'
|
10
|
+
|
11
|
+
# Create a new transitions object.
|
12
|
+
# @param [Hash{String,PageMagic::Mapping => PageMagic}] transitions a map of paths to pages
|
13
|
+
# @example
|
14
|
+
# Transitions.new('/path1' => Page1, Matcher.new('/another_*') => AnotherPageClass )
|
15
|
+
def initialize(transitions)
|
16
|
+
super
|
17
|
+
transitions.each do |key, value|
|
18
|
+
key = key.is_a?(Mapping) ? key : Mapping.new(key)
|
19
|
+
self[key] = value
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# get the url to be used when visiting the path mapped against the given page
|
24
|
+
# @param [PageMagic] page - the page class to get the mapped path from
|
25
|
+
# @param [String] base_url - the base url of the site to be joined to the mapped path
|
26
|
+
# @return String
|
27
|
+
# @raise InvalidURLException - Raised if it is not possible to generate the url for the mapped page
|
28
|
+
# i.e. if the mapping is a regular expression.
|
29
|
+
def url_for(page, base_url:)
|
30
|
+
return unless (mapping = key(page))
|
31
|
+
raise InvalidURLException, REGEXP_MAPPING_MSG unless mapping.can_compute_uri?
|
32
|
+
|
33
|
+
PageMagic::Utils::URL.concat(base_url, mapping.compute_uri)
|
34
|
+
end
|
35
|
+
|
36
|
+
# get the page class mapped to the given url
|
37
|
+
# @param [String] url - the url to search against
|
38
|
+
# @return [PageMagic]
|
39
|
+
def mapped_page(url)
|
40
|
+
matches(url).first
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def matches(url)
|
46
|
+
keys.find_all { |matcher| matcher.match?(url) }.sort.collect { |match| self[match] }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -5,6 +5,10 @@ module PageMagic
|
|
5
5
|
# module String - contains methods for manipulating strings
|
6
6
|
module String
|
7
7
|
class << self
|
8
|
+
# convert a snake case `String` or `Symbol`
|
9
|
+
# @example
|
10
|
+
# classify(:snake_case) # => "SnakeCase"
|
11
|
+
# @return [String]
|
8
12
|
def classify(string_or_symbol)
|
9
13
|
string_or_symbol.to_s.split('_').collect(&:capitalize).reduce(:+)
|
10
14
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PageMagic
|
4
|
+
module Utils
|
5
|
+
# module String - contains methods for manipulating strings
|
6
|
+
module URL
|
7
|
+
class << self
|
8
|
+
# build a url from a base and path.
|
9
|
+
# @example
|
10
|
+
# concat('http://base.url/', '/path') # => "http://base.url/path"
|
11
|
+
# @return [String]
|
12
|
+
def concat(base_url, path)
|
13
|
+
path = path.sub(%r{^/}, '')
|
14
|
+
base_url = base_url.sub(%r{/$}, '')
|
15
|
+
"#{base_url}/#{path}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/page_magic/watcher.rb
CHANGED
@@ -3,31 +3,25 @@
|
|
3
3
|
module PageMagic
|
4
4
|
# class WatchedElementDefinition - Contains the specification the for checking if an subject has changed
|
5
5
|
class Watcher
|
6
|
-
attr_reader :name, :
|
6
|
+
attr_reader :name, :context, :observed_value, :block
|
7
7
|
|
8
8
|
# @param [Symbol] name the of the subject being checked
|
9
|
-
# @param [Symbol] method the method that should be called on the subject being checked
|
10
9
|
# @example
|
11
|
-
# Watcher.new(:
|
12
|
-
# Watcher.new do
|
10
|
+
# Watcher.new(:url) do
|
13
11
|
# session.url
|
14
12
|
# end
|
15
|
-
def initialize(name,
|
13
|
+
def initialize(name, context:, &block)
|
16
14
|
@name = name
|
17
|
-
@
|
15
|
+
@context = context
|
18
16
|
@block = block
|
19
17
|
end
|
20
18
|
|
21
|
-
# check current value of watched element. The result of the check
|
22
|
-
#
|
23
|
-
#
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
else
|
28
|
-
object = subject.send(name)
|
29
|
-
attribute ? object.send(attribute) : object
|
30
|
-
end
|
19
|
+
# check current value of watched element. The result of the check can be accessed
|
20
|
+
# by calling {PageMagic::Watcher#last}
|
21
|
+
# if a block was specified to the constructor then this will be executed.
|
22
|
+
# @return [PageMagic::Watcher]
|
23
|
+
def check
|
24
|
+
@observed_value = context.instance_eval(&block)
|
31
25
|
self
|
32
26
|
end
|
33
27
|
|
@@ -36,7 +30,6 @@ module PageMagic
|
|
36
30
|
def ==(other)
|
37
31
|
other.is_a?(Watcher) &&
|
38
32
|
name == other.name &&
|
39
|
-
attribute == other.attribute &&
|
40
33
|
block == other.block
|
41
34
|
end
|
42
35
|
end
|
data/lib/page_magic/watchers.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require_relative 'watcher'
|
4
4
|
|
5
5
|
module PageMagic
|
6
6
|
# module Watchers - contains methods for adding watchers and checking them
|
@@ -11,25 +11,27 @@ module PageMagic
|
|
11
11
|
# @return [Boolean] true if a change is detected
|
12
12
|
def changed?(name)
|
13
13
|
watched_element = watcher(name)
|
14
|
-
watched_element.
|
14
|
+
watched_element.observed_value != watched_element.check.observed_value
|
15
15
|
end
|
16
16
|
|
17
17
|
# register a new watcher
|
18
|
-
# @
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
18
|
+
# @overload watch(:price, context: object, method: :text)
|
19
|
+
# @param [Symbol] name of the watcher/element
|
20
|
+
# @param [Object] context the object that is being watched - defaults to self
|
21
|
+
# @param [Symbol] method - the method on the watched element to check
|
22
|
+
# @overload watch(:text)
|
23
|
+
# @param [Symbol] method - the method on the watched element to check
|
24
|
+
# @overload watch(:text, &blk)
|
25
|
+
# @param [Symbol] name of the watcher/element
|
26
|
+
# @yieldreturn [Object] the value that should be checked
|
27
|
+
# @example
|
28
|
+
# watch(:something) do
|
25
29
|
# # more complicated code to get value
|
26
|
-
#
|
27
|
-
def watch(name, method
|
28
|
-
|
29
|
-
|
30
|
-
watched_element = block ? Watcher.new(name, &block) : Watcher.new(name, method)
|
30
|
+
# end
|
31
|
+
def watch(name, context: self, method: nil, &blk)
|
32
|
+
watcher = blk ? Watcher.new(name, context: context, &blk) : watch_method(name, context: context, method: method)
|
31
33
|
watchers.delete_if { |w| w.name == name }
|
32
|
-
watchers <<
|
34
|
+
watchers << watcher.check
|
33
35
|
end
|
34
36
|
|
35
37
|
# retrieve a watcher given its name
|
@@ -43,5 +45,16 @@ module PageMagic
|
|
43
45
|
def watchers
|
44
46
|
@watchers ||= []
|
45
47
|
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def watch_method(name, context:, method:)
|
52
|
+
subject = method || name
|
53
|
+
raise ElementMissingException, (ELEMENT_MISSING_MSG % subject) unless context.respond_to?(subject)
|
54
|
+
|
55
|
+
Watcher.new(name, context: context) do
|
56
|
+
public_send(subject)
|
57
|
+
end
|
58
|
+
end
|
46
59
|
end
|
47
60
|
end
|
@@ -1,65 +1,92 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
describe
|
5
|
-
subject do
|
3
|
+
RSpec.describe PageMagic::ClassMethods do
|
4
|
+
describe '#load' do
|
5
|
+
subject(:page_class) do
|
6
6
|
Class.new.tap do |clazz|
|
7
7
|
clazz.extend(described_class)
|
8
|
-
clazz.include(InstanceMethods)
|
8
|
+
clazz.include(PageMagic::InstanceMethods)
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
<<-HTML
|
12
|
+
let(:page_title) { 'page title' }
|
13
|
+
let(:page_source) do
|
14
|
+
<<-HTML
|
16
15
|
<html>
|
17
16
|
<head><title>#{page_title}</title></head>
|
18
17
|
</html>
|
19
|
-
|
20
|
-
|
18
|
+
HTML
|
19
|
+
end
|
21
20
|
|
22
|
-
|
23
|
-
|
21
|
+
it 'returns an instance using that source' do
|
22
|
+
expect(page_class.load(page_source).title).to eq(page_title)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe 'on_load' do
|
27
|
+
subject(:page_class) do
|
28
|
+
Class.new.tap do |clazz|
|
29
|
+
clazz.extend(described_class)
|
24
30
|
end
|
25
31
|
end
|
26
32
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
expect(subject.on_load).to be(described_class::DEFAULT_ON_LOAD)
|
31
|
-
end
|
33
|
+
context 'when a block is not set' do
|
34
|
+
it 'returns a default block' do
|
35
|
+
expect(page_class.on_load).to be(described_class::DEFAULT_ON_LOAD)
|
32
36
|
end
|
37
|
+
end
|
33
38
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
end
|
39
|
+
context 'when a block is set' do
|
40
|
+
it 'returns that block' do
|
41
|
+
expected_block = proc {}
|
42
|
+
page_class.on_load(&expected_block)
|
43
|
+
expect(page_class.on_load).to be(expected_block)
|
40
44
|
end
|
41
45
|
end
|
46
|
+
end
|
42
47
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
48
|
+
describe '#url' do
|
49
|
+
subject(:page_class) do
|
50
|
+
Class.new.tap do |clazz|
|
51
|
+
clazz.extend(described_class)
|
47
52
|
end
|
48
53
|
end
|
49
54
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
options: {},
|
56
|
-
browser: :rack_test,
|
57
|
-
url: subject.url).and_call_original
|
55
|
+
it 'get/sets a value' do
|
56
|
+
page_class.url(:url)
|
57
|
+
expect(page_class.url).to eq(:url)
|
58
|
+
end
|
59
|
+
end
|
58
60
|
|
59
|
-
|
61
|
+
describe '#visit' do
|
62
|
+
subject(:page_class) do
|
63
|
+
Class.new.tap do |clazz|
|
64
|
+
clazz.extend(described_class)
|
65
|
+
clazz.include(PageMagic::InstanceMethods)
|
66
|
+
clazz.url ''
|
67
|
+
end
|
68
|
+
end
|
60
69
|
|
61
|
-
|
70
|
+
let(:rack_app) do
|
71
|
+
Class.new do
|
72
|
+
def self.call(_env)
|
73
|
+
[200, {}, ['<html><head><title>page1</title></head></html>']]
|
74
|
+
end
|
62
75
|
end
|
63
76
|
end
|
77
|
+
|
78
|
+
it 'passes all options to create an active session on the registered url' do
|
79
|
+
allow(PageMagic).to receive(:session).and_call_original
|
80
|
+
|
81
|
+
page_class.visit(application: rack_app, options: {}, browser: :rack_test)
|
82
|
+
|
83
|
+
expected_option = { application: rack_app, options: {}, browser: :rack_test, url: page_class.url }
|
84
|
+
expect(PageMagic).to have_received(:session).with(expected_option)
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'returns a session' do
|
88
|
+
session = page_class.visit(application: rack_app, options: {}, browser: :rack_test)
|
89
|
+
expect(session).to be_kind_of(PageMagic::Session)
|
90
|
+
end
|
64
91
|
end
|
65
92
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
RSpec.describe PageMagic::Comparator::Fuzzy do
|
2
|
+
describe '#fuzzy?' do
|
3
|
+
context 'when one value is fuzzy' do
|
4
|
+
it 'returns true' do
|
5
|
+
map = described_class.new(//)
|
6
|
+
expect(map).to be_fuzzy
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe 'match?' do
|
12
|
+
context 'when comparator contains the parameter' do
|
13
|
+
it 'returns true' do
|
14
|
+
expect(described_class.new(/f*o/)).to be_match('foo')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'when comparator does not contains the parameter' do
|
19
|
+
it 'returns false' do
|
20
|
+
expect(described_class.new(/f*o/)).not_to be_match('bar')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#<=>' do
|
26
|
+
context 'when other is `Null`' do
|
27
|
+
it 'is lesser' do
|
28
|
+
expect(described_class.new(//) <=> PageMagic::Comparator::Null.new).to be(-1)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'when other is `Fuzzy`' do
|
33
|
+
it 'is equal' do
|
34
|
+
expect(described_class.new(//) <=> described_class.new(//)).to be 0
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'when other is `Literal`' do
|
39
|
+
it 'is greater' do
|
40
|
+
expect(described_class.new(//) <=> PageMagic::Comparator::Literal.new('/')).to be 1
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|