Created
June 24, 2009 18:13
-
-
Save mrship/135434 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'rubygems' | |
# USE_DM_0_9 = true | |
if defined?(USE_DM_0_9) | |
DM_GEMS_VERSION = "0.9.11" | |
DO_GEMS_VERSION = "0.9.12" | |
gem "data_objects", DO_GEMS_VERSION | |
gem "do_sqlite3", DO_GEMS_VERSION | |
gem "dm-core", DM_GEMS_VERSION | |
end | |
require 'dm-core' | |
require 'spec' | |
SQLITE_FILE = File.join(`pwd`.chomp, "test.db") | |
DataMapper.setup(:default, "sqlite3:#{SQLITE_FILE}") | |
DataMapper.setup(:reloaded, "sqlite3:#{SQLITE_FILE}") | |
class Spouse | |
include DataMapper::Resource | |
property :id, Serial | |
belongs_to :parent | |
end | |
class Kid | |
include DataMapper::Resource | |
property :id, Serial | |
property :name, String | |
end | |
class KidElement | |
include DataMapper::Resource | |
property :id, Serial | |
belongs_to :parent | |
belongs_to :kid, :order => [ :name ] | |
end | |
class Debt | |
include DataMapper::Resource | |
property :id, Serial | |
property :type, String | |
belongs_to :parent | |
end | |
class Parent | |
include DataMapper::Resource | |
property :id, Serial | |
has 1, :spouse | |
has n, :kid_elements | |
has n, :debts, :order => [ :type ] | |
end | |
Spec::Runner.configure do |config| | |
config.before(:each) do | |
Spouse.auto_migrate! | |
Kid.auto_migrate! | |
KidElement.auto_migrate! | |
Debt.auto_migrate! | |
Parent.auto_migrate! | |
end | |
config.before(:each) do | |
DataMapper::Repository.context << repository(:default) | |
end | |
config.after(:each) do | |
DataMapper::Repository.context.pop | |
end | |
end | |
describe Parent, "with a spouse, 1 to 1" do | |
before(:each) do | |
@parent = Parent.new | |
@parent.spouse = Spouse.new | |
@parent.save | |
@parent.spouse.should_not be_nil | |
end | |
it "1 to 1 associations appears to be sharing associations across an identity map" do | |
other_spouse_object_id = | |
repository(:reloaded) do | |
parent_reloaded = Parent.get(@parent.id) | |
parent_reloaded.spouse.object_id | |
end | |
@parent.spouse.object_id.should_not == other_spouse_object_id | |
end | |
end | |
describe Parent, "with kids, 1 to n via a join table" do | |
before(:each) do | |
@parent = Parent.new | |
@parent.kid_elements.new(:kid => Kid.new(:name => "Ella")) | |
@parent.kid_elements.new(:kid => Kid.new(:name => "Harriet")) | |
@parent.save | |
end | |
it "should sanity check" do | |
@parent.kid_elements.first.kid.name.should == "Ella" | |
@parent.kid_elements.last.kid.name.should == "Harriet" | |
end | |
it "1 to n associations appears to be sharing associations across an identity map" do | |
other_kid_object_id = | |
repository(:reloaded) do | |
parent_reloaded = Parent.get(@parent.id) | |
parent_reloaded.kid_elements.first.object_id | |
end | |
@parent.kid_elements.first.object_id.should_not == other_kid_object_id | |
end | |
it "is fixed if you make a change in another repository and then reload the :default association" do | |
other_kid_object_id = | |
repository(:reloaded) do | |
parent_reloaded = Parent.get(@parent.id) | |
parent_reloaded.kid_elements.delete(parent_reloaded.kid_elements.first) | |
parent_reloaded.kid_elements.first.object_id | |
end | |
@parent.kid_elements.reload | |
@parent.kid_elements.first.object_id.should_not == other_kid_object_id | |
end | |
end | |
describe Parent, "with debts, 1 to n" do | |
before(:each) do | |
@parent = Parent.new | |
@parent.debts << Debt.new(:type => "Education", :parent => @parent) | |
@parent.debts << Debt.new(:type => "House", :parent => @parent) | |
@parent.save | |
end | |
it "should sanity check" do | |
@parent.debts.first.type.should == "Education" | |
@parent.debts.last.type.should == "House" | |
end | |
it "1 to n associations appears to be sharing associations across an identity map" do | |
other_debt_object_id = | |
repository(:reloaded) do | |
parent_reloaded = Parent.get(@parent.id) | |
parent_reloaded.debts.first.object_id | |
end | |
@parent.debts.first.object_id.should_not == other_debt_object_id | |
end | |
it "is fixed if you make a change in another repository and then reload the :default association" do | |
other_debt_object_id = | |
repository(:reloaded) do | |
parent_reloaded = Parent.get(@parent.id) | |
parent_reloaded.debts.delete(parent_reloaded.debts.first) | |
parent_reloaded.debts.first.object_id | |
end | |
@parent.debts.reload | |
@parent.debts.first.object_id.should_not == other_debt_object_id | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment