spec/mongomodel/document/dynamic_finders_spec.rb in mongomodel-0.5.5 vs spec/mongomodel/document/dynamic_finders_spec.rb in mongomodel-0.5.6
- old
+ new
@@ -5,176 +5,176 @@
describe "dynamic finders" do
define_class(:Person, Document) do
property :name, String
property :age, Integer
end
-
+
subject { Person }
-
+
before(:each) do
@john = Person.create!(:name => 'John', :age => 42, :id => '1')
@young_john = Person.create!(:name => 'John', :age => 12, :id => '2')
@tom1 = Person.create!(:name => 'Tom', :age => 23, :id => '3')
@tom2 = Person.create!(:name => 'Tom', :age => 23, :id => '4')
@mary = Person.create!(:name => 'Mary', :age => 33, :id => '5')
end
-
+
def self.should_find(*args, &block)
it "returns correct results when called with #{args.inspect}" do
expected = instance_eval(&block)
subject.send(valid_finder, *args).should == expected
end
end
-
+
def self.should_raise(*args, &block)
it "raises DocumentNotFound exception if results not found" do
message = instance_eval(&block)
lambda { subject.send(valid_finder, *args) }.should raise_error(DocumentNotFound, message)
end
end
-
+
def self.should_initialize(*args, &block)
it "initializes new instance" do
result = subject.send(valid_finder, *args)
result.should be_a_new_record
result.should be_an_instance_of(Person)
- yield(result).should be_true
+ yield(result).should be true
end
end
-
+
def self.should_create(*args, &block)
it "creates new instance" do
result = subject.send(valid_finder, *args)
result.should_not be_a_new_record
result.should be_an_instance_of(Person)
- yield(result).should be_true
+ yield(result).should be true
end
end
-
+
shared_examples_for "a dynamic finder" do
it { should respond_to(valid_finder) }
it { should_not respond_to(invalid_finder) }
-
+
it "raises NoMethodError calling an invalid finder" do
lambda { subject.send(invalid_finder, "Foo") }.should raise_error(NoMethodError)
end
end
-
+
describe "find first by single property" do
let(:valid_finder) { :find_by_name }
let(:invalid_finder) { :find_by_something_else }
-
+
it_should_behave_like "a dynamic finder"
-
+
should_find("John") { @john }
should_find("Jane") { nil }
end
-
+
describe "find first by single property (bang method)" do
let(:valid_finder) { :find_by_name! }
let(:invalid_finder) { :find_by_something_else! }
-
+
it_should_behave_like "a dynamic finder"
-
+
should_find("John") { @john }
should_raise("Jane") { 'Couldn\'t find Person with {:name=>"Jane"}' }
end
-
+
describe "find last by single property" do
let(:valid_finder) { :find_last_by_name }
let(:invalid_finder) { :find_last_by_something_else }
-
+
it_should_behave_like "a dynamic finder"
-
+
should_find("John") { @young_john }
should_find("Jane") { nil }
end
-
+
describe "find all by single property" do
let(:valid_finder) { :find_all_by_name }
let(:invalid_finder) { :find_all_by_something_else }
-
+
it_should_behave_like "a dynamic finder"
-
+
should_find("John") { [@john, @young_john] }
end
-
+
describe "find first by multiple properties" do
let(:valid_finder) { :find_by_name_and_age }
let(:invalid_finder) { :find_by_age_and_something_else }
-
+
it_should_behave_like "a dynamic finder"
-
+
should_find("Tom", 23) { @tom1 }
should_find("Tom", 5) { nil }
end
-
+
describe "find first by multiple properties (bang method)" do
let(:valid_finder) { :find_by_name_and_age! }
let(:invalid_finder) { :find_by_age_and_something_else! }
-
+
it_should_behave_like "a dynamic finder"
-
+
should_find("Tom", 23) { @tom1 }
should_raise("Tom", 5) { "Couldn\'t find Person with #{{:name=>"Tom", :age=>5}.inspect}" }
end
-
+
describe "find all by multiple properties" do
let(:valid_finder) { :find_all_by_name_and_age }
let(:invalid_finder) { :find_all_by_age_and_something_else }
-
+
it_should_behave_like "a dynamic finder"
-
+
should_find("Tom", 23) { [@tom1, @tom2] }
should_find("Tom", 5) { [] }
end
-
+
describe "find last by multiple properties" do
let(:valid_finder) { :find_last_by_name_and_age }
let(:invalid_finder) { :find_last_by_age_and_something_else }
-
+
it_should_behave_like "a dynamic finder"
-
+
should_find("Tom", 23) { @tom2 }
should_find("Tom", 5) { nil }
end
-
+
describe "find or initialize by single property" do
let(:valid_finder) { :find_or_initialize_by_name }
let(:invalid_finder) { :find_or_initialize_by_something_else }
-
+
it_should_behave_like "a dynamic finder"
-
+
should_find("John") { @john }
should_initialize("Jane") { |p| p.name == "Jane" }
end
-
+
describe "find or initialize by multiple properties" do
let(:valid_finder) { :find_or_initialize_by_name_and_age }
let(:invalid_finder) { :find_or_initialize_by_name_and_something_else }
-
+
it_should_behave_like "a dynamic finder"
-
+
should_find("John", 42) { @john }
should_initialize("John", 1) { |p| p.name == "John" && p.age == 1 }
end
-
+
describe "find or create by single property" do
let(:valid_finder) { :find_or_create_by_name }
let(:invalid_finder) { :find_or_create_by_something_else }
-
+
it_should_behave_like "a dynamic finder"
-
+
should_find("John") { @john }
should_create("Jane") { |p| p.name == "Jane" }
end
-
+
describe "find or create by multiple properties" do
let(:valid_finder) { :find_or_create_by_name_and_age }
let(:invalid_finder) { :find_or_create_by_name_and_something_else }
-
+
it_should_behave_like "a dynamic finder"
-
+
should_find("John", 42) { @john }
should_create("John", 1) { |p| p.name == "John" && p.age == 1 }
end
end
end