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  }