spec/support/driver_collection.rb in baza-0.0.20 vs spec/support/driver_collection.rb in baza-0.0.21
- old
+ new
@@ -7,16 +7,20 @@
let(:row) do
test_table.insert(text: "Kasper", number: 30, float: 4.5)
db.select(:test, text: "Kasper").fetch
end
let(:test_table) do
- db.tables.create("test", columns: [
- {name: "id", type: :int, autoincr: true, primarykey: true},
- {name: "text", type: :varchar},
- {name: "number", type: :int, default: 0},
- {name: "float", type: :float, default: 0.0}
- ])
+ db.tables.create(
+ "test",
+ columns: [
+ {name: "id", type: :int, autoincr: true, primarykey: true},
+ {name: "text", type: :varchar},
+ {name: "number", type: :int, default: 0},
+ {name: "float", type: :float, default: 0.0},
+ {name: "created_at", type: :datetime}
+ ]
+ )
db.tables[:test]
end
before do
driver.before
@@ -26,85 +30,52 @@
after do
driver.after
driver2.after
end
- it "should do revisions" do
- test_table
-
- schema = {
- tables: {
- test_table: {
- columns: [
- {name: "id", type: :int, autoincr: true, primarykey: true},
- {name: "name", type: :varchar},
- {name: "age", type: :int, default: 0},
- {name: "nickname", type: :varchar, default: ""}
- ],
- indexes: [
- "name"
- ],
- rows: [
- {
- find_by: {"id" => 1},
- data: {"id" => 1, "name" => "trala"}
- }
- ]
- }
- }
- }
-
- rev = Baza::Revision.new
- rev.init_db(schema: schema, debug: false, db: db)
-
- test_table = db.tables[:test_table]
- expect(test_table.columns.map(&:name)).to include "age"
- expect(test_table.columns.map(&:name)).to include "nickname"
- end
-
it "does id-queries" do
test_table
rows_count = 1250
db.transaction do
- 0.upto(rows_count) do |count|
+ rows_count.times do |count|
db.insert(:test, text: "User #{count}")
end
end
block_ran = 0
- idq = Baza::Idquery.new(db: db, debug: false, table: :test, query: "SELECT id FROM test") do |_data|
+ Baza::Idquery.new(db: db, debug: false, table: :test, query: "SELECT id FROM test") do
block_ran += 1
end
- raise "Block with should have ran too little: #{block_ran}." if block_ran < rows_count
+ expect(block_ran).to eq rows_count
block_ran = 0
- db.select(:test, {}, idquery: true) do |_data|
+ db.select(:test, {}, idquery: true) do
block_ran += 1
end
- raise "Block with should have ran too little: #{block_ran}." if block_ran < rows_count
+ expect(block_ran).to eq rows_count
end
it "does unbuffered queries" do
test_table
10.times do |count|
db.insert(:test, text: "Test #{count}")
end
count_results = 0
- db.q("SELECT * FROM test", type: :unbuffered) do |row|
+ db.query_ubuf("SELECT * FROM test") do |row|
expect(row[:text]).to eq "Test #{count_results}"
count_results += 1
end
expect(count_results).to eq 10
end
- it "does upserting" do
+ it "#upsert" do
test_table.create_columns([{name: "nickname", type: :varchar}])
# Test upserting.
data = {text: "upsert - Kasper Johansen"}
data2 = {text: "upsert - Kasper Nielsen Johansen"}
@@ -114,36 +85,70 @@
table.reload
rows_count = table.rows_count
db.upsert(:test, data, sel)
row = db.select(:test, sel).fetch
- row[:text].should eq "upsert - Kasper Johansen"
+ expect(row[:text]).to eq "upsert - Kasper Johansen"
table.reload
- table.rows_count.should eql(rows_count + 1)
+ expect(table.rows_count).to eq rows_count + 1
db.upsert(:test, data2, sel)
row = db.select(:test, sel).fetch
- row[:text].should eq "upsert - Kasper Nielsen Johansen"
+ expect(row[:text]).to eq "upsert - Kasper Nielsen Johansen"
table.reload
- table.rows_count.should eq rows_count + 1
+ expect(table.rows_count).to eq rows_count + 1
end
+ describe "#upsert_duplicate_key" do
+ before do
+ test_table.create_indexes([name: "unique_text", columns: ["text"], unique: true])
+ end
+
+ it "inserts records with terms" do
+ expect(test_table.rows_count).to eq 0
+ test_table.upsert_duplicate_key({number: 2}, text: "test1")
+ expect(test_table.rows_count).to eq 1
+ end
+
+ it "updates existing records with terms" do
+ test_table.insert(text: "test1", number: 1)
+ test_table.upsert_duplicate_key({number: 2}, text: "test1")
+ expect(test_table.rows_count).to eq 1
+
+ rows = test_table.rows.to_a.map(&:to_hash)
+ rows[0][:float] = "0.0" if rows[0][:float] == "0"
+ expect(rows).to eq [{id: "1", text: "test1", number: "2", float: "0.0", created_at: ""}]
+ end
+
+ it "inserts with empty terms" do
+ expect(test_table.rows_count).to eq 0
+ id = test_table.upsert_duplicate_key({text: "test2"}, {}, return_id: true)
+ expect(test_table.rows_count).to eq 1
+ expect(id).to eq 1
+ end
+
+ it "updates existing records with empty terms" do
+ test_table.insert(text: "test1", number: 1)
+ id = test_table.upsert_duplicate_key({number: 2, text: "test1"}, {}, return_id: true)
+ expect(test_table.rows_count).to eq 1
+ expect(id).to eq 1
+ end
+ end
+
it "dumps as SQL" do
dump = Baza::Dump.new(db: db, debug: false)
str_io = StringIO.new
dump.dump(str_io)
str_io.rewind
# Remember some numbers for validation.
tables_count = db.tables.list.length
# Remove everything in the db.
- db.tables.list do |table|
- table.drop unless table.native?
- end
+ db.tables.list.select(&:native?).each(&:drop)
# Run the exported SQL.
db.transaction do
str_io.each_line do |sql|
db.q(sql)
@@ -152,73 +157,33 @@
# Vaildate import.
raise "Not same amount of tables: #{tables_count}, #{db.tables.list.length}" if tables_count != db.tables.list.length
end
- it "renames tables in revisions" do
- test_table
-
- Baza::Revision.new.init_db(
- db: db,
- debug: false,
- schema: {
- tables: {
- new_test_table: {
- renames: [:test]
- }
- }
- }
- )
-
- tables = db.tables.list.map(&:name)
-
- expect(tables).to_not include "test"
- expect(tables).to include "new_test_table"
- end
-
- it "renames columns in revisions" do
- test_table
-
- Baza::Revision.new.init_db(
- db: db,
- debug: false,
- schema: {
- tables: {
- new_test_table: {
- columns: [
- {name: :new_name, type: :varchar, renames: [:text]}
- ]
- }
- }
- }
- )
-
- columns = db.tables[:new_test_table].columns.map(&:name)
- expect(columns).to_not include "text"
- expect(columns).to include "new_name"
- end
-
it "generates proper sql" do
time = Time.new(1985, 6, 17, 10, 30)
- db.insert(:test, {date: time}, return_sql: true).should eql("INSERT INTO `test` (`date`) VALUES ('1985-06-17 10:30:00')")
+ expect(db.insert(:test, {date: time}, return_sql: true)).to eq "INSERT INTO #{db.sep_table}test#{db.sep_table} (#{db.sep_col}date#{db.sep_col}) VALUES (#{db.sep_val}1985-06-17 10:30:00#{db.sep_val})"
date = Date.new(1985, 6, 17)
- db.insert(:test, {date: date}, return_sql: true).should eql("INSERT INTO `test` (`date`) VALUES ('1985-06-17')")
+ expect(db.insert(:test, {date: date}, return_sql: true)).to eq "INSERT INTO #{db.sep_table}test#{db.sep_table} (#{db.sep_col}date#{db.sep_col}) VALUES (#{db.sep_val}1985-06-17#{db.sep_val})"
end
it "is able to make new connections based on given objects" do
# Mysql doesn't support it...
unless db.opts.fetch(:type) == :mysql
- new_db = Baza::Db.from_object(object: db.driver.conn)
+ Baza::Db.from_object(object: db.driver.conn)
end
end
it "is able to do ID-queries through the select-method" do
- db.tables.create(:test_table, columns: [
- {name: :idrow, type: :int, autoincr: true, primarykey: true},
- {name: :name, type: :varchar}
- ])
+ db.tables.create(
+ :test_table,
+ columns: [
+ {name: :idrow, type: :int, autoincr: true, primarykey: true},
+ {name: :name, type: :varchar}
+ ]
+ )
count = 0
100.times do
arr = []
100.times do
@@ -231,21 +196,24 @@
count_found = 0
db.select(:test_table, nil, idquery: :idrow) do |row|
count_found += 1
- row[:name].should eq "Kasper #{count_found}"
+ expect(row[:name]).to eq "Kasper #{count_found}"
end
expect(count_found).to eq 10_000
end
- it "should be able to use query buffers" do
- db.tables.create(:test_table, columns: [
- {name: :id, type: :int, autoincr: true, primarykey: true},
- {name: :name, type: :varchar}
- ])
+ it "uses query buffers" do
+ db.tables.create(
+ :test_table,
+ columns: [
+ {name: :id, type: :int, autoincr: true, primarykey: true},
+ {name: :name, type: :varchar}
+ ]
+ )
upsert = false
count_inserts = 0
db.q_buffer do |buffer|
2500.times do |count|
@@ -298,20 +266,19 @@
# Test the flush-async which flushes transactions in a thread asyncronous.
db.q_buffer(flush_async: true) do |buffer|
count = 0
db.select(:test_table) do |row|
count += 1
-
time_start = Time.now.to_f if count == 1000
- buffer.delete(:test_table, id: row[:id])
+ buffer.delete(:test_table, id: row.fetch(:id))
next unless count == 1000
time_end = Time.now.to_f
time_spent = time_end - time_start
- raise "Too much time spent: '#{time_spent}'." if time_spent > 0.01
+ raise "Too much time spent: '#{time_spent}'." if time_spent > 0.015
end
end
expect(test_table.rows_count).to eq 0
end
@@ -354,28 +321,76 @@
expect(row.fetch(:number).class).to eq String
expect(row.fetch(:float).class).to eq String
end
it "does type translation" do
- db_with_type_translation.tables.create(:test, columns: [
- {name: "id", type: :int, autoincr: true, primarykey: true},
- {name: "text", type: :varchar},
- {name: "number", type: :int},
- {name: "float", type: :float},
- {name: "created_at", type: :datetime},
- {name: "date", type: :date}
- ])
+ db_with_type_translation.tables.create(
+ :test,
+ columns: [
+ {name: "id", type: :int, autoincr: true, primarykey: true},
+ {name: "text", type: :varchar},
+ {name: "number", type: :int},
+ {name: "float", type: :float},
+ {name: "created_at", type: :datetime},
+ {name: "date", type: :date}
+ ]
+ )
db_with_type_translation.insert(:test, text: "Kasper", number: 30, float: 4.5, created_at: Time.now, date: Date.new(2015, 06, 17))
row = db_with_type_translation.select(:test, text: "Kasper").fetch
expect(row.fetch(:text).class).to eq String
expect(row.fetch(:number).class).to eq Fixnum
expect(row.fetch(:float).class).to eq Float
- unless db.driver.conn.class.name == "ActiveRecord::ConnectionAdapters::SQLite3Adapter"
+ if db.driver.conn.class.name == "ActiveRecord::ConnectionAdapters::SQLite3Adapter"
+ check_time_and_date = false
+ elsif db.driver.class.name == "Baza::Driver::ActiveRecord" && RUBY_PLATFORM == "java"
+ check_time_and_date = false
+ else
+ check_time_and_date = true
+ end
+
+ if check_time_and_date
expect(row.fetch(:created_at).class).to eq Time
expect(row.fetch(:date).class).to eq Date
+ end
+ end
+
+ it "returns arguments used to connect" do
+ require_relative "../../lib/baza/driver/active_record"
+
+ unless db.driver.is_a?(Baza::Driver::ActiveRecord)
+ args = db.driver.class.args
+ expect(args).to be_a Array
+ end
+ end
+
+ it "#new_query" do
+ test_table
+ test_table.insert(text: "Kasper")
+
+ query = db.new_query.from(:test).where(text: "Kasper").to_a
+ query[0][:float] = query[0][:float].to_f.to_s if query[0][:float] == "0"
+ expect(query.to_a).to eq [{id: "1", text: "Kasper", number: "0", float: "0.0", created_at: ""}]
+ end
+
+ it "#last_id" do
+ test_table.insert(text: "Kasper")
+ expect(db.last_id).to eq 1
+ end
+
+ it "handels null values for datetimes" do
+ id = test_table.insert({text: "Kasper"}, return_id: true)
+ row = test_table.row(id)
+ expect(row[:created_at]).to eq ""
+ end
+
+ describe "#insert" do
+ it "returns id" do
+ test_table
+ id = db.insert("test", {text: "Kasper"}, return_id: true)
+ expect(id).to eq 1
end
end
end