...

Source file src/github.com/doug-martin/goqu/v9/sqlgen/truncate_sql_generator_test.go

Documentation: github.com/doug-martin/goqu/v9/sqlgen

     1  package sqlgen_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/doug-martin/goqu/v9/exp"
     7  	"github.com/doug-martin/goqu/v9/internal/errors"
     8  	"github.com/doug-martin/goqu/v9/internal/sb"
     9  	"github.com/doug-martin/goqu/v9/sqlgen"
    10  	"github.com/stretchr/testify/suite"
    11  )
    12  
    13  type (
    14  	truncateTestCase struct {
    15  		clause     exp.TruncateClauses
    16  		sql        string
    17  		isPrepared bool
    18  		args       []interface{}
    19  		err        string
    20  	}
    21  	truncateSQLGeneratorSuite struct {
    22  		baseSQLGeneratorSuite
    23  	}
    24  )
    25  
    26  func (tsgs *truncateSQLGeneratorSuite) assertCases(tsg sqlgen.TruncateSQLGenerator, testCases ...truncateTestCase) {
    27  	for _, tc := range testCases {
    28  		b := sb.NewSQLBuilder(tc.isPrepared)
    29  		tsg.Generate(b, tc.clause)
    30  		switch {
    31  		case len(tc.err) > 0:
    32  			tsgs.assertErrorSQL(b, tc.err)
    33  		case tc.isPrepared:
    34  			tsgs.assertPreparedSQL(b, tc.sql, tc.args)
    35  		default:
    36  			tsgs.assertNotPreparedSQL(b, tc.sql)
    37  		}
    38  	}
    39  }
    40  
    41  func (tsgs *truncateSQLGeneratorSuite) TestDialect() {
    42  	opts := sqlgen.DefaultDialectOptions()
    43  	d := sqlgen.NewTruncateSQLGenerator("test", opts)
    44  	tsgs.Equal("test", d.Dialect())
    45  
    46  	opts2 := sqlgen.DefaultDialectOptions()
    47  	d2 := sqlgen.NewTruncateSQLGenerator("test2", opts2)
    48  	tsgs.Equal("test2", d2.Dialect())
    49  }
    50  
    51  func (tsgs *truncateSQLGeneratorSuite) TestGenerate() {
    52  	opts := sqlgen.DefaultDialectOptions()
    53  	opts.TruncateClause = []byte("truncate")
    54  
    55  	tcNoTable := exp.NewTruncateClauses()
    56  	tcSingle := tcNoTable.SetTable(exp.NewColumnListExpression("a"))
    57  	tcMulti := exp.NewTruncateClauses().SetTable(exp.NewColumnListExpression("a", "b"))
    58  
    59  	expectedNoSourceErr := "goqu: no source found when generating truncate sql"
    60  	tsgs.assertCases(
    61  		sqlgen.NewTruncateSQLGenerator("test", opts),
    62  		truncateTestCase{clause: tcSingle, sql: `truncate "a"`},
    63  		truncateTestCase{clause: tcSingle, sql: `truncate "a"`, isPrepared: true},
    64  
    65  		truncateTestCase{clause: tcMulti, sql: `truncate "a", "b"`},
    66  		truncateTestCase{clause: tcMulti, sql: `truncate "a", "b"`, isPrepared: true},
    67  
    68  		truncateTestCase{clause: tcNoTable, err: expectedNoSourceErr},
    69  		truncateTestCase{clause: tcNoTable, err: expectedNoSourceErr, isPrepared: true},
    70  	)
    71  }
    72  
    73  func (tsgs *truncateSQLGeneratorSuite) TestGenerate_UnsupportedFragment() {
    74  	opts := sqlgen.DefaultDialectOptions()
    75  	opts.TruncateSQLOrder = []sqlgen.SQLFragmentType{sqlgen.UpdateBeginSQLFragment}
    76  	tc := exp.NewTruncateClauses().SetTable(exp.NewColumnListExpression("a"))
    77  	expectedErr := "goqu: unsupported TRUNCATE SQL fragment UpdateBeginSQLFragment"
    78  	tsgs.assertCases(
    79  		sqlgen.NewTruncateSQLGenerator("test", opts),
    80  		truncateTestCase{clause: tc, err: expectedErr},
    81  		truncateTestCase{clause: tc, err: expectedErr, isPrepared: true},
    82  	)
    83  }
    84  
    85  func (tsgs *truncateSQLGeneratorSuite) TestGenerate_WithErroredBuilder() {
    86  	opts := sqlgen.DefaultDialectOptions()
    87  	opts.TruncateSQLOrder = []sqlgen.SQLFragmentType{sqlgen.UpdateBeginSQLFragment}
    88  	d := sqlgen.NewTruncateSQLGenerator("test", opts)
    89  
    90  	b := sb.NewSQLBuilder(true).SetError(errors.New("expected error"))
    91  	d.Generate(b, exp.NewTruncateClauses().SetTable(exp.NewColumnListExpression("a")))
    92  	tsgs.assertErrorSQL(b, `goqu: expected error`)
    93  }
    94  
    95  func (tsgs *truncateSQLGeneratorSuite) TestGenerate_WithCascade() {
    96  	opts := sqlgen.DefaultDialectOptions()
    97  	opts.CascadeFragment = []byte(" cascade")
    98  	opts.RestrictFragment = []byte(" restrict")
    99  	opts.IdentityFragment = []byte(" identity")
   100  
   101  	tc := exp.NewTruncateClauses().SetTable(exp.NewColumnListExpression("a"))
   102  	tcCascade := tc.SetOptions(exp.TruncateOptions{Cascade: true})
   103  	tcRestrict := tc.SetOptions(exp.TruncateOptions{Restrict: true})
   104  	tcRestart := tc.SetOptions(exp.TruncateOptions{Identity: "restart"})
   105  
   106  	tsgs.assertCases(
   107  		sqlgen.NewTruncateSQLGenerator("test", opts),
   108  		truncateTestCase{clause: tcCascade, sql: `TRUNCATE "a" cascade`},
   109  		truncateTestCase{clause: tcCascade, sql: `TRUNCATE "a" cascade`, isPrepared: true},
   110  
   111  		truncateTestCase{clause: tcRestrict, sql: `TRUNCATE "a" restrict`},
   112  		truncateTestCase{clause: tcRestrict, sql: `TRUNCATE "a" restrict`, isPrepared: true},
   113  
   114  		truncateTestCase{clause: tcRestart, sql: `TRUNCATE "a" RESTART identity`},
   115  		truncateTestCase{clause: tcRestart, sql: `TRUNCATE "a" RESTART identity`, isPrepared: true},
   116  	)
   117  }
   118  
   119  func TestTruncateSQLGenerator(t *testing.T) {
   120  	suite.Run(t, new(truncateSQLGeneratorSuite))
   121  }
   122  

View as plain text