gitlab.com/beacon-software/gadget@v0.0.0-20181217202115-54565ea1ed5e/database/qb/insert_test.go (about) 1 package qb 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/assert" 7 8 "gitlab.com/beacon-software/gadget/generator" 9 ) 10 11 func TestInsertQuery(t *testing.T) { 12 assert := assert.New(t) 13 pID := generator.TestID() 14 name := generator.String(5) 15 aID := generator.TestID() 16 query := Insert(Person.ID, Person.Name, Person.AddressID).Values(pID, name, aID) 17 sql, values, err := query.SQL() 18 assert.NoError(err) 19 if assert.Equal(3, len(values)) { 20 values[0] = pID 21 values[1] = name 22 values[2] = aID 23 } 24 assert.Equal("INSERT INTO `person` (`person`.`id`, `person`.`name`, `person`.`address_id`) VALUES (?, ?, ?)", sql) 25 } 26 27 func TestInsertQueryMulti(t *testing.T) { 28 assert := assert.New(t) 29 query := Insert(Person.ID, Person.Name, Person.AddressID) 30 for i := 0; i < 10; i++ { 31 query.Values(i, i, i) 32 } 33 sql, values, err := query.SQL() 34 assert.NoError(err) 35 assert.Equal(30, len(values)) 36 for i := 0; i < 10; i++ { 37 j := i * 3 38 assert.Equal(i, values[j]) 39 assert.Equal(i, values[j+1]) 40 assert.Equal(i, values[j+2]) 41 } 42 assert.Equal("INSERT INTO `person` (`person`.`id`, `person`.`name`, `person`.`address_id`) VALUES "+ 43 "(?, ?, ?), "+ 44 "(?, ?, ?), "+ 45 "(?, ?, ?), "+ 46 "(?, ?, ?), "+ 47 "(?, ?, ?), "+ 48 "(?, ?, ?), "+ 49 "(?, ?, ?), "+ 50 "(?, ?, ?), "+ 51 "(?, ?, ?), "+ 52 "(?, ?, ?)", sql) 53 } 54 55 func TestInsertMismatchColumnValuesCount(t *testing.T) { 56 assert := assert.New(t) 57 query := Insert(Person.ID, Person.Name, Person.AddressID).Values(1, 2) 58 assert.EqualError(query.err, "insert field/value count mismatch") 59 _, _, err := query.SQL() 60 assert.EqualError(err, "insert field/value count mismatch") 61 } 62 63 func TestInsertNoColumns(t *testing.T) { 64 assert := assert.New(t) 65 query := Insert() 66 _, _, err := query.SQL() 67 assert.EqualError(err, "no columns specified for insert") 68 } 69 70 func TestInsertDifferentTablesError(t *testing.T) { 71 assert := assert.New(t) 72 query := Insert(Person.ID, Address.ID) 73 _, _, err := query.SQL() 74 assert.EqualError(err, "insert columns must be from the same table") 75 } 76 77 func TestInsertQueryOnDuplicate(t *testing.T) { 78 assert := assert.New(t) 79 pID := generator.TestID() 80 name := generator.String(5) 81 aID := generator.TestID() 82 query := Insert(Person.ID, Person.Name, Person.AddressID).Values(pID, name, aID).OnDuplicate(Person.WriteColumns(), pID, name, aID) 83 sql, values, err := query.SQL() 84 assert.NoError(err) 85 if assert.Equal(6, len(values)) { 86 values[0] = pID 87 values[1] = name 88 values[2] = aID 89 values[3] = pID 90 values[4] = name 91 values[5] = aID 92 } 93 assert.Equal("INSERT INTO `person` (`person`.`id`, `person`.`name`, `person`.`address_id`) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE `person`.`id` = ?, `person`.`name` = ?, `person`.`address_id` = ?", sql) 94 } 95 96 func TestInsertQueryMultiOnDuplicate(t *testing.T) { 97 assert := assert.New(t) 98 query := Insert(Person.ID, Person.Name, Person.AddressID).OnDuplicate(Person.WriteColumns(), 1, generator.String(3), 3) 99 for i := 0; i < 10; i++ { 100 query.Values(i, i, i) 101 } 102 sql, values, err := query.SQL() 103 assert.EqualError(err, "cannot use on duplicate with multi-insert") 104 assert.Nil(values) 105 assert.Equal("", sql) 106 sql, err = query.ParameterizedSQL() 107 assert.EqualError(err, "cannot use on duplicate with multi-insert") 108 assert.Equal("", sql) 109 }