118 lines
2.6 KiB
Go
118 lines
2.6 KiB
Go
package repository
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"errors"
|
|
"testing"
|
|
)
|
|
|
|
// mockQueryer implements sqlQueryer for testing
|
|
type mockQueryer struct {
|
|
rows *sql.Rows
|
|
err error
|
|
}
|
|
|
|
func (m *mockQueryer) QueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error) {
|
|
return m.rows, m.err
|
|
}
|
|
|
|
func TestScanSingleRow_QueryError(t *testing.T) {
|
|
ctx := context.Background()
|
|
mockErr := errors.New("query failed")
|
|
q := &mockQueryer{err: mockErr}
|
|
|
|
var dest int
|
|
err := scanSingleRow(ctx, q, "SELECT 1", nil, &dest)
|
|
if err == nil {
|
|
t.Fatal("expected error, got nil")
|
|
}
|
|
if !errors.Is(err, mockErr) {
|
|
t.Errorf("expected query error, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestScanSingleRow_NoRows(t *testing.T) {
|
|
// This test requires a real database connection to create sql.Rows.
|
|
// scanSingleRow is designed to work with any sqlQueryer, but creating
|
|
// a mock sql.Rows without a real driver is complex.
|
|
// We test the behavior through integration with the test database.
|
|
db := openTestDB(t)
|
|
ctx := context.Background()
|
|
|
|
// Use the raw sql.DB from gorm
|
|
sqlDB, err := db.DB()
|
|
if err != nil {
|
|
t.Fatalf("get sql.DB failed: %v", err)
|
|
}
|
|
|
|
var dest int
|
|
err = scanSingleRow(ctx, sqlDB, "SELECT 1 WHERE 1=0", nil, &dest)
|
|
if err == nil {
|
|
t.Fatal("expected error for no rows, got nil")
|
|
}
|
|
if !errors.Is(err, sql.ErrNoRows) {
|
|
t.Errorf("expected sql.ErrNoRows, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestScanSingleRow_Success(t *testing.T) {
|
|
db := openTestDB(t)
|
|
ctx := context.Background()
|
|
|
|
sqlDB, err := db.DB()
|
|
if err != nil {
|
|
t.Fatalf("get sql.DB failed: %v", err)
|
|
}
|
|
|
|
var dest int
|
|
err = scanSingleRow(ctx, sqlDB, "SELECT 42", nil, &dest)
|
|
if err != nil {
|
|
t.Fatalf("expected no error, got %v", err)
|
|
}
|
|
if dest != 42 {
|
|
t.Errorf("expected 42, got %d", dest)
|
|
}
|
|
}
|
|
|
|
func TestScanSingleRow_MultipleColumns(t *testing.T) {
|
|
db := openTestDB(t)
|
|
ctx := context.Background()
|
|
|
|
sqlDB, err := db.DB()
|
|
if err != nil {
|
|
t.Fatalf("get sql.DB failed: %v", err)
|
|
}
|
|
|
|
var a, b int
|
|
err = scanSingleRow(ctx, sqlDB, "SELECT 1, 2", nil, &a, &b)
|
|
if err != nil {
|
|
t.Fatalf("expected no error, got %v", err)
|
|
}
|
|
if a != 1 {
|
|
t.Errorf("expected a=1, got %d", a)
|
|
}
|
|
if b != 2 {
|
|
t.Errorf("expected b=2, got %d", b)
|
|
}
|
|
}
|
|
|
|
func TestScanSingleRow_StringResult(t *testing.T) {
|
|
db := openTestDB(t)
|
|
ctx := context.Background()
|
|
|
|
sqlDB, err := db.DB()
|
|
if err != nil {
|
|
t.Fatalf("get sql.DB failed: %v", err)
|
|
}
|
|
|
|
var dest string
|
|
err = scanSingleRow(ctx, sqlDB, "SELECT 'hello'", nil, &dest)
|
|
if err != nil {
|
|
t.Fatalf("expected no error, got %v", err)
|
|
}
|
|
if dest != "hello" {
|
|
t.Errorf("expected 'hello', got %q", dest)
|
|
}
|
|
}
|