mince 2.1.0 → 2.2.0
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.
- checksums.yaml +4 -4
- data/README.md +8 -1
- data/lib/mince/data_model.rb +56 -13
- data/lib/mince/data_model/timestamps.rb +60 -0
- data/lib/mince/model.rb +1 -1
- data/lib/mince/model/data_model.rb +5 -2
- data/lib/mince/model/finders.rb +25 -3
- data/lib/mince/version.rb +1 -1
- data/spec/integration/inferred_data_fields_spec.rb +62 -0
- data/spec/integration/mince_data_model_spec.rb +52 -0
- data/spec/integration/mince_model_spec.rb +1 -0
- data/spec/support/shared_examples/model_finders_example.rb +139 -8
- data/spec/units/mince/data_model/inferred_fields_spec.rb +79 -0
- data/spec/units/mince/data_model/timestamps_spec.rb +149 -0
- data/spec/units/mince/data_model_spec.rb +116 -23
- data/spec/units/mince/model_spec.rb +107 -66
- metadata +9 -2
@@ -7,6 +7,34 @@ shared_examples_for 'a model using mince model finders' do
|
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
|
+
describe 'finding by one field' do
|
11
|
+
subject { klass.find_by_field(field, value) }
|
12
|
+
|
13
|
+
let(:field) { mock }
|
14
|
+
let(:value) { mock }
|
15
|
+
|
16
|
+
before do
|
17
|
+
klass.data_model.stub(:find_by_field).with(field, value).and_return(data)
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'when a record exists' do
|
21
|
+
let(:data) { mock }
|
22
|
+
let(:model) { mock }
|
23
|
+
|
24
|
+
before do
|
25
|
+
klass.stub(:new).with(data).and_return(model)
|
26
|
+
end
|
27
|
+
|
28
|
+
it { should == model }
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'when a record does not exist' do
|
32
|
+
let(:data) { nil }
|
33
|
+
|
34
|
+
it { should be_nil }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
10
38
|
describe 'getting all models' do
|
11
39
|
subject { klass.all }
|
12
40
|
|
@@ -20,8 +48,115 @@ shared_examples_for 'a model using mince model finders' do
|
|
20
48
|
klass.stub(:new).with(datum).and_return(model)
|
21
49
|
end
|
22
50
|
|
23
|
-
it
|
24
|
-
|
51
|
+
it { should == models }
|
52
|
+
end
|
53
|
+
|
54
|
+
describe 'finding all by fields by a given hash' do
|
55
|
+
subject { klass.all_by_fields(hash) }
|
56
|
+
|
57
|
+
let(:hash) { mock }
|
58
|
+
|
59
|
+
before do
|
60
|
+
klass.data_model.stub(:all_by_fields).with(hash).and_return(data)
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'when a record exists' do
|
64
|
+
let(:data) { [mock] }
|
65
|
+
let(:model) { mock }
|
66
|
+
|
67
|
+
before do
|
68
|
+
klass.stub(:new).with(data.first).and_return(model)
|
69
|
+
end
|
70
|
+
|
71
|
+
it { should == [model] }
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'when a record does not exist' do
|
75
|
+
let(:data) { [] }
|
76
|
+
|
77
|
+
it { should be_empty }
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe 'finding all by fields by a given field value pair' do
|
82
|
+
subject { klass.all_by_field(field, value) }
|
83
|
+
|
84
|
+
let(:field) { mock }
|
85
|
+
let(:value) { mock }
|
86
|
+
|
87
|
+
before do
|
88
|
+
klass.data_model.stub(:all_by_field).with(field, value).and_return(data)
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'when a record exists' do
|
92
|
+
let(:data) { [mock] }
|
93
|
+
let(:model) { mock }
|
94
|
+
|
95
|
+
before do
|
96
|
+
klass.stub(:new).with(data.first).and_return(model)
|
97
|
+
end
|
98
|
+
|
99
|
+
it { should == [model] }
|
100
|
+
end
|
101
|
+
|
102
|
+
context 'when a record does not exist' do
|
103
|
+
let(:data) { [] }
|
104
|
+
|
105
|
+
it { should be_empty }
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe 'finding by fields' do
|
110
|
+
subject { klass.find_by_fields(hash) }
|
111
|
+
|
112
|
+
let(:hash) { mock }
|
113
|
+
|
114
|
+
before do
|
115
|
+
klass.data_model.stub(:find_by_fields).with(hash).and_return(data)
|
116
|
+
end
|
117
|
+
|
118
|
+
context 'when a record exists' do
|
119
|
+
let(:data) { mock }
|
120
|
+
let(:model) { mock }
|
121
|
+
|
122
|
+
before do
|
123
|
+
klass.stub(:new).with(data).and_return(model)
|
124
|
+
end
|
125
|
+
|
126
|
+
it { should == model }
|
127
|
+
end
|
128
|
+
|
129
|
+
context 'when a record does not exist' do
|
130
|
+
let(:data) { nil }
|
131
|
+
|
132
|
+
it { should be_nil }
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
describe 'finding or initializing by fields' do
|
137
|
+
subject { klass.find_or_initialize_by(hash) }
|
138
|
+
|
139
|
+
let(:hash) { mock }
|
140
|
+
|
141
|
+
before do
|
142
|
+
klass.stub(:find_by_fields).with(hash).and_return(model)
|
143
|
+
end
|
144
|
+
|
145
|
+
context 'when a record exists' do
|
146
|
+
let(:model) { mock }
|
147
|
+
|
148
|
+
it { should == model }
|
149
|
+
end
|
150
|
+
|
151
|
+
context 'when a record does not exist' do
|
152
|
+
let(:model) { nil }
|
153
|
+
let(:new_model) { mock }
|
154
|
+
|
155
|
+
before do
|
156
|
+
klass.stub(:new).with(hash).and_return(new_model)
|
157
|
+
end
|
158
|
+
|
159
|
+
it { should == new_model }
|
25
160
|
end
|
26
161
|
end
|
27
162
|
|
@@ -42,17 +177,13 @@ shared_examples_for 'a model using mince model finders' do
|
|
42
177
|
klass.stub(:new).with(data).and_return(model)
|
43
178
|
end
|
44
179
|
|
45
|
-
it
|
46
|
-
subject.should == model
|
47
|
-
end
|
180
|
+
it { should == model }
|
48
181
|
end
|
49
182
|
|
50
183
|
context 'when it does not exist' do
|
51
184
|
let(:data) { nil }
|
52
185
|
|
53
|
-
it
|
54
|
-
subject.should be_nil
|
55
|
-
end
|
186
|
+
it { should be_nil }
|
56
187
|
end
|
57
188
|
end
|
58
189
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require_relative '../../../../lib/mince/data_model'
|
2
|
+
|
3
|
+
module Mince
|
4
|
+
describe DataModel do
|
5
|
+
subject { klass.new(model) }
|
6
|
+
|
7
|
+
let(:model) { mock fields: fields}
|
8
|
+
let(:fields) { [:username, :email] }
|
9
|
+
let(:klass) do
|
10
|
+
Class.new do
|
11
|
+
include Mince::DataModel
|
12
|
+
|
13
|
+
data_collection :users
|
14
|
+
end
|
15
|
+
end
|
16
|
+
let(:id) { mock }
|
17
|
+
|
18
|
+
before do
|
19
|
+
klass.stub(:generate_unique_id).with(model).and_return(id)
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'when the data model is infering fields' do
|
23
|
+
let(:primary_key) { mock }
|
24
|
+
let(:interface) { mock }
|
25
|
+
let(:model_instance_values) { { username: 'coffeencoke' } }
|
26
|
+
|
27
|
+
before do
|
28
|
+
klass.stub(infer_fields?: true, interface: interface, primary_key: primary_key)
|
29
|
+
model.stub(instance_values: model_instance_values)
|
30
|
+
end
|
31
|
+
|
32
|
+
its(:infer_fields?) { should be_true }
|
33
|
+
|
34
|
+
it 'can store the model' do
|
35
|
+
expected_attributes = HashWithIndifferentAccess.new(model_instance_values.merge(primary_key => id))
|
36
|
+
interface.should_receive(:add).with(klass.data_collection, expected_attributes)
|
37
|
+
|
38
|
+
subject.create.should == id
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'when the data model is not infering fields' do
|
43
|
+
before do
|
44
|
+
klass.stub(infer_fields?: false)
|
45
|
+
end
|
46
|
+
|
47
|
+
its(:infer_fields?) { should be_false }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe DataModel, 'Class Methods:' do
|
52
|
+
subject { klass }
|
53
|
+
|
54
|
+
context 'when the data model is infering fields' do
|
55
|
+
let(:klass) do
|
56
|
+
Class.new do
|
57
|
+
include Mince::DataModel
|
58
|
+
|
59
|
+
data_collection :users
|
60
|
+
infer_fields_from_model
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
its(:infer_fields?) { should be_true }
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'when the data model is not infering fields' do
|
68
|
+
let(:klass) do
|
69
|
+
Class.new do
|
70
|
+
include Mince::DataModel
|
71
|
+
|
72
|
+
data_collection :users
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
its(:infer_fields?) { should be_false }
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,149 @@
|
|
1
|
+
require_relative '../../../../lib/mince/data_model/timestamps'
|
2
|
+
|
3
|
+
module Mince::DataModel
|
4
|
+
describe Timestamps, 'Mixin' do
|
5
|
+
let(:klass) do
|
6
|
+
Class.new do
|
7
|
+
include Mince::DataModel
|
8
|
+
include Timestamps
|
9
|
+
|
10
|
+
data_collection :users
|
11
|
+
data_fields :username, :emails
|
12
|
+
end
|
13
|
+
end
|
14
|
+
let(:utc_now) { mock 'now' }
|
15
|
+
let(:interface) { mock 'interface' }
|
16
|
+
let(:data_collection) { mock 'collection name' }
|
17
|
+
let(:id) { '1' }
|
18
|
+
let(:primary_key) { :id }
|
19
|
+
|
20
|
+
before do
|
21
|
+
Time.stub_chain('now.utc' => utc_now)
|
22
|
+
klass.stub(
|
23
|
+
interface: interface,
|
24
|
+
data_collection: data_collection,
|
25
|
+
primary_key: primary_key,
|
26
|
+
generate_unique_id: id
|
27
|
+
) # because it's mixed in
|
28
|
+
end
|
29
|
+
|
30
|
+
describe 'adding a record from a hash' do
|
31
|
+
let(:hash_to_add) { { username: 'joe' } }
|
32
|
+
let(:expected_hash) do
|
33
|
+
HashWithIndifferentAccess.new(
|
34
|
+
hash_to_add.merge(
|
35
|
+
primary_key => id,
|
36
|
+
created_at: utc_now,
|
37
|
+
updated_at: utc_now
|
38
|
+
)
|
39
|
+
)
|
40
|
+
end
|
41
|
+
|
42
|
+
before do
|
43
|
+
interface.stub(:add).with(data_collection, expected_hash).and_return([expected_hash])
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'sets the created and updated values' do
|
47
|
+
klass.add(hash_to_add).should == expected_hash
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe 'adding a record from a model' do
|
52
|
+
subject { klass.new(model) }
|
53
|
+
let(:model) { mock 'model', instance_values: instance_values }
|
54
|
+
let(:instance_values) { HashWithIndifferentAccess.new username: "joe", emails: ["joedawg@test.com"] }
|
55
|
+
let(:attributes_plus_timestamps) { instance_values.merge(created_at: utc_now, updated_at: utc_now, primary_key => id) }
|
56
|
+
|
57
|
+
before do
|
58
|
+
interface.stub(:add)
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'sets the created value' do
|
62
|
+
subject.create
|
63
|
+
|
64
|
+
subject.attributes.should == attributes_plus_timestamps
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe 'updating a record' do
|
69
|
+
subject { klass.new(model) }
|
70
|
+
let(:model) { mock 'model', instance_values.merge(instance_values: instance_values) }
|
71
|
+
let(:instance_values) { HashWithIndifferentAccess.new username: "joe", emails: ["joedawg@test.com"], updated_at: 'old value', created_at: 'created time', primary_key => id }
|
72
|
+
let(:attributes_plus_timestamp) { instance_values.merge(updated_at: utc_now) }
|
73
|
+
|
74
|
+
before do
|
75
|
+
interface.stub(:replace)
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'sets the updated value' do
|
79
|
+
subject.update
|
80
|
+
|
81
|
+
subject.attributes.should == attributes_plus_timestamp
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe 'updating a single field' do
|
86
|
+
subject { klass.new(model) }
|
87
|
+
let(:field_to_update) { :username }
|
88
|
+
let(:new_value) { mock 'new value' }
|
89
|
+
|
90
|
+
before do
|
91
|
+
interface.stub(:update_field_with_value).with(data_collection, id, field_to_update, new_value)
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'sets the updated value' do
|
95
|
+
interface.should_receive(:update_field_with_value).with(data_collection, id, :updated_at, utc_now)
|
96
|
+
|
97
|
+
klass.update_field_with_value(id, field_to_update, new_value)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
describe 'incrementing a single field' do
|
102
|
+
subject { klass.new(model) }
|
103
|
+
let(:field_to_update) { :username }
|
104
|
+
let(:amount) { mock :amount }
|
105
|
+
|
106
|
+
before do
|
107
|
+
interface.stub(:increment_field_by_amount).with(data_collection, id, field_to_update, amount)
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'sets the updated value' do
|
111
|
+
interface.should_receive(:update_field_with_value).with(data_collection, id, :updated_at, utc_now)
|
112
|
+
|
113
|
+
klass.increment_field_by_amount(id, field_to_update, amount)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
describe 'adding a value to an array field' do
|
118
|
+
subject { klass.new(model) }
|
119
|
+
let(:field_to_update) { :username }
|
120
|
+
let(:value) { mock :value }
|
121
|
+
|
122
|
+
before do
|
123
|
+
interface.stub(:push_to_array).with(data_collection, id, field_to_update, value)
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'sets the updated value' do
|
127
|
+
interface.should_receive(:update_field_with_value).with(data_collection, id, :updated_at, utc_now)
|
128
|
+
|
129
|
+
klass.push_to_array(id, field_to_update, value)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
describe 'removing a value from an array field' do
|
134
|
+
subject { klass.new(model) }
|
135
|
+
let(:field_to_update) { :username }
|
136
|
+
let(:value) { mock :value }
|
137
|
+
|
138
|
+
before do
|
139
|
+
interface.stub(:remove_from_array).with(data_collection, id, field_to_update, value)
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'sets the updated value' do
|
143
|
+
interface.should_receive(:update_field_with_value).with(data_collection, id, :updated_at, utc_now)
|
144
|
+
|
145
|
+
klass.remove_from_array(id, field_to_update, value)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
@@ -1,7 +1,80 @@
|
|
1
1
|
require_relative '../../../lib/mince/data_model'
|
2
2
|
require 'digest'
|
3
3
|
|
4
|
-
describe Mince::DataModel
|
4
|
+
describe Mince::DataModel do
|
5
|
+
let(:klass_object){ described_class.new(model) }
|
6
|
+
|
7
|
+
let(:described_class) { klass }
|
8
|
+
let(:klass) do
|
9
|
+
Class.new do
|
10
|
+
include Mince::DataModel
|
11
|
+
|
12
|
+
data_collection :guitars
|
13
|
+
data_fields :brand, :price
|
14
|
+
data_fields :type, :color
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
let(:data_collection) { :guitars }
|
19
|
+
let(:data_field_attributes) do
|
20
|
+
{
|
21
|
+
brand: 'a brand everyone knows',
|
22
|
+
price: 'a price you save up for',
|
23
|
+
type: 'the kind you want',
|
24
|
+
color: 'should be your favorite'
|
25
|
+
}
|
26
|
+
end
|
27
|
+
let(:model) { mock instance_values: data_field_attributes }
|
28
|
+
|
29
|
+
let(:interface) { mock 'mince data interface class', generate_unique_id: unique_id, primary_key: primary_key }
|
30
|
+
let(:unique_id) { mock 'id' }
|
31
|
+
let(:primary_key) { "custom_id" }
|
32
|
+
|
33
|
+
before do
|
34
|
+
Mince::Config.stub(:interface => interface)
|
35
|
+
end
|
36
|
+
|
37
|
+
describe 'creating' do
|
38
|
+
let(:attributes_with_id) { attributes.merge(primary_key => unique_id) }
|
39
|
+
let(:attributes) { HashWithIndifferentAccess.new data_field_attributes }
|
40
|
+
|
41
|
+
before do
|
42
|
+
interface.stub(:add)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'adds the data model to the db store' do
|
46
|
+
interface.should_receive(:add).with(data_collection, attributes_with_id)
|
47
|
+
|
48
|
+
klass_object.create
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'generates a unique id' do
|
52
|
+
interface.should_receive(:generate_unique_id).with(model).and_return(unique_id)
|
53
|
+
|
54
|
+
klass_object.create
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'returns the id' do
|
58
|
+
klass_object.create.should == unique_id
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe 'updating' do
|
63
|
+
let(:attributes) { HashWithIndifferentAccess.new data_field_attributes }
|
64
|
+
|
65
|
+
before do
|
66
|
+
data_field_attributes.merge!(primary_key => unique_id)
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'replaces all data in the data collection with the current state of the model' do
|
70
|
+
interface.should_receive(:replace).with(data_collection, attributes)
|
71
|
+
|
72
|
+
klass_object.update
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe Mince::DataModel, 'Class Methods' do
|
5
78
|
let(:described_class) { klass }
|
6
79
|
|
7
80
|
let(:collection_name) { :guitars }
|
@@ -19,50 +92,67 @@ describe Mince::DataModel, 'Mixin' do
|
|
19
92
|
include Mince::DataModel
|
20
93
|
|
21
94
|
data_collection :guitars
|
22
|
-
data_fields :brand, :price
|
95
|
+
data_fields :brand, :price
|
96
|
+
data_fields :type, :color
|
23
97
|
end
|
24
98
|
end
|
25
99
|
|
26
100
|
let(:interface) { mock 'mince data interface class', generate_unique_id: unique_id, primary_key: primary_key }
|
27
101
|
let(:unique_id) { mock 'id' }
|
28
102
|
let(:primary_key) { "custom_id" }
|
103
|
+
let(:fields) { [:brand, :type, :color, :price] }
|
29
104
|
|
30
105
|
before do
|
31
106
|
Mince::Config.stub(:interface => interface)
|
32
107
|
end
|
33
108
|
|
109
|
+
it 'knows when timestamps are not included' do
|
110
|
+
klass.timestamps?.should be_false
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'knows when timestamps are included' do
|
114
|
+
klass.send(:include, Mince::DataModel::Timestamps)
|
115
|
+
|
116
|
+
klass.timestamps?.should be_true
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'knows the fields it has' do
|
120
|
+
klass.data_fields.should =~ fields
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'does not duplicate data fields' do
|
124
|
+
pending
|
125
|
+
klass.data_fields(:brand)
|
126
|
+
|
127
|
+
klass.data_fields.should =~ fields
|
128
|
+
end
|
129
|
+
|
34
130
|
describe "inserting data" do
|
35
|
-
let(:expected_hash) { data_field_attributes.merge(primary_key => unique_id) }
|
131
|
+
let(:expected_hash) { HashWithIndifferentAccess.new(data_field_attributes.merge(primary_key => unique_id)) }
|
36
132
|
|
37
133
|
before do
|
38
|
-
interface.stub(:add).and_return([expected_hash])
|
134
|
+
interface.stub(:add).with(collection_name, expected_hash).and_return([expected_hash])
|
39
135
|
interface.stub(:generate_unique_id).with(data_field_attributes).and_return(unique_id)
|
40
136
|
end
|
41
137
|
|
42
138
|
it 'adds the data to the db store with the generated id' do
|
43
|
-
interface.should_receive(:add).with(collection_name, HashWithIndifferentAccess.new(expected_hash)).and_return([expected_hash])
|
44
|
-
|
45
139
|
described_class.add(data_field_attributes).should == expected_hash
|
46
140
|
end
|
47
141
|
end
|
48
142
|
|
49
143
|
describe "storing a data model" do
|
50
|
-
let(:
|
144
|
+
let(:klass_object) { mock }
|
145
|
+
let(:model) { mock 'a model' }
|
146
|
+
let(:return_value) { mock }
|
51
147
|
|
52
148
|
before do
|
53
|
-
|
149
|
+
described_class.stub(:new).with(model).and_return(klass_object)
|
54
150
|
end
|
55
151
|
|
56
|
-
it '
|
57
|
-
|
152
|
+
it 'can create a record from a model' do
|
153
|
+
klass_object.should_receive(:create).and_return(return_value)
|
58
154
|
|
59
|
-
described_class.store(model)
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'adds the data model to the db store' do
|
63
|
-
interface.should_receive(:add).with(collection_name, HashWithIndifferentAccess.new({primary_key => unique_id}).merge(data_field_attributes))
|
64
|
-
|
65
|
-
described_class.store(model)
|
155
|
+
described_class.store(model).should == return_value
|
66
156
|
end
|
67
157
|
end
|
68
158
|
|
@@ -89,17 +179,18 @@ describe Mince::DataModel, 'Mixin' do
|
|
89
179
|
end
|
90
180
|
|
91
181
|
describe "updating a data model" do
|
92
|
-
let(:
|
93
|
-
let(:model) { mock 'a model'
|
182
|
+
let(:klass_object) { mock }
|
183
|
+
let(:model) { mock 'a model' }
|
184
|
+
let(:return_value) { mock }
|
94
185
|
|
95
186
|
before do
|
96
|
-
|
187
|
+
described_class.stub(:new).with(model).and_return(klass_object)
|
97
188
|
end
|
98
189
|
|
99
|
-
it '
|
100
|
-
|
190
|
+
it 'can update a record for a model' do
|
191
|
+
klass_object.should_receive(:update).and_return(return_value)
|
101
192
|
|
102
|
-
described_class.update(model)
|
193
|
+
described_class.update(model).should == return_value
|
103
194
|
end
|
104
195
|
end
|
105
196
|
|
@@ -241,3 +332,5 @@ describe Mince::DataModel, 'Mixin' do
|
|
241
332
|
end
|
242
333
|
end
|
243
334
|
end
|
335
|
+
|
336
|
+
|