active_mocker 0.1.1 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a57ab19178452d40493f706844efc26d8381d0b1
4
- data.tar.gz: 360196e9eccecb12fef06ca111e002bfdd1cb5a7
3
+ metadata.gz: 088dc755f7c69b012b24059d5dde2327b51c2ac5
4
+ data.tar.gz: 056cc0f1af0680b37db122ba36a5c6406550d597
5
5
  SHA512:
6
- metadata.gz: ff22e9d0e5bef978329f85385e6865dcce9803a10a703de790ce2682f7715efda58b017007a05b4ab4e0d3ac7d24a2fb9c6255d078d9a9e974ca04f0f3029f16
7
- data.tar.gz: 6b94c9d8b9025619a45f8991cb7592a5c43dd44258822405726cbfcdffc4730eaddbd94687e02842cb5ed219c7f08d8136ad501dd771820c30748f6aa5e61c7e
6
+ metadata.gz: 16e53701559ce5c97bee5cdef1a2d438bdc4b2dfe0e37fd8008046ec34d5527a224f651ef953adf098dc492d744b6467794fc2695dfc4f0c9599e41828567578
7
+ data.tar.gz: e2c885e9ab6358deb98b6ae3f25ffbec50e7b189c2b05dfda687e5c97e657d4655fe45cd4209fcec83120a67e9994905e3b68c7279098afdcd97501983c49839
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # ActiveMocker
2
2
  [![Build Status](https://travis-ci.org/zeisler/active_mocker.png?branch=master)](https://travis-ci.org/zeisler/active_mocker)
3
- Create mocks from active record models without loading rails or running a datebase
3
+
4
+ Create mocks from active record models without loading rails or running a database.
5
+
4
6
 
5
7
  ## Installation
6
8
 
@@ -18,7 +20,119 @@ Or install it yourself as:
18
20
 
19
21
  ## Usage
20
22
 
21
- TODO: Write usage instructions here
23
+
24
+ #db/schema.rb
25
+
26
+ ActiveRecord::Schema.define(version: 20140327205359) do
27
+
28
+ create_table "people", force: true do |t|
29
+ t.integer "account_id"
30
+ t.string "first_name", limit: 128
31
+ t.string "last_name", limit: 128
32
+ t.string "address", limit: 200
33
+ t.string "city", limit: 100
34
+ end
35
+
36
+ end
37
+
38
+ #app/models/person.rb
39
+
40
+ class Person < ActiveRecord::Base
41
+ belongs_to :account
42
+
43
+ def bar(name, type=nil)
44
+ puts bar
45
+ end
46
+
47
+ end
48
+
49
+ require 'active_mocker'
50
+
51
+ ActiveMocker::Base.configure do |config|
52
+ config.schema_file = 'file is being inject as string'
53
+ config.model_dir = 'file is being inject as string'
54
+ # Dependency injection
55
+ config.schema_file_reader = schema_file
56
+ config.model_file_reader = model_file
57
+ # Additional Options
58
+ config.active_hash_as_base = false #default
59
+ config.schema_attributes = true #default
60
+ config.model_relationships = true #default
61
+ config.model_methods = true #default
62
+ config.mass_assignment = true #default
63
+ end
64
+
65
+ mocker = ActiveMocker::Base.new({schema: {path: [path to schema.rb file]},
66
+ model: {path: [dir of rails models]}}
67
+
68
+ mocker.mock('Person')
69
+ => PersonMock
70
+
71
+ PersonMock.column_names
72
+ => ["account_id", "first_name", "last_name", "address", "city"]
73
+
74
+ person_mock = PersonMock.new(first_name: "Dustin", last_name: "Zeisler", account: mocker.mock('Account').new)
75
+ => #<PersonMock @first_name="Dustin", @last_name="Zeisler">
76
+
77
+ person_mock.first_name
78
+ => "Dustin"
79
+
80
+ ### When schema.rb changes the mock fails
81
+
82
+ #db/schema.rb
83
+
84
+ ActiveRecord::Schema.define(version: 20140327205359) do
85
+
86
+ create_table "people", force: true do |t|
87
+ t.integer "account_id"
88
+ t.string "f_name", limit: 128
89
+ t.string "l_name", limit: 128
90
+ t.string "address", limit: 200
91
+ t.string "city", limit: 100
92
+ end
93
+
94
+ end
95
+
96
+ person_mock = PersonMock.new(first_name: "Dustin", last_name: "Zeisler", account: AccountMock.new)
97
+ => NoMethodError: undefined method `first_name=' for #<PersonMock:0x007f860abf6b10>
98
+
99
+
100
+ ### Mocking instance methods
101
+
102
+ person_mock.bar
103
+ => ArgumentError: wrong number of arguments (0 for 1..2)
104
+
105
+ person_mock.bar('baz')
106
+ => RuntimeError: #bar is not Implemented for Class: PersonMock
107
+
108
+
109
+ mock_class.mock_instance_method(:bar) do |name, type=nil|
110
+ "Now implemented with #{name} and #{type}"
111
+ end
112
+
113
+ mock_class.new.bar('foo', 'type')
114
+ => "Now implemented with foo and type"
115
+
116
+ ### When the model changes the mock fails
117
+
118
+ #app/models/person.rb
119
+
120
+ class Person < ActiveRecord::Base
121
+ belongs_to :account
122
+
123
+ def bar(name)
124
+ puts bar
125
+ end
126
+
127
+ end
128
+
129
+ mock_class.new.bar('foo', 'type')
130
+ => ArgumentError: wrong number of arguments (2 for 1)
131
+
132
+
133
+
134
+ ### When the schema changes
135
+
22
136
 
23
137
  ## Contributing
24
138
 
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency "rspec", "~>2.14"
24
24
  spec.add_development_dependency "i18n", "~>0.6"
25
25
  spec.add_development_dependency "activesupport", "~>4.0"
26
+ spec.add_development_dependency "active_hash", "~>1.3"
26
27
 
27
28
  #spec.add_development_dependency "debase", "~>0.0"
28
29
  #spec.add_development_dependency "ruby-debug-ide", "~>0.4"
@@ -1,5 +1,16 @@
1
1
  require "active_mocker/version"
2
-
2
+ $:.unshift File.expand_path('../../', __FILE__)
3
+ require 'string_reader'
4
+ require 'active_mocker/table'
5
+ require 'active_mocker/config'
6
+ require 'active_mocker/reparameterize'
7
+ require 'active_mocker/field'
8
+ require 'active_mocker/active_record'
9
+ require 'active_mocker/model_reader'
10
+ require 'active_mocker/schema_reader'
11
+ require 'active_mocker/active_record/schema'
12
+ require 'active_mocker/base'
13
+ require 'active_support/all'
3
14
  module ActiveMocker
4
- # Your code goes here...
15
+
5
16
  end
@@ -1,38 +1,39 @@
1
1
  module ActiveMocker
2
2
 
3
- #TODO DRY up method creation
4
- #TODO have instance variable array for instance method
5
- #TODO have class variable array for class method
6
- #TODO enable support for active_hash as base class
7
- #TODO work on options interface
8
-
9
3
  class Base
4
+ extend Config
5
+ extend Forwardable
6
+ @@_self = self
7
+ def_delegators :@@_self,
8
+ :mass_assignment,
9
+ :model_relationships,
10
+ :schema_attributes,
11
+ :model_methods,
12
+ :active_hash_as_base,
13
+ :model_dir,
14
+ :schema_file,
15
+ :model_file_reader,
16
+ :schema_file_reader
17
+
18
+ attr_reader :model_name, :klass
19
+
20
+ def initialize(model_name)
21
+ @model_name = model_name
22
+ plain_mock_class unless active_hash_as_base
23
+ active_hash_mock_class if active_hash_as_base
24
+ end
10
25
 
11
- attr_reader :model_name,
12
- :model_options,
13
- :options_schema,
14
- :mass_assignment,
15
- :model_relationships,
16
- :schema_attributes,
17
- :model_methods
18
-
19
- def initialize(options={})
20
- @schema_attributes = options.fetch(:schema_attributes, true)
21
- @model_relationships = options.fetch(:model_relationships, true)
22
- @model_methods = options.fetch(:model_methods, true)
23
- @mass_assignment = options.fetch(:mass_assignment, true)
24
- @model_options = options[:model]
25
- @options_schema = options[:schema]
26
+ def self.configure(&block)
27
+ config(&block)
26
28
  end
27
29
 
28
- def mock(model_name)
29
- @model_name = model_name
30
- mock_class
30
+ def self.mock(model_name)
31
+ self.new(model_name).klass
31
32
  end
32
33
 
33
34
  def model_definition
34
35
  return @model_definition unless @model_definition.nil?
35
- @model_definition = ModelReader.new(model_options).parse(model_file_name)
36
+ @model_definition = ModelReader.new({model_dir: model_dir, file_reader: model_file_reader}).parse(model_file_name)
36
37
  end
37
38
 
38
39
  def model_file_name
@@ -41,21 +42,42 @@ module ActiveMocker
41
42
 
42
43
  def table_definition
43
44
  table_name = model_name.tableize
44
- table = SchemaReader.new(options_schema).search(table_name)
45
+ table = SchemaReader.new({schema_file: schema_file, file_reader: schema_file_reader}).search(table_name)
45
46
  raise "#{table_name} table not found." if table.nil?
46
47
  return table
47
48
  end
48
49
 
49
- def mock_class
50
+ def active_hash_mock_class
51
+
52
+ add_column_names_method
53
+ klass = create_klass
54
+ fields = table_definition.column_names + model_definition.relationships
55
+ klass.class_eval do
56
+ klass.fields(*fields)
57
+ end
58
+
50
59
  add_method_mock_of
51
- add_instance_methods if model_methods
52
- add_mock_instance_method if model_methods
60
+ if model_methods
61
+ add_instance_methods
62
+ add_mock_instance_method
63
+ add_mock_class_method
64
+ add_class_methods
65
+ end
66
+
67
+ end
68
+
69
+ def plain_mock_class
70
+ add_method_mock_of
71
+ if model_methods
72
+ add_instance_methods
73
+ add_mock_instance_method
74
+ add_mock_class_method
75
+ add_class_methods
76
+ end
53
77
  add_relationships if model_relationships
54
- add_class_methods if model_methods
55
78
  add_column_names_method if schema_attributes
56
79
  add_table_attributes if schema_attributes
57
80
  create_initializer if mass_assignment
58
- return @klass
59
81
  end
60
82
 
61
83
  def create_initializer
@@ -95,16 +117,30 @@ module ActiveMocker
95
117
  klass = create_klass
96
118
  model_definition.instance_methods_with_arguments.each do |method|
97
119
  m = method.keys.first
98
- params = Reparameterize.call(method.values.first)
120
+ params = Reparameterize.call(method.values.first)
99
121
  params_pass = Reparameterize.call(method.values.first, true)
100
- klass.instance_variable_set("@#{m}", eval_lambda(params, %Q[raise "##{m} is not Implemented for Class: #{klass.name}"]))
101
- block = eval_lambda(params, %Q[ self.class.instance_variable_get("@#{m}").call(#{params_pass})])
122
+ klass.instance_variable_set("@instance_#{m}", eval_lambda(params, %Q[raise "##{m} is not Implemented for Class: #{klass.name}"]))
123
+ block = eval_lambda(params, %Q[ self.class.instance_variable_get("@instance_#{m}").call(#{params_pass})])
102
124
  klass.instance_eval do
103
125
  define_method(m, block)
104
126
  end
105
127
  end
106
128
  end
107
129
 
130
+ def add_class_methods
131
+ klass = create_klass
132
+ model_definition.class_methods_with_arguments.each do |method|
133
+ m = method.keys.first
134
+ params = Reparameterize.call(method.values.first)
135
+ params_pass = Reparameterize.call(method.values.first, true)
136
+ klass.class_variable_set("@@klass_#{m}", eval_lambda(params, %Q[raise "::#{m} is not Implemented for Class: #{klass.name}"]))
137
+ block = eval_lambda(params, %Q[ class_variable_get("@@klass_#{m}").call(#{params_pass})])
138
+ klass.singleton_class.class_eval do
139
+ define_method(m, block)
140
+ end
141
+ end
142
+ end
143
+
108
144
  def eval_lambda(arguments, block)
109
145
  eval(%Q[ ->(#{arguments}){ #{block} }])
110
146
  end
@@ -113,18 +149,21 @@ module ActiveMocker
113
149
  klass = create_klass
114
150
  klass.singleton_class.class_eval do
115
151
  define_method(:mock_instance_method) do |method, &block|
116
- klass.instance_variable_set("@#{method.to_s}", block)
152
+ klass.instance_variable_set("@instance_#{method.to_s}", block)
153
+ end
154
+ end
155
+ klass.instance_eval do
156
+ define_method(:mock_instance_method) do |method, &block|
157
+ klass.instance_variable_set("@instance_#{method.to_s}", block)
117
158
  end
118
159
  end
119
160
  end
120
161
 
121
- def add_class_methods
162
+ def add_mock_class_method
122
163
  klass = create_klass
123
- model_definition.class_methods.each do |m|
124
- klass.singleton_class.class_eval do
125
- define_method(m) do
126
- raise "::#{m} is not Implemented for Class: #{klass.name}"
127
- end
164
+ klass.singleton_class.class_eval do
165
+ define_method(:mock_class_method) do |method, &block|
166
+ class_variable_set("@@klass_#{method.to_s}", block)
128
167
  end
129
168
  end
130
169
  end
@@ -145,8 +184,8 @@ module ActiveMocker
145
184
 
146
185
  def const_class
147
186
  remove_const(mock_class_name) if class_exists? mock_class_name
148
- return Object.const_set(mock_class_name, Class.new) unless Object.const_defined?(mock_class_name)
149
- return Object.const_get(mock_class_name, false)
187
+ return Object.const_set(mock_class_name ,Class.new(ActiveHash::Base)) if active_hash_as_base
188
+ return Object.const_set(mock_class_name ,Class.new()) unless active_hash_as_base
150
189
  end
151
190
 
152
191
  def remove_const(class_name)
@@ -0,0 +1,34 @@
1
+ module ActiveMocker
2
+
3
+ module Config
4
+ extend self
5
+
6
+ attr_accessor :schema_file,
7
+ :model_dir,
8
+ :active_hash_as_base,
9
+ :schema_attributes,
10
+ :model_relationships,
11
+ :model_methods,
12
+ :mass_assignment,
13
+ :schema_file_reader,
14
+ :model_file_reader
15
+
16
+ def config
17
+ default
18
+ yield self
19
+ end
20
+
21
+ def default
22
+ schema_file = nil
23
+ model_dir = nil
24
+ active_hash_as_base = false
25
+ schema_attributes = true
26
+ model_relationships = true
27
+ model_methods = true
28
+ mass_assignment = true
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+
@@ -2,11 +2,11 @@ module ActiveMocker
2
2
 
3
3
  class ModelReader
4
4
 
5
- attr_reader :model_name, :relative_path, :file_reader
5
+ attr_reader :model_name, :model_dir, :file_reader
6
6
 
7
7
  def initialize(options={})
8
8
  @file_reader = options[:file_reader] ||= FileReader
9
- @relative_path = options[:path]
9
+ @model_dir = options[:model_dir]
10
10
  end
11
11
 
12
12
  def parse(model_name)
@@ -26,11 +26,11 @@ module ActiveMocker
26
26
  end
27
27
 
28
28
  def read_file
29
- file_reader.read("#{relative_path}/#{model_name}.rb")
29
+ file_reader.read("#{model_dir}/#{model_name}.rb")
30
30
  end
31
31
 
32
32
  def class_methods
33
- (klass.methods - Object.methods - instance_methods - ActiveRecord::Base.methods)
33
+ klass.methods(false)
34
34
  end
35
35
 
36
36
  def class_methods_with_arguments
@@ -2,11 +2,11 @@ module ActiveMocker
2
2
 
3
3
  class SchemaReader
4
4
 
5
- attr_reader :model_name, :relative_path, :file_reader, :table
5
+ attr_reader :model_name, :schema_file, :file_reader, :table
6
6
 
7
7
  def initialize(options={})
8
8
  @file_reader = options[:file_reader] ||= FileReader
9
- @relative_path = options[:path]
9
+ @schema_file = options[:schema_file]
10
10
  end
11
11
 
12
12
  def search(model_name)
@@ -37,7 +37,7 @@ module ActiveMocker
37
37
  end
38
38
 
39
39
  def read_file
40
- file_reader.read("#{relative_path}/schema.rb")
40
+ file_reader.read(schema_file)
41
41
  end
42
42
 
43
43
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveMocker
2
- VERSION = "0.1.1"
2
+ VERSION = "0.3.1"
3
3
  end
@@ -2,6 +2,7 @@ require 'rspec'
2
2
  $:.unshift File.expand_path('../../', __FILE__)
3
3
  require 'string_reader'
4
4
  require 'active_mocker/table'
5
+ require 'active_mocker/config'
5
6
  require 'active_mocker/reparameterize'
6
7
  require 'active_mocker/field'
7
8
  require 'active_mocker/active_record'
@@ -13,13 +14,25 @@ require 'active_support/all'
13
14
 
14
15
  describe ActiveMocker::Base do
15
16
 
16
- let(:base_options){{}}
17
- let(:sub_options){{schema: {path: File.expand_path('../../', __FILE__), file_reader: schema_file},
18
- model: {path: File.expand_path('../../', __FILE__), file_reader: model_file}}}
19
-
20
- let(:subject){ described_class.new(base_options.merge(sub_options))}
17
+ let(:mock_class){described_class.mock('Person')}
18
+
19
+ before(:each) do
20
+
21
+ ActiveMocker::Base.configure do |config|
22
+ config.schema_file = 'file is being inject as string'
23
+ config.model_dir = 'file is being inject as string'
24
+ # Dependency injection
25
+ config.schema_file_reader = schema_file
26
+ config.model_file_reader = model_file
27
+ # Additional Options
28
+ config.active_hash_as_base = false #default
29
+ config.schema_attributes = true #default
30
+ config.model_relationships = true #default
31
+ config.model_methods = true #default
32
+ config.mass_assignment = true #default
33
+ end
21
34
 
22
- let(:mock_class){subject.mock('Person')}
35
+ end
23
36
 
24
37
  let(:model_file){
25
38
  StringReader.new <<-eos
@@ -32,22 +45,49 @@ describe ActiveMocker::Base do
32
45
  StringReader.new <<-eos
33
46
  ActiveRecord::Schema.define(version: 20140327205359) do
34
47
 
35
- create_table "people", force: true do |t|
36
- t.integer "company_id"
37
- t.string "first_name", limit: 128
38
- t.string "middle_name", limit: 128
39
- t.string "last_name", limit: 128
40
- t.string "address_1", limit: 200
41
- t.string "address_2", limit: 100
42
- t.string "city", limit: 100
43
- t.integer "state_id"
44
- t.integer "zip_code_id"
45
- end
46
-
48
+ create_table "people", force: true do |t|
49
+ t.integer "account_id"
50
+ t.string "first_name", limit: 128
51
+ t.string "last_name", limit: 128
52
+ t.string "address", limit: 200
53
+ t.string "city", limit: 100
47
54
  end
55
+
56
+ end
48
57
  eos
49
58
  }
50
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(["account_id", "first_name", "last_name", "address", "city"])
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
+ context 'set to false' do
78
+
79
+ it 'will fail' do
80
+ described_class.mass_assignment = false
81
+ person = described_class.mock("Person")
82
+ expect{
83
+ person.new(first_name: "Sam", last_name: 'Walton')
84
+ }.to raise_error ArgumentError
85
+ end
86
+
87
+ end
88
+
89
+ end
90
+
51
91
  describe '#mock_class' do
52
92
 
53
93
  it 'create a mock object after the active record' do
@@ -99,6 +139,38 @@ describe ActiveMocker::Base do
99
139
 
100
140
  end
101
141
 
142
+ describe 'conflict of instance mocks and class mocks' do
143
+
144
+ let(:model_file){
145
+ StringReader.new <<-eos
146
+ class Person < ActiveRecord::Base
147
+ def bar(name, type=nil)
148
+ end
149
+
150
+ def self.bar
151
+ end
152
+ end
153
+ eos
154
+ }
155
+
156
+ it 'can mock instance method and class method of the same name' do
157
+ result = mock_class.new
158
+ result.mock_instance_method(:bar) do |name, type=nil|
159
+ "Now implemented with #{name} and #{type}"
160
+ end
161
+ result = result.bar('foo', 'type')
162
+ expect(result).to eq "Now implemented with foo and type"
163
+ expect{mock_class.bar}.to raise_error('::bar is not Implemented for Class: PersonMock')
164
+
165
+ mock_class.mock_class_method(:bar) do
166
+ "Now implemented"
167
+ end
168
+ expect{mock_class.bar}.to_not raise_error
169
+ expect(mock_class.bar).to eq("Now implemented")
170
+ end
171
+
172
+ end
173
+
102
174
  describe 'instance methods' do
103
175
 
104
176
  let(:model_file){
@@ -116,15 +188,6 @@ describe ActiveMocker::Base do
116
188
  expect{mock_class.new.bar('foo', 'type')}.to raise_error('#bar is not Implemented for Class: PersonMock')
117
189
  end
118
190
 
119
- it 'can be implemented dynamically' do
120
-
121
- mock_class.instance_variable_set(:@bar, ->(name, type=nil){ "Now implemented with #{name} and #{type}" })
122
- result = mock_class.new
123
- result = result.bar('foo', 'type')
124
- expect(result).to eq "Now implemented with foo and type"
125
-
126
- end
127
-
128
191
  it 'can be implemented dynamically' do
129
192
 
130
193
  mock_class.mock_instance_method(:bar) do |name, type=nil|
@@ -156,10 +219,13 @@ describe ActiveMocker::Base do
156
219
  expect{mock_class.class_method}.to raise_error('::class_method is not Implemented for Class: PersonMock')
157
220
  end
158
221
 
159
- xit 'can be implemented as follows' do
160
-
222
+ it 'can be implemented as follows' do
161
223
 
162
- expect(mock_class.named).to eq "Now implemented"
224
+ mock_class.mock_class_method(:class_method) do
225
+ "Now implemented"
226
+ end
227
+ expect{mock_class.class_method}.to_not raise_error
228
+ expect(mock_class.class_method).to eq("Now implemented")
163
229
 
164
230
  end
165
231
 
@@ -171,50 +237,92 @@ describe ActiveMocker::Base do
171
237
 
172
238
  end
173
239
 
174
- describe '::column_names' do
240
+ context 'option active_hash_as_base' do
175
241
 
242
+ describe 'true' do
176
243
 
177
- it 'returns an array of column names found from the schema.rb file' do
178
- expect(mock_class.column_names).to eq(["company_id", "first_name", "middle_name", "last_name", "address_1", "address_2", "city", "state_id", "zip_code_id"])
179
- end
244
+ before(:each) do
180
245
 
181
- end
246
+ ActiveMocker::Base.configure do |config|
247
+ config.schema_file = 'file is being inject as string'
248
+ config.model_dir = 'file is being inject as string'
249
+ # Depenency injection
250
+ config.schema_file_reader = schema_file
251
+ config.model_file_reader = model_file
252
+ # Additional Options
253
+ config.active_hash_as_base = true
254
+ config.schema_attributes = false
255
+ config.model_relationships = false
256
+ config.model_methods = true
257
+ config.mass_assignment = false
258
+ end
182
259
 
260
+ end
261
+ require 'active_hash'
183
262
 
184
- describe 'have attributes from schema' do
263
+ let(:model_file){
264
+ StringReader.new <<-eos
265
+ class Person < ActiveRecord::Base
266
+ belongs_to :account
185
267
 
186
- xit 'uses ActiveHash'
268
+ def bar
269
+ end
187
270
 
188
- xit 'makes plain ruby class' do
271
+ end
272
+ eos
273
+ }
189
274
 
190
- end
275
+ it 'uses active_hase::base as superclass' do
276
+ expect(mock_class.superclass.name).to eq 'ActiveHash::Base'
277
+ end
191
278
 
192
- end
279
+ it 'can mass assign attributes to constructor' do
280
+ result = mock_class.new(first_name: "Sam", last_name: 'Walton', account: 0)
281
+ expect(result.first_name).to eq 'Sam'
282
+ expect(result.last_name).to eq 'Walton'
283
+ expect(result.account).to eq 0
284
+ end
193
285
 
194
- describe 'mass_assignment' do
286
+ it 'can save to class and then find instance by attribute' do
195
287
 
288
+ record = mock_class.create(first_name: "Sam", last_name: 'Walton')
289
+ expect(mock_class.find_by_first_name("Sam")).to eq record
196
290
 
291
+ end
197
292
 
198
- it "can pass any or all attributes from schema in initializer" do
199
- result = mock_class.new(first_name: "Sam", last_name: 'Walton')
200
- expect(result.first_name).to eq 'Sam'
201
- expect(result.last_name).to eq 'Walton'
293
+ it '::column_names' do
294
+ expect(mock_class.column_names).to eq(["account_id", "first_name", "last_name", "address", "city"])
295
+ end
296
+
297
+ it '#mock_of' do
298
+ expect(mock_class.new.mock_of).to eq 'Person'
299
+ end
300
+
301
+ it 'instance methods from model' do
302
+ expect{mock_class.new.bar}.to raise_error '#bar is not Implemented for Class: PersonMock'
303
+ end
304
+
305
+ it 'instance method can be mocked' do
306
+
307
+ mock_class.instance_variable_set(:@instance_bar, ->(){ "Now implemented" })
308
+ result = mock_class.new
309
+ result = result.bar
310
+ expect(result).to eq "Now implemented"
311
+
312
+ end
202
313
 
203
314
  end
204
315
 
205
- context 'set to false' do
316
+ describe 'false' do
317
+ let(:base_options){{active_hash_as_base: false}}
318
+
319
+ it 'has object as supper class' do
320
+ expect(mock_class.superclass.name).to eq 'Object'
206
321
 
207
- it 'will fail' do
208
- mock = described_class.new(sub_options.merge({mass_assignment: false}))
209
- person = mock.mock("Person")
210
- expect{
211
- person.new(first_name: "Sam", last_name: 'Walton')
212
- }.to raise_error ArgumentError
213
322
  end
214
323
 
215
324
  end
216
325
 
217
326
  end
218
327
 
219
-
220
328
  end
@@ -8,11 +8,11 @@ require 'active_mocker/reparameterize'
8
8
 
9
9
  describe ActiveMocker::ModelReader do
10
10
 
11
- let(:subject){ described_class.new({path: File.expand_path('../../', __FILE__)}).parse('Model') }
11
+ let(:subject){ described_class.new({model_dir: File.expand_path('../../', __FILE__)}).parse('Model') }
12
12
 
13
13
  describe '#parse' do
14
14
 
15
- let(:subject){ described_class.new({path: File.expand_path('../../', __FILE__)}) }
15
+ let(:subject){ described_class.new({model_dir: File.expand_path('../../', __FILE__)}) }
16
16
 
17
17
  it 'takes a model name to the active_record model class' do
18
18
  subject.parse('Model')
@@ -22,9 +22,8 @@ describe ActiveMocker::ModelReader do
22
22
 
23
23
  describe '#class_methods' do
24
24
 
25
-
26
25
  it 'returns all public class methods' do
27
- expect(subject.class_methods).to eq([:duper, :named])
26
+ expect(subject.class_methods).to eq([:duper, :named, :foo])
28
27
  end
29
28
 
30
29
  end
@@ -48,7 +47,7 @@ describe ActiveMocker::ModelReader do
48
47
  describe '#class_methods_with_arguments' do
49
48
 
50
49
  it 'returns all public instance methods' do
51
- expect(subject.class_methods_with_arguments).to eq([{:duper=>[[:req, :value], [:rest, :args]]}, {:named=>[[:req, :name], [:opt, :value], [:opt, :options]]}])
50
+ expect(subject.class_methods_with_arguments).to eq( [{:duper=>[[:req, :value], [:rest, :args]]}, {:named=>[[:req, :name], [:opt, :value], [:opt, :options]]}, {:foo=>[]}] )
52
51
  end
53
52
 
54
53
  end
@@ -110,7 +109,7 @@ describe ActiveMocker::ModelReader do
110
109
  )
111
110
  }
112
111
 
113
- let(:subject){described_class.new({path: File.expand_path('../../', __FILE__), file_reader: example_model})}
112
+ let(:subject){described_class.new({model_dir: File.expand_path('../../', __FILE__), file_reader: example_model})}
114
113
 
115
114
  let(:search){subject.parse('Person')}
116
115
 
@@ -10,6 +10,8 @@ require 'active_support/all'
10
10
 
11
11
  describe ActiveMocker::SchemaReader do
12
12
 
13
+ let(:schema_file){ File.join(File.expand_path('../../', __FILE__), 'schema.rb') }
14
+
13
15
  let(:example_schema){
14
16
  StringReader.new(
15
17
  <<-eos
@@ -55,7 +57,7 @@ describe ActiveMocker::SchemaReader do
55
57
 
56
58
  context 'inject string_reader as file_reader' do
57
59
 
58
- let(:subject){described_class.new({path: File.expand_path('../../', __FILE__), file_reader: example_schema})}
60
+ let(:subject){described_class.new({schema_file:nil, file_reader: example_schema})}
59
61
 
60
62
  let(:search){subject.search('people')}
61
63
 
@@ -70,13 +72,13 @@ describe ActiveMocker::SchemaReader do
70
72
 
71
73
  context 'reads from file' do
72
74
 
73
- let(:subject){described_class.new({path: File.expand_path('../../', __FILE__)})}
75
+ let(:subject){described_class.new({schema_file: schema_file})}
74
76
 
75
77
 
76
78
  describe '#search' do
77
79
 
78
80
  it 'takes a table name and will return its attributes' do
79
- described_class.new({path: File.expand_path('../../', __FILE__)}).search("people")
81
+ described_class.new({schema_file: schema_file}).search("people")
80
82
  end
81
83
 
82
84
  end
@@ -112,13 +114,11 @@ describe ActiveMocker::SchemaReader do
112
114
  it 'returns an exception if table not found in schema.rb' do
113
115
  expect{
114
116
  described_class.new(
115
- {path: File.expand_path('../../', __FILE__)}
117
+ {schema_file: schema_file}
116
118
  ).search("disclosures")
117
119
  }.to raise_error 'disclosures table not found.'
118
120
  end
119
121
 
120
-
121
122
  end
122
123
 
123
-
124
124
  end
@@ -15,6 +15,10 @@ class Model < ActiveRecord::Base
15
15
 
16
16
  end
17
17
 
18
+ def self.foo
19
+
20
+ end
21
+
18
22
  def super
19
23
 
20
24
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_mocker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dustin Zeisler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-01 00:00:00.000000000 Z
11
+ date: 2014-04-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '4.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: active_hash
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.3'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.3'
83
97
  description: Create mocks from active record models without loading rails or running
84
98
  a database. The Mocks methods have the same arguments as the AR model and if they
85
99
  change you get a error in your test.
@@ -102,6 +116,7 @@ files:
102
116
  - lib/active_mocker/active_record/schema.rb
103
117
  - lib/active_mocker/active_record/scope.rb
104
118
  - lib/active_mocker/base.rb
119
+ - lib/active_mocker/config.rb
105
120
  - lib/active_mocker/field.rb
106
121
  - lib/active_mocker/model_reader.rb
107
122
  - lib/active_mocker/reparameterize.rb