github.com/samiam2013/sqlvet@v0.0.0-20221210043606-d72f678fc0aa/pkg/vet/gosource_internal_test.go (about) 1 package vet 2 3 import ( 4 "testing" 5 6 "go/constant" 7 "go/token" 8 9 "github.com/houqp/gtest" 10 "github.com/stretchr/testify/assert" 11 "golang.org/x/tools/go/ssa" 12 ) 13 14 type ExtractQueryStrTests struct{} 15 16 func (s *ExtractQueryStrTests) Setup(t *testing.T) {} 17 func (s *ExtractQueryStrTests) Teardown(t *testing.T) {} 18 func (s *ExtractQueryStrTests) BeforeEach(t *testing.T) {} 19 func (s *ExtractQueryStrTests) AfterEach(t *testing.T) {} 20 21 // func (s *ExtractQueryStrTests) SubTestVarArg(t *testing.T) { 22 // // vararg is parsed as *ssa.Slice 23 // // eg: (*xorm.io/xorm.Session).Exec 24 // argVal := ssa.Slice{} 25 // s, err := extractQueryStrFromArg(ssa) 26 // assert.NoError(t, err) 27 // assert.Equal(t, "SELECT name FROM foo WHERE id=1", s) 28 // } 29 30 func (s *ExtractQueryStrTests) SubTestQueryStringAsInterface(t *testing.T) { 31 // query string constant is passed in as interface to match query function 32 // signature 33 expectedQs := "SELECT name FROM foo WHERE id=2" 34 argVal := &ssa.MakeInterface{ 35 X: &ssa.Const{ 36 Value: constant.MakeString(expectedQs), 37 }, 38 } 39 40 qs, err := extractQueryStrFromSsaValue(argVal) 41 assert.NoError(t, err) 42 assert.Equal(t, expectedQs, qs) 43 } 44 45 func (s *ExtractQueryStrTests) SubTestQueryStringAsConstant(t *testing.T) { 46 expectedQs := "SELECT name FROM foo WHERE id=1" 47 argVal := &ssa.Const{ 48 Value: constant.MakeString(expectedQs), 49 } 50 51 qs, err := extractQueryStrFromSsaValue(argVal) 52 assert.NoError(t, err) 53 assert.Equal(t, expectedQs, qs) 54 } 55 56 func (s *ExtractQueryStrTests) SubTestQueryStringThroughAddBinOp(t *testing.T) { 57 expectedQs := "SELECT id FROM table" 58 argVal := &ssa.BinOp{ 59 Op: token.ADD, 60 X: &ssa.Const{ 61 Value: constant.MakeString("SELECT "), 62 }, 63 Y: &ssa.Const{ 64 Value: constant.MakeString("id FROM table"), 65 }, 66 } 67 68 qs, err := extractQueryStrFromSsaValue(argVal) 69 assert.NoError(t, err) 70 assert.Equal(t, expectedQs, qs) 71 } 72 73 func (s *ExtractQueryStrTests) SubTestQueryStringThroughNestedAddBinOp(t *testing.T) { 74 expectedQs := "SELECT id FROM table WHERE id = 1" 75 argVal := &ssa.BinOp{ 76 Op: token.ADD, 77 X: &ssa.BinOp{ 78 Op: token.ADD, 79 X: &ssa.Const{ 80 Value: constant.MakeString("SELECT "), 81 }, 82 Y: &ssa.Const{ 83 Value: constant.MakeString("id FROM table"), 84 }, 85 }, 86 Y: &ssa.Const{ 87 Value: constant.MakeString(" WHERE id = 1"), 88 }, 89 } 90 91 qs, err := extractQueryStrFromSsaValue(argVal) 92 assert.NoError(t, err) 93 assert.Equal(t, expectedQs, qs) 94 } 95 96 func (s *ExtractQueryStrTests) SubTestQueryStringThroughUnsupportedBinOp(t *testing.T) { 97 argVal := &ssa.BinOp{ 98 Op: token.AND, 99 X: &ssa.Const{ 100 Value: constant.MakeString("SELECT "), 101 }, 102 Y: &ssa.Const{ 103 Value: constant.MakeString("id FROM table"), 104 }, 105 } 106 qs, err := extractQueryStrFromSsaValue(argVal) 107 assert.Error(t, err) 108 assert.Equal(t, "", qs) 109 } 110 111 func TestGoSource(t *testing.T) { 112 gtest.RunSubTests(t, &ExtractQueryStrTests{}) 113 }