active_mocker 1.3.2 → 1.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/README.md +136 -24
- data/Rakefile +8 -2
- data/active_mocker.gemspec +3 -3
- data/lib/active_mock/association.rb +7 -0
- data/lib/active_mock/base.rb +250 -0
- data/lib/active_mock/collection.rb +52 -0
- data/lib/active_mock/creators.rb +25 -0
- data/lib/active_mock/do_nothing_active_record_methods.rb +51 -0
- data/lib/active_mock/has_and_belongs_to_many.rb +7 -0
- data/lib/active_mock/has_many.rb +54 -0
- data/lib/active_mock/next_id.rb +16 -0
- data/lib/active_mock/object_inspect.rb +39 -0
- data/lib/{active_mocker/collection → active_mock}/queries.rb +26 -19
- data/lib/active_mock/records.rb +81 -0
- data/lib/active_mock/relation.rb +8 -0
- data/lib/active_mocker.rb +3 -1
- data/lib/active_mocker/active_mock.rb +26 -0
- data/lib/active_mocker/active_record.rb +18 -0
- data/lib/active_mocker/active_record/relationships.rb +57 -6
- data/lib/active_mocker/active_record/schema.rb +1 -1
- data/lib/active_mocker/active_record/scope.rb +1 -1
- data/lib/active_mocker/active_record/unknown_class_method.rb +1 -1
- data/lib/active_mocker/active_record/unknown_module.rb +10 -9
- data/lib/active_mocker/db_to_ruby_type.rb +26 -0
- data/lib/active_mocker/field.rb +16 -8
- data/lib/active_mocker/generate.rb +19 -174
- data/lib/active_mocker/loaded_mocks.rb +48 -8
- data/lib/active_mocker/logger.rb +2 -0
- data/lib/active_mocker/mock_template.erb +123 -53
- data/lib/active_mocker/model_reader.rb +42 -13
- data/lib/active_mocker/model_schema.rb +279 -0
- data/lib/active_mocker/model_schema/generate.rb +175 -0
- data/lib/active_mocker/reparameterize.rb +23 -3
- data/lib/active_mocker/table.rb +2 -2
- data/lib/active_mocker/version.rb +1 -1
- data/sample_app_rails_4/Gemfile +1 -1
- data/sample_app_rails_4/app/models/micropost.rb +13 -1
- data/sample_app_rails_4/db/schema.rb +1 -1
- data/sample_app_rails_4/spec/compare_mocker_and_record_spec.rb +194 -7
- data/sample_app_rails_4/spec/micropost_mock_spec.rb +145 -0
- data/sample_app_rails_4/spec/mocks/micropost_mock.rb +81 -55
- data/sample_app_rails_4/spec/mocks/relationship_mock.rb +85 -54
- data/sample_app_rails_4/spec/mocks/user_mock.rb +71 -72
- data/sample_app_rails_4/spec/reload_spec.rb +1 -1
- data/sample_app_rails_4/spec/user_mock_spec.rb +25 -7
- data/spec/lib/acitve_mock/queriable_spec.rb +207 -0
- data/spec/lib/active_mocker/db_to_ruby_type_spec.rb +124 -0
- data/spec/lib/active_mocker/loaded_mocks_spec.rb +167 -0
- data/spec/lib/active_mocker/logger_spec.rb +32 -0
- data/spec/lib/active_mocker/model_reader_spec.rb +79 -28
- data/spec/lib/active_mocker/model_schema/generate_spec.rb +111 -0
- data/spec/lib/active_mocker/model_schema_spec.rb +145 -0
- data/spec/lib/model.rb +2 -1
- data/spec/lib/reparameterize_spec.rb +202 -0
- data/spec/unit_logger.rb +2 -2
- metadata +55 -35
- data/lib/active_hash/ar_api.rb +0 -77
- data/lib/active_hash/init.rb +0 -32
- data/lib/active_mocker/collection/association.rb +0 -12
- data/lib/active_mocker/collection/base.rb +0 -65
- data/lib/active_mocker/collection/relation.rb +0 -11
- data/lib/active_mocker/mock_class_methods.rb +0 -92
- data/lib/active_mocker/mock_instance_methods.rb +0 -84
- data/lib/active_mocker/mock_requires.rb +0 -10
- data/spec/lib/active_mocker/collection.rb +0 -94
@@ -1,24 +1,46 @@
|
|
1
|
-
require 'active_mocker/
|
2
|
-
Object.send(:remove_const, "UserMock") if
|
1
|
+
require 'active_mocker/active_mock'
|
2
|
+
Object.send(:remove_const, "UserMock") if Object.const_defined?("UserMock")
|
3
3
|
|
4
|
-
class UserMock < ::
|
5
|
-
include ActiveMocker::ActiveHash::ARApi
|
6
|
-
include ActiveMocker::MockInstanceMethods
|
7
|
-
extend ActiveMocker::MockClassMethods
|
4
|
+
class UserMock < ActiveMock::Base
|
8
5
|
|
9
|
-
|
10
|
-
@attributes = HashWithIndifferentAccess.new({"id"=>nil, "name"=>nil, "email"=>"", "credits"=>nil, "created_at"=>nil, "updated_at"=>nil, "password_digest"=>nil, "remember_token"=>true, "admin"=>false})
|
11
|
-
@associations = HashWithIndifferentAccess.new({:microposts=>nil, :relationships=>nil, :followed_users=>nil, :reverse_relationships=>nil, :followers=>nil})
|
12
|
-
super(attributes, &block)
|
13
|
-
end
|
6
|
+
class << self
|
14
7
|
|
8
|
+
def attributes
|
9
|
+
@attributes ||= HashWithIndifferentAccess.new({"id"=>nil, "name"=>nil, "email"=>"", "credits"=>nil, "created_at"=>nil, "updated_at"=>nil, "password_digest"=>nil, "remember_token"=>true, "admin"=>false})
|
10
|
+
end
|
15
11
|
|
16
|
-
|
17
|
-
|
18
|
-
|
12
|
+
def types
|
13
|
+
@types ||= { id: build_type(Fixnum), name: build_type(String), email: build_type(String), credits: build_type(BigDecimal), created_at: build_type(DateTime), updated_at: build_type(DateTime), password_digest: build_type(String), remember_token: build_type(Axiom::Types::Boolean), admin: build_type(Axiom::Types::Boolean) }
|
14
|
+
end
|
15
|
+
|
16
|
+
def associations
|
17
|
+
@associations ||= {:microposts=>nil, :relationships=>nil, :followed_users=>nil, :reverse_relationships=>nil, :followers=>nil}
|
18
|
+
end
|
19
|
+
|
20
|
+
def model_instance_methods
|
21
|
+
@model_instance_methods ||= {"feed"=>:not_implemented, "following?"=>:not_implemented, "follow!"=>:not_implemented, "unfollow!"=>:not_implemented}
|
22
|
+
end
|
23
|
+
|
24
|
+
def model_class_methods
|
25
|
+
@model_class_methods ||= {"new_remember_token"=>:not_implemented, "digest"=>:not_implemented}
|
26
|
+
end
|
27
|
+
|
28
|
+
def mocked_class
|
29
|
+
'User'
|
30
|
+
end
|
31
|
+
|
32
|
+
def column_names
|
33
|
+
attribute_names
|
34
|
+
end
|
35
|
+
|
36
|
+
def attribute_names
|
37
|
+
@attribute_names ||= ["id", "name", "email", "credits", "created_at", "updated_at", "password_digest", "remember_token", "admin"]
|
38
|
+
end
|
39
|
+
|
40
|
+
def primary_key
|
41
|
+
"id"
|
42
|
+
end
|
19
43
|
|
20
|
-
def self.attribute_names
|
21
|
-
@attribute_names = ["id", "name", "email", "credits", "created_at", "updated_at", "password_digest", "remember_token", "admin"]
|
22
44
|
end
|
23
45
|
|
24
46
|
##################################
|
@@ -26,150 +48,127 @@ class UserMock < ::ActiveHash::Base
|
|
26
48
|
##################################
|
27
49
|
|
28
50
|
def id
|
29
|
-
|
51
|
+
read_attribute(:id)
|
30
52
|
end
|
31
53
|
|
32
54
|
def id=(val)
|
33
|
-
|
34
|
-
@attributes['id'] = type.coerce(val)
|
55
|
+
write_attribute(:id, val)
|
35
56
|
end
|
36
57
|
|
37
58
|
def name
|
38
|
-
|
59
|
+
read_attribute(:name)
|
39
60
|
end
|
40
61
|
|
41
62
|
def name=(val)
|
42
|
-
|
43
|
-
@attributes['name'] = type.coerce(val)
|
63
|
+
write_attribute(:name, val)
|
44
64
|
end
|
45
65
|
|
46
66
|
def email
|
47
|
-
|
67
|
+
read_attribute(:email)
|
48
68
|
end
|
49
69
|
|
50
70
|
def email=(val)
|
51
|
-
|
52
|
-
@attributes['email'] = type.coerce(val)
|
71
|
+
write_attribute(:email, val)
|
53
72
|
end
|
54
73
|
|
55
74
|
def credits
|
56
|
-
|
75
|
+
read_attribute(:credits)
|
57
76
|
end
|
58
77
|
|
59
78
|
def credits=(val)
|
60
|
-
|
61
|
-
@attributes['credits'] = type.coerce(val)
|
79
|
+
write_attribute(:credits, val)
|
62
80
|
end
|
63
81
|
|
64
82
|
def created_at
|
65
|
-
|
83
|
+
read_attribute(:created_at)
|
66
84
|
end
|
67
85
|
|
68
86
|
def created_at=(val)
|
69
|
-
|
70
|
-
@attributes['created_at'] = type.coerce(val)
|
87
|
+
write_attribute(:created_at, val)
|
71
88
|
end
|
72
89
|
|
73
90
|
def updated_at
|
74
|
-
|
91
|
+
read_attribute(:updated_at)
|
75
92
|
end
|
76
93
|
|
77
94
|
def updated_at=(val)
|
78
|
-
|
79
|
-
@attributes['updated_at'] = type.coerce(val)
|
95
|
+
write_attribute(:updated_at, val)
|
80
96
|
end
|
81
97
|
|
82
98
|
def password_digest
|
83
|
-
|
99
|
+
read_attribute(:password_digest)
|
84
100
|
end
|
85
101
|
|
86
102
|
def password_digest=(val)
|
87
|
-
|
88
|
-
@attributes['password_digest'] = type.coerce(val)
|
103
|
+
write_attribute(:password_digest, val)
|
89
104
|
end
|
90
105
|
|
91
106
|
def remember_token
|
92
|
-
|
107
|
+
read_attribute(:remember_token)
|
93
108
|
end
|
94
109
|
|
95
110
|
def remember_token=(val)
|
96
|
-
|
97
|
-
@attributes['remember_token'] = type.coerce(val)
|
111
|
+
write_attribute(:remember_token, val)
|
98
112
|
end
|
99
113
|
|
100
114
|
def admin
|
101
|
-
|
115
|
+
read_attribute(:admin)
|
102
116
|
end
|
103
117
|
|
104
118
|
def admin=(val)
|
105
|
-
|
106
|
-
@attributes['admin'] = type.coerce(val)
|
119
|
+
write_attribute(:admin, val)
|
107
120
|
end
|
108
121
|
|
109
122
|
##################################
|
110
|
-
#
|
123
|
+
# Associations #
|
111
124
|
##################################
|
112
125
|
|
113
|
-
def self.association_names
|
114
|
-
@association_names = [:microposts, :relationships, :followed_users, :reverse_relationships, :followers]
|
115
|
-
end
|
116
126
|
|
127
|
+
# has_many
|
117
128
|
def microposts
|
118
|
-
associations[
|
129
|
+
@associations[:microposts] ||= ActiveMock::HasMany.new([],'user_id', @attributes['id'], classes('Micropost'))
|
119
130
|
end
|
120
131
|
|
121
132
|
def microposts=(val)
|
122
|
-
associations[
|
133
|
+
@associations[:microposts] ||= ActiveMock::HasMany.new(val,'user_id', @attributes['id'], classes('Micropost'))
|
123
134
|
end
|
124
135
|
|
125
136
|
def relationships
|
126
|
-
associations[
|
137
|
+
@associations[:relationships] ||= ActiveMock::HasMany.new([],'follower_id', @attributes['id'], classes('Relationship'))
|
127
138
|
end
|
128
139
|
|
129
140
|
def relationships=(val)
|
130
|
-
associations[
|
141
|
+
@associations[:relationships] ||= ActiveMock::HasMany.new(val,'follower_id', @attributes['id'], classes('Relationship'))
|
131
142
|
end
|
132
143
|
|
133
144
|
def followed_users
|
134
|
-
associations[
|
145
|
+
@associations[:followed_users] ||= ActiveMock::HasMany.new([],'user_id', @attributes['id'], classes('FollowedUser'))
|
135
146
|
end
|
136
147
|
|
137
148
|
def followed_users=(val)
|
138
|
-
associations[
|
149
|
+
@associations[:followed_users] ||= ActiveMock::HasMany.new(val,'user_id', @attributes['id'], classes('FollowedUser'))
|
139
150
|
end
|
140
151
|
|
141
152
|
def reverse_relationships
|
142
|
-
associations[
|
153
|
+
@associations[:reverse_relationships] ||= ActiveMock::HasMany.new([],'followed_id', @attributes['id'], classes('Relationship'))
|
143
154
|
end
|
144
155
|
|
145
156
|
def reverse_relationships=(val)
|
146
|
-
associations[
|
157
|
+
@associations[:reverse_relationships] ||= ActiveMock::HasMany.new(val,'followed_id', @attributes['id'], classes('Relationship'))
|
147
158
|
end
|
148
159
|
|
149
160
|
def followers
|
150
|
-
associations[
|
161
|
+
@associations[:followers] ||= ActiveMock::HasMany.new([],'user_id', @attributes['id'], classes('Follower'))
|
151
162
|
end
|
152
163
|
|
153
164
|
def followers=(val)
|
154
|
-
associations[
|
165
|
+
@associations[:followers] ||= ActiveMock::HasMany.new(val,'user_id', @attributes['id'], classes('Follower'))
|
155
166
|
end
|
156
167
|
|
157
168
|
##################################
|
158
169
|
# Model Methods getter/setters #
|
159
170
|
##################################
|
160
171
|
|
161
|
-
def self.model_instance_methods
|
162
|
-
@model_instance_methods ||= {"feed"=>:not_implemented, "following?"=>:not_implemented, "follow!"=>:not_implemented, "unfollow!"=>:not_implemented}
|
163
|
-
end
|
164
|
-
|
165
|
-
def self.model_class_methods
|
166
|
-
@model_class_methods ||= {"new_remember_token"=>:not_implemented, "digest"=>:not_implemented}
|
167
|
-
end
|
168
|
-
|
169
|
-
def self.clear_mock
|
170
|
-
@model_class_methods, @model_instance_methods = nil, nil
|
171
|
-
delete_all
|
172
|
-
end
|
173
172
|
|
174
173
|
def feed()
|
175
174
|
block = model_instance_methods['feed']
|
@@ -207,10 +206,10 @@ class UserMock < ::ActiveHash::Base
|
|
207
206
|
instance_exec(*[token], &block)
|
208
207
|
end
|
209
208
|
|
209
|
+
private
|
210
|
+
|
210
211
|
def self.reload
|
211
212
|
load __FILE__
|
212
213
|
end
|
213
214
|
|
214
|
-
end
|
215
|
-
|
216
|
-
ActiveMocker::LoadedMocks.add(UserMock)
|
215
|
+
end
|
@@ -11,7 +11,7 @@ RSpec.configure do |config|
|
|
11
11
|
end
|
12
12
|
|
13
13
|
$:.unshift File.expand_path('../../', __FILE__)
|
14
|
-
APP_ROOT = File.expand_path('../../', __FILE__)
|
14
|
+
APP_ROOT = File.expand_path('../../', __FILE__) unless defined? APP_ROOT
|
15
15
|
require 'config/initializers/active_mocker.rb'
|
16
16
|
load 'mocks/user_mock.rb'
|
17
17
|
|
@@ -1,9 +1,10 @@
|
|
1
1
|
require 'rspec'
|
2
2
|
$:.unshift File.expand_path('../../', __FILE__)
|
3
|
-
|
4
|
-
|
3
|
+
require 'active_support'
|
4
|
+
require 'spec/mocks/user_mock.rb'
|
5
|
+
APP_ROOT = File.expand_path('../../', __FILE__) unless defined? APP_ROOT
|
5
6
|
require 'config/initializers/active_mocker.rb'
|
6
|
-
|
7
|
+
require 'forwardable'
|
7
8
|
|
8
9
|
describe 'UserMock' do
|
9
10
|
|
@@ -12,6 +13,23 @@ describe 'UserMock' do
|
|
12
13
|
UserMock.clear_mock
|
13
14
|
}
|
14
15
|
|
16
|
+
describe '::mocked_class' do
|
17
|
+
|
18
|
+
it 'returns the name of the class being mocked' do
|
19
|
+
expect(UserMock.mocked_class).to eq 'User'
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
describe 'ActiveMocker::LoadedMocks' do
|
25
|
+
|
26
|
+
it 'will be added when sub classed' do
|
27
|
+
expect(ActiveMocker::LoadedMocks.all.keys.include?('UserMock')).to eq true
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
|
15
33
|
describe '::column_names' do
|
16
34
|
|
17
35
|
it 'returns an array of column names found from the schema.rb file' do
|
@@ -29,7 +47,7 @@ describe 'UserMock' do
|
|
29
47
|
end
|
30
48
|
|
31
49
|
it 'will raise error if not an attribute or association' do
|
32
|
-
expect{UserMock.new(baz: "Hello")}.to raise_error(
|
50
|
+
expect{UserMock.new(baz: "Hello")}.to raise_error(ActiveMock::RejectedParams, '{:baz=>"Hello"} for UserMock')
|
33
51
|
end
|
34
52
|
|
35
53
|
end
|
@@ -106,10 +124,10 @@ describe 'UserMock' do
|
|
106
124
|
|
107
125
|
end
|
108
126
|
|
109
|
-
context '
|
127
|
+
context 'active_mock' do
|
110
128
|
|
111
|
-
it 'uses
|
112
|
-
expect(UserMock.superclass.name).to eq '
|
129
|
+
it 'uses active_mock::base as superclass' do
|
130
|
+
expect(UserMock.superclass.name).to eq 'ActiveMock::Base'
|
113
131
|
end
|
114
132
|
|
115
133
|
it 'can save to class and then find instance by attribute' do
|
@@ -0,0 +1,207 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
$:.unshift File.expand_path('../../', __FILE__)
|
3
|
+
require 'active_support/all'
|
4
|
+
require 'active_mock/queries'
|
5
|
+
require 'active_mock/collection'
|
6
|
+
require 'ostruct'
|
7
|
+
|
8
|
+
describe ActiveMock::Queries do
|
9
|
+
|
10
|
+
before do
|
11
|
+
|
12
|
+
class Queriable < ActiveMock::Collection
|
13
|
+
include ActiveMock::Queries
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
subject{ Queriable.new }
|
19
|
+
|
20
|
+
describe '#sum' do
|
21
|
+
|
22
|
+
it 'sum values by attribute name' do
|
23
|
+
subject << [OpenStruct.new(value: 1), OpenStruct.new(value: 1)]
|
24
|
+
expect(subject.sum(:value)).to eq 2
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#limit' do
|
30
|
+
|
31
|
+
let!(:given_collection){ [OpenStruct.new(value: 1),
|
32
|
+
OpenStruct.new(value: 2),
|
33
|
+
OpenStruct.new(value: 3)]}
|
34
|
+
|
35
|
+
it 'will return only the n-number of items' do
|
36
|
+
subject << given_collection
|
37
|
+
expect(subject.limit(1).count).to eq 1
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '#<<' do
|
43
|
+
|
44
|
+
it 'will add a single item to the array' do
|
45
|
+
|
46
|
+
subject << "item"
|
47
|
+
expect(subject.count).to eq 1
|
48
|
+
expect(subject.first).to eq 'item'
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'will add a many item to the array' do
|
53
|
+
|
54
|
+
subject << ['item1', 'item2', 'item3']
|
55
|
+
expect(subject.count).to eq 3
|
56
|
+
expect(subject).to eq ['item1', 'item2', 'item3']
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
describe 'new' do
|
63
|
+
|
64
|
+
it 'take optional item and adds to collection' do
|
65
|
+
|
66
|
+
subject = Queriable.new(1)
|
67
|
+
|
68
|
+
expect(subject.first).to eq 1
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'can take an array' do
|
73
|
+
|
74
|
+
subject = Queriable.new([1])
|
75
|
+
|
76
|
+
expect(subject.first).to eq 1
|
77
|
+
|
78
|
+
subject = Queriable.new([1,2])
|
79
|
+
|
80
|
+
expect(subject.last).to eq 2
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
describe 'empty?' do
|
87
|
+
|
88
|
+
it 'returns true if collection is empty' do
|
89
|
+
expect(subject.empty?).to eq true
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'returns false if collection is not empty' do
|
93
|
+
subject << 1
|
94
|
+
expect(subject.empty?).to eq false
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
describe 'each' do
|
100
|
+
|
101
|
+
it 'can iterate over array' do
|
102
|
+
sum = 0
|
103
|
+
Queriable.new([1, 2]).each { |a| sum += a }
|
104
|
+
expect(sum).to eq 3
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
describe 'map' do
|
110
|
+
|
111
|
+
it 'return a new array' do
|
112
|
+
expect(Queriable.new([1, 2]).map { |a| a + a }).to eq [2, 4]
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'return an instance of the class' do
|
116
|
+
expect(Queriable.new([1, 2]).map { |a| a + a }).to be_a_kind_of Array
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
describe 'delete_all' do
|
122
|
+
|
123
|
+
let!(:given_collection) { [double(delete: true),
|
124
|
+
double(delete: true),
|
125
|
+
double(delete: true)] }
|
126
|
+
|
127
|
+
before do
|
128
|
+
given_collection.each do |item|
|
129
|
+
expect(item).to receive(:delete)
|
130
|
+
end
|
131
|
+
subject << given_collection
|
132
|
+
end
|
133
|
+
|
134
|
+
it 'calls delete on every item in the collection' do
|
135
|
+
subject.delete_all
|
136
|
+
end
|
137
|
+
|
138
|
+
context 'alias destroy_all' do
|
139
|
+
|
140
|
+
it 'calls delete on every item in the collection' do
|
141
|
+
subject.destroy_all
|
142
|
+
end
|
143
|
+
|
144
|
+
end
|
145
|
+
|
146
|
+
end
|
147
|
+
|
148
|
+
describe '#all' do
|
149
|
+
subject{ Queriable.new(given_collection)}
|
150
|
+
|
151
|
+
let(:given_collection) { [1,1,1] }
|
152
|
+
|
153
|
+
it 'return the collection' do
|
154
|
+
expect(subject.all).to eq given_collection
|
155
|
+
end
|
156
|
+
|
157
|
+
it 'returns an instance of the class' do
|
158
|
+
expect(subject.all).to be_a_kind_of Queriable
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|
162
|
+
|
163
|
+
describe 'where' do
|
164
|
+
|
165
|
+
context 'with condition' do
|
166
|
+
|
167
|
+
subject{ Queriable.new(given_collection)}
|
168
|
+
|
169
|
+
let(:given_collection) { [OpenStruct.new(value: 1),
|
170
|
+
OpenStruct.new(value: 2),
|
171
|
+
OpenStruct.new(value: 3)] }
|
172
|
+
|
173
|
+
it 'returns array of values that meet the condition' do
|
174
|
+
expect(subject.where(value: 1)).to eq [given_collection.first]
|
175
|
+
end
|
176
|
+
|
177
|
+
it 'returns an instance of the class' do
|
178
|
+
expect(subject.where(value: 1)).to be_a_kind_of(Queriable)
|
179
|
+
end
|
180
|
+
|
181
|
+
end
|
182
|
+
|
183
|
+
context 'without condition' do
|
184
|
+
|
185
|
+
subject { Queriable.new(given_collection) }
|
186
|
+
|
187
|
+
it 'return a WhereNotChain' do
|
188
|
+
expect(subject.where).to be_a_kind_of(ActiveMock::Queries::WhereNotChain)
|
189
|
+
end
|
190
|
+
|
191
|
+
let(:given_collection) { [OpenStruct.new(value: 1),
|
192
|
+
OpenStruct.new(value: 2),
|
193
|
+
OpenStruct.new(value: 3)] }
|
194
|
+
|
195
|
+
it 'takes .not(condition)' do
|
196
|
+
expect(subject.where.not(value: 1)).to eq [given_collection[1], given_collection[2]]
|
197
|
+
end
|
198
|
+
|
199
|
+
it '.not(condition) return the class' do
|
200
|
+
expect(subject.where.not(value: 1)).to be_a_kind_of(Queriable)
|
201
|
+
end
|
202
|
+
|
203
|
+
end
|
204
|
+
|
205
|
+
end
|
206
|
+
|
207
|
+
end
|