diff --git a/lib/rom/session/relation.rb b/lib/rom/session/relation.rb index 708449a..50627aa 100644 --- a/lib/rom/session/relation.rb +++ b/lib/rom/session/relation.rb @@ -19,6 +19,13 @@ def self.build(relation, tracker, identity_map) new(relation.inject_mapper(mapper), tracker) end + def new(*args, &block) + # FIXME: expose some nice API on the mapper to build new models + object = mapper.loader.send(:model).new(*args, &block) + track(object) + object + end + def identity(object) dumper.identity(object) end diff --git a/spec/shared/unit/relation_context.rb b/spec/shared/unit/relation_context.rb index a38750f..8a372e7 100644 --- a/spec/shared/unit/relation_context.rb +++ b/spec/shared/unit/relation_context.rb @@ -10,6 +10,5 @@ let(:relation) { Relation.new(axiom, mapper) } let(:users) { session[:users] } - let(:user) { session[:users].all.first } end diff --git a/spec/unit/rom/session/relation/save_spec.rb b/spec/unit/rom/session/relation/save_spec.rb new file mode 100644 index 0000000..9f85433 --- /dev/null +++ b/spec/unit/rom/session/relation/save_spec.rb @@ -0,0 +1,27 @@ +require 'spec_helper' + +describe Session::Relation, '#save' do + subject { users.save(user).state(user) } + + include_context 'Session::Relation' + + context 'when an object is new' do + let(:user) { users.new(:id => 3, :name => 'John') } + + it { should be_created } + end + + context 'when an object is persisted' do + context 'when not dirty' do + it { should be_persisted } + end + + context 'when dirty' do + before do + user.name = 'John Doe' + end + + it { should be_updated } + end + end +end diff --git a/spec/unit/rom/session_spec.rb b/spec/unit/rom/session_spec.rb index a0af372..e3f1ea4 100644 --- a/spec/unit/rom/session_spec.rb +++ b/spec/unit/rom/session_spec.rb @@ -13,39 +13,6 @@ let(:object) { env[:users].all.first } - describe '#save' do - context 'when an object is persisted' do - context 'when not dirty' do - it 'does not queue an object to be updated' do - session[:users].save(object) - - expect(session[:users].state(object)).to be_persisted - end - end - - context 'when dirty' do - it 'queues an object to be updated' do - object.name = 'John Doe' - - session[:users].save(object) - - expect(session[:users].state(object)).to be_updated - end - end - end - - context 'when an object is new' do - it 'queues an object to be created' do - user = model.new(:id => 3, :name => 'John') - - session[:users].track(user) - session[:users].save(user) - - expect(session[:users].state(user)).to be_created - end - end - end - describe '#delete' do it 'queues an object to be deleted' do session[:users].delete(object)