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,3 +1,12 @@
1
1
  module ActiveMocker
2
- Logger_ = Logger.new(STDOUT)
2
+ class Logger
3
+
4
+ def self.set(logger)
5
+ @@logger = logger
6
+ end
7
+
8
+ def self.method_missing(meth, *args, &block)
9
+ return @@logger.send(meth, *args, &block)
10
+ end
11
+ end
3
12
  end
@@ -2,11 +2,11 @@ module ActiveMocker
2
2
  module MockClassMethods
3
3
 
4
4
  def mock_instance_method(method, &block)
5
- model_instance_methods[method] = block
5
+ model_instance_methods[method.to_s] = block
6
6
  end
7
7
 
8
8
  def mock_class_method(method, &block)
9
- model_class_methods[method] = block
9
+ model_class_methods[method.to_s] = block
10
10
  end
11
11
 
12
12
  def column_names
@@ -73,6 +73,16 @@ module MockClassMethods
73
73
  return @association_template
74
74
  end
75
75
 
76
+ def set_type(field_name, type)
77
+ types[field_name] = Virtus::Attribute.build(type)
78
+ end
79
+
80
+ def coerce(field, new_val)
81
+ type = self.class.types[field]
82
+ return attributes[field] = type.coerce(new_val) unless type.nil?
83
+ return new_value
84
+ end
85
+
76
86
  public
77
87
  def is_implemented(val, method)
78
88
  raise "#{method} is not Implemented for Class: #{name}" if val == :not_implemented
@@ -1,6 +1,7 @@
1
1
  module ActiveMocker
2
2
  module MockInstanceMethods
3
3
 
4
+
4
5
  def mock_instance_method(method, &block)
5
6
  model_instance_methods[method] = block
6
7
  end
@@ -38,11 +39,11 @@ module MockInstanceMethods
38
39
  private
39
40
 
40
41
  def read_attribute(attr)
41
- attributes[attr]
42
+ @attributes[attr]
42
43
  end
43
44
 
44
45
  def write_attribute(attr, value)
45
- attributes[attr] = value
46
+ @attributes[attr] = value
46
47
  end
47
48
 
48
49
  def read_association(attr)
@@ -3,4 +3,5 @@ require 'active_mocker/mock_class_methods'
3
3
  require 'active_mocker/mock_instance_methods'
4
4
  require 'active_hash'
5
5
  require 'active_hash/ar_api'
6
- require 'active_mocker/class_exists'
6
+ require 'active_mocker/class_exists'
7
+ require 'virtus'
@@ -6,6 +6,13 @@ class <%= class_name %> < ::ActiveHash::Base
6
6
  include ActiveMocker::MockInstanceMethods
7
7
  extend ActiveMocker::MockClassMethods
8
8
 
9
+ def initialize(attributes = {})
10
+ @attributes = HashWithIndifferentAccess.new(<%= default_attributes %>)
11
+ @associations = HashWithIndifferentAccess.new(<%= associations %>)
12
+ super(attributes)
13
+ end
14
+
15
+
9
16
  def self.column_names
10
17
  <%= attribute_names %>
11
18
  end
@@ -18,12 +25,13 @@ class <%= class_name %> < ::ActiveHash::Base
18
25
  # Attributes getter/setters #
19
26
  ##################################
20
27
  <% attributes.each do |meth| %>
21
- def <%= meth %>
22
- attributes['<%= meth %>']
23
- end
28
+ def <%= meth.name %>
29
+ @attributes['<%= meth.name %>']
30
+ end
24
31
 
25
- def <%= meth %>=(val)
26
- attributes['<%= meth %>'] = val
32
+ def <%= meth.name %>=(val)
33
+ type = (types[:<%= meth.name %>] ||= Virtus::Attribute.build(<%= meth.type %>))
34
+ @attributes['<%= meth.name %>'] = type.coerce(val)
27
35
  end
28
36
  <% end %>
29
37
  ##################################
@@ -41,32 +49,27 @@ class <%= class_name %> < ::ActiveHash::Base
41
49
  def <%= meth %>=(val)
42
50
  associations['<%= meth %>'] = val
43
51
  end
44
- <% end %>
52
+ <% end -%>
45
53
  <% collection_associations.each do |meth| %>
46
54
  def <%= meth %>
47
- associations['<%= meth %>']
55
+ associations['<%= meth %>'] ||= ActiveMocker::CollectionAssociation.new
48
56
  end
49
57
 
50
58
  def <%= meth %>=(val)
51
59
  associations['<%= meth %>'] = ActiveMocker::CollectionAssociation.new(val)
52
60
  end
53
- <% end %>
61
+ <% end -%>
62
+
54
63
  ##################################
55
64
  # Model Methods getter/setters #
56
65
  ##################################
57
66
 
58
67
  def self.model_instance_methods
59
- return @model_instance_methods if @model_instance_methods
60
- @model_instance_methods = {}<% model_instance_methods.each do |key, value| %>
61
- @model_instance_methods[:<%= key %>] = :not_implemented<% end %>
62
- @model_instance_methods
68
+ @model_instance_methods ||= <%= model_instance_methods %>
63
69
  end
64
70
 
65
71
  def self.model_class_methods
66
- return @model_class_methods if @model_class_methods
67
- @model_class_methods = {}<% model_class_methods.each do |key, value| %>
68
- @model_class_methods[:<%= key %>] = :not_implemented<% end %>
69
- @model_class_methods
72
+ @model_class_methods ||= <%= model_class_methods %>
70
73
  end
71
74
 
72
75
  def self.clear_mock
@@ -75,17 +78,17 @@ class <%= class_name %> < ::ActiveHash::Base
75
78
  end
76
79
  <% instance_methods.each do |method| %>
77
80
  def <%= method.method %>(<%= method.params %>)
78
- block = model_instance_methods[<%= method.method.inspect %>]
79
- self.class.is_implemented(block, "#<%= method.method %>")
81
+ block = model_instance_methods['<%= method.method %>']
82
+ self.class.is_implemented(block, '#<%= method.method %>')
80
83
  instance_exec(*[<%= method.params_pass %>], &block)
81
84
  end
82
- <% end %>
85
+ <% end -%>
83
86
  <% class_methods.each do |method| %>
84
87
  def self.<%= method.method %>(<%= method.params %>)
85
- block = model_class_methods[<%= method.method.inspect %>]
86
- is_implemented(block, "::<%= method.method %>")
88
+ block = model_class_methods['<%= method.method %>']
89
+ is_implemented(block, '::<%= method.method %>')
87
90
  instance_exec(*[<%= method.params_pass %>], &block)
88
91
  end
89
- <% end %>
92
+ <% end -%>
90
93
 
91
94
  end
@@ -1,7 +1,7 @@
1
1
  module ActiveMocker
2
2
 
3
- def self.mock(model_name, force_reload: false)
4
- Generate.mock(model_name, force_reload: force_reload)
3
+ def self.mock(model_name, options=nil)
4
+ Generate.mock(model_name)
5
5
  end
6
6
 
7
7
  def self.configure(&block)
@@ -12,4 +12,8 @@ module ActiveMocker
12
12
  Generate.configure(&block)
13
13
  end
14
14
 
15
+ def self.create_mocks
16
+ Generate.new
17
+ end
18
+
15
19
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveMocker
2
- VERSION = "1.2"
2
+ VERSION = "1.2.3"
3
3
  end
@@ -1,8 +1,6 @@
1
1
  class Micropost < ActiveRecord::Base
2
2
  belongs_to :user
3
3
  default_scope -> { order('created_at DESC') }
4
- validates :content, presence: true, length: { maximum: 140 }
5
- validates :user_id, presence: true
6
4
 
7
5
  # Returns microposts from the users being followed by the given user.
8
6
  def self.from_users_followed_by(user)
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'rspec' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require 'rubygems'
14
+ require 'bundler/setup'
15
+
16
+ load Gem.bin_path('rspec-core', 'rspec')
@@ -2,9 +2,6 @@
2
2
 
3
3
  # Pick the frameworks you want:
4
4
  require "active_record/railtie"
5
- require "action_controller/railtie"
6
- require "action_mailer/railtie"
7
- require "sprockets/railtie"
8
5
  # require "rails/test_unit/railtie"
9
6
 
10
7
  # Assets should be precompiled for production (so we don't need the gems loaded then)
@@ -12,17 +12,16 @@ development:
12
12
  # Warning: The database defined as "test" will be erased and
13
13
  # re-generated from your development database when you run "rake".
14
14
  # Do not set this db to the same as development or production.
15
- test: &test
15
+ test:
16
16
  adapter: sqlite3
17
- database: db/test.sqlite3
17
+ encoding: utf8
18
18
  pool: 5
19
19
  timeout: 5000
20
+ database: ":memory:"
21
+ verbosity: quiet
20
22
 
21
23
  production:
22
24
  adapter: sqlite3
23
25
  database: db/production.sqlite3
24
26
  pool: 5
25
- timeout: 5000
26
-
27
- cucumber:
28
- <<: *test
27
+ timeout: 5000
@@ -11,10 +11,8 @@ SampleApp::Application.configure do
11
11
 
12
12
  # Show full error reports and disable caching.
13
13
  config.consider_all_requests_local = true
14
- config.action_controller.perform_caching = false
15
14
 
16
15
  # Don't care if the mailer can't send.
17
- config.action_mailer.raise_delivery_errors = false
18
16
 
19
17
  # Print deprecation notices to the Rails logger.
20
18
  config.active_support.deprecation = :log
@@ -29,7 +29,6 @@ SampleApp::Application.configure do
29
29
  # Tell Action Mailer not to deliver emails to the real world.
30
30
  # The :test delivery method accumulates sent emails in the
31
31
  # ActionMailer::Base.deliveries array.
32
- config.action_mailer.delivery_method = :test
33
32
 
34
33
  # Print deprecation notices to the stderr.
35
34
  config.active_support.deprecation = :stderr
@@ -1,10 +1,12 @@
1
1
  require 'active_mocker'
2
-
2
+ root = APP_ROOT unless defined? Rails
3
+ root = Rails.root if defined? Rails
4
+ require "#{root}/lib/unit_logger"
3
5
  ActiveMocker::Generate.configure do |config|
4
6
  # Required Options
5
- config.schema_file = File.join(Rails.root, 'db/schema.rb')
6
- config.model_dir = File.join(Rails.root, 'app/models')
7
- config.mock_dir = File.join(Rails.root, 'spec/mocks')
7
+ config.schema_file = File.join(root, 'db/schema.rb')
8
+ config.model_dir = File.join(root, 'app/models')
9
+ config.mock_dir = File.join(root, 'spec/mocks')
8
10
  # Logging
9
- config.log_level = Logger::WARN #default
11
+ config.logger = UnitLogger
10
12
  end
@@ -3,7 +3,7 @@ class CreateUsers < ActiveRecord::Migration
3
3
  create_table :users do |t|
4
4
  t.string :name
5
5
  t.string :email
6
-
6
+ t.decimal :credits
7
7
  t.timestamps
8
8
  end
9
9
  end
@@ -1,5 +1,5 @@
1
1
  class AddAdminToUsers < ActiveRecord::Migration
2
2
  def change
3
- add_column :users, :admin, :boolean
3
+ add_column :users, :admin, :boolean, default: false
4
4
  end
5
5
  end
@@ -35,12 +35,13 @@ ActiveRecord::Schema.define(version: 20130315230445) do
35
35
 
36
36
  create_table "users", force: true do |t|
37
37
  t.string "name"
38
- t.string "email"
38
+ t.string "email", default: ""
39
+ t.decimal "credits"
39
40
  t.datetime "created_at"
40
41
  t.datetime "updated_at"
41
42
  t.string "password_digest"
42
- t.string "remember_token"
43
- t.boolean "admin"
43
+ t.boolean "remember_token", default: true
44
+ t.boolean "admin", default: false
44
45
  end
45
46
 
46
47
  add_index "users", ["email"], name: "index_users_on_email", unique: true
@@ -1,10 +1,10 @@
1
+ task rebuild_mocks: :environment do
2
+ puts 'rebuilding mocks'
3
+ ActiveMocker.create_mocks
4
+ end
5
+
1
6
  ['db:schema:load', 'db:migrate', 'db:reset'].each do |task|
2
7
  Rake::Task[task].enhance do
3
8
  Rake::Task['rebuild_mocks'].invoke
4
9
  end
5
10
  end
6
-
7
- task rebuild_mocks: :environment do
8
- puts 'rebuilding mocks'
9
- ActiveMocker::Generate.new
10
- end
@@ -0,0 +1,22 @@
1
+ require 'logger'
2
+ class UnitLogger
3
+
4
+ def self.method_missing(meth, *args, &block)
5
+ return Rails.logger.send(meth, *args, &block) if defined? Rails
6
+ return unit.send(meth, *args, &block)
7
+ end
8
+
9
+ def self.unit
10
+ return @logger unless @logger.nil?
11
+ @logger = Logger.new(STDOUT)
12
+ @logger.formatter = proc do |severity, datetime, progname, msg|
13
+ msg
14
+ end
15
+ @logger.level = Logger::DEBUG
16
+ @logger
17
+ end
18
+
19
+ end
20
+
21
+
22
+
@@ -12,6 +12,7 @@ describe 'Comparing ActiveMocker Api to ActiveRecord Api' do
12
12
  Micropost.destroy_all
13
13
  end
14
14
 
15
+
15
16
  let(:attributes) { {name: 'Dustin Zeisler', email: 'dustin@example.com'} }
16
17
  let(:attributes_with_admin) { {name: 'Dustin Zeisler', email: 'dustin@example.com', admin: true} }
17
18
 
@@ -43,8 +44,12 @@ describe 'Comparing ActiveMocker Api to ActiveRecord Api' do
43
44
  let(:user_ar){User.new(attributes)}
44
45
  let(:user_mock){UserMock.new(attributes)}
45
46
 
46
- it 'they are the same' do
47
- expect(user_mock.attributes).to eq user_ar.attributes
47
+ it 'mock' do
48
+ expect(user_mock.attributes).to eq({"id" => nil, "name" => "Dustin Zeisler", "email" => "dustin@example.com", "credits" => nil, "created_at" => nil, "updated_at" => nil, "password_digest" => nil, "remember_token" => true, "admin" => false})
49
+ end
50
+
51
+ it 'AR' do
52
+ expect(user_ar.attributes).to eq({"id" => nil, "name" => "Dustin Zeisler", "email" => "dustin@example.com", "credits" => nil, "created_at" => nil, "updated_at" => nil, "password_digest" => nil, "remember_token" => true, "admin" => false})
48
53
  end
49
54
 
50
55
  end
@@ -58,12 +63,12 @@ describe 'Comparing ActiveMocker Api to ActiveRecord Api' do
58
63
  let(:user_mock){UserMock.new(create_attributes)}
59
64
 
60
65
  it 'the Mock when adding an association will not set the _id attribute, do it manually' do
61
- expect(user_mock.attributes).to eq({"id" => nil, "name" => "Dustin Zeisler", "email" => "dustin@example.com", "created_at" => nil, "updated_at" => nil, "password_digest" => nil, "remember_token" => nil, "admin" => nil})
66
+ expect(user_mock.attributes).to eq({"id" => nil, "name" => "Dustin Zeisler", "email" => "dustin@example.com", "credits" => nil, "created_at" => nil, "updated_at" => nil, "password_digest" => nil, "remember_token" => true, "admin" => false})
62
67
  expect(user_mock.microposts).to eq [micropost]
63
68
  end
64
69
 
65
70
  it 'Ar will not include associations in attributes' do
66
- expect(user_ar.attributes).to eq({"id" => nil, "name" => "Dustin Zeisler", "email" => "dustin@example.com", "created_at" => nil, "updated_at" => nil, "password_digest" => nil, "remember_token" => nil, "admin" => nil})
71
+ expect(user_ar.attributes).to eq({"id" => nil, "name" => "Dustin Zeisler", "email" => "dustin@example.com", "credits" => nil, "created_at" => nil, "updated_at" => nil, "password_digest" => nil, "remember_token" => true, "admin" => false})
67
72
  expect(user_ar.microposts).to eq [micropost]
68
73
  end
69
74
 
@@ -113,4 +118,105 @@ describe 'Comparing ActiveMocker Api to ActiveRecord Api' do
113
118
 
114
119
  end
115
120
 
121
+ describe 'type coercion' do
122
+
123
+ it 'will coerce string to integer' do
124
+ expect(Micropost.new(user_id: '1').user_id).to eq 1
125
+ expect(MicropostMock.new(user_id: '1').user_id).to eq 1
126
+ end
127
+
128
+ it 'will coerce string to bool' do
129
+ expect(User.new(admin: 'true').admin).to eq true
130
+ expect(UserMock.new(admin: 'true').admin).to eq true
131
+ end
132
+
133
+ it 'will coerce string to decimal' do
134
+ expect(User.new(credits: '12345').credits).to eq 12345.0
135
+ expect(UserMock.new(credits: '12345').credits).to eq 12345.0
136
+ end
137
+
138
+ it 'will coerce string to datetime' do
139
+ expect(User.new(created_at: '1/1/1990').created_at).to eq 'Mon, 01 Jan 1990 00:00:00 UTC +00:00'
140
+ expect(UserMock.new(created_at: '1/1/1990').created_at).to eq 'Mon, 01 Jan 1990 00:00:00 UTC +00:00'
141
+ end
142
+
143
+ it 'will coerce integer to string' do
144
+ expect(User.create(name: 1).reload.name).to eq '1'
145
+ expect(UserMock.new(name: 1).name).to eq '1'
146
+ end
147
+
148
+ end
149
+
150
+ describe 'CollectionAssociation' do
151
+
152
+ let(:support_array_methods) { [:<<, :take, :push, :clear, :first, :last, :concat, :replace, :distinct, :uniq, :count, :size, :length, :empty?, :any?, :include?] }
153
+
154
+ it 'supported array methods' do
155
+ mp1 = Micropost.create!(content: 'text')
156
+ mp2 = Micropost.create!(content: 'text')
157
+ user = User.create(microposts: [mp1, mp2])
158
+
159
+ mpm1 = MicropostMock.create
160
+ mpm2 = MicropostMock.create
161
+ user_mock = UserMock.create(microposts: [mpm1, mpm2])
162
+
163
+ expect(user.microposts.methods).to include *support_array_methods
164
+ expect(user_mock.microposts.methods).to include *support_array_methods
165
+ expect(user.microposts.take(1).count).to eq(1)
166
+ expect(user_mock.microposts.take(1).count).to eq(1)
167
+
168
+ end
169
+
170
+ it '#sum' do
171
+ mp1 = Micropost.create!(content: 'text')
172
+ mp2 = Micropost.create!(content: 'text')
173
+ user = User.create(microposts: [mp1, mp2])
174
+ expect(user.microposts.sum(:user_id)).to eq 2
175
+
176
+ mpm1 = MicropostMock.create(user_id: 1)
177
+ mpm2 = MicropostMock.create(user_id: 2)
178
+ user_mock = UserMock.create(microposts: [mpm1, mpm2])
179
+
180
+ expect(user_mock.microposts.sum(:user_id)).to eq 3
181
+
182
+ end
183
+
184
+ end
185
+
186
+ describe 'default values' do
187
+
188
+ context 'if nil values are defaulted' do
189
+
190
+ it 'ar' do
191
+ user = User.new
192
+ expect(user.admin).to eq false
193
+ expect(user.remember_token).to eq true
194
+ end
195
+
196
+ it 'mock' do
197
+ user = UserMock.new
198
+ expect(user.admin).to eq false
199
+ expect(user.remember_token).to eq true
200
+ end
201
+
202
+ end
203
+
204
+ context 'values can be passed' do
205
+
206
+ it 'ar' do
207
+ user = User.new(admin: true, remember_token: false)
208
+ expect(user.admin).to eq true
209
+ expect(user.remember_token).to eq false
210
+ end
211
+
212
+ it 'mock' do
213
+ user = UserMock.new(admin: true, remember_token: false)
214
+ expect(user.admin).to eq true
215
+ expect(user.remember_token).to eq false
216
+ end
217
+
218
+ end
219
+
220
+ end
221
+
116
222
  end