active_mocker 1.3.2 → 1.4.1
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/.travis.yml +1 -1
- data/README.md +136 -24
- data/Rakefile +8 -2
- data/active_mocker.gemspec +3 -3
- data/lib/active_mock/association.rb +7 -0
- data/lib/active_mock/base.rb +250 -0
- data/lib/active_mock/collection.rb +52 -0
- data/lib/active_mock/creators.rb +25 -0
- data/lib/active_mock/do_nothing_active_record_methods.rb +51 -0
- data/lib/active_mock/has_and_belongs_to_many.rb +7 -0
- data/lib/active_mock/has_many.rb +54 -0
- data/lib/active_mock/next_id.rb +16 -0
- data/lib/active_mock/object_inspect.rb +39 -0
- data/lib/{active_mocker/collection → active_mock}/queries.rb +26 -19
- data/lib/active_mock/records.rb +81 -0
- data/lib/active_mock/relation.rb +8 -0
- data/lib/active_mocker.rb +3 -1
- data/lib/active_mocker/active_mock.rb +26 -0
- data/lib/active_mocker/active_record.rb +18 -0
- data/lib/active_mocker/active_record/relationships.rb +57 -6
- data/lib/active_mocker/active_record/schema.rb +1 -1
- data/lib/active_mocker/active_record/scope.rb +1 -1
- data/lib/active_mocker/active_record/unknown_class_method.rb +1 -1
- data/lib/active_mocker/active_record/unknown_module.rb +10 -9
- data/lib/active_mocker/db_to_ruby_type.rb +26 -0
- data/lib/active_mocker/field.rb +16 -8
- data/lib/active_mocker/generate.rb +19 -174
- data/lib/active_mocker/loaded_mocks.rb +48 -8
- data/lib/active_mocker/logger.rb +2 -0
- data/lib/active_mocker/mock_template.erb +123 -53
- data/lib/active_mocker/model_reader.rb +42 -13
- data/lib/active_mocker/model_schema.rb +279 -0
- data/lib/active_mocker/model_schema/generate.rb +175 -0
- data/lib/active_mocker/reparameterize.rb +23 -3
- data/lib/active_mocker/table.rb +2 -2
- data/lib/active_mocker/version.rb +1 -1
- data/sample_app_rails_4/Gemfile +1 -1
- data/sample_app_rails_4/app/models/micropost.rb +13 -1
- data/sample_app_rails_4/db/schema.rb +1 -1
- data/sample_app_rails_4/spec/compare_mocker_and_record_spec.rb +194 -7
- data/sample_app_rails_4/spec/micropost_mock_spec.rb +145 -0
- data/sample_app_rails_4/spec/mocks/micropost_mock.rb +81 -55
- data/sample_app_rails_4/spec/mocks/relationship_mock.rb +85 -54
- data/sample_app_rails_4/spec/mocks/user_mock.rb +71 -72
- data/sample_app_rails_4/spec/reload_spec.rb +1 -1
- data/sample_app_rails_4/spec/user_mock_spec.rb +25 -7
- data/spec/lib/acitve_mock/queriable_spec.rb +207 -0
- data/spec/lib/active_mocker/db_to_ruby_type_spec.rb +124 -0
- data/spec/lib/active_mocker/loaded_mocks_spec.rb +167 -0
- data/spec/lib/active_mocker/logger_spec.rb +32 -0
- data/spec/lib/active_mocker/model_reader_spec.rb +79 -28
- data/spec/lib/active_mocker/model_schema/generate_spec.rb +111 -0
- data/spec/lib/active_mocker/model_schema_spec.rb +145 -0
- data/spec/lib/model.rb +2 -1
- data/spec/lib/reparameterize_spec.rb +202 -0
- data/spec/unit_logger.rb +2 -2
- metadata +55 -35
- data/lib/active_hash/ar_api.rb +0 -77
- data/lib/active_hash/init.rb +0 -32
- data/lib/active_mocker/collection/association.rb +0 -12
- data/lib/active_mocker/collection/base.rb +0 -65
- data/lib/active_mocker/collection/relation.rb +0 -11
- data/lib/active_mocker/mock_class_methods.rb +0 -92
- data/lib/active_mocker/mock_instance_methods.rb +0 -84
- data/lib/active_mocker/mock_requires.rb +0 -10
- data/spec/lib/active_mocker/collection.rb +0 -94
@@ -0,0 +1,175 @@
|
|
1
|
+
module ActiveMocker
|
2
|
+
|
3
|
+
class ModelSchema
|
4
|
+
|
5
|
+
class Generate
|
6
|
+
|
7
|
+
attr_reader :schema_file, :models_dir
|
8
|
+
|
9
|
+
def initialize(schema_file:nil, models_dir:nil, logger:nil)
|
10
|
+
@schema_file = schema_file
|
11
|
+
@models_dir = models_dir
|
12
|
+
Logger.set(logger)
|
13
|
+
end
|
14
|
+
|
15
|
+
def tables
|
16
|
+
@tables ||= SchemaReader.new({schema_file: schema_file}).search(nil)
|
17
|
+
end
|
18
|
+
|
19
|
+
def get_table(model , model_name)
|
20
|
+
table_name = get_table_name(model.table_name, model_name)
|
21
|
+
selected_table = tables.select{|table| table.name == table_name}.first
|
22
|
+
if selected_table.nil?
|
23
|
+
Logger.error "The Implicit or defined table, `#{table_name}`, can not be found for model #{model_name.camelize}."
|
24
|
+
end
|
25
|
+
tables.delete(selected_table)
|
26
|
+
selected_table
|
27
|
+
end
|
28
|
+
|
29
|
+
# noinspection RubyArgCount
|
30
|
+
def run
|
31
|
+
model_schemas = models.map do |model_name|
|
32
|
+
|
33
|
+
model = get_model(model_name)
|
34
|
+
next if model == false
|
35
|
+
table = get_table(model, model_name)
|
36
|
+
attributes = build_attributes(table.fields, primary_key(table.fields, model))
|
37
|
+
|
38
|
+
ModelSchema.new(class_name: model_name.camelize,
|
39
|
+
table_name: table.name,
|
40
|
+
attributes: attributes,
|
41
|
+
methods: build_methods(model),
|
42
|
+
relationships: build_relationships(model),
|
43
|
+
constants: model.constants)
|
44
|
+
end
|
45
|
+
|
46
|
+
ModelSchemaCollection.new(model_schemas.compact)
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
# noinspection RubyArgCount
|
52
|
+
def build_attributes(attributes, primary_attribute)
|
53
|
+
attributes.map do |attr|
|
54
|
+
attribute = ModelSchema::Attributes
|
55
|
+
.new(name: attr.name,
|
56
|
+
type: attr.type,
|
57
|
+
precision: attr.precision,
|
58
|
+
scale: attr.scale,
|
59
|
+
default_value: attr.default)
|
60
|
+
if primary_attribute == attr
|
61
|
+
attribute.primary_key = true
|
62
|
+
end
|
63
|
+
attribute
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# noinspection RubyArgCount
|
68
|
+
def build_methods(model)
|
69
|
+
result = []
|
70
|
+
{instance: model.instance_methods_with_arguments,
|
71
|
+
class: model.class_methods_with_arguments}.each do |type,methods|
|
72
|
+
methods.map do |method|
|
73
|
+
method_name = method.keys.first.to_s
|
74
|
+
arguments = method.values.first
|
75
|
+
|
76
|
+
result.push(ModelSchema::Methods.new(name: method_name,arguments: arguments,type:type))
|
77
|
+
end
|
78
|
+
end
|
79
|
+
result
|
80
|
+
end
|
81
|
+
|
82
|
+
def build_relationships(model)
|
83
|
+
relations_by_type(model).map do |type, relations|
|
84
|
+
relations.map do |relation|
|
85
|
+
join_table = nil
|
86
|
+
join_table = find_join_table(relation, model) if type == :has_and_belongs_to_many
|
87
|
+
Relationships.new(name: relation.name,
|
88
|
+
class_name: relation.class_name,
|
89
|
+
type: type,
|
90
|
+
through: relation.through,
|
91
|
+
foreign_key: relation.foreign_key,
|
92
|
+
join_table: join_table)
|
93
|
+
end
|
94
|
+
end.flatten
|
95
|
+
end
|
96
|
+
|
97
|
+
def relations_by_type(model)
|
98
|
+
{belongs_to: model.belongs_to,
|
99
|
+
has_one: model.has_one,
|
100
|
+
has_many: model.has_many,
|
101
|
+
has_and_belongs_to_many: model.has_and_belongs_to_many
|
102
|
+
|
103
|
+
}
|
104
|
+
end
|
105
|
+
|
106
|
+
def find_join_table(relation, model)
|
107
|
+
return relation.join_table if relation.respond_to?(:join_table) && relation.join_table
|
108
|
+
tables.select do |table|
|
109
|
+
|
110
|
+
"#{model.table_name}_#{relation.name}" == table.name.to_s || "#{relation.name}_#{model.table_name}" == table.name.to_s
|
111
|
+
end.first
|
112
|
+
end
|
113
|
+
|
114
|
+
def primary_key(attributes, model)
|
115
|
+
result = model_primary_key_attribute(attributes, model)
|
116
|
+
return result unless result.nil?
|
117
|
+
|
118
|
+
result = find_primary_key(attributes)
|
119
|
+
return result unless result.nil?
|
120
|
+
|
121
|
+
find_id_attribute(attributes)
|
122
|
+
end
|
123
|
+
|
124
|
+
private
|
125
|
+
|
126
|
+
def model_primary_key_attribute(attributes, model)
|
127
|
+
if model.respond_to?(:primary_key) && model.primary_key
|
128
|
+
attributes.select do |attr|
|
129
|
+
model.primary_key.to_s == attr.name.to_s
|
130
|
+
end.first
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def find_primary_key(attributes)
|
135
|
+
attributes.select do |attr|
|
136
|
+
attr.try(:primary_key)
|
137
|
+
end.first
|
138
|
+
end
|
139
|
+
|
140
|
+
def find_id_attribute(attributes)
|
141
|
+
attributes.select do |attr|
|
142
|
+
attr.name.to_sym == :id
|
143
|
+
end.first
|
144
|
+
end
|
145
|
+
|
146
|
+
public
|
147
|
+
|
148
|
+
def models
|
149
|
+
Dir["#{models_dir}/*.rb"].map do |file|
|
150
|
+
Pathname.new(file).basename.to_s.sub('.rb', '')
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
def get_model(model_file_name)
|
155
|
+
ModelReader.new({model_dir: models_dir}).parse(model_file_name)
|
156
|
+
end
|
157
|
+
|
158
|
+
def get_table_name(model_table_name, model_name)
|
159
|
+
return model_name.tableize if model_table_name.nil?
|
160
|
+
return model_table_name
|
161
|
+
end
|
162
|
+
|
163
|
+
def table_to_model_file(table_name)
|
164
|
+
table_name.singularize
|
165
|
+
end
|
166
|
+
|
167
|
+
def table_to_class_name(table)
|
168
|
+
table.camelize.singularize
|
169
|
+
end
|
170
|
+
|
171
|
+
end
|
172
|
+
|
173
|
+
end
|
174
|
+
|
175
|
+
end
|
@@ -1,8 +1,12 @@
|
|
1
|
+
module ActiveMocker
|
1
2
|
class Reparameterize
|
2
3
|
|
3
|
-
def self.call(params,
|
4
|
-
return params
|
4
|
+
def self.call(params, param_list:false)
|
5
|
+
return param_list(params) if param_list
|
6
|
+
method_arguments(params)
|
7
|
+
end
|
5
8
|
|
9
|
+
def self.method_arguments(params)
|
6
10
|
params.map do |state, param|
|
7
11
|
case state
|
8
12
|
when :req
|
@@ -11,11 +15,27 @@ class Reparameterize
|
|
11
15
|
"*#{param}"
|
12
16
|
when :opt
|
13
17
|
"#{param}=nil"
|
18
|
+
when :keyreq
|
19
|
+
"#{param}:"
|
20
|
+
when :key
|
21
|
+
"#{param}: nil"
|
14
22
|
else
|
15
23
|
param
|
16
24
|
end
|
17
|
-
end.join(
|
25
|
+
end.join(', ')
|
26
|
+
|
27
|
+
end
|
18
28
|
|
29
|
+
def self.param_list(params)
|
30
|
+
params.map do |state, param|
|
31
|
+
case state
|
32
|
+
when :key, :keyreq
|
33
|
+
"#{param}: #{param}"
|
34
|
+
else
|
35
|
+
param
|
36
|
+
end
|
37
|
+
end.join(', ')
|
19
38
|
end
|
20
39
|
|
40
|
+
end
|
21
41
|
end
|
data/lib/active_mocker/table.rb
CHANGED
@@ -4,10 +4,10 @@ module ActiveMocker
|
|
4
4
|
|
5
5
|
attr_reader :name, :fields
|
6
6
|
|
7
|
-
def initialize(name, fields=[])
|
7
|
+
def initialize(name, id=true, fields=[])
|
8
8
|
@name = name
|
9
9
|
@fields = fields
|
10
|
-
fields.unshift Field.new('id', :integer, {})
|
10
|
+
fields.unshift Field.new('id', :integer, [{primary_key: true}]) if id.nil?
|
11
11
|
end
|
12
12
|
|
13
13
|
def to_h
|
data/sample_app_rails_4/Gemfile
CHANGED
@@ -1,12 +1,24 @@
|
|
1
1
|
class Micropost < ActiveRecord::Base
|
2
2
|
belongs_to :user
|
3
3
|
default_scope -> { order('created_at DESC') }
|
4
|
+
MAGIC_ID_NUMBER = 90
|
5
|
+
MAGIC_ID_STRING = 'F-1'
|
4
6
|
|
7
|
+
module DoNotIncludeInMock
|
8
|
+
|
9
|
+
end
|
10
|
+
include DoNotIncludeInMock
|
11
|
+
# self.primary_key = :lol
|
12
|
+
# self.table_name = :posts
|
5
13
|
# Returns microposts from the users being followed by the given user.
|
6
|
-
def self.from_users_followed_by(user)
|
14
|
+
def self.from_users_followed_by(user=nil)
|
7
15
|
followed_user_ids = "SELECT followed_id FROM relationships
|
8
16
|
WHERE follower_id = :user_id"
|
9
17
|
where("user_id IN (#{followed_user_ids}) OR user_id = :user_id",
|
10
18
|
user_id: user.id)
|
11
19
|
end
|
20
|
+
|
21
|
+
def display_name
|
22
|
+
|
23
|
+
end
|
12
24
|
end
|
@@ -37,7 +37,7 @@ ActiveRecord::Schema.define(version: 20130315230445) do
|
|
37
37
|
create_table "users", force: true do |t|
|
38
38
|
t.string "name"
|
39
39
|
t.string "email", default: ""
|
40
|
-
t.decimal "credits"
|
40
|
+
t.decimal "credits", precision: 19, scale: 6
|
41
41
|
t.datetime "created_at"
|
42
42
|
t.datetime "updated_at"
|
43
43
|
t.string "password_digest"
|
@@ -26,7 +26,7 @@ describe 'Comparing ActiveMocker Api to ActiveRecord Api' do
|
|
26
26
|
describe '::superclass' do
|
27
27
|
|
28
28
|
it 'mock has super of active hash' do
|
29
|
-
expect(UserMock.superclass.name).to eq "
|
29
|
+
expect(UserMock.superclass.name).to eq "ActiveMock::Base"
|
30
30
|
end
|
31
31
|
|
32
32
|
it 'ar has super of ar' do
|
@@ -95,7 +95,9 @@ describe 'Comparing ActiveMocker Api to ActiveRecord Api' do
|
|
95
95
|
describe '#attributes' do
|
96
96
|
|
97
97
|
let(:user_ar){User.new(attributes)}
|
98
|
-
let(:user_mock){
|
98
|
+
let(:user_mock){
|
99
|
+
UserMock.new(attributes)
|
100
|
+
}
|
99
101
|
|
100
102
|
it 'mock' do
|
101
103
|
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})
|
@@ -292,7 +294,7 @@ describe 'Comparing ActiveMocker Api to ActiveRecord Api' do
|
|
292
294
|
end
|
293
295
|
|
294
296
|
it 'UserMock' do
|
295
|
-
where_no_options(UserMock,
|
297
|
+
where_no_options(UserMock, ActiveMock::Queries::WhereNotChain)
|
296
298
|
end
|
297
299
|
|
298
300
|
end
|
@@ -400,7 +402,7 @@ describe 'Comparing ActiveMocker Api to ActiveRecord Api' do
|
|
400
402
|
end
|
401
403
|
|
402
404
|
it 'UserMock' do
|
403
|
-
supported_array_methods(UserMock, MicropostMock,
|
405
|
+
supported_array_methods(UserMock, MicropostMock, ActiveMock::HasMany)
|
404
406
|
end
|
405
407
|
|
406
408
|
end
|
@@ -420,7 +422,7 @@ describe 'Comparing ActiveMocker Api to ActiveRecord Api' do
|
|
420
422
|
end
|
421
423
|
|
422
424
|
it 'UserMock' do
|
423
|
-
collection_find(UserMock, MicropostMock,
|
425
|
+
collection_find(UserMock, MicropostMock, ActiveMock::Association)
|
424
426
|
end
|
425
427
|
|
426
428
|
end
|
@@ -438,7 +440,7 @@ describe 'Comparing ActiveMocker Api to ActiveRecord Api' do
|
|
438
440
|
end
|
439
441
|
|
440
442
|
it 'UserMock' do
|
441
|
-
collection_finds(UserMock, MicropostMock,
|
443
|
+
collection_finds(UserMock, MicropostMock, ActiveMock::Association)
|
442
444
|
end
|
443
445
|
|
444
446
|
end
|
@@ -822,7 +824,7 @@ describe 'Comparing ActiveMocker Api to ActiveRecord Api' do
|
|
822
824
|
end
|
823
825
|
|
824
826
|
it 'UserMock' do
|
825
|
-
find_by_exception(UserMock,
|
827
|
+
find_by_exception(UserMock, ActiveMock::RecordNotFound)
|
826
828
|
end
|
827
829
|
|
828
830
|
end
|
@@ -846,6 +848,191 @@ describe 'Comparing ActiveMocker Api to ActiveRecord Api' do
|
|
846
848
|
|
847
849
|
end
|
848
850
|
|
851
|
+
describe '::transaction' do
|
849
852
|
|
853
|
+
context 'will run code in block' do
|
854
|
+
|
855
|
+
def transaction(user_class)
|
856
|
+
user_class.transaction do
|
857
|
+
user_class.create(email: '1')
|
858
|
+
user_class.create(email: '2')
|
859
|
+
end
|
860
|
+
|
861
|
+
expect(user_class.count).to eq 2
|
862
|
+
end
|
863
|
+
|
864
|
+
it 'User' do
|
865
|
+
transaction(User)
|
866
|
+
end
|
867
|
+
|
868
|
+
it 'UserMock' do
|
869
|
+
transaction(UserMock)
|
870
|
+
end
|
871
|
+
|
872
|
+
end
|
873
|
+
|
874
|
+
end
|
875
|
+
|
876
|
+
describe 'belongs_to association' do
|
877
|
+
|
878
|
+
describe 'when setting association by object it will set id if object is persisted' do
|
879
|
+
|
880
|
+
def id_set_by_object(post_class, user_class)
|
881
|
+
user = user_class.create
|
882
|
+
post = post_class.create(user: user)
|
883
|
+
expect(post.user_id).to eq user.id
|
884
|
+
end
|
885
|
+
|
886
|
+
it 'User' do
|
887
|
+
id_set_by_object(Micropost, User)
|
888
|
+
end
|
889
|
+
|
890
|
+
it 'UserMock' do
|
891
|
+
id_set_by_object(MicropostMock, UserMock)
|
892
|
+
end
|
893
|
+
|
894
|
+
end
|
895
|
+
|
896
|
+
describe 'when setting association by object it will set the child association', pending:true do
|
897
|
+
|
898
|
+
def set_by_object(post_class, user_class)
|
899
|
+
user = user_class.create
|
900
|
+
post = post_class.create(user: user)
|
901
|
+
expect(user.microposts).to eq [post]
|
902
|
+
end
|
903
|
+
|
904
|
+
it 'User' do
|
905
|
+
set_by_object(Micropost, User)
|
906
|
+
end
|
907
|
+
|
908
|
+
it 'UserMock' do
|
909
|
+
set_by_object(MicropostMock, UserMock)
|
910
|
+
end
|
911
|
+
|
912
|
+
end
|
913
|
+
|
914
|
+
describe 'when setting association by id it will set the object on the parent' do
|
915
|
+
|
916
|
+
def object_set_by_id(post_class, user_class)
|
917
|
+
user = user_class.create
|
918
|
+
post = post_class.create(user_id: user.id)
|
919
|
+
expect(post.user).to eq user
|
920
|
+
end
|
921
|
+
|
922
|
+
it 'User' do
|
923
|
+
object_set_by_id(Micropost, User)
|
924
|
+
end
|
925
|
+
|
926
|
+
it 'UserMock' do
|
927
|
+
object_set_by_id(MicropostMock, UserMock)
|
928
|
+
end
|
929
|
+
|
930
|
+
end
|
931
|
+
|
932
|
+
describe 'when setting association by object it will not set id if object is not persisted' do
|
933
|
+
|
934
|
+
def id_set_by_object(post_class, user_class)
|
935
|
+
user = user_class.new
|
936
|
+
post = post_class.new(user: user)
|
937
|
+
expect(post.user_id).to eq nil
|
938
|
+
end
|
939
|
+
|
940
|
+
it 'User' do
|
941
|
+
id_set_by_object(Micropost, User)
|
942
|
+
end
|
943
|
+
|
944
|
+
it 'UserMock' do
|
945
|
+
id_set_by_object(MicropostMock, UserMock)
|
946
|
+
end
|
947
|
+
|
948
|
+
end
|
949
|
+
|
950
|
+
describe 'can build' do
|
951
|
+
|
952
|
+
def build_belong_to(post_class, user_class)
|
953
|
+
post = post_class.new
|
954
|
+
user = post.build_user
|
955
|
+
expect(user.class).to eq user_class
|
956
|
+
expect(post.user).to eq user
|
957
|
+
end
|
958
|
+
|
959
|
+
it 'User' do
|
960
|
+
build_belong_to(Micropost, User)
|
961
|
+
end
|
962
|
+
|
963
|
+
it 'UserMock' do
|
964
|
+
build_belong_to(MicropostMock, UserMock)
|
965
|
+
end
|
966
|
+
|
967
|
+
end
|
968
|
+
|
969
|
+
end
|
970
|
+
|
971
|
+
describe 'has_many association' do
|
972
|
+
|
973
|
+
describe 'when passing in collection all item in collection will set its foreign key to the parent', pending: true do
|
974
|
+
|
975
|
+
def id_set_to_children(user_class, post_class)
|
976
|
+
posts = [post_class.create, post_class.create, post_class.create]
|
977
|
+
user = user_class.create(microposts: posts)
|
978
|
+
expect(user.microposts.map(&:user_id)).to eq posts.map(&:user_id)
|
979
|
+
expect(posts.map(&:user_id)).to eq [user.id, user.id, user.id]
|
980
|
+
end
|
981
|
+
|
982
|
+
it 'User' do
|
983
|
+
id_set_to_children(User, Micropost)
|
984
|
+
end
|
985
|
+
|
986
|
+
it 'UserMock' do
|
987
|
+
id_set_to_children(UserMock, MicropostMock)
|
988
|
+
end
|
989
|
+
|
990
|
+
end
|
991
|
+
|
992
|
+
end
|
993
|
+
|
994
|
+
describe 'can build new object from collection' do
|
995
|
+
|
996
|
+
def new_record_on_collection(user_class, post_class)
|
997
|
+
user = user_class.create
|
998
|
+
new_post = user.microposts.build
|
999
|
+
expect(new_post.class).to eq(post_class)
|
1000
|
+
expect(new_post.attributes).to eq({"id" => nil, "content" => nil, "user_id" => 1, "up_votes" => nil, "created_at" => nil, "updated_at" => nil})
|
1001
|
+
expect(user.microposts.count).to eq 0
|
1002
|
+
new_post.save
|
1003
|
+
expect(user.microposts.count).to eq(1)
|
1004
|
+
expect(user.microposts.first).to eq(new_post)
|
1005
|
+
end
|
1006
|
+
|
1007
|
+
it 'User' do
|
1008
|
+
new_record_on_collection(User, Micropost)
|
1009
|
+
end
|
1010
|
+
|
1011
|
+
it 'UserMock' do
|
1012
|
+
new_record_on_collection(UserMock, MicropostMock)
|
1013
|
+
end
|
1014
|
+
|
1015
|
+
end
|
1016
|
+
|
1017
|
+
describe 'can create new object from collection' do
|
1018
|
+
|
1019
|
+
def create_record_on_collection(user_class, post_class)
|
1020
|
+
user = user_class.create
|
1021
|
+
new_post = user.microposts.create
|
1022
|
+
expect(new_post.class).to eq(post_class)
|
1023
|
+
expect(new_post.user_id).to eq(1)
|
1024
|
+
expect(user.microposts.count).to eq 1
|
1025
|
+
expect(user.microposts.first).to eq(new_post)
|
1026
|
+
end
|
1027
|
+
|
1028
|
+
it 'User' do
|
1029
|
+
create_record_on_collection(User, Micropost)
|
1030
|
+
end
|
1031
|
+
|
1032
|
+
it 'UserMock' do
|
1033
|
+
create_record_on_collection(UserMock, MicropostMock)
|
1034
|
+
end
|
1035
|
+
|
1036
|
+
end
|
850
1037
|
|
851
1038
|
end
|