mongodb_model 0.2.8 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +3 -4
- data/lib/mongo/model/assignment.rb +4 -2
- data/lib/mongo/model/callbacks.rb +27 -2
- data/lib/mongo/model/conversion.rb +26 -11
- data/lib/mongo/model/crud.rb +52 -9
- data/lib/mongo/model/{file_model.rb → integration/file_model.rb} +1 -1
- data/lib/mongo/model/{validation → integration/validatable}/uniqueness_validator.rb +2 -2
- data/lib/mongo/model/integration/validatable.rb +41 -0
- data/lib/mongo/model/load.rb +59 -0
- data/lib/mongo/model/model.rb +51 -19
- data/lib/mongo/model/query.rb +1 -1
- data/lib/mongo/model/scope.rb +2 -6
- data/lib/mongo/model/spec.rb +0 -3
- data/lib/mongo/model/support/{types.rb → conversions.rb} +9 -23
- data/lib/mongo/model/support.rb +11 -0
- data/lib/mongo/model/validation.rb +14 -34
- data/lib/mongo/model.rb +1 -46
- data/spec/assignment_spec.rb +2 -2
- data/spec/associations_spec.rb +2 -4
- data/spec/attribute_convertors_spec.rb +9 -9
- data/spec/callbacks_spec.rb +161 -34
- data/spec/conversion_spec.rb +18 -18
- data/spec/crud_spec.rb +79 -81
- data/spec/equality_spec.rb +23 -13
- data/spec/{file_model_spec.rb → integration/file_model_spec.rb} +1 -1
- data/spec/integration/validatable_spec.rb +89 -0
- data/spec/misc_spec.rb +6 -6
- data/spec/query_spec.rb +14 -25
- data/spec/scope_spec.rb +10 -10
- data/spec/spec_helper.rb +19 -3
- data/spec/validation_spec.rb +92 -85
- metadata +16 -12
data/spec/crud_spec.rb
CHANGED
@@ -1,83 +1,81 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'mongo/object/spec/
|
2
|
+
require 'mongo/object/spec/shared_object_crud'
|
3
3
|
|
4
4
|
describe "Model CRUD" do
|
5
5
|
with_mongo_model
|
6
6
|
|
7
|
-
describe '
|
8
|
-
|
7
|
+
describe 'single model' do
|
8
|
+
it_should_behave_like "single object CRUD"
|
9
|
+
|
10
|
+
before do
|
9
11
|
class Unit
|
10
12
|
inherit Mongo::Model
|
11
13
|
collection :units
|
12
14
|
|
13
15
|
attr_accessor :name, :info
|
14
|
-
def == o; [self.class, name, info] == [o.class, o.
|
16
|
+
def == o; [self.class, name, info] == [o.class, o.name, o.info] end
|
15
17
|
end
|
16
|
-
end
|
17
|
-
after(:all){remove_constants :Unit}
|
18
18
|
|
19
|
-
|
20
|
-
@zeratul = Unit.build name: 'Zeratul', info: 'Dark Templar'
|
19
|
+
@unit = Unit.build name: 'Zeratul', info: 'Dark Templar'
|
21
20
|
end
|
21
|
+
after{remove_constants :Unit}
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
it 'model crud' do
|
26
|
-
# read
|
23
|
+
it 'should perform CRUD' do
|
24
|
+
# Read.
|
27
25
|
Unit.count.should == 0
|
28
26
|
Unit.all.should == []
|
29
27
|
Unit.first.should == nil
|
30
28
|
|
31
|
-
#
|
32
|
-
@
|
33
|
-
@
|
29
|
+
# Create.
|
30
|
+
@unit.save.should be_true
|
31
|
+
@unit._id.should_not be_nil
|
34
32
|
|
35
|
-
#
|
33
|
+
# Read.
|
36
34
|
Unit.count.should == 1
|
37
|
-
Unit.all.should == [@
|
38
|
-
Unit.first.should == @
|
39
|
-
Unit.first.object_id.should_not == @
|
35
|
+
Unit.all.should == [@unit]
|
36
|
+
Unit.first.should == @unit
|
37
|
+
Unit.first.object_id.should_not == @unit.object_id
|
40
38
|
|
41
|
-
#
|
42
|
-
@
|
43
|
-
@
|
39
|
+
# Update.
|
40
|
+
@unit.info = 'Killer of Cerebrates'
|
41
|
+
@unit.save.should be_true
|
44
42
|
Unit.count.should == 1
|
45
43
|
Unit.first(name: 'Zeratul').info.should == 'Killer of Cerebrates'
|
46
44
|
|
47
|
-
#
|
48
|
-
@
|
45
|
+
# Delete.
|
46
|
+
@unit.delete.should be_true
|
49
47
|
Unit.count.should == 0
|
50
48
|
end
|
51
49
|
|
52
|
-
it 'should be able to save to another collection' do
|
53
|
-
#
|
54
|
-
@
|
55
|
-
@
|
50
|
+
it 'should be able to save model to another collection' do
|
51
|
+
# Create.
|
52
|
+
@unit.save(collection: db.heroes).should be_true
|
53
|
+
@unit._id.should_not be_nil
|
56
54
|
|
57
|
-
#
|
55
|
+
# Read.
|
58
56
|
Unit.count.should == 0
|
59
57
|
db.heroes.count.should == 1
|
60
|
-
db.heroes.first.should == @
|
61
|
-
db.heroes.first.object_id.should_not == @
|
58
|
+
db.heroes.first.should == @unit
|
59
|
+
db.heroes.first.object_id.should_not == @unit.object_id
|
62
60
|
|
63
|
-
#
|
64
|
-
@
|
65
|
-
@
|
61
|
+
# Update.
|
62
|
+
@unit.info = 'Killer of Cerebrates'
|
63
|
+
@unit.save(collection: db.heroes).should be_true
|
66
64
|
Unit.count.should == 0
|
67
65
|
db.heroes.count.should == 1
|
68
66
|
db.heroes.first(name: 'Zeratul').info.should == 'Killer of Cerebrates'
|
69
67
|
|
70
|
-
#
|
71
|
-
@
|
68
|
+
# Delete.
|
69
|
+
@unit.delete(collection: db.heroes).should be_true
|
72
70
|
db.heroes.count.should == 0
|
73
71
|
end
|
74
72
|
|
75
|
-
it 'build' do
|
73
|
+
it 'should build model' do
|
76
74
|
u = Unit.build name: 'Zeratul'
|
77
75
|
u.name.should == 'Zeratul'
|
78
76
|
end
|
79
77
|
|
80
|
-
it 'create' do
|
78
|
+
it 'should create model' do
|
81
79
|
u = Unit.create(name: 'Zeratul')
|
82
80
|
u.new_record?.should be_false
|
83
81
|
|
@@ -85,16 +83,16 @@ describe "Model CRUD" do
|
|
85
83
|
u.new_record?.should be_false
|
86
84
|
end
|
87
85
|
|
88
|
-
it '
|
86
|
+
it 'should delete all models' do
|
89
87
|
Unit.create(name: 'Zeratul')
|
90
88
|
Unit.count.should == 1
|
91
|
-
Unit.
|
89
|
+
Unit.delete_all
|
92
90
|
Unit.count.should == 0
|
93
91
|
|
94
|
-
Unit.
|
92
|
+
Unit.delete_all!
|
95
93
|
end
|
96
94
|
|
97
|
-
it 'modifiers' do
|
95
|
+
it 'should accept modifiers' do
|
98
96
|
unit = Unit.create! name: 'Zeratul'
|
99
97
|
|
100
98
|
Unit.update({_id: unit._id}, _set: {name: 'Tassadar'})
|
@@ -107,57 +105,57 @@ describe "Model CRUD" do
|
|
107
105
|
end
|
108
106
|
end
|
109
107
|
|
110
|
-
describe 'embedded' do
|
111
|
-
|
112
|
-
|
108
|
+
describe 'embedded model' do
|
109
|
+
it_should_behave_like 'embedded object CRUD'
|
110
|
+
|
111
|
+
before do
|
112
|
+
class Unit
|
113
113
|
inherit Mongo::Model
|
114
|
-
collection :
|
114
|
+
collection :units
|
115
115
|
|
116
|
-
attr_accessor :
|
117
|
-
def == o; [self.class, self.
|
116
|
+
attr_accessor :items
|
117
|
+
def == o; [self.class, self.items] == [o.class, o.items] end
|
118
118
|
|
119
|
-
class
|
119
|
+
class Item
|
120
120
|
inherit Mongo::Model
|
121
121
|
|
122
|
-
attr_accessor :name
|
123
|
-
def == o; [self.class, self.name
|
122
|
+
attr_accessor :name
|
123
|
+
def == o; [self.class, self.name] == [o.class, o.name] end
|
124
124
|
end
|
125
125
|
end
|
126
|
-
end
|
127
|
-
after(:all){remove_constants :Player}
|
128
126
|
|
129
|
-
|
130
|
-
@
|
131
|
-
@
|
132
|
-
|
133
|
-
|
134
|
-
Player::Mission.build(name: 'Backwater Station', stats: {'buildings' => 8, 'units' => 25}),
|
127
|
+
@item_class = Unit::Item
|
128
|
+
@unit = Unit.new
|
129
|
+
@unit.items = [
|
130
|
+
Unit::Item.build(name: 'Psionic blade'),
|
131
|
+
Unit::Item.build(name: 'Plasma shield'),
|
135
132
|
]
|
136
133
|
end
|
134
|
+
after{remove_constants :Unit}
|
137
135
|
|
138
|
-
|
136
|
+
it 'should perform CRUD' do
|
137
|
+
# Create.
|
138
|
+
@unit.save.should be_true
|
139
|
+
@unit._id.should_not be_nil
|
139
140
|
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
# destroy
|
159
|
-
@player.destroy.should be_true
|
160
|
-
Player.count.should == 0
|
141
|
+
# Read.
|
142
|
+
Unit.count.should == 1
|
143
|
+
unit = Unit.first
|
144
|
+
unit.should == @unit
|
145
|
+
unit.object_id.should_not == @unit.object_id
|
146
|
+
|
147
|
+
# Update.
|
148
|
+
@unit.items.first.name = "Psionic blade level 3"
|
149
|
+
@unit.items << Unit::Item.build(name: 'Power suit')
|
150
|
+
@unit.save.should be_true
|
151
|
+
Unit.count.should == 1
|
152
|
+
unit = Unit.first
|
153
|
+
unit.should == @unit
|
154
|
+
unit.object_id.should_not == @unit.object_id
|
155
|
+
|
156
|
+
# Delete.
|
157
|
+
@unit.delete.should be_true
|
158
|
+
Unit.count.should == 0
|
161
159
|
end
|
162
160
|
end
|
163
161
|
end
|
data/spec/equality_spec.rb
CHANGED
@@ -3,34 +3,44 @@ require 'spec_helper'
|
|
3
3
|
describe 'Model equality' do
|
4
4
|
with_mongo_model
|
5
5
|
|
6
|
-
after{remove_constants :
|
6
|
+
after{remove_constants :Unit, :Tags}
|
7
7
|
|
8
|
-
it "
|
9
|
-
class
|
8
|
+
it "should check for equality based on model attributes" do
|
9
|
+
class Unit
|
10
10
|
inherit Mongo::Model
|
11
11
|
|
12
|
-
attr_accessor :name, :
|
12
|
+
attr_accessor :name, :items
|
13
13
|
|
14
|
-
class
|
14
|
+
class Item
|
15
15
|
inherit Mongo::Model
|
16
16
|
|
17
17
|
attr_accessor :name
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
|
22
|
-
|
21
|
+
unit1 = Unit.new name: 'Zeratul'
|
22
|
+
unit1.items = [Unit::Item.new(name: 'Psionic blade')]
|
23
23
|
|
24
|
-
|
25
|
-
|
24
|
+
unit2 = Unit.new name: 'Zeratul'
|
25
|
+
unit2.items = [Unit::Item.new(name: 'Psionic blade')]
|
26
26
|
|
27
|
-
|
27
|
+
unit1.should == unit2
|
28
28
|
|
29
|
-
|
30
|
-
|
29
|
+
unit1.items.first.name = 'Power suit'
|
30
|
+
unit1.should_not == unit2
|
31
31
|
end
|
32
32
|
|
33
|
-
it "should
|
33
|
+
it "should compare with non models (from errors)" do
|
34
|
+
class Unit
|
35
|
+
inherit Mongo::Model
|
36
|
+
end
|
37
|
+
|
38
|
+
unit = Unit.new
|
39
|
+
unit.should_not == 1
|
40
|
+
unit.should_not == nil
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should correctly compare Array/Hash models (from error)" do
|
34
44
|
class Tags < Array
|
35
45
|
inherit Mongo::Model
|
36
46
|
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Integration with Validatable" do
|
4
|
+
with_mongo_model
|
5
|
+
|
6
|
+
describe "basics" do
|
7
|
+
before do
|
8
|
+
class Unit
|
9
|
+
inherit Mongo::Model
|
10
|
+
collection :units
|
11
|
+
|
12
|
+
attr_accessor :name
|
13
|
+
end
|
14
|
+
end
|
15
|
+
after{remove_constants :Unit}
|
16
|
+
|
17
|
+
it "should perform basic validation" do
|
18
|
+
class Unit
|
19
|
+
validates_presence_of :name
|
20
|
+
end
|
21
|
+
|
22
|
+
unit = Unit.new
|
23
|
+
unit.should_not be_valid
|
24
|
+
unit.errors.size.should == 1
|
25
|
+
unit.errors.first.first.should == :name
|
26
|
+
unit.save.should be_false
|
27
|
+
|
28
|
+
unit.errors.clear
|
29
|
+
unit.name = 'Zeratul'
|
30
|
+
unit.should be_valid
|
31
|
+
unit.errors.should be_empty
|
32
|
+
unit.save.should be_true
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should validate before save" do
|
36
|
+
unit = Unit.new
|
37
|
+
unit.should_receive(:run_validations)
|
38
|
+
unit.save
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should not save errors as instance variables" do
|
42
|
+
unit = Unit.new
|
43
|
+
unit.valid?
|
44
|
+
unit.instance_variables.select{|iv_name| iv_name !~ /^@_/}.should be_empty
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "Special validators" do
|
49
|
+
before do
|
50
|
+
class Unit
|
51
|
+
inherit Mongo::Model
|
52
|
+
collection :units
|
53
|
+
|
54
|
+
attr_accessor :name
|
55
|
+
end
|
56
|
+
end
|
57
|
+
after{remove_constants :Unit}
|
58
|
+
|
59
|
+
it 'should validate uniqueness' do
|
60
|
+
class Unit
|
61
|
+
validates_uniqueness_of :name
|
62
|
+
end
|
63
|
+
|
64
|
+
unit = Unit.build name: 'Zeratul'
|
65
|
+
unit.save.should be_true
|
66
|
+
|
67
|
+
unit = Unit.build name: 'Zeratul'
|
68
|
+
unit.save.should be_false
|
69
|
+
unit.errors[:name].first.should =~ /unique/
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should validate uniqueness within scope' do
|
73
|
+
class Unit
|
74
|
+
attr_accessor :account_id
|
75
|
+
|
76
|
+
validates_uniqueness_of :name, scope: :account_id
|
77
|
+
end
|
78
|
+
|
79
|
+
unit = Unit.build name: 'Zeratul', account_id: '10'
|
80
|
+
unit.save.should be_true
|
81
|
+
|
82
|
+
unit = Unit.build name: 'Zeratul', account_id: '10'
|
83
|
+
unit.save.should be_false
|
84
|
+
|
85
|
+
unit = Unit.build name: 'Zeratul', account_id: '20'
|
86
|
+
unit.save.should be_true
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
data/spec/misc_spec.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe '
|
3
|
+
describe 'Miscellaneous' do
|
4
4
|
with_mongo_model
|
5
5
|
|
6
6
|
before do
|
@@ -13,7 +13,7 @@ describe 'Model Miscellaneous' do
|
|
13
13
|
end
|
14
14
|
after{remove_constants :Unit3, :User}
|
15
15
|
|
16
|
-
it "timestamps" do
|
16
|
+
it "should create timestamps" do
|
17
17
|
class Unit3
|
18
18
|
inherit Mongo::Model
|
19
19
|
collection :units
|
@@ -36,7 +36,7 @@ describe 'Model Miscellaneous' do
|
|
36
36
|
unit.updated_at.should > updated_at
|
37
37
|
end
|
38
38
|
|
39
|
-
it 'cache' do
|
39
|
+
it 'should have cache' do
|
40
40
|
class Unit3
|
41
41
|
inherit Mongo::Model
|
42
42
|
end
|
@@ -44,21 +44,21 @@ describe 'Model Miscellaneous' do
|
|
44
44
|
u._cache.should == {}
|
45
45
|
end
|
46
46
|
|
47
|
-
it "
|
47
|
+
it "should convert model to param" do
|
48
48
|
u = User.new
|
49
49
|
u.to_param.should be_nil
|
50
50
|
u.save!
|
51
51
|
u.to_param.should_not be_empty
|
52
52
|
end
|
53
53
|
|
54
|
-
it "dom_id" do
|
54
|
+
it "should have dom_id" do
|
55
55
|
u = User.new
|
56
56
|
u.dom_id.should be_nil
|
57
57
|
u.save!
|
58
58
|
u.dom_id.should_not be_empty
|
59
59
|
end
|
60
60
|
|
61
|
-
it 'reload' do
|
61
|
+
it 'should reload model' do
|
62
62
|
u = User.create! name: 'Zeratul'
|
63
63
|
u.name = 'Jim'
|
64
64
|
u.reload
|
data/spec/query_spec.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe "
|
3
|
+
describe "Query" do
|
4
4
|
with_mongo_model
|
5
5
|
|
6
6
|
before :all do
|
@@ -13,32 +13,32 @@ describe "Model Query" do
|
|
13
13
|
end
|
14
14
|
after(:all){remove_constants :Unit, :SpecialUnit}
|
15
15
|
|
16
|
-
before{@
|
16
|
+
before{@unit = Unit.build name: 'Zeratul'}
|
17
17
|
|
18
|
-
it '
|
18
|
+
it 'should check existence' do
|
19
19
|
Unit.should_not exist(name: 'Zeratul')
|
20
|
-
@
|
20
|
+
@unit.save!
|
21
21
|
Unit.should exist(name: 'Zeratul')
|
22
22
|
end
|
23
23
|
|
24
|
-
it 'first
|
24
|
+
it 'should return first model (also with bang version)' do
|
25
25
|
Unit.first.should be_nil
|
26
26
|
-> {Unit.first!}.should raise_error(Mongo::NotFound)
|
27
|
-
@
|
27
|
+
@unit.save
|
28
28
|
Unit.first.should_not be_nil
|
29
29
|
Unit.first!.should_not be_nil
|
30
30
|
end
|
31
31
|
|
32
|
-
it 'all
|
32
|
+
it 'should return all and iterate over each models' do
|
33
33
|
list = []; Unit.each{|o| list << o}
|
34
34
|
list.size.should == 0
|
35
35
|
|
36
|
-
@
|
36
|
+
@unit.save
|
37
37
|
list = []; Unit.each{|o| list << o}
|
38
38
|
list.size.should == 1
|
39
39
|
end
|
40
40
|
|
41
|
-
it 'dynamic finders
|
41
|
+
it 'should have dynamic finders' do
|
42
42
|
Unit.first_by_name('Zeratul').should be_nil
|
43
43
|
u = Unit.build(name: 'Zeratul')
|
44
44
|
u.save!
|
@@ -46,7 +46,7 @@ describe "Model Query" do
|
|
46
46
|
Unit.by_id!(u._id).name.should == 'Zeratul'
|
47
47
|
end
|
48
48
|
|
49
|
-
it 'build, create
|
49
|
+
it 'should be integrated with build, create and create!' do
|
50
50
|
class SpecialUnit < Unit
|
51
51
|
attr_accessor :age
|
52
52
|
end
|
@@ -54,27 +54,18 @@ describe "Model Query" do
|
|
54
54
|
u = SpecialUnit.query(name: 'Zeratul').build age: 500
|
55
55
|
[u.name, u.age].should == ['Zeratul', 500]
|
56
56
|
|
57
|
-
SpecialUnit.
|
57
|
+
SpecialUnit.delete_all
|
58
58
|
SpecialUnit.query(name: 'Zeratul').create age: 500
|
59
59
|
u = SpecialUnit.first
|
60
60
|
[u.name, u.age].should == ['Zeratul', 500]
|
61
61
|
|
62
|
-
SpecialUnit.
|
62
|
+
SpecialUnit.delete_all
|
63
63
|
SpecialUnit.query(name: 'Zeratul').create! age: 500
|
64
64
|
u = SpecialUnit.first
|
65
65
|
[u.name, u.age].should == ['Zeratul', 500]
|
66
66
|
end
|
67
67
|
|
68
|
-
it
|
69
|
-
u = Unit.new
|
70
|
-
u.exist?.should be_false
|
71
|
-
u.save!
|
72
|
-
u.exist?.should be_true
|
73
|
-
u.destroy!
|
74
|
-
u.exist?.should be_false
|
75
|
-
end
|
76
|
-
|
77
|
-
it "build should assign protected attributes" do
|
68
|
+
it "should not allow to mass-assign protected attributes" do
|
78
69
|
class SpecialUnit < Unit
|
79
70
|
attr_accessor :age, :status
|
80
71
|
assign do
|
@@ -88,9 +79,7 @@ describe "Model Query" do
|
|
88
79
|
u.status.should == 'active'
|
89
80
|
end
|
90
81
|
|
91
|
-
it "where" do
|
92
|
-
# Unit.where(name: 'Zeratul').should == Mongo::Model::Query.new(Unit, {name: 'Zeratul'}, {})
|
93
|
-
|
82
|
+
it "should support where clause" do
|
94
83
|
query = Unit.where(name: 'Zeratul')
|
95
84
|
query = query.where(race: 'Protoss')
|
96
85
|
query.should == Mongo::Model::Query.new(Unit, {name: 'Zeratul', race: 'Protoss'}, {})
|
data/spec/scope_spec.rb
CHANGED
@@ -45,7 +45,7 @@ describe "Scope" do
|
|
45
45
|
Unit.current_scope.should be_nil
|
46
46
|
end
|
47
47
|
|
48
|
-
it "
|
48
|
+
it "should allow to define default scope" do
|
49
49
|
Unit.default_scope status: 'alive'
|
50
50
|
|
51
51
|
Unit.current_scope.should == Unit.query(status: 'alive')
|
@@ -56,7 +56,7 @@ describe "Scope" do
|
|
56
56
|
Unit.current_scope.should == Unit.query(status: 'alive')
|
57
57
|
end
|
58
58
|
|
59
|
-
it "should
|
59
|
+
it "should inherit default scope" do
|
60
60
|
Unit.default_scope status: 'alive'
|
61
61
|
|
62
62
|
class Protoss < Unit; end
|
@@ -69,7 +69,7 @@ describe "Scope" do
|
|
69
69
|
end
|
70
70
|
|
71
71
|
describe 'scope' do
|
72
|
-
it "
|
72
|
+
it "should allow to define scope" do
|
73
73
|
Unit.scope :alive, status: 'alive'
|
74
74
|
Unit.alive.current_scope.should == Unit.query(status: 'alive')
|
75
75
|
|
@@ -101,7 +101,7 @@ describe "Scope" do
|
|
101
101
|
end
|
102
102
|
end
|
103
103
|
|
104
|
-
describe '
|
104
|
+
describe 'querying with scope' do
|
105
105
|
it "shouldn't allow to nest exclusive scope" do
|
106
106
|
-> {
|
107
107
|
Unit.with_exclusive_scope do
|
@@ -116,7 +116,7 @@ describe "Scope" do
|
|
116
116
|
}.should raise_error(/exclusive scope already applied/)
|
117
117
|
end
|
118
118
|
|
119
|
-
it "
|
119
|
+
it "should clear other scopes when exclusive scope used" do
|
120
120
|
Unit.default_scope status: 'alive'
|
121
121
|
|
122
122
|
Unit.with_scope race: 'Protoss' do
|
@@ -132,13 +132,13 @@ describe "Scope" do
|
|
132
132
|
end
|
133
133
|
end
|
134
134
|
|
135
|
-
it "
|
135
|
+
it "should access current scope" do
|
136
136
|
Unit.with_scope status: 'alive' do
|
137
137
|
Unit.current_scope.should == Unit.query(status: 'alive')
|
138
138
|
end
|
139
139
|
end
|
140
140
|
|
141
|
-
it "should merge
|
141
|
+
it "should merge scopes" do
|
142
142
|
Unit.default_scope status: 'alive'
|
143
143
|
Unit.with_scope race: 'Protoss' do
|
144
144
|
Unit.with_scope name: 'Zeratul' do
|
@@ -149,13 +149,13 @@ describe "Scope" do
|
|
149
149
|
end
|
150
150
|
|
151
151
|
describe 'handy scopes' do
|
152
|
-
it "limit, skip
|
152
|
+
it "should provide limit, skip and sort scopes" do
|
153
153
|
query = Unit.skip(30).limit(10).sort([:name, 1]).snapshot
|
154
154
|
query.selector.should == {}
|
155
155
|
query.options.should == {skip: 30, limit: 10, sort: [[:name, 1]], snapshot: true}
|
156
156
|
end
|
157
157
|
|
158
|
-
it "
|
158
|
+
it "should understand simplified form of sort scope" do
|
159
159
|
query = Unit.sort(:name)
|
160
160
|
query.options.should == {sort: [[:name, 1]]}
|
161
161
|
|
@@ -163,7 +163,7 @@ describe "Scope" do
|
|
163
163
|
query.options.should == {sort: [[:race, 1], [:name, 1]]}
|
164
164
|
end
|
165
165
|
|
166
|
-
it 'paginate' do
|
166
|
+
it 'should provide paginate' do
|
167
167
|
query = Unit.paginate(4, 10)
|
168
168
|
query.selector.should == {}
|
169
169
|
query.options.should == {skip: 30, limit: 10}
|
data/spec/spec_helper.rb
CHANGED
@@ -3,11 +3,27 @@ require 'mongo/model'
|
|
3
3
|
require 'rspec_ext'
|
4
4
|
require 'mongo/model/spec'
|
5
5
|
|
6
|
-
#
|
7
|
-
# Handy spec helpers
|
8
|
-
#
|
6
|
+
# Shortcuts.
|
9
7
|
rspec do
|
10
8
|
def db
|
11
9
|
mongo.db
|
12
10
|
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# Helper to simplify callback expectations.
|
14
|
+
module RSpec::CallbackHelper
|
15
|
+
def run_before_callbacks name, method, options = {}
|
16
|
+
$_dont_watch_callbacks ? true : send(:"before_#{name}")
|
17
|
+
end
|
18
|
+
|
19
|
+
def run_after_callbacks name, method, options = {}
|
20
|
+
$_dont_watch_callbacks ? true : send(:"after_#{name}")
|
21
|
+
end
|
22
|
+
|
23
|
+
def dont_watch_callbacks &block
|
24
|
+
$_dont_watch_callbacks = true
|
25
|
+
block.call
|
26
|
+
ensure
|
27
|
+
$_dont_watch_callbacks = false
|
28
|
+
end
|
13
29
|
end
|