active_mocker 1.2 → 1.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/README.md +61 -25
  4. data/Rakefile +1 -1
  5. data/active_mocker.gemspec +3 -3
  6. data/lib/active_hash/init.rb +13 -22
  7. data/lib/active_mocker.rb +1 -0
  8. data/lib/active_mocker/active_record/unknown_class_method.rb +1 -1
  9. data/lib/active_mocker/active_record/unknown_module.rb +3 -3
  10. data/lib/active_mocker/collection_association.rb +19 -20
  11. data/lib/active_mocker/config.rb +7 -4
  12. data/lib/active_mocker/field.rb +4 -4
  13. data/lib/active_mocker/generate.rb +75 -18
  14. data/lib/active_mocker/logger.rb +10 -1
  15. data/lib/active_mocker/mock_class_methods.rb +12 -2
  16. data/lib/active_mocker/mock_instance_methods.rb +3 -2
  17. data/lib/active_mocker/mock_requires.rb +2 -1
  18. data/lib/active_mocker/mock_template.erb +25 -22
  19. data/lib/active_mocker/public_methods.rb +6 -2
  20. data/lib/active_mocker/version.rb +1 -1
  21. data/sample_app_rails_4/app/models/micropost.rb +0 -2
  22. data/sample_app_rails_4/bin/rspec +16 -0
  23. data/sample_app_rails_4/config/application.rb +0 -3
  24. data/sample_app_rails_4/config/database.yml +5 -6
  25. data/sample_app_rails_4/config/environments/development.rb +0 -2
  26. data/sample_app_rails_4/config/environments/test.rb +0 -1
  27. data/sample_app_rails_4/config/initializers/active_mocker.rb +7 -5
  28. data/sample_app_rails_4/db/migrate/20130311191400_create_users.rb +1 -1
  29. data/sample_app_rails_4/db/migrate/20130315015932_add_admin_to_users.rb +1 -1
  30. data/sample_app_rails_4/db/schema.rb +4 -3
  31. data/sample_app_rails_4/lib/tasks/{mocks.rake → active_mocker.rake} +5 -5
  32. data/sample_app_rails_4/lib/unit_logger.rb +22 -0
  33. data/sample_app_rails_4/spec/compare_mocker_and_record_spec.rb +110 -4
  34. data/sample_app_rails_4/spec/mocks/micropost_mock.rb +31 -27
  35. data/sample_app_rails_4/spec/mocks/relationship_mock.rb +29 -24
  36. data/sample_app_rails_4/spec/mocks/user_mock.rb +69 -58
  37. data/sample_app_rails_4/spec/spec_helper.rb +6 -7
  38. data/sample_app_rails_4/spec/user_mock_spec.rb +14 -7
  39. data/spec/lib/active_mocker/collection_association_spec.rb +17 -3
  40. data/spec/lib/active_mocker/generate_spec.rb +8 -6
  41. data/spec/lib/active_mocker/model_reader_spec.rb +5 -0
  42. data/spec/lib/active_mocker/schema_reader_spec.rb +1 -1
  43. data/spec/lib/readme_spec.rb +199 -205
  44. data/spec/unit_logger.rb +24 -0
  45. metadata +22 -32
  46. data/mocks/micropost_mock.rb +0 -108
  47. data/mocks/relationship_mock.rb +0 -109
  48. data/mocks/user_mock.rb +0 -199
  49. data/plan_mock.rb +0 -2323
  50. data/sample_app_rails_4/config/cucumber.yml +0 -8
  51. data/sample_app_rails_4/db/development.sqlite3 +0 -0
  52. data/sample_app_rails_4/db/test.sqlite3 +0 -0
  53. data/spec/lib/active_mocker/performance/base_spec.rb +0 -454
  54. data/spec/lib/active_mocker/performance/large_schema.rb +0 -3576
  55. data/spec/lib/active_mocker/performance/migration/20140327205359_migration.rb +0 -0
  56. data/spec/lib/active_mocker/performance/schema_reader_spec.rb +0 -96
  57. data/spec/lib/compare_mocker_and_record_spec.rb +0 -133
@@ -1,8 +0,0 @@
1
- <%
2
- rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : ""
3
- rerun_opts = rerun.to_s.strip.empty? ? "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}"
4
- std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} --strict --tags ~@wip"
5
- %>
6
- default: <%= std_opts %> features
7
- wip: --tags @wip:3 --wip features
8
- rerun: <%= rerun_opts %> --format rerun --out rerun.txt --strict --tags ~@wip
@@ -1,454 +0,0 @@
1
- require 'rspec'
2
- $:.unshift File.expand_path('../../', __FILE__)
3
- require 'forwardable'
4
- require 'singleton'
5
- require 'logger'
6
- require 'active_mocker/logger'
7
- require 'string_reader'
8
- require 'file_reader'
9
- require 'active_mocker/public_methods'
10
- require 'active_mocker/collection_association'
11
- require 'active_mocker/table'
12
- require 'active_mocker/config'
13
- require 'active_mocker/reparameterize'
14
- require 'active_mocker/field'
15
- require 'active_mocker/active_record'
16
- require 'active_mocker/model_reader'
17
- require 'active_mocker/schema_reader'
18
- require 'active_mocker/generate'
19
- require 'active_mocker/active_record/schema'
20
- require 'active_support/all'
21
- require 'active_hash/ar_api'
22
- require 'erb'
23
- describe ActiveMocker, pending: true do
24
-
25
- before(:each) do
26
- ActiveMocker.configure do |config|
27
- # Required Options
28
- config.schema_file = File.join(File.expand_path('../../', __FILE__), 'performance/large_schema.rb')
29
- config.model_dir = 'file is being inject as string'
30
- # Dependency injection
31
- config.model_file_reader = model_file
32
- # Additional Options
33
- config.schema_attributes = true #default
34
- config.model_attributes = true #default
35
- config.clear_cache = true #default
36
- config.migration_dir = '/Users/zeisler/dev/active_mocker/spec/lib/active_mocker/performance/migration'
37
- # Logging
38
- config.log_level = Logger::WARN #default
39
- end
40
-
41
- end
42
-
43
- let(:mock_class){
44
- ActiveMocker.mock('Person')
45
- }
46
-
47
- let(:model_file){
48
- StringReader.new <<-eos
49
- class Plan < ActiveRecord::Base
50
-
51
- def for_real(abc)
52
- puts abc
53
- end
54
-
55
- end
56
- eos
57
- }
58
-
59
-
60
- describe '::column_names' do
61
-
62
- it 'returns an array of column names found from the schema.rb file' do
63
- expect(mock_class.column_names).to eq(["id", "account_id", "first_name", "last_name", "address", "city", "800_number"])
64
- end
65
-
66
- end
67
-
68
- describe 'mass_assignment' do
69
-
70
- it "can pass any or all attributes from schema in initializer" do
71
- result = mock_class.new(first_name: "Sam", last_name: 'Walton')
72
- expect(result.first_name).to eq 'Sam'
73
- expect(result.last_name).to eq 'Walton'
74
-
75
- end
76
-
77
- it 'will raise error if not an attribute or association' do
78
- expect{mock_class.new(baz: "Hello")}.to raise_error('Rejected params: {"baz"=>"Hello"} for PersonMock')
79
- end
80
-
81
- end
82
-
83
- describe '#mock_class' do
84
-
85
- it 'create a mock object after the active record' do
86
- expect(mock_class).to eq(PersonMock)
87
- end
88
-
89
- context 'private methods' do
90
-
91
- let(:model_file){
92
- StringReader.new <<-eos
93
- class Person < ActiveRecord::Base
94
- private
95
-
96
- def bar
97
- end
98
-
99
- end
100
- eos
101
- }
102
-
103
- it 'will not have private methods' do
104
- expect{mock_class.bar}.to raise_error(NoMethodError)
105
- end
106
-
107
- end
108
-
109
- describe 'relationships' do
110
-
111
- let(:model_file){
112
- StringReader.new <<-eos
113
- class Person < ActiveRecord::Base
114
- belongs_to :account
115
- has_many :files
116
- end
117
- eos
118
- }
119
-
120
- it 'add instance methods from model relationships' do
121
- result = mock_class.new(account: 'Account')
122
- expect(result.account).to eq 'Account'
123
- end
124
-
125
- it 'add has_many relationship' do
126
-
127
- expect(mock_class.new.files.class).to eq ActiveMocker::CollectionAssociation
128
- expect(mock_class.new.files.count).to eq 0
129
- mock_inst = mock_class.new
130
- mock_inst.files << 1
131
- expect(mock_inst.files.count).to eq 1
132
-
133
- end
134
-
135
- end
136
-
137
- describe 'conflict of instance mocks and class mocks' do
138
-
139
- let(:model_file){
140
- StringReader.new <<-eos
141
- class Person < ActiveRecord::Base
142
- def bar(name, type=nil)
143
- end
144
-
145
- def self.bar
146
- end
147
- end
148
- eos
149
- }
150
-
151
- it 'can mock instance method and class method of the same name' do
152
- result = mock_class.new
153
- result.mock_instance_method(:bar) do |name, type=nil|
154
- "Now implemented with #{name} and #{type}"
155
- end
156
- expect{result.bar}.to raise_error ArgumentError
157
- result = result.bar('foo', 'type')
158
- expect(result).to eq "Now implemented with foo and type"
159
- expect{mock_class.bar}.to raise_error(RuntimeError, '::bar is not Implemented for Class: PersonMock')
160
-
161
- mock_class.mock_class_method(:bar) do
162
- "Now implemented"
163
- end
164
- expect{mock_class.bar}.to_not raise_error
165
- expect(mock_class.bar).to eq("Now implemented")
166
- end
167
-
168
- end
169
-
170
- describe 'instance methods' do
171
-
172
- let(:model_file){
173
- StringReader.new <<-eos
174
- class Plan < ActiveRecord::Base
175
- def bar(name, type=nil)
176
- end
177
-
178
- def baz
179
- end
180
- end
181
- eos
182
- }
183
-
184
- it 'will raise exception for unimplemented methods' do
185
- expect(mock_class.new.method(:bar).parameters).to eq [[:req, :name], [:opt, :type]]
186
- expect{mock_class.new.bar}.to raise_error ArgumentError
187
- expect{mock_class.new.bar('foo', 'type')}.to raise_error('#bar is not Implemented for Class: PersonMock')
188
- end
189
-
190
- it 'can be implemented dynamically' do
191
-
192
- mock_class.mock_instance_method(:bar) do |name, type=nil|
193
- "Now implemented with #{name} and #{type}"
194
- end
195
-
196
- result = mock_class.new
197
- result = result.bar('foo', 'type')
198
- expect(result).to eq "Now implemented with foo and type"
199
-
200
- end
201
-
202
- it 'can reference another mock' do
203
-
204
- mock_class.mock_instance_method(:bar) do |name, type=nil|
205
- "Now implemented with #{name} and #{type}"
206
- end
207
-
208
- mock_class.mock_instance_method(:baz) do
209
- bar("name", 'type')
210
- end
211
-
212
- expect(mock_class.new.bar("name", 'type')).to eq "Now implemented with name and type"
213
- expect(mock_class.new.baz).to eq "Now implemented with name and type"
214
- end
215
-
216
- context 'can call real code by delegating to model' do
217
-
218
- let(:model_file){
219
- StringReader.new <<-eos
220
- class Person < ActiveRecord::Base
221
- def bar(name, type=nil)
222
- name + ' bar' + foo + ' ' +type
223
- end
224
-
225
- def foo
226
- 'foo'
227
- end
228
-
229
- def baz
230
- end
231
-
232
- def self.foobar
233
- 'foobar'
234
- end
235
- end
236
- eos
237
- }
238
-
239
- it 'can delegate instance method to models instance method' do
240
-
241
- mock_class.mock_instance_method(:bar) do |name, type=nil|
242
- delegate_to_model_instance(:bar, name, type)
243
- end
244
-
245
- expect(mock_class.new.bar('name','type')).to eq "name barfoo type"
246
-
247
- end
248
-
249
- it 'can delegate class method to models class method' do
250
-
251
- mock_class.mock_class_method(:foobar) do
252
- delegate_to_model_class(:foobar)
253
- end
254
-
255
- expect(mock_class.foobar).to eq "foobar"
256
-
257
- end
258
-
259
- end
260
-
261
- end
262
-
263
- describe 'class methods' do
264
-
265
- let(:model_file){
266
- StringReader.new <<-eos
267
- class Person < ActiveRecord::Base
268
- scope :named, -> { }
269
-
270
- def self.class_method
271
- end
272
- end
273
- eos
274
- }
275
-
276
- it 'will raise exception for unimplemented methods' do
277
- expect{mock_class.class_method}.to raise_error('::class_method is not Implemented for Class: PersonMock')
278
- end
279
-
280
- it 'can be implemented as follows' do
281
-
282
- mock_class.mock_class_method(:class_method) do
283
- "Now implemented"
284
- end
285
- expect{mock_class.class_method}.to_not raise_error
286
- expect(mock_class.class_method).to eq("Now implemented")
287
-
288
- end
289
-
290
- it 'loads named scopes as class method' do
291
- expect{mock_class.named}.to raise_error('::named is not Implemented for Class: PersonMock')
292
- end
293
-
294
- end
295
-
296
- end
297
-
298
- context 'active_hash' do
299
-
300
- let(:model_file){
301
- StringReader.new <<-eos
302
- class Person < ActiveRecord::Base
303
- belongs_to :account
304
-
305
- def bar
306
- end
307
-
308
- end
309
- eos
310
- }
311
-
312
- it 'uses active_hash::base as superclass' do
313
- expect(mock_class.superclass.name).to eq 'ActiveHash::Base'
314
- end
315
-
316
- it 'can mass assign attributes to constructor' do
317
- result = mock_class.new(first_name: "Sam", last_name: 'Walton', account: 0)
318
- expect(result.first_name).to eq 'Sam'
319
- expect(result.last_name).to eq 'Walton'
320
- expect(result.account).to eq 0
321
- end
322
-
323
- it 'can save to class and then find instance by attribute' do
324
-
325
- record = mock_class.create(first_name: "Sam", last_name: 'Walton')
326
- expect(mock_class.find_by(first_name:"Sam")).to eq record
327
-
328
- end
329
-
330
- it '::column_names' do
331
- expect(mock_class.column_names).to eq(["id", "account_id", "first_name", "last_name", "address", "city","800_number"])
332
- end
333
-
334
- it 'instance methods from model' do
335
- expect{mock_class.new.bar}.to raise_error '#bar is not Implemented for Class: PersonMock'
336
- end
337
-
338
- let(:model_file){
339
- StringReader.new <<-eos
340
- class Person < ActiveRecord::Base
341
- belongs_to :account
342
-
343
- def bar
344
- end
345
-
346
- end
347
- eos
348
- }
349
-
350
- it '#update' do
351
-
352
- person = mock_class.create(first_name: 'Justin')
353
-
354
- expect(PersonMock.first.first_name).to eq 'Justin'
355
- person.update(first_name: 'Dustin')
356
- expect(PersonMock.first.first_name).to eq 'Dustin'
357
-
358
- expect(person.first_name).to eq 'Dustin'
359
-
360
-
361
- end
362
-
363
- it '::destroy_all' do
364
-
365
- mock_class.create
366
-
367
- expect(mock_class.count).to eq 1
368
-
369
- mock_class.destroy_all
370
-
371
- expect(mock_class.count).to eq 0
372
-
373
- end
374
-
375
- it '::find_by' do
376
- person = mock_class.create(first_name: 'dustin')
377
- expect(mock_class.find_by(first_name: 'dustin')).to eq person
378
- end
379
-
380
- it '::find_or_create_by' do
381
- person = mock_class.find_or_create_by(first_name: 'dustin')
382
- expect(mock_class.find_by(first_name: 'dustin')).to eq person
383
- person = mock_class.find_or_create_by(first_name: 'dustin')
384
- expect(mock_class.count).to eq 1
385
- end
386
-
387
- it '::find_or_create_by with update' do
388
- mock_class.create(first_name: 'dustin')
389
- person = mock_class.find_or_create_by(first_name: 'dustin')
390
- person.update(last_name: 'Zeisler')
391
- expect(mock_class.first.attributes).to eq person.attributes
392
- expect(mock_class.count).to eq 1
393
- end
394
-
395
- it '::find_or_initialize_by' do
396
- person = mock_class.find_or_initialize_by(first_name: 'dustin')
397
- expect(person.persisted?).to eq false
398
- mock_class.create(first_name: 'dustin')
399
- person = mock_class.find_or_initialize_by(first_name: 'dustin')
400
- expect(person.persisted?).to eq true
401
- end
402
-
403
- after(:each) do
404
- mock_class.delete_all
405
- end
406
-
407
-
408
- end
409
-
410
- describe '::configure' do
411
-
412
- it 'requires schema_file' do
413
- ActiveMocker::Base.reload_default
414
- expect{
415
- ActiveMocker::Base.configure {
416
- }
417
- }.to raise_error
418
-
419
- end
420
-
421
-
422
- it 'requires model_dir' do
423
- ActiveMocker::Base.reload_default
424
- expect{
425
- ActiveMocker::Base.configure { |c|
426
- c.schema_file = 'dir'
427
- }
428
- }.to raise_error
429
-
430
- end
431
-
432
- end
433
-
434
- describe 'cannot redefine attributes method' do
435
-
436
- let(:model_file){
437
- StringReader.new <<-eos
438
- class Person < ActiveRecord::Base
439
- def attributes; end
440
-
441
- end
442
- eos
443
- }
444
-
445
- it 'still works' do
446
-
447
- mock_class.new.attributes
448
-
449
- end
450
-
451
-
452
- end
453
-
454
- end