massive_record 0.2.0 → 0.2.1.rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +43 -4
- data/Gemfile.lock +3 -1
- data/README.md +5 -0
- data/lib/massive_record/adapters/thrift/connection.rb +23 -16
- data/lib/massive_record/adapters/thrift/row.rb +13 -33
- data/lib/massive_record/adapters/thrift/table.rb +24 -10
- data/lib/massive_record/orm/attribute_methods.rb +27 -1
- data/lib/massive_record/orm/attribute_methods/dirty.rb +2 -2
- data/lib/massive_record/orm/attribute_methods/read.rb +36 -1
- data/lib/massive_record/orm/attribute_methods/time_zone_conversion.rb +81 -0
- data/lib/massive_record/orm/attribute_methods/write.rb +18 -0
- data/lib/massive_record/orm/base.rb +52 -10
- data/lib/massive_record/orm/callbacks.rb +1 -1
- data/lib/massive_record/orm/default_id.rb +20 -0
- data/lib/massive_record/orm/errors.rb +4 -0
- data/lib/massive_record/orm/finders.rb +102 -57
- data/lib/massive_record/orm/finders/rescue_missing_table_on_find.rb +45 -0
- data/lib/massive_record/orm/id_factory.rb +1 -1
- data/lib/massive_record/orm/log_subscriber.rb +85 -0
- data/lib/massive_record/orm/persistence.rb +82 -37
- data/lib/massive_record/orm/query_instrumentation.rb +64 -0
- data/lib/massive_record/orm/relations/interface.rb +10 -0
- data/lib/massive_record/orm/relations/metadata.rb +2 -0
- data/lib/massive_record/orm/relations/proxy/references_one_polymorphic.rb +1 -1
- data/lib/massive_record/orm/schema/field.rb +33 -6
- data/lib/massive_record/orm/timestamps.rb +1 -1
- data/lib/massive_record/orm/validations.rb +2 -2
- data/lib/massive_record/rails/controller_runtime.rb +55 -0
- data/lib/massive_record/rails/railtie.rb +16 -0
- data/lib/massive_record/version.rb +1 -1
- data/lib/massive_record/wrapper/cell.rb +32 -3
- data/massive_record.gemspec +1 -0
- data/spec/{wrapper/cases → adapter/thrift}/adapter_spec.rb +0 -0
- data/spec/adapter/thrift/atomic_increment_spec.rb +55 -0
- data/spec/{wrapper/cases → adapter/thrift}/connection_spec.rb +0 -10
- data/spec/adapter/thrift/table_find_spec.rb +40 -0
- data/spec/{wrapper/cases → adapter/thrift}/table_spec.rb +55 -13
- data/spec/orm/cases/attribute_methods_spec.rb +6 -1
- data/spec/orm/cases/base_spec.rb +18 -4
- data/spec/orm/cases/callbacks_spec.rb +1 -1
- data/spec/orm/cases/default_id_spec.rb +38 -0
- data/spec/orm/cases/default_values_spec.rb +37 -0
- data/spec/orm/cases/dirty_spec.rb +25 -1
- data/spec/orm/cases/encoding_spec.rb +3 -3
- data/spec/orm/cases/finder_default_scope.rb +8 -1
- data/spec/orm/cases/finder_scope_spec.rb +2 -2
- data/spec/orm/cases/finders_spec.rb +8 -18
- data/spec/orm/cases/id_factory_spec.rb +38 -21
- data/spec/orm/cases/log_subscriber_spec.rb +133 -0
- data/spec/orm/cases/mass_assignment_security_spec.rb +97 -0
- data/spec/orm/cases/persistence_spec.rb +132 -27
- data/spec/orm/cases/single_table_inheritance_spec.rb +2 -2
- data/spec/orm/cases/time_zone_awareness_spec.rb +157 -0
- data/spec/orm/cases/timestamps_spec.rb +15 -0
- data/spec/orm/cases/validation_spec.rb +2 -2
- data/spec/orm/models/model_without_default_id.rb +5 -0
- data/spec/orm/models/person.rb +1 -0
- data/spec/orm/models/test_class.rb +1 -0
- data/spec/orm/relations/interface_spec.rb +2 -2
- data/spec/orm/relations/metadata_spec.rb +1 -1
- data/spec/orm/relations/proxy/references_many_spec.rb +21 -15
- data/spec/orm/relations/proxy/references_one_polymorphic_spec.rb +7 -1
- data/spec/orm/relations/proxy/references_one_spec.rb +7 -0
- data/spec/orm/schema/field_spec.rb +61 -5
- data/spec/support/connection_helpers.rb +2 -1
- data/spec/support/mock_massive_record_connection.rb +7 -0
- data/spec/support/time_zone_helper.rb +25 -0
- metadata +51 -14
data/spec/orm/cases/base_spec.rb
CHANGED
@@ -175,7 +175,7 @@ describe MassiveRecord::ORM::Base do
|
|
175
175
|
end
|
176
176
|
|
177
177
|
it "should return the id if persisted" do
|
178
|
-
TestClass.create!(
|
178
|
+
TestClass.create!(1).to_param.should == "1"
|
179
179
|
end
|
180
180
|
end
|
181
181
|
|
@@ -185,7 +185,7 @@ describe MassiveRecord::ORM::Base do
|
|
185
185
|
end
|
186
186
|
|
187
187
|
it "should return id in an array persisted" do
|
188
|
-
TestClass.create!(
|
188
|
+
TestClass.create!("1").to_key.should == ["1"]
|
189
189
|
end
|
190
190
|
end
|
191
191
|
|
@@ -215,7 +215,7 @@ describe MassiveRecord::ORM::Base do
|
|
215
215
|
|
216
216
|
it "should start with the record's id if it has any" do
|
217
217
|
@person.id = 3
|
218
|
-
@person.inspect.should include
|
218
|
+
@person.inspect.should include '#<Person id: "3",'
|
219
219
|
end
|
220
220
|
|
221
221
|
it "should start with the record's id if it has any" do
|
@@ -286,7 +286,7 @@ describe MassiveRecord::ORM::Base do
|
|
286
286
|
|
287
287
|
describe "#clone" do
|
288
288
|
before do
|
289
|
-
@test_object = TestClass.create!(
|
289
|
+
@test_object = TestClass.create!("1", :foo => 'bar')
|
290
290
|
@clone_object = @test_object.clone
|
291
291
|
end
|
292
292
|
|
@@ -313,4 +313,18 @@ describe MassiveRecord::ORM::Base do
|
|
313
313
|
Person.coder.should be_instance_of MassiveRecord::ORM::Coders::JSON
|
314
314
|
end
|
315
315
|
end
|
316
|
+
|
317
|
+
describe "id as first argument to" do
|
318
|
+
[:new, :create, :create!].each do |creation_method|
|
319
|
+
describe creation_method do
|
320
|
+
it "sets first argument as records id" do
|
321
|
+
TestClass.send(creation_method, "idfirstarg").id.should == "idfirstarg"
|
322
|
+
end
|
323
|
+
|
324
|
+
it "sets first argument as record id, hash as it's attribute" do
|
325
|
+
TestClass.send(creation_method, "idfirstarg", foo: 'works').foo.should == 'works'
|
326
|
+
end
|
327
|
+
end
|
328
|
+
end
|
329
|
+
end
|
316
330
|
end
|
@@ -175,7 +175,7 @@ describe "callbacks for" do
|
|
175
175
|
end
|
176
176
|
|
177
177
|
it "create should run in correct order" do
|
178
|
-
thorbjorn = CallbackDeveloper.create
|
178
|
+
thorbjorn = CallbackDeveloper.create "dummy"
|
179
179
|
thorbjorn.history.should == [
|
180
180
|
[:after_initialize, :method],
|
181
181
|
[:after_initialize, :string],
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'orm/models/model_without_default_id'
|
3
|
+
|
4
|
+
describe ModelWithoutDefaultId do
|
5
|
+
include MockMassiveRecordConnection
|
6
|
+
#include SetUpHbaseConnectionBeforeAll
|
7
|
+
#include SetTableNamesToTestTable
|
8
|
+
|
9
|
+
context "with auto increment id" do
|
10
|
+
its(:id) { be_nil }
|
11
|
+
its(:auto_increment_id) { be_true }
|
12
|
+
|
13
|
+
it "sets id to what next_id returns" do
|
14
|
+
subject.should_receive(:next_id).and_return 1
|
15
|
+
subject.save
|
16
|
+
subject.id.should eq "1"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "does nothing if the id is set before create" do
|
20
|
+
subject.id = 2
|
21
|
+
subject.should_not_receive(:next_id)
|
22
|
+
subject.save
|
23
|
+
subject.id.should eq "2"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "without auto increment id" do
|
28
|
+
before(:all) { subject.class.auto_increment_id = false }
|
29
|
+
after(:all) { subject.class.auto_increment_id = true }
|
30
|
+
|
31
|
+
its(:id) { be_nil }
|
32
|
+
its(:auto_increment_id) { be_false }
|
33
|
+
|
34
|
+
it "raises error as expected when id is missing" do
|
35
|
+
expect { subject.save }.to raise_error MassiveRecord::ORM::IdMissing
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "default values" do
|
4
|
+
include SetUpHbaseConnectionBeforeAll
|
5
|
+
include SetTableNamesToTestTable
|
6
|
+
|
7
|
+
subject do
|
8
|
+
Person.new("id", {
|
9
|
+
:name => "Thorbjorn",
|
10
|
+
:age => 22,
|
11
|
+
:points => 1
|
12
|
+
})
|
13
|
+
end
|
14
|
+
|
15
|
+
context "new record" do
|
16
|
+
its(:addresses) { should eq Hash.new }
|
17
|
+
its(:points) { should eq 1 }
|
18
|
+
its(:status) { should eq false }
|
19
|
+
its(:phone_numbers) { should eq [] }
|
20
|
+
end
|
21
|
+
|
22
|
+
context "persisted record" do
|
23
|
+
before do
|
24
|
+
subject.addresses = nil
|
25
|
+
subject.points = nil
|
26
|
+
subject.status = nil
|
27
|
+
subject.phone_numbers = nil
|
28
|
+
subject.save!
|
29
|
+
subject.reload
|
30
|
+
end
|
31
|
+
|
32
|
+
its(:addresses) { should be_nil }
|
33
|
+
its(:points) { should be_nil }
|
34
|
+
its(:status) { should be_nil }
|
35
|
+
its(:phone_numbers) { should eq [] }
|
36
|
+
end
|
37
|
+
end
|
@@ -5,7 +5,7 @@ describe "dirty" do
|
|
5
5
|
include MockMassiveRecordConnection
|
6
6
|
|
7
7
|
before do
|
8
|
-
@person = Person.new
|
8
|
+
@person = Person.new '1', :name => "Alice", :age => 20, :email => "foo@bar.com"
|
9
9
|
end
|
10
10
|
|
11
11
|
it "should not be changed after created" do
|
@@ -22,6 +22,30 @@ describe "dirty" do
|
|
22
22
|
@person.should be_changed
|
23
23
|
end
|
24
24
|
|
25
|
+
it "should notice changes in boolean values from false to true" do
|
26
|
+
@person.status = !@person.status
|
27
|
+
@person.should be_status_changed
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should notice changes in boolean values from true to false" do
|
31
|
+
@person.status = true
|
32
|
+
@person.save
|
33
|
+
@person.status = false
|
34
|
+
@person.should be_status_changed
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should not consider age set as string to the same as integer a change" do
|
38
|
+
@person.age = "20"
|
39
|
+
@person.should_not be_age_changed
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should not consider age set as string back to original value a change" do
|
43
|
+
@person.age = 30
|
44
|
+
@person.age = "20"
|
45
|
+
@person.should_not be_age_changed
|
46
|
+
end
|
47
|
+
|
48
|
+
|
25
49
|
it "should know when a attribute is set to it's original value" do
|
26
50
|
original_name = @person.name
|
27
51
|
@person.name = "Bob"
|
@@ -9,7 +9,7 @@ describe "encoding" do
|
|
9
9
|
include SetTableNamesToTestTable
|
10
10
|
|
11
11
|
before do
|
12
|
-
@person = Person.create!
|
12
|
+
@person = Person.create! "new_id", :name => "Thorbjørn", :age => "22"
|
13
13
|
@person_from_db = Person.find(@person.id)
|
14
14
|
end
|
15
15
|
|
@@ -39,11 +39,11 @@ describe "encoding" do
|
|
39
39
|
end
|
40
40
|
|
41
41
|
it "should be able to store UTF-8 encoded strings" do
|
42
|
-
@row_from_db.values["info:name"].should == "Thorbjørn"
|
42
|
+
@row_from_db.values["info:name"].force_encoding(Encoding::UTF_8).should == "Thorbjørn"
|
43
43
|
end
|
44
44
|
|
45
45
|
it "should return string as UTF-8 encoded strings" do
|
46
|
-
@row_from_db.values["info:name"].encoding.should == Encoding::
|
46
|
+
@row_from_db.values["info:name"].encoding.should == Encoding::BINARY
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
@@ -1,12 +1,13 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'orm/models/person'
|
3
|
+
require 'orm/models/test_class'
|
3
4
|
|
4
5
|
describe "Default scope in" do
|
5
6
|
include SetUpHbaseConnectionBeforeAll
|
6
7
|
include SetTableNamesToTestTable
|
7
8
|
|
8
9
|
describe Person do
|
9
|
-
let(:subject) { Person.new
|
10
|
+
let(:subject) { Person.new "ID1", :name => "Person1", :email => "one@person.com", :age => 11, :points => 111, :status => true }
|
10
11
|
|
11
12
|
before do
|
12
13
|
subject.save!
|
@@ -49,5 +50,11 @@ describe "Default scope in" do
|
|
49
50
|
person.points.should == 111
|
50
51
|
person.name.should be_nil
|
51
52
|
end
|
53
|
+
|
54
|
+
it "should not share scopes between classes" do
|
55
|
+
Person.class_eval { default_scope :select => :base }
|
56
|
+
Person.default_scoping.should be_instance_of MassiveRecord::ORM::Finders::Scope
|
57
|
+
TestClass.default_scoping.should be_nil
|
58
|
+
end
|
52
59
|
end
|
53
60
|
end
|
@@ -217,8 +217,8 @@ describe MassiveRecord::ORM::Finders::Scope do
|
|
217
217
|
include SetTableNamesToTestTable
|
218
218
|
|
219
219
|
describe "with a person" do
|
220
|
-
let(:person_1) { Person.create
|
221
|
-
let(:person_2) { Person.create
|
220
|
+
let(:person_1) { Person.create "ID1", :name => "Person1", :email => "one@person.com", :age => 11, :points => 111, :status => true }
|
221
|
+
let(:person_2) { Person.create "ID2", :name => "Person2", :email => "two@person.com", :age => 22, :points => 222, :status => false }
|
222
222
|
|
223
223
|
before do
|
224
224
|
person_1.save!
|
@@ -23,21 +23,6 @@ describe "finders" do
|
|
23
23
|
lambda { Person.find }.should raise_error ArgumentError
|
24
24
|
end
|
25
25
|
|
26
|
-
it "should simply return nil on first if table does not exists" do
|
27
|
-
Person.table.should_receive(:exists?).and_return false
|
28
|
-
Person.first.should be_nil
|
29
|
-
end
|
30
|
-
|
31
|
-
it "should raise record not found error on find if table does not exists" do
|
32
|
-
Person.table.should_receive(:exists?).and_return false
|
33
|
-
lambda { Person.find(1) }.should raise_error MassiveRecord::ORM::RecordNotFound
|
34
|
-
end
|
35
|
-
|
36
|
-
it "should simply return empty array if table does not exists" do
|
37
|
-
Person.table.should_receive(:exists?).and_return false
|
38
|
-
Person.all.should == []
|
39
|
-
end
|
40
|
-
|
41
26
|
it "should raise RecordNotFound if id is nil" do
|
42
27
|
lambda { Person.find(nil) }.should raise_error MassiveRecord::ORM::RecordNotFound
|
43
28
|
end
|
@@ -164,10 +149,15 @@ describe "finders" do
|
|
164
149
|
@bob = Person.find("ID2")
|
165
150
|
end
|
166
151
|
|
167
|
-
it "should
|
152
|
+
it "should raise record not found error" do
|
168
153
|
lambda { Person.find("not_found") }.should raise_error MassiveRecord::ORM::RecordNotFound
|
169
154
|
end
|
170
155
|
|
156
|
+
it "should raise MassiveRecord::ORM::RecordNotFound error if table does not exist" do
|
157
|
+
Person.table.destroy
|
158
|
+
expect { Person.find("id") }.to raise_error MassiveRecord::ORM::RecordNotFound
|
159
|
+
end
|
160
|
+
|
171
161
|
it "should return the person object when found" do
|
172
162
|
@person.name.should == "John Doe"
|
173
163
|
@person.email.should == "john@base.com"
|
@@ -185,7 +175,7 @@ describe "finders" do
|
|
185
175
|
end
|
186
176
|
|
187
177
|
it "should find all persons, even if it is more than 10" do
|
188
|
-
15.times { |i| Person.create!
|
178
|
+
15.times { |i| Person.create! "id-#{i}", :name => "Going to die :-(", :age => i + 20 }
|
189
179
|
Person.all.length.should > 10
|
190
180
|
end
|
191
181
|
|
@@ -214,7 +204,7 @@ describe "finders" do
|
|
214
204
|
end
|
215
205
|
|
216
206
|
it "should not do a thing if table does not exist" do
|
217
|
-
Person.table.
|
207
|
+
Person.table.destroy
|
218
208
|
|
219
209
|
counter = 0
|
220
210
|
|
@@ -2,6 +2,8 @@ require 'spec_helper'
|
|
2
2
|
require 'orm/models/person'
|
3
3
|
|
4
4
|
describe "id factory" do
|
5
|
+
subject { MassiveRecord::ORM::IdFactory.instance }
|
6
|
+
|
5
7
|
it "should be a singleton" do
|
6
8
|
MassiveRecord::ORM::IdFactory.included_modules.should include(Singleton)
|
7
9
|
end
|
@@ -10,32 +12,28 @@ describe "id factory" do
|
|
10
12
|
describe "dry" do
|
11
13
|
include MockMassiveRecordConnection
|
12
14
|
|
13
|
-
before do
|
14
|
-
@factory = MassiveRecord::ORM::IdFactory.instance
|
15
|
-
end
|
16
|
-
|
17
15
|
it "should respond to next_for" do
|
18
|
-
|
16
|
+
subject.should respond_to :next_for
|
19
17
|
end
|
20
18
|
|
21
19
|
it "should use incomming table name if it's a string" do
|
22
|
-
|
23
|
-
|
20
|
+
subject.should_receive(:next_id).with(hash_including(:table => "test_table"))
|
21
|
+
subject.next_for "test_table"
|
24
22
|
end
|
25
23
|
|
26
24
|
it "should use incomming table name if it's a symbol" do
|
27
|
-
|
28
|
-
|
25
|
+
subject.should_receive(:next_id).with(hash_including(:table => "test_table"))
|
26
|
+
subject.next_for :test_table
|
29
27
|
end
|
30
28
|
|
31
29
|
it "should ask object for it's table name if it responds to that" do
|
32
30
|
Person.should_receive(:table_name).and_return("people")
|
33
|
-
|
34
|
-
|
31
|
+
subject.should_receive(:next_id).with(hash_including(:table => "people"))
|
32
|
+
subject.next_for(Person)
|
35
33
|
end
|
36
34
|
|
37
35
|
it "should have class method next_for and delegate it to it's instance" do
|
38
|
-
|
36
|
+
subject.should_receive(:next_for).with("cars")
|
39
37
|
MassiveRecord::ORM::IdFactory.next_for("cars")
|
40
38
|
end
|
41
39
|
end
|
@@ -46,29 +44,48 @@ describe "id factory" do
|
|
46
44
|
include SetUpHbaseConnectionBeforeAll
|
47
45
|
include SetTableNamesToTestTable
|
48
46
|
|
49
|
-
before do
|
50
|
-
@factory = MassiveRecord::ORM::IdFactory.instance
|
51
|
-
end
|
52
|
-
|
53
47
|
after do
|
54
48
|
MassiveRecord::ORM::IdFactory.destroy_all
|
55
|
-
MassiveRecord::ORM::IdFactory.instance_variable_set(:@instance, nil)
|
56
49
|
end
|
57
50
|
|
58
51
|
it "should increment start a new sequence on 1" do
|
59
|
-
|
52
|
+
subject.next_for(Person).should == 1
|
60
53
|
end
|
61
54
|
|
62
55
|
it "should increment value one by one" do
|
63
56
|
5.times do |index|
|
64
57
|
expected_id = index + 1
|
65
|
-
|
58
|
+
subject.next_for(Person).should == expected_id
|
66
59
|
end
|
67
60
|
end
|
68
61
|
|
69
62
|
it "should maintain ids separate for each table" do
|
70
|
-
3.times {
|
71
|
-
|
63
|
+
3.times { subject.next_for(Person) }
|
64
|
+
subject.next_for("cars").should == 1
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
describe "old string representation of integers" do
|
69
|
+
it "increments correctly when value is '1'" do
|
70
|
+
old_ensure = MassiveRecord::ORM::Base.backward_compatibility_integers_might_be_persisted_as_strings
|
71
|
+
MassiveRecord::ORM::Base.backward_compatibility_integers_might_be_persisted_as_strings = true
|
72
|
+
|
73
|
+
subject.next_for(Person)
|
74
|
+
|
75
|
+
# Enter incompatible data, number as string.
|
76
|
+
MassiveRecord::ORM::IdFactory.table.first.tap do |row|
|
77
|
+
row.update_column(
|
78
|
+
MassiveRecord::ORM::IdFactory::COLUMN_FAMILY_FOR_TABLES,
|
79
|
+
Person.table_name,
|
80
|
+
MassiveRecord::ORM::Base.coder.dump(1)
|
81
|
+
)
|
82
|
+
row.save
|
83
|
+
end
|
84
|
+
|
85
|
+
subject.next_for(Person).should eq 2
|
86
|
+
|
87
|
+
MassiveRecord::ORM::Base.backward_compatibility_integers_might_be_persisted_as_strings = old_ensure
|
88
|
+
end
|
72
89
|
end
|
73
90
|
end
|
74
91
|
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require "active_support/log_subscriber/test_helper"
|
3
|
+
|
4
|
+
describe "log subscriber" do
|
5
|
+
include ActiveSupport::BufferedLogger::Severity
|
6
|
+
|
7
|
+
include SetUpHbaseConnectionBeforeAll
|
8
|
+
include SetTableNamesToTestTable
|
9
|
+
|
10
|
+
let(:level) { DEBUG }
|
11
|
+
subject { ActiveSupport::LogSubscriber::TestHelper::MockLogger.new(level) }
|
12
|
+
|
13
|
+
before do
|
14
|
+
@old_logger = MassiveRecord::ORM::Base.logger
|
15
|
+
@notifier = ActiveSupport::Notifications::Fanout.new
|
16
|
+
|
17
|
+
ActiveSupport::LogSubscriber.colorize_logging = false
|
18
|
+
|
19
|
+
MassiveRecord::ORM::Base.logger = subject
|
20
|
+
ActiveSupport::Notifications.notifier = @notifier
|
21
|
+
|
22
|
+
MassiveRecord::ORM::LogSubscriber.attach_to :massive_record
|
23
|
+
end
|
24
|
+
|
25
|
+
after do
|
26
|
+
MassiveRecord::ORM::Base.logger = @old_logger
|
27
|
+
ActiveSupport::Notifications.notifier = nil
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
context "debug" do
|
33
|
+
it "should have nothing loged to begin with" do
|
34
|
+
subject.logged(:debug).size.should be_zero
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
describe "loading records" do
|
39
|
+
it "should have one lined log to debug when doing a all" do
|
40
|
+
Person.all
|
41
|
+
wait
|
42
|
+
subject.logged(:debug).size.should eq 1
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should include a the class name of what is loading, time it took, a description about what has been done" do
|
46
|
+
Person.all
|
47
|
+
wait
|
48
|
+
subject.logged(:debug).last.should match /Person.+?load.+?([\d.]+).+?all/
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should have one log line when doing first" do
|
52
|
+
Person.first
|
53
|
+
wait
|
54
|
+
subject.logged(:debug).size.should eq 1
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should have some clue written that it is first" do
|
58
|
+
Person.first
|
59
|
+
wait
|
60
|
+
subject.logged(:debug).first.should include "options: [:all, {:limit=>1}]"
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should have one log when doing find" do
|
64
|
+
Person.find("dummy") rescue nil
|
65
|
+
wait
|
66
|
+
subject.logged(:debug).first.should include 'options: ["dummy", {}]'
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
describe "store records" do
|
72
|
+
before do
|
73
|
+
@person = Person.create! "first", :name => "Name", :age => 20
|
74
|
+
wait
|
75
|
+
end
|
76
|
+
|
77
|
+
describe "create" do
|
78
|
+
it "should have one line log when creating a record" do
|
79
|
+
subject.logged(:debug).size.should eq 1
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should include class of what is being save, time it took an what kind of save it was" do
|
83
|
+
subject.logged(:debug).first.should match /Person.+?save.+?([\d.]+).+?create/
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe "update" do
|
88
|
+
before do
|
89
|
+
# Resetting the logger. Kinda hackish, might break if MockLogger changes internal implementation
|
90
|
+
subject.instance_variable_set(:@logged, Hash.new { |h,k| h[k] = [] })
|
91
|
+
@person.name = "New Name"
|
92
|
+
@person.save!
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should have one line log when updating a record" do
|
96
|
+
subject.logged(:debug).size.should eq 1
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should include class of what is being save, time it took an what kind of save it was" do
|
100
|
+
subject.logged(:debug).first.should match /Person.+?save.+?([\d.]+).+?update.+?id: first/
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should include a list of attributes which was updated" do
|
104
|
+
subject.logged(:debug).first.should match /attributes: name/
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
context "info" do
|
112
|
+
let(:level) { INFO }
|
113
|
+
|
114
|
+
it "should have nothing logged to begin with" do
|
115
|
+
subject.logged(:debug).size.should be_zero
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should have nothing logged when doing an all call" do
|
119
|
+
Person.all
|
120
|
+
wait
|
121
|
+
subject.logged(:debug).size.should be_zero
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
|
128
|
+
private
|
129
|
+
|
130
|
+
def wait
|
131
|
+
@notifier.wait
|
132
|
+
end
|
133
|
+
end
|