Skip to content

Instantly share code, notes, and snippets.

@mrship
Created June 24, 2009 18:13
Show Gist options
  • Save mrship/135434 to your computer and use it in GitHub Desktop.
Save mrship/135434 to your computer and use it in GitHub Desktop.
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