require 'spec_helper' require 'dm-core/spec/shared/adapter_spec' require 'dm-do-adapter/spec/shared_spec' require 'dm-migrations' require 'dm-oracle-adapter/spec/setup' ENV['ADAPTER'] = 'oracle' ENV['ADAPTER_SUPPORTS'] = 'all' module SQLLogHelper class SQLLogger attr_accessor :buffer def initialize @buffer = "" end def level; 0; end def debug(string) @buffer << string << "\n" # puts "#{string.gsub(/\n/m,"
\n")}
" end end def start_sql_log! return if @sql_log_on @sql_log_on = true @old_logger = DataObjects::Oracle.logger DataObjects::Oracle.logger = SQLLogger.new end def stop_sql_log! return unless @sql_log_on @sql_log_on = nil DataObjects::Oracle.logger = @old_logger end def clear_sql_log! return unless @sql_log_on DataObjects::Oracle.logger.buffer = "" end def sql_log_buffer DataObjects::Oracle.logger.buffer end end describe 'DataMapper::Adapters::OracleAdapter' do before :all do @adapter = DataMapper::Spec.adapter @repository = DataMapper.repository(@adapter.name) # speed up test execution @adapter.class.class_eval do auto_migrate_with :delete # table data will be deleted instead of dropping and creating table auto_migrate_reset_sequences false # primary key sequences will not be reset end end it_should_behave_like "An Adapter" it_should_behave_like "A DataObjects Adapter" describe "sequences" do include SQLLogHelper before(:all) do @auto_migrate_with = DataMapper::Adapters::OracleAdapter.auto_migrate_with DataMapper::Adapters::OracleAdapter.auto_migrate_with :drop_and_create start_sql_log! end after(:all) do stop_sql_log! DataMapper::Adapters::OracleAdapter.auto_migrate_with @auto_migrate_with end describe "create default sequence and trigger" do before(:all) do class ::Employee include DataMapper::Resource property :employee_id, Serial end Employee.auto_migrate! end after(:all) do Employee.auto_migrate_down! end it "should not have sequence name in options" do Employee.properties[:employee_id].options[:sequence].should be_nil end it "should create default sequence" do sql_log_buffer.should =~ /CREATE SEQUENCE "EMPLOYEES_SEQ"/ end it "should create trigger" do sql_log_buffer.should =~ /CREATE OR REPLACE TRIGGER "EMPLOYEES_PKT"/ end end describe "create custom sequence" do before(:all) do class ::Employee include DataMapper::Resource property :employee_id, Serial, :sequence => "emp_seq" end Employee.auto_migrate! end after(:all) do Employee.auto_migrate_down! end it "should have custom sequence name" do Employee.properties[:employee_id].options[:sequence].should == "emp_seq" end it "should create custom sequence" do sql_log_buffer.should =~ /CREATE SEQUENCE "EMP_SEQ"/ end it "should not create trigger" do sql_log_buffer.should_not =~ /TRIGGER/ end end describe "create custom sequence in non-default repository" do before(:all) do stop_sql_log! DataMapper.setup :oracle, DataMapper::Repository.adapters[:default].options start_sql_log! class ::Employee include DataMapper::Resource property :id, Serial repository(:oracle) do property :id, Serial, :field => "employee_id", :sequence => "emp_seq" end end repository(:oracle) do Employee.auto_migrate! end end after(:all) do repository(:oracle) do Employee.auto_migrate_down! end end it "should have custom sequence name" do Employee.properties(:oracle)[:id].options[:sequence].should == "emp_seq" end it "should create custom sequence" do sql_log_buffer.should =~ /CREATE SEQUENCE "EMP_SEQ"/ end it "should not create trigger" do sql_log_buffer.should_not =~ /TRIGGER/ end end describe "prefetch key value from custom sequence" do before(:all) do class ::Employee include DataMapper::Resource property :employee_id, Serial, :sequence => "emp_seq" property :first_name, String end Employee.auto_migrate! end after(:all) do Employee.auto_migrate_down! end it "should prefetch sequence value when inserting new record" do e = Employee.create e.employee_id.should == 1 e = Employee.create(:first_name => "Raimonds") e.employee_id.should == 2 end it "should insert explicitly specified primary key value" do e = Employee.create(:employee_id => 100,:first_name => "Raimonds") e.employee_id.should == 100 end end end end