massive_record 0.2.0 → 0.2.1.rc1
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/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
|