active_mocker 1.1.23 → 1.2.pre

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 (37) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +12 -22
  3. data/active_mocker.gemspec +1 -0
  4. data/lib/active_hash/init.rb +1 -1
  5. data/lib/active_mocker.rb +4 -5
  6. data/lib/active_mocker/active_record/schema.rb +2 -4
  7. data/lib/active_mocker/config.rb +6 -22
  8. data/lib/active_mocker/field.rb +3 -1
  9. data/lib/active_mocker/generate.rb +161 -0
  10. data/lib/active_mocker/mock_class_methods.rb +82 -0
  11. data/lib/active_mocker/mock_instance_methods.rb +81 -0
  12. data/lib/active_mocker/mock_requires.rb +12 -0
  13. data/lib/active_mocker/mock_task.rb +12 -0
  14. data/lib/active_mocker/mock_template.erb +84 -0
  15. data/lib/active_mocker/public_methods.rb +6 -2
  16. data/lib/active_mocker/schema_reader.rb +35 -16
  17. data/lib/active_mocker/table.rb +2 -0
  18. data/lib/active_mocker/version.rb +1 -1
  19. data/mocks/micropost_mock.rb +100 -0
  20. data/mocks/relationship_mock.rb +100 -0
  21. data/mocks/user_mock.rb +196 -0
  22. data/plan_mock.rb +2323 -0
  23. data/spec/lib/active_mocker/generate_spec.rb +49 -0
  24. data/spec/lib/active_mocker/{base_spec.rb → performance/base_spec.rb} +17 -37
  25. data/spec/lib/active_mocker/performance/large_schema.rb +3576 -0
  26. data/spec/lib/active_mocker/performance/migration/20140327205359_migration.rb +0 -0
  27. data/spec/lib/active_mocker/performance/schema_reader_spec.rb +96 -0
  28. data/spec/lib/active_mocker/schema_reader_spec.rb +12 -27
  29. data/spec/lib/compare_mocker_and_record_spec.rb +3 -2
  30. data/spec/lib/readme_spec.rb +205 -0
  31. data/spec/mocks/micropost_mock.rb +100 -0
  32. data/spec/mocks/relationship_mock.rb +100 -0
  33. data/spec/mocks/user_mock.rb +196 -0
  34. data/spec/mocks/user_mock_spec.rb +173 -0
  35. metadata +48 -9
  36. data/lib/active_mocker/base.rb +0 -356
  37. data/spec/lib/active_mocker/active_record/schema_spec.rb +0 -2721
@@ -0,0 +1,100 @@
1
+ require 'active_mocker/mock_requires'
2
+
3
+ Object.send(:remove_const, 'RelationshipMock') if class_exists? 'RelationshipMock'
4
+
5
+ class RelationshipMock < ::ActiveHash::Base
6
+ include ActiveMocker::ActiveHash::ARApi
7
+ include ActiveMocker::MockInstanceMethods
8
+ extend ActiveMocker::MockClassMethods
9
+
10
+ def self.column_names
11
+ ["id", "follower_id", "followed_id", "created_at", "updated_at"]
12
+ end
13
+
14
+ def self.association_names
15
+ @association_names = [:follower, :followed]
16
+ end
17
+
18
+ def self.attribute_names
19
+ @attribute_names = [:id, :follower_id, :followed_id, :created_at, :updated_at]
20
+ end
21
+
22
+
23
+ def id
24
+ attributes['id']
25
+ end
26
+
27
+ def id=(val)
28
+ attributes['id'] = val
29
+ end
30
+
31
+ def follower_id
32
+ attributes['follower_id']
33
+ end
34
+
35
+ def follower_id=(val)
36
+ attributes['follower_id'] = val
37
+ end
38
+
39
+ def followed_id
40
+ attributes['followed_id']
41
+ end
42
+
43
+ def followed_id=(val)
44
+ attributes['followed_id'] = val
45
+ end
46
+
47
+ def created_at
48
+ attributes['created_at']
49
+ end
50
+
51
+ def created_at=(val)
52
+ attributes['created_at'] = val
53
+ end
54
+
55
+ def updated_at
56
+ attributes['updated_at']
57
+ end
58
+
59
+ def updated_at=(val)
60
+ attributes['updated_at'] = val
61
+ end
62
+
63
+
64
+
65
+ def follower
66
+ associations['follower']
67
+ end
68
+
69
+ def follower=(val)
70
+ associations['follower'] = val
71
+ end
72
+
73
+ def followed
74
+ associations['followed']
75
+ end
76
+
77
+ def followed=(val)
78
+ associations['followed'] = val
79
+ end
80
+
81
+
82
+
83
+
84
+ def self.model_instance_methods
85
+ return @model_instance_methods if @model_instance_methods
86
+ @model_instance_methods = {}
87
+ @model_instance_methods
88
+ end
89
+
90
+ def self.model_class_methods
91
+ return @model_class_methods if @model_class_methods
92
+ @model_class_methods = {}
93
+ @model_class_methods
94
+ end
95
+
96
+
97
+
98
+
99
+
100
+ end
@@ -0,0 +1,196 @@
1
+ require 'active_mocker/mock_requires'
2
+
3
+ Object.send(:remove_const, 'UserMock') if class_exists? 'UserMock'
4
+
5
+ class UserMock < ::ActiveHash::Base
6
+ include ActiveMocker::ActiveHash::ARApi
7
+ include ActiveMocker::MockInstanceMethods
8
+ extend ActiveMocker::MockClassMethods
9
+
10
+ def self.column_names
11
+ ["id", "name", "email", "created_at", "updated_at", "password_digest", "remember_token", "admin"]
12
+ end
13
+
14
+ def self.association_names
15
+ @association_names = [:microposts, :relationships, :followed_users, :reverse_relationships, :followers]
16
+ end
17
+
18
+ def self.attribute_names
19
+ @attribute_names = [:id, :name, :email, :created_at, :updated_at, :password_digest, :remember_token, :admin]
20
+ end
21
+
22
+
23
+ def id
24
+ attributes['id']
25
+ end
26
+
27
+ def id=(val)
28
+ attributes['id'] = val
29
+ end
30
+
31
+ def name
32
+ attributes['name']
33
+ end
34
+
35
+ def name=(val)
36
+ attributes['name'] = val
37
+ end
38
+
39
+ def email
40
+ attributes['email']
41
+ end
42
+
43
+ def email=(val)
44
+ attributes['email'] = val
45
+ end
46
+
47
+ def created_at
48
+ attributes['created_at']
49
+ end
50
+
51
+ def created_at=(val)
52
+ attributes['created_at'] = val
53
+ end
54
+
55
+ def updated_at
56
+ attributes['updated_at']
57
+ end
58
+
59
+ def updated_at=(val)
60
+ attributes['updated_at'] = val
61
+ end
62
+
63
+ def password_digest
64
+ attributes['password_digest']
65
+ end
66
+
67
+ def password_digest=(val)
68
+ attributes['password_digest'] = val
69
+ end
70
+
71
+ def remember_token
72
+ attributes['remember_token']
73
+ end
74
+
75
+ def remember_token=(val)
76
+ attributes['remember_token'] = val
77
+ end
78
+
79
+ def admin
80
+ attributes['admin']
81
+ end
82
+
83
+ def admin=(val)
84
+ attributes['admin'] = val
85
+ end
86
+
87
+
88
+
89
+
90
+
91
+ def microposts
92
+ associations['microposts']
93
+ end
94
+
95
+ def microposts=(val)
96
+ associations['microposts'] = ActiveMocker::CollectionAssociation.new(val)
97
+ end
98
+
99
+ def relationships
100
+ associations['relationships']
101
+ end
102
+
103
+ def relationships=(val)
104
+ associations['relationships'] = ActiveMocker::CollectionAssociation.new(val)
105
+ end
106
+
107
+ def followed_users
108
+ associations['followed_users']
109
+ end
110
+
111
+ def followed_users=(val)
112
+ associations['followed_users'] = ActiveMocker::CollectionAssociation.new(val)
113
+ end
114
+
115
+ def reverse_relationships
116
+ associations['reverse_relationships']
117
+ end
118
+
119
+ def reverse_relationships=(val)
120
+ associations['reverse_relationships'] = ActiveMocker::CollectionAssociation.new(val)
121
+ end
122
+
123
+ def followers
124
+ associations['followers']
125
+ end
126
+
127
+ def followers=(val)
128
+ associations['followers'] = ActiveMocker::CollectionAssociation.new(val)
129
+ end
130
+
131
+
132
+ def self.model_instance_methods
133
+ return @model_instance_methods if @model_instance_methods
134
+ @model_instance_methods = {}
135
+ @model_instance_methods[:feed] = :not_implemented
136
+
137
+ @model_instance_methods[:following?] = :not_implemented
138
+
139
+ @model_instance_methods[:follow!] = :not_implemented
140
+
141
+ @model_instance_methods[:unfollow!] = :not_implemented
142
+
143
+ @model_instance_methods
144
+ end
145
+
146
+ def self.model_class_methods
147
+ return @model_class_methods if @model_class_methods
148
+ @model_class_methods = {}
149
+ @model_class_methods[:new_remember_token] = :not_implemented
150
+
151
+ @model_class_methods[:digest] = :not_implemented
152
+
153
+ @model_class_methods
154
+ end
155
+
156
+
157
+ def feed()
158
+ block = model_instance_methods[:feed]
159
+ self.class.is_implemented(block, "#feed")
160
+ instance_exec(*[], &block)
161
+ end
162
+
163
+ def following?(other_user)
164
+ block = model_instance_methods[:following?]
165
+ self.class.is_implemented(block, "#following?")
166
+ instance_exec(*[other_user], &block)
167
+ end
168
+
169
+ def follow!(other_user)
170
+ block = model_instance_methods[:follow!]
171
+ self.class.is_implemented(block, "#follow!")
172
+ instance_exec(*[other_user], &block)
173
+ end
174
+
175
+ def unfollow!(other_user)
176
+ block = model_instance_methods[:unfollow!]
177
+ self.class.is_implemented(block, "#unfollow!")
178
+ instance_exec(*[other_user], &block)
179
+ end
180
+
181
+
182
+
183
+ def self.new_remember_token()
184
+ block = model_class_methods[:new_remember_token]
185
+ is_implemented(block, "::new_remember_token")
186
+ instance_exec(*[], &block)
187
+ end
188
+
189
+ def self.digest(token)
190
+ block = model_class_methods[:digest]
191
+ is_implemented(block, "::digest")
192
+ instance_exec(*[token], &block)
193
+ end
194
+
195
+
196
+ end
@@ -0,0 +1,173 @@
1
+ require 'rspec'
2
+ $:.unshift File.expand_path('../', __FILE__)
3
+ load 'spec/mocks/user_mock.rb'
4
+
5
+ describe UserMock do
6
+
7
+ let(:mock_class){described_class}
8
+
9
+ describe '::column_names' do
10
+
11
+ it 'returns an array of column names found from the schema.rb file' do
12
+ expect(mock_class.column_names).to eq(["id", "name", "email", "created_at", "updated_at", "password_digest", "remember_token", "admin"])
13
+ end
14
+
15
+ end
16
+
17
+ describe 'mass_assignment' do
18
+
19
+ it "can pass any or all attributes from schema in initializer" do
20
+ result = mock_class.new(name: "Sam", email: 'Walton')
21
+ expect(result.name).to eq 'Sam'
22
+ expect(result.email).to eq 'Walton'
23
+ end
24
+
25
+ it 'will raise error if not an attribute or association' do
26
+ expect{mock_class.new(baz: "Hello")}.to raise_error('Rejected params: {"baz"=>"Hello"} for UserMock')
27
+ end
28
+
29
+ end
30
+
31
+ describe 'relationships' do
32
+
33
+ it 'add instance methods from model relationships' do
34
+ result = mock_class.new(followers: [1])
35
+ expect(result.followers).to eq [1]
36
+ end
37
+
38
+ it 'add has_many relationship' do
39
+
40
+ expect(mock_class.new.microposts.class).to eq ActiveMocker::CollectionAssociation
41
+ expect(mock_class.new.microposts.count).to eq 0
42
+ mock_inst = mock_class.new
43
+ mock_inst.microposts << 1
44
+ expect(mock_inst.microposts.count).to eq 1
45
+
46
+ end
47
+
48
+ end
49
+
50
+ describe 'instance methods' do
51
+
52
+ it 'will raise exception for unimplemented methods' do
53
+ expect(mock_class.new.method(:following?).parameters).to eq [[:req, :other_user]]
54
+ expect{mock_class.new.following?}.to raise_error ArgumentError
55
+ expect{mock_class.new.following?('foo')}.to raise_error(RuntimeError, '#following? is not Implemented for Class: UserMock')
56
+ end
57
+
58
+ it 'can be implemented dynamically' do
59
+
60
+ mock_class.mock_instance_method(:follow!) do |other_user|
61
+ "Now implemented with #{other_user}"
62
+ end
63
+ result = mock_class.new
64
+ result = result.follow!('foo')
65
+ expect(result).to eq "Now implemented with foo"
66
+
67
+ end
68
+
69
+ it 'can reference another mock' do
70
+
71
+ mock_class.mock_instance_method(:following?) do |person|
72
+ true
73
+ end
74
+
75
+ mock_class.mock_instance_method(:follow!) do |person|
76
+ following?(person)
77
+ end
78
+
79
+ expect(mock_class.new.follow!("name")).to eq true
80
+ expect(mock_class.new.following?(1)).to eq true
81
+ end
82
+
83
+ end
84
+
85
+ describe 'class methods' do
86
+
87
+ it 'will raise exception for unimplemented methods' do
88
+ expect{mock_class.new_remember_token}.to raise_error('::new_remember_token is not Implemented for Class: UserMock')
89
+ end
90
+
91
+ it 'can be implemented as follows' do
92
+
93
+ mock_class.mock_class_method(:new_remember_token) do
94
+ "Now implemented"
95
+ end
96
+ expect{mock_class.new_remember_token}.to_not raise_error
97
+ expect(mock_class.new_remember_token).to eq("Now implemented")
98
+
99
+ end
100
+
101
+ end
102
+
103
+ context 'active_hash' do
104
+
105
+ it 'uses active_hash::base as superclass' do
106
+ expect(mock_class.superclass.name).to eq 'ActiveHash::Base'
107
+ end
108
+
109
+ it 'can save to class and then find instance by attribute' do
110
+ record = mock_class.create(name: "Sam")
111
+ expect(mock_class.find_by(name:"Sam")).to eq record
112
+
113
+ end
114
+
115
+ it '#update' do
116
+
117
+ person = mock_class.create(name: 'Justin')
118
+
119
+ expect(UserMock.first.name).to eq 'Justin'
120
+ person.update(name: 'Dustin')
121
+ expect(UserMock.first.name).to eq 'Dustin'
122
+
123
+ expect(person.name).to eq 'Dustin'
124
+
125
+ end
126
+
127
+ it '::destroy_all' do
128
+
129
+ mock_class.create
130
+
131
+ expect(mock_class.count).to eq 1
132
+
133
+ mock_class.destroy_all
134
+
135
+ expect(mock_class.count).to eq 0
136
+
137
+ end
138
+
139
+ it '::find_by' do
140
+ person = mock_class.create(name: 'dustin')
141
+ expect(mock_class.find_by(name: 'dustin')).to eq person
142
+ end
143
+
144
+ it '::find_or_create_by' do
145
+ person = mock_class.find_or_create_by(name: 'dustin')
146
+ expect(mock_class.find_by(name: 'dustin')).to eq person
147
+ person = mock_class.find_or_create_by(name: 'dustin')
148
+ expect(mock_class.count).to eq 1
149
+ end
150
+
151
+ it '::find_or_create_by with update' do
152
+ mock_class.create(name: 'dustin')
153
+ person = mock_class.find_or_create_by(name: 'dustin')
154
+ person.update(email: 'Zeisler')
155
+ expect(mock_class.first.attributes).to eq person.attributes
156
+ expect(mock_class.count).to eq 1
157
+ end
158
+
159
+ it '::find_or_initialize_by' do
160
+ person = mock_class.find_or_initialize_by(name: 'dustin')
161
+ expect(person.persisted?).to eq false
162
+ mock_class.create(name: 'dustin')
163
+ person = mock_class.find_or_initialize_by(name: 'dustin')
164
+ expect(person.persisted?).to eq true
165
+ end
166
+
167
+ after(:each) do
168
+ mock_class.delete_all
169
+ end
170
+
171
+ end
172
+
173
+ end