spec/extensions/prepared_statements_spec.rb in sequel-4.49.0 vs spec/extensions/prepared_statements_spec.rb in sequel-5.0.0

- old
+ new

@@ -1,6 +1,6 @@ -require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper") +require_relative "spec_helper" describe "prepared_statements plugin" do before do @db = Sequel.mock(:fetch=>{:id=>1, :name=>'foo', :i=>2}, :autoid=>proc{|sql| 1}, :numrows=>1, :servers=>{:read_only=>{}}) @c = Class.new(Sequel::Model(@db[:people])) @@ -11,15 +11,15 @@ @p = @c.load(:id=>1, :name=>'foo', :i=>2) @ds = @c.dataset @db.sqls end - deprecated "should correctly lookup by primary key for joined dataset" do + it "should work with implicit subqueries used for joined datasets" do @c.dataset = @c.dataset.from(:people, :people2) @db.sqls @c[1].must_equal @p - @db.sqls.must_equal ["SELECT * FROM people, people2 WHERE (people.id = 1) LIMIT 1 -- read_only"] + @db.sqls.must_equal ["SELECT * FROM (SELECT * FROM people, people2) AS people WHERE (id = 1) LIMIT 1 -- read_only"] end it "should correctly lookup by primary key for dataset using subquery" do @c.dataset = @c.dataset.from(:people, :people2).from_self(:alias=>:people) @db.sqls @@ -30,37 +30,16 @@ it "should use prepared statements for pk lookups only if default is not optimized" do @c.send(:use_prepared_statements_for_pk_lookup?).must_equal false @c.set_primary_key [:id, :name] @c.send(:use_prepared_statements_for_pk_lookup?).must_equal true @c.set_primary_key :id - deprecated do @c.dataset = @c.dataset.from(:people, :people2) - @c.send(:use_prepared_statements_for_pk_lookup?).must_equal false - end + @c.send(:use_prepared_statements_for_pk_lookup?).must_equal true @c.dataset = @db[:people].select(:id, :name, :i) @c.send(:use_prepared_statements_for_pk_lookup?).must_equal true end - it "should use prepared statements for refreshes if default is not optimized" do - @p.send(:use_prepared_statements_for?, :refresh).must_equal false - @c.set_primary_key [:id, :name] - @p.send(:use_prepared_statements_for?, :refresh).must_equal true - end - - it "should use prepared statements for deletes if default is not optimized" do - @p.send(:use_prepared_statements_for?, :delete).must_equal false - @c.set_primary_key [:id, :name] - @p.send(:use_prepared_statements_for?, :delete).must_equal true - end - - it "should use prepared statements for deletes if default on Oracle and DB2" do - def @db.database_type; :oracle end - @p.send(:use_prepared_statements_for?, :delete).must_equal true - def @db.database_type; :db2 end - @p.send(:use_prepared_statements_for?, :delete).must_equal true - end - it "should raise Error for unsupported prepared statement types" do proc{@p.send(:use_prepared_statements_for?, :foo)}.must_raise Sequel::Error end prepared_statements_spec = shared_description do @@ -100,36 +79,21 @@ include prepared_statements_spec it "should correctly create instance" do @c.create(:name=>'foo').must_equal @c.load(:id=>1, :name=>'foo', :i => 2) - @db.sqls.must_equal ["INSERT INTO people (name) VALUES ('foo')", "SELECT #{@columns} FROM people WHERE (id = 1) LIMIT 1"] + @db.sqls.must_equal ["INSERT INTO people (name) VALUES ('foo')", "SELECT * FROM people WHERE id = 1"] end - it "should correctly lookup by primary key" do - @c[1].must_equal @p - @db.sqls.must_equal ["SELECT id, name, i FROM people WHERE (id = 1) LIMIT 1 -- read_only"] - end - - it "should correctly delete instance" do - @p.destroy.must_equal @p - @db.sqls.must_equal ["DELETE FROM people WHERE (id = 1)"] - end - - it "should correctly delete instance when specifying server" do - @p.set_server(:read_only).destroy.must_equal @p - @db.sqls.must_equal ["DELETE FROM people WHERE (id = 1) -- read_only"] - end - it "should correctly update instance when specifying server" do @p.set_server(:read_only).update(:name=>'bar').must_equal @c.load(:id=>1, :name=>'bar', :i => 2) @db.sqls.must_equal ["UPDATE people SET name = 'bar' WHERE (id = 1) -- read_only"] end it "should correctly create instance when specifying server" do @c.new(:name=>'foo').set_server(:read_only).save.must_equal @c.load(:id=>1, :name=>'foo', :i => 2) - @db.sqls.must_equal ["INSERT INTO people (name) VALUES ('foo') -- read_only", "SELECT #{@columns} FROM people WHERE (id = 1) LIMIT 1 -- read_only"] + @db.sqls.must_equal ["INSERT INTO people (name) VALUES ('foo') -- read_only", "SELECT * FROM people WHERE id = 1 -- read_only"] end it "should correctly create instance if dataset supports insert_select when specifying server" do @c.dataset_module do def supports_insert_select? @@ -150,18 +114,19 @@ @db.sqls.must_equal ["INSERT INTO people (name) VALUES ('foo') RETURNING #{@columns} -- read_only"] end it "should work correctly when subclassing" do c = Class.new(@c) - c[1].must_equal c.load(:id=>1, :name=>'foo', :i=>2) - @db.sqls.must_equal ["SELECT id, name, i FROM people WHERE (id = 1) LIMIT 1 -- read_only"] + @db.sqls + c.load(:id=>1, :name=>'foo', :i=>2).save + @db.sqls.must_equal ["UPDATE people SET name = 'foo', i = 2 WHERE (id = 1)"] end it "should correctly handle without schema type when placeholder type specifiers are required" do @c.dataset = @ds.with_extend{def requires_placeholder_type_specifiers?; true end} - @c[1].must_equal @p - @db.sqls.must_equal ["SELECT id, name, i FROM people WHERE (id = 1) LIMIT 1 -- read_only"] + @p.save + @db.sqls.must_equal ["UPDATE people SET name = 'foo', i = 2 WHERE (id = 1)"] end it "should correctly handle with schema type when placeholder type specifiers are required" do @c.dataset = @ds.with_extend do def requires_placeholder_type_specifiers?; true end @@ -181,11 +146,11 @@ end end end end @c.db_schema[:id][:type] = :integer - @c[1].must_equal @p - @db.sqls.must_equal ["SELECT id, name, i FROM people WHERE (id = 1) LIMIT 1 -- read_only"] + @p.save + @db.sqls.must_equal ["UPDATE people SET name = 'foo', i = 2 WHERE (id = 1)"] end end describe "when #use_prepared_statements_for? returns false" do before do