Skip to content

Commit c43d59e

Browse files
committed
refactor rspec matchers
1 parent 3921a07 commit c43d59e

File tree

8 files changed

+265
-239
lines changed

8 files changed

+265
-239
lines changed

lib/liquid-rails/drop_example_group.rb

Lines changed: 0 additions & 25 deletions
This file was deleted.

lib/liquid-rails/matchers.rb

Lines changed: 4 additions & 160 deletions
Original file line numberDiff line numberDiff line change
@@ -1,160 +1,4 @@
1-
require 'liquid-rails/drop_example_group'
2-
require 'liquid-rails/tag_example_group'
3-
4-
module Liquid
5-
module Rails
6-
module Matchers
7-
def have_attribute(name)
8-
AttributeMatcher.new(name)
9-
end
10-
11-
def have_many(name)
12-
AssociationMatcher.new(name, type: :has_many)
13-
end
14-
15-
def belongs_to(name)
16-
AssociationMatcher.new(name, type: :belongs_to)
17-
end
18-
19-
def have_scope(name)
20-
ScopeMatcher.new(name)
21-
end
22-
23-
class AttributeMatcher
24-
attr_reader :name, :actual
25-
26-
def initialize(name)
27-
@name = name
28-
end
29-
30-
def matches?(actual)
31-
@actual = actual
32-
33-
attributes.include?(name)
34-
end
35-
36-
def description
37-
"have attribute #{name}"
38-
end
39-
40-
def failure_message
41-
%Q{expected #{actual.inspect} to define "#{name}" as attribute}
42-
end
43-
44-
def failure_message_when_negated
45-
%Q{expected #{actual.inspect} not to define "#{name}" as attribute}
46-
end
47-
48-
private
49-
50-
def drop
51-
if actual.is_a?(Class)
52-
actual
53-
else
54-
actual.class
55-
end
56-
end
57-
58-
def attributes
59-
drop._attributes
60-
end
61-
end
62-
63-
class AssociationMatcher
64-
attr_reader :name, :actual, :options
65-
66-
def initialize(name, options)
67-
@name = name
68-
@options = options
69-
end
70-
71-
def matches?(actual)
72-
@actual = actual
73-
74-
association = associations[name]
75-
result = association.present? && association[:type] == options[:type]
76-
result = result && association[:options][:with] == options[:with] if options[:with]
77-
result = result && association[:options][:class_name] == options[:class_name] if options[:class_name]
78-
79-
result
80-
end
81-
82-
def with(class_name)
83-
@options[:with] = class_name
84-
self
85-
end
86-
87-
def class_name(class_name)
88-
@options[:class_name] = class_name
89-
self
90-
end
91-
92-
def description
93-
"have association #{name}"
94-
end
95-
96-
def failure_message
97-
%Q{expected #{actual.inspect} to define "#{name}" as :#{options[:type]} association}
98-
end
99-
100-
def failure_message_when_negated
101-
%Q{expected #{actual.inspect} not to define "#{name}" as :#{options[:type]} association}
102-
end
103-
104-
private
105-
106-
def drop
107-
if actual.is_a?(Class)
108-
actual
109-
else
110-
actual.class
111-
end
112-
end
113-
114-
def associations
115-
drop._associations
116-
end
117-
end
118-
119-
class ScopeMatcher
120-
attr_reader :name, :actual
121-
122-
def initialize(name)
123-
@name = name
124-
end
125-
126-
def matches?(actual)
127-
@actual = actual
128-
129-
scopes.include?(name)
130-
end
131-
132-
def description
133-
"have scope #{name}"
134-
end
135-
136-
def failure_message
137-
%Q{expected #{actual.inspect} to define "#{name}" as scope}
138-
end
139-
140-
def failure_message_when_negated
141-
%Q{expected #{actual.inspect} not to define "#{name}" as scope}
142-
end
143-
144-
private
145-
146-
def drop
147-
if actual.is_a?(Class)
148-
actual
149-
else
150-
actual.class
151-
end
152-
end
153-
154-
def scopes
155-
drop._scopes
156-
end
157-
end
158-
end
159-
end
160-
end
1+
require 'liquid-rails/rspec/view_controller_context'
2+
require 'liquid-rails/rspec/drop_matchers'
3+
require 'liquid-rails/rspec/drop_example_group'
4+
require 'liquid-rails/rspec/tag_example_group'
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
module Liquid
2+
module Rails
3+
module Rspec
4+
module DropExampleGroup
5+
extend ActiveSupport::Concern
6+
include Liquid::Rails::Rspec::DropMatchers
7+
include Liquid::Rails::Rspec::ViewControllerContext
8+
9+
included do
10+
metadata[:type] = :drop
11+
12+
subject {
13+
if described_class.ancestors.include?(Liquid::Rails::Drop)
14+
described_class.new(double)
15+
else
16+
described_class.new([])
17+
end
18+
}
19+
20+
before {
21+
setup_view_and_controller
22+
subject.context = context
23+
}
24+
end
25+
end
26+
end
27+
end
28+
end
29+
30+
RSpec.configure do |config|
31+
if RSpec::Core::Version::STRING.starts_with?('3')
32+
config.include Liquid::Rails::Rspec::DropExampleGroup, type: :drop, file_path: %r(spec/drops)
33+
else
34+
config.include Liquid::Rails::Rspec::DropExampleGroup, type: :drop, example_group: { file_path: %r{spec/drops} }
35+
end
36+
end
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
module Liquid
2+
module Rails
3+
module Rspec
4+
module DropMatchers
5+
def have_attribute(name)
6+
AttributeMatcher.new(name)
7+
end
8+
9+
def have_many(name)
10+
AssociationMatcher.new(name, type: :has_many)
11+
end
12+
13+
def belongs_to(name)
14+
AssociationMatcher.new(name, type: :belongs_to)
15+
end
16+
17+
def have_scope(name)
18+
ScopeMatcher.new(name)
19+
end
20+
21+
class AttributeMatcher
22+
attr_reader :name, :actual
23+
24+
def initialize(name)
25+
@name = name
26+
end
27+
28+
def matches?(actual)
29+
@actual = actual
30+
31+
attributes.include?(name)
32+
end
33+
34+
def description
35+
"have attribute #{name}"
36+
end
37+
38+
def failure_message
39+
%Q{expected #{actual.inspect} to define "#{name}" as attribute}
40+
end
41+
42+
def failure_message_when_negated
43+
%Q{expected #{actual.inspect} not to define "#{name}" as attribute}
44+
end
45+
46+
private
47+
48+
def drop
49+
if actual.is_a?(Class)
50+
actual
51+
else
52+
actual.class
53+
end
54+
end
55+
56+
def attributes
57+
drop._attributes
58+
end
59+
end
60+
61+
class AssociationMatcher
62+
attr_reader :name, :actual, :options
63+
64+
def initialize(name, options)
65+
@name = name
66+
@options = options
67+
end
68+
69+
def matches?(actual)
70+
@actual = actual
71+
72+
association = associations[name]
73+
result = association.present? && association[:type] == options[:type]
74+
result = result && association[:options][:with] == options[:with] if options[:with]
75+
result = result && association[:options][:class_name] == options[:class_name] if options[:class_name]
76+
77+
result
78+
end
79+
80+
def with(class_name)
81+
@options[:with] = class_name
82+
self
83+
end
84+
85+
def class_name(class_name)
86+
@options[:class_name] = class_name
87+
self
88+
end
89+
90+
def description
91+
"have association #{name}"
92+
end
93+
94+
def failure_message
95+
%Q{expected #{actual.inspect} to define "#{name}" as :#{options[:type]} association}
96+
end
97+
98+
def failure_message_when_negated
99+
%Q{expected #{actual.inspect} not to define "#{name}" as :#{options[:type]} association}
100+
end
101+
102+
private
103+
104+
def drop
105+
if actual.is_a?(Class)
106+
actual
107+
else
108+
actual.class
109+
end
110+
end
111+
112+
def associations
113+
drop._associations
114+
end
115+
end
116+
117+
class ScopeMatcher
118+
attr_reader :name, :actual
119+
120+
def initialize(name)
121+
@name = name
122+
end
123+
124+
def matches?(actual)
125+
@actual = actual
126+
127+
scopes.include?(name)
128+
end
129+
130+
def description
131+
"have scope #{name}"
132+
end
133+
134+
def failure_message
135+
%Q{expected #{actual.inspect} to define "#{name}" as scope}
136+
end
137+
138+
def failure_message_when_negated
139+
%Q{expected #{actual.inspect} not to define "#{name}" as scope}
140+
end
141+
142+
private
143+
144+
def drop
145+
if actual.is_a?(Class)
146+
actual
147+
else
148+
actual.class
149+
end
150+
end
151+
152+
def scopes
153+
drop._scopes
154+
end
155+
end
156+
end
157+
end
158+
end
159+
end

0 commit comments

Comments
 (0)