zeng 0.0.1 → 0.0.2
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.
- data/README.md +67 -0
- data/Rakefile +21 -19
- data/book.rb +23 -0
- data/{init.rb → lib/zeng.rb} +5 -1
- data/lib/{cute_kv → zeng}/adapters/tokyo_cabinet.rb +7 -6
- data/lib/zeng/adapters/tokyo_tyrant.rb +30 -0
- data/lib/zeng/connector.rb +28 -0
- data/lib/{cute_kv → zeng}/document.rb +7 -12
- data/lib/{cute_kv → zeng}/indexer.rb +2 -2
- data/spec/case/document_test.rb +174 -174
- data/spec/case/indexer_test.rb +31 -31
- data/spec/helper.rb +12 -14
- data/spec/model/Account.rb +3 -3
- data/spec/model/Book.rb +2 -2
- data/spec/model/Friend.rb +3 -3
- data/spec/model/Icon.rb +3 -3
- data/spec/model/Project.rb +2 -2
- data/spec/model/User.rb +3 -4
- metadata +26 -49
- data/README.rdoc +0 -89
- data/lib/cute_kv/adapters/light_cloud.rb +0 -22
- data/lib/cute_kv/adapters/tokyo_tyrant.rb +0 -22
- data/lib/cute_kv/associations.rb +0 -285
- data/lib/cute_kv/connector.rb +0 -27
- data/lib/cute_kv/ext/string.rb +0 -34
- data/lib/cute_kv/ext/symbol.rb +0 -9
- data/lib/cute_kv/serialization.rb +0 -95
- data/lib/cute_kv/serializers/json_serializer.rb +0 -75
- data/lib/cute_kv/serializers/xml_serializer.rb +0 -325
- data/lib/cute_kv/timestamp.rb +0 -56
- data/lib/cute_kv/validations.rb +0 -68
- data/lib/cutekv.rb +0 -17
- data/spec/asso.yml +0 -23
- data/spec/asso_sin_plural.yml +0 -36
- data/spec/case/associations_test.rb +0 -313
- data/spec/case/document_docking_test.rb +0 -103
- data/spec/case/serialization_test.rb +0 -78
- data/spec/case/sin_plu_dic_test.rb +0 -29
- data/spec/case/symmetry_test.rb +0 -80
- data/spec/case/timestamp_test.rb +0 -65
- data/spec/case/validations_test.rb +0 -74
- data/spec/light_cloud.yml +0 -9
- data/spec/model/Topic.rb +0 -26
- data/tags +0 -322
data/lib/cute_kv/timestamp.rb
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
module CuteKV
|
2
|
-
# CuteKV automatically timestamps create and update operations if the table has fields
|
3
|
-
# named created_at/created_on or updated_at/updated_on.
|
4
|
-
#
|
5
|
-
# Timestamping can be turned off by setting
|
6
|
-
# <tt>ActiveRecord::Base.record_timestamps = false</tt>
|
7
|
-
#
|
8
|
-
# Timestamps are in the local timezone by default but you can use UTC by setting
|
9
|
-
# <tt>CuteKV::Timestampes.default_timezone == :utc</tt>
|
10
|
-
module Timestamp
|
11
|
-
|
12
|
-
def self.included(base) #:nodoc:
|
13
|
-
base.extend ClassMethods
|
14
|
-
base.alias_method_chain :save, :timestamps
|
15
|
-
end
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
module ClassMethods
|
20
|
-
def default_timezone
|
21
|
-
@timezone = Timestamp::default_timezone
|
22
|
-
@timezone.to_sym
|
23
|
-
end
|
24
|
-
|
25
|
-
def add_timestamps
|
26
|
-
assign(:created_at, :updated_at) unless already_has_timestamp?
|
27
|
-
end
|
28
|
-
|
29
|
-
def already_has_timestamp?
|
30
|
-
attrs = self.assigned_attributes
|
31
|
-
attrs.include?(:created_at) && attrs.include?(:updated_at)
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
def save_with_timestamps #:nodoc:
|
39
|
-
t = self.class.default_timezone == :utc ? DateTime.now.utc : DateTime.now
|
40
|
-
self.created_at ||= t if self.respond_to?(:created_at)
|
41
|
-
self.updated_at = t if self.respond_to?(:updated_at)
|
42
|
-
save_without_timestamps
|
43
|
-
end
|
44
|
-
|
45
|
-
|
46
|
-
class << self
|
47
|
-
|
48
|
-
def default_timezone
|
49
|
-
@default_tz ||= :utc
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
|
-
end
|
55
|
-
|
56
|
-
end
|
data/lib/cute_kv/validations.rb
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
module CuteKV
|
2
|
-
|
3
|
-
module Validations
|
4
|
-
|
5
|
-
def self.included(base)
|
6
|
-
base.extend ClassMethods
|
7
|
-
base.send :include, InstanceMethods
|
8
|
-
base.class_eval { alias_method :validated, :save; alias_method :save, :validating }
|
9
|
-
end
|
10
|
-
|
11
|
-
class Error
|
12
|
-
|
13
|
-
def initialize
|
14
|
-
@body = Hash.new {|h,k| h[k] = []}
|
15
|
-
end
|
16
|
-
|
17
|
-
def add(attr, mesg)
|
18
|
-
attr = attr.to_s
|
19
|
-
@body[attr] << mesg unless @body[attr].include?(mesg)
|
20
|
-
end
|
21
|
-
|
22
|
-
def on(attr)
|
23
|
-
attr = attr.to_s
|
24
|
-
@body[attr].size == 1 ? @body[attr].first : @body[attr]
|
25
|
-
end
|
26
|
-
|
27
|
-
def empty?
|
28
|
-
@body.values.flatten.empty?
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
module InstanceMethods
|
34
|
-
|
35
|
-
def validating
|
36
|
-
self.class.validations.each {|v| self.send v}
|
37
|
-
valid? ? validated : nil
|
38
|
-
end
|
39
|
-
|
40
|
-
def errors
|
41
|
-
@errors ||= Error.new
|
42
|
-
end
|
43
|
-
|
44
|
-
def valid?
|
45
|
-
self.errors.empty?
|
46
|
-
end
|
47
|
-
|
48
|
-
def errors_message_on(attr)
|
49
|
-
self.errors.on(attr)
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
|
-
module ClassMethods
|
55
|
-
|
56
|
-
def validate(validate_process)
|
57
|
-
(@validations ||=[]) << validate_process
|
58
|
-
end
|
59
|
-
|
60
|
-
def validations
|
61
|
-
(@validations ||=[]).dup
|
62
|
-
end
|
63
|
-
|
64
|
-
end
|
65
|
-
|
66
|
-
end
|
67
|
-
|
68
|
-
end
|
data/lib/cutekv.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
$:.unshift(File.dirname(__FILE__)) unless
|
2
|
-
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
|
-
|
4
|
-
require 'rubygems'
|
5
|
-
require 'lightcloud'
|
6
|
-
require 'active_support'
|
7
|
-
require 'cute_kv/ext/string'
|
8
|
-
require 'cute_kv/ext/symbol'
|
9
|
-
require 'cute_kv/document'
|
10
|
-
require 'cute_kv/validations'
|
11
|
-
require 'cute_kv/connector'
|
12
|
-
require 'cute_kv/associations'
|
13
|
-
require 'cute_kv/indexer'
|
14
|
-
require 'cute_kv/serialization'
|
15
|
-
require 'cute_kv/connector'
|
16
|
-
require 'cute_kv/timestamp'
|
17
|
-
|
data/spec/asso.yml
DELETED
data/spec/asso_sin_plural.yml
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
-
|
2
|
-
Book:
|
3
|
-
owner
|
4
|
-
User:
|
5
|
-
book
|
6
|
-
plural:
|
7
|
-
book
|
8
|
-
singular:
|
9
|
-
owner
|
10
|
-
-
|
11
|
-
User:
|
12
|
-
projects
|
13
|
-
Project:
|
14
|
-
members
|
15
|
-
plural:
|
16
|
-
projects
|
17
|
-
members
|
18
|
-
-
|
19
|
-
User:
|
20
|
-
icons
|
21
|
-
Icon:
|
22
|
-
users
|
23
|
-
singular:
|
24
|
-
icons
|
25
|
-
users
|
26
|
-
-
|
27
|
-
User:
|
28
|
-
husband
|
29
|
-
wife
|
30
|
-
-
|
31
|
-
User:
|
32
|
-
friends
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
@@ -1,313 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__),'..','helper')
|
2
|
-
AA = CuteKV
|
3
|
-
|
4
|
-
ModelDivider.divide "User", "Icon", "Project", "Book"
|
5
|
-
Project.select_serializer(:marshal)
|
6
|
-
|
7
|
-
class RubymapTest < Test::Unit::TestCase
|
8
|
-
|
9
|
-
def setup
|
10
|
-
clear_database
|
11
|
-
@aaron = User.create(:name=>'aaron', :email=>'aaron@nonobo.com')
|
12
|
-
@rita = User.create(:name=>'rita')
|
13
|
-
@jack = User.create(:name=>'jack', :email=>'jack@nonobo.com')
|
14
|
-
@icon = Icon.create(:name=>"aaron.jpg", :path=>'/tmp/aaron.jpg')
|
15
|
-
@icon2 = Icon.create(:name=>"jack.jpg", :path=>'/tmp/jack.jpg')
|
16
|
-
@book = Book.create(:name=>"Deep hole")
|
17
|
-
@book2 = Book.create(:name=>"css")
|
18
|
-
@book3 = Book.create(:name=>"ruby on rails")
|
19
|
-
@project_nonobo = Project.create(:name=>"无书网")
|
20
|
-
@project_forum = Project.create(:name=>"多论坛")
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_relations_by_self_friends_friends
|
24
|
-
CuteKV::Associations::map(User=>:friends)
|
25
|
-
assert_equal @jack.friends.size, 0
|
26
|
-
assert_equal @aaron.friends.size, 0
|
27
|
-
@jack.friends << @aaron
|
28
|
-
jack = User.find(@jack.id)
|
29
|
-
assert_equal jack.friends[0].id, @aaron.id
|
30
|
-
aaron = User.find(@aaron.id)
|
31
|
-
assert_equal aaron.friends[0].id, jack.id
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_relations_by_self_copy_icon
|
35
|
-
CuteKV::Associations::map(Icon=>:copy)
|
36
|
-
assert @icon.copy.nil?
|
37
|
-
@icon.copy = @icon2
|
38
|
-
icon = Icon.find(@icon.id)
|
39
|
-
icon2 = Icon.find(@icon2.id)
|
40
|
-
assert_equal icon.copy.id, @icon2.id
|
41
|
-
assert_equal icon2.copy.id, @icon.id
|
42
|
-
end
|
43
|
-
|
44
|
-
def test_relations_husband_and_wife
|
45
|
-
CuteKV::Associations::map(User=>[:wife, :husband])
|
46
|
-
assert @aaron.wife.nil?
|
47
|
-
assert @rita.husband.nil?
|
48
|
-
@aaron.wife = @rita
|
49
|
-
aaron = User.find(@aaron.id)
|
50
|
-
rita = User.find(@rita.id)
|
51
|
-
assert_equal aaron.wife.id, rita.id
|
52
|
-
assert_equal rita.husband.id, aaron.id
|
53
|
-
end
|
54
|
-
|
55
|
-
def test_relaions_map_one_to_many
|
56
|
-
AA::Associations.map(Book=>:owner, User=>:books)
|
57
|
-
assert_equal @jack.books.size, 0
|
58
|
-
assert_equal @aaron.books.size, 0
|
59
|
-
@jack.books << @book
|
60
|
-
@jack.books << @book2
|
61
|
-
@jack.books << @book3
|
62
|
-
jack = User.find(@jack.id)
|
63
|
-
assert_equal @book.owner.id, @jack.id
|
64
|
-
assert_equal @book2.owner.id, @jack.id
|
65
|
-
assert_equal @book3.owner.id, @jack.id
|
66
|
-
book_ids = @jack.books.map(&:id)
|
67
|
-
assert book_ids.include?(@book.id)
|
68
|
-
assert book_ids.include?(@book2.id)
|
69
|
-
assert book_ids.include?(@book3.id)
|
70
|
-
@book.owner = @aaron
|
71
|
-
assert_equal @book.owner.id, @aaron.id
|
72
|
-
assert_equal @aaron.books.size, 1
|
73
|
-
aaron = User.find(@aaron.id)
|
74
|
-
assert aaron.books.map(&:id).include?(@book.id)
|
75
|
-
assert_equal @jack.books.size, 2
|
76
|
-
assert !@jack.books.map(&:id).include?(@book.id)
|
77
|
-
@book2.owner = @aaron
|
78
|
-
assert_equal @aaron.books.size, 2
|
79
|
-
assert @aaron.books.map(&:id).include?(@book2.id)
|
80
|
-
assert_equal @jack.books.size, 1
|
81
|
-
assert !@jack.books.map(&:id).include?(@book2.id)
|
82
|
-
|
83
|
-
end
|
84
|
-
|
85
|
-
|
86
|
-
def test_relations_map_one_to_one
|
87
|
-
AA::Associations.map(User=>:icon, Icon=>:user)
|
88
|
-
user_icon_test
|
89
|
-
end
|
90
|
-
|
91
|
-
def test_relations_map_one_to_one_set_singular
|
92
|
-
AA::Associations.map(User=>:icons, Icon=>:users, :singular=>[:icons, :users])
|
93
|
-
users_icons_test
|
94
|
-
end
|
95
|
-
|
96
|
-
def test_relations_map_one_to_many_set_singular_plural
|
97
|
-
AA::Associations.map(Book=>:owner, User=>:books, :singular=>:owner, :plural=>:books)
|
98
|
-
owner_books_test
|
99
|
-
end
|
100
|
-
|
101
|
-
def test_relations_map_many_to_many_set_plural
|
102
|
-
AA::Associations.map(User=>:project, Project=>:member, :plural=>[:project, :member])
|
103
|
-
member_project_test
|
104
|
-
end
|
105
|
-
|
106
|
-
def test_relations_map_one_to_many
|
107
|
-
AA::Associations.map(Book=>:owner, User=>:books)
|
108
|
-
owner_books_test
|
109
|
-
end
|
110
|
-
|
111
|
-
def test_relations_map_many_to_many
|
112
|
-
AA::Associations.map(User=>:projects, Project=>:members)
|
113
|
-
members_projects_test
|
114
|
-
end
|
115
|
-
|
116
|
-
def test_relations_map_many_to_many_set_plural
|
117
|
-
AA::Associations.map(User=>:projects, Project=>:members, :plural=>[:projects, :members])
|
118
|
-
members_projects_test
|
119
|
-
end
|
120
|
-
|
121
|
-
def owner_books_test
|
122
|
-
assert_equal @aaron.books.size, 0
|
123
|
-
assert_equal @book.owner, nil
|
124
|
-
@aaron.books << @book
|
125
|
-
aaron = User.find(@aaron.id)
|
126
|
-
assert_equal @aaron.books.size, 1
|
127
|
-
assert_equal aaron.books.size, 1
|
128
|
-
assert_equal aaron.books[0].id, @book.id
|
129
|
-
assert_equal @book.owner.id, aaron.id
|
130
|
-
book = Book.find(@book.id)
|
131
|
-
assert_equal book.owner.id, aaron.id
|
132
|
-
aaron.books.remove(book)
|
133
|
-
assert_equal aaron.books.size, 0
|
134
|
-
assert_equal book.owner, nil
|
135
|
-
end
|
136
|
-
|
137
|
-
def user_icon_test
|
138
|
-
assert @aaron.respond_to?(:icon=)
|
139
|
-
@aaron.icon = @icon
|
140
|
-
aaron = User.find(@aaron.id)
|
141
|
-
assert_equal aaron.icon.id, @icon.id
|
142
|
-
assert_equal aaron.icon.path, @icon.path
|
143
|
-
assert_equal aaron.icon.name, @icon.name
|
144
|
-
assert_equal @icon.user.id, aaron.id
|
145
|
-
@aaron.icon.remove(@icon)
|
146
|
-
assert @aaron.icon.nil?
|
147
|
-
assert @icon.user.nil?
|
148
|
-
@aaron.icon = @icon
|
149
|
-
aaron = User.find(@aaron.id)
|
150
|
-
assert_equal aaron.icon.id, @icon.id
|
151
|
-
assert_equal @icon.user.id, aaron.id
|
152
|
-
@aaron.icon = @icon2
|
153
|
-
assert @icon.user.nil?
|
154
|
-
assert_equal @icon2.user.id, aaron.id
|
155
|
-
@icon2.user = @jack
|
156
|
-
assert @aaron.icon.nil?
|
157
|
-
end
|
158
|
-
|
159
|
-
def users_icons_test
|
160
|
-
assert @aaron.respond_to?(:icons=)
|
161
|
-
@aaron.icons = @icon
|
162
|
-
aaron = User.find(@aaron.id)
|
163
|
-
assert_equal aaron.icons.id, @icon.id
|
164
|
-
assert_equal @icon.users.id, aaron.id
|
165
|
-
assert_equal @icon.users.name, aaron.name
|
166
|
-
end
|
167
|
-
|
168
|
-
def member_project_test
|
169
|
-
assert_equal @aaron.project.size, 0
|
170
|
-
assert_equal @project_nonobo.member.size, 0
|
171
|
-
@aaron.project << @project_nonobo
|
172
|
-
assert_equal @aaron.project.size, 1
|
173
|
-
assert_equal @project_nonobo.member.size, 1
|
174
|
-
aaron = User.find(@aaron.id)
|
175
|
-
project = aaron.project.last
|
176
|
-
member = @project_nonobo.member.last
|
177
|
-
assert_equal member.id, aaron.id
|
178
|
-
assert_equal project.id, @project_nonobo.id
|
179
|
-
end
|
180
|
-
|
181
|
-
def members_projects_test
|
182
|
-
assert_equal @aaron.projects.size, 0
|
183
|
-
assert_equal @project_nonobo.members.size, 0
|
184
|
-
@aaron.projects << @project_nonobo
|
185
|
-
assert_equal @aaron.projects.size, 1
|
186
|
-
assert_equal @project_nonobo.members.size, 1
|
187
|
-
aaron = User.find(@aaron.id)
|
188
|
-
project = aaron.projects.last
|
189
|
-
member = @project_nonobo.members.last
|
190
|
-
assert_equal member.id, aaron.id
|
191
|
-
assert_equal project.id, @project_nonobo.id
|
192
|
-
aaron.projects.remove(@project_nonobo)
|
193
|
-
assert_equal @project_nonobo.members.size, 0
|
194
|
-
assert_equal @aaron.projects.size, 0
|
195
|
-
@aaron.projects << @project_nonobo
|
196
|
-
@aaron.projects << @project_forum
|
197
|
-
aaron = User.find(@aaron.id)
|
198
|
-
assert_equal aaron.projects.size, 2
|
199
|
-
nonobo = Project.find(@project_nonobo.id)
|
200
|
-
forum = Project.find(@project_forum.id)
|
201
|
-
assert_equal nonobo.members.size, 1
|
202
|
-
assert_equal forum.members.size, 1
|
203
|
-
assert_equal nonobo.members[0].id, aaron.id
|
204
|
-
assert_equal forum.members[0].id, aaron.id
|
205
|
-
aaron.projects.remove(nonobo)
|
206
|
-
aaron = User.find(@aaron.id)
|
207
|
-
assert_equal aaron.projects.size, 1
|
208
|
-
assert_equal nonobo.members.size, 0
|
209
|
-
forum.members.remove(aaron)
|
210
|
-
assert_equal aaron.projects.size, 0
|
211
|
-
assert_equal forum.members.size, 0
|
212
|
-
end
|
213
|
-
|
214
|
-
def test_robust_of_many_to_many
|
215
|
-
AA::Associations.map(User=>:projects, Project=>:members)
|
216
|
-
robust_many_to_many_test
|
217
|
-
end
|
218
|
-
|
219
|
-
def robust_many_to_many_test
|
220
|
-
@aaron.projects << "aadd"
|
221
|
-
@aaron.projects << @jack
|
222
|
-
@aaron.projects.remove("bbbbbb")
|
223
|
-
@aaron.projects.remove(@jack)
|
224
|
-
assert @aaron.projects.empty?
|
225
|
-
@aaron.projects << @project_nonobo
|
226
|
-
assert_equal @aaron.projects.size, 1
|
227
|
-
assert @project_nonobo.destroy
|
228
|
-
assert_equal @aaron.projects.size, 0
|
229
|
-
end
|
230
|
-
|
231
|
-
def test_Associations_map_from_yml
|
232
|
-
yml_path = "#{File.dirname(__FILE__)}/../asso.yml"
|
233
|
-
assert AA::Associations.map(yml_path)
|
234
|
-
robust_many_to_many_test
|
235
|
-
setup
|
236
|
-
members_projects_test
|
237
|
-
setup
|
238
|
-
user_icon_test
|
239
|
-
setup
|
240
|
-
owner_books_test
|
241
|
-
setup
|
242
|
-
project_master_test
|
243
|
-
end
|
244
|
-
|
245
|
-
def project_master_test
|
246
|
-
assert @jack.projects.size==0
|
247
|
-
@jack.projects << @project_nonobo
|
248
|
-
assert_equal @jack.projects.size, 1
|
249
|
-
assert @project_nonobo.master.nil?
|
250
|
-
@project_nonobo.master = @aaron
|
251
|
-
assert_equal @aaron.project.id, @project_nonobo.id
|
252
|
-
assert_equal @aaron.projects.size, 0
|
253
|
-
assert_equal @project_nonobo.master.id, @aaron.id
|
254
|
-
end
|
255
|
-
|
256
|
-
def test_Associations_map_from_yml_sin_plural
|
257
|
-
yml_path = "#{File.dirname(__FILE__)}/../asso_sin_plural.yml"
|
258
|
-
assert AA::Associations.map(yml_path)
|
259
|
-
robust_many_to_many_test
|
260
|
-
setup
|
261
|
-
members_projects_test
|
262
|
-
setup
|
263
|
-
users_icons_test
|
264
|
-
setup
|
265
|
-
owner_book_test
|
266
|
-
setup
|
267
|
-
husband_wife_test
|
268
|
-
end
|
269
|
-
|
270
|
-
def husband_wife_test
|
271
|
-
assert @aaron.wife.nil?
|
272
|
-
assert @rita.husband.nil?
|
273
|
-
@aaron.wife = @rita
|
274
|
-
aaron = User.find(@aaron.id)
|
275
|
-
assert_equal aaron.wife.id, @rita.id
|
276
|
-
rita = User.find(@rita.id)
|
277
|
-
assert_equal @aaron.wife.id, rita.id
|
278
|
-
@lucy = User.create(:name=>"lucy")
|
279
|
-
assert @lucy.husband.nil?
|
280
|
-
@aaron.wife = @lucy
|
281
|
-
assert_equal @aaron.wife.name, "lucy"
|
282
|
-
assert_equal @aaron.wife.id, @lucy.id
|
283
|
-
assert @rita.husband.nil?
|
284
|
-
assert @lucy.husband.id==@aaron.id
|
285
|
-
end
|
286
|
-
|
287
|
-
|
288
|
-
def clear_database
|
289
|
-
User.clear
|
290
|
-
Icon.clear
|
291
|
-
Project.clear
|
292
|
-
Book.clear
|
293
|
-
end
|
294
|
-
|
295
|
-
def owner_book_test
|
296
|
-
#User.select_serializer(:marshal)
|
297
|
-
#Book.select_serializer(:json)
|
298
|
-
assert_equal @aaron.book.size, 0
|
299
|
-
assert_equal @book.owner, nil
|
300
|
-
@aaron.book << @book
|
301
|
-
aaron = User.find(@aaron.id)
|
302
|
-
assert_equal @aaron.book.size, 1
|
303
|
-
assert_equal aaron.book.size, 1
|
304
|
-
assert_equal aaron.book[0].id, @book.id
|
305
|
-
assert_equal @book.owner.id, aaron.id
|
306
|
-
book = Book.find(@book.id)
|
307
|
-
assert_equal book.owner.id, aaron.id
|
308
|
-
aaron.book.remove(book)
|
309
|
-
assert_equal aaron.book.size, 0
|
310
|
-
assert_equal book.owner, nil
|
311
|
-
end
|
312
|
-
|
313
|
-
end
|