Create comprehensive documentation for future Claude Code instances working in this repository, including: - Development commands for testing, building, and code quality - Core architecture overview of the SQL query builder system - Directory structure and component explanations - Testing patterns and conventions - Key dependencies and their purposes 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
95 lines
2.2 KiB
Go
95 lines
2.2 KiB
Go
package exec
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"git.fsdpf.net/go/db/exp"
|
|
"github.com/DATA-DOG/go-sqlmock"
|
|
"github.com/stretchr/testify/suite"
|
|
)
|
|
|
|
type scannerSuite struct {
|
|
suite.Suite
|
|
}
|
|
|
|
func TestScanner(t *testing.T) {
|
|
suite.Run(t, &scannerSuite{})
|
|
}
|
|
|
|
func (s *scannerSuite) TestScanStructs() {
|
|
type StructWithTags struct {
|
|
Address string `db:"address"`
|
|
Name string `db:"name"`
|
|
}
|
|
db, mock, err := sqlmock.New()
|
|
s.Require().NoError(err)
|
|
|
|
mock.ExpectQuery(`SELECT \* FROM "items"`).
|
|
WithArgs().
|
|
WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).
|
|
AddRow(testAddr1, testName1).
|
|
AddRow(testAddr2, testName2),
|
|
)
|
|
rows, err := db.Query(`SELECT * FROM "items"`)
|
|
s.Require().NoError(err)
|
|
|
|
sc := NewScanner(rows)
|
|
|
|
result := make([]StructWithTags, 0)
|
|
err = sc.ScanStructs(result)
|
|
s.Require().EqualError(err, errUnsupportedScanStructsType.Error())
|
|
|
|
err = sc.ScanStructs(&result)
|
|
s.Require().NoError(err)
|
|
s.Require().ElementsMatch(
|
|
[]StructWithTags{{Address: testAddr1, Name: testName1}, {Address: testAddr2, Name: testName2}},
|
|
result,
|
|
)
|
|
}
|
|
|
|
func (s *scannerSuite) TestScanVals() {
|
|
db, mock, err := sqlmock.New()
|
|
s.Require().NoError(err)
|
|
|
|
mock.ExpectQuery(`SELECT "id" FROM "items"`).
|
|
WithArgs().
|
|
WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1).AddRow(2))
|
|
|
|
rows, err := db.Query(`SELECT "id" FROM "items"`)
|
|
s.Require().NoError(err)
|
|
|
|
sc := NewScanner(rows)
|
|
|
|
result := make([]int, 0)
|
|
err = sc.ScanVals(result)
|
|
s.Require().EqualError(err, errUnsupportedScanValsType.Error())
|
|
|
|
err = sc.ScanVals(&result)
|
|
s.Require().NoError(err)
|
|
s.Require().ElementsMatch([]int{1, 2}, result)
|
|
}
|
|
|
|
func (s *scannerSuite) TestGetRecords() {
|
|
db, mock, err := sqlmock.New()
|
|
s.Require().NoError(err)
|
|
|
|
mock.ExpectQuery("SELECT \\* FROM `items`").
|
|
WithArgs().
|
|
WillReturnRows(
|
|
sqlmock.NewRows([]string{"address", "name"}).
|
|
AddRow("111 Test Addr", "Test1").
|
|
AddRow("111 Test Addr", "Test1"),
|
|
)
|
|
|
|
rows, err := db.Query("SELECT \\* FROM `items`")
|
|
s.Require().NoError(err)
|
|
|
|
result, err := NewScanner(rows).GetRecords()
|
|
s.Require().NoError(err)
|
|
|
|
s.Equal([]exp.Record{
|
|
{"address": "111 Test Addr", "name": "Test1"},
|
|
{"address": "111 Test Addr", "name": "Test1"},
|
|
}, result)
|
|
}
|