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  }