Files
GitOcean-Old/internal/app/scan_test.go
T
2026-06-08 15:03:41 -05:00

91 lines
2.7 KiB
Go

package app
import (
"database/sql"
"testing"
"time"
"github.com/DATA-DOG/go-sqlmock"
)
type stubScanner struct {
values []any
err error
}
func (s stubScanner) Scan(dest ...any) error {
if s.err != nil {
return s.err
}
for i := range dest {
switch d := dest[i].(type) {
case *int64:
*d = s.values[i].(int64)
case *int:
*d = s.values[i].(int)
case *string:
*d = s.values[i].(string)
case *time.Time:
*d = s.values[i].(time.Time)
case *sql.NullTime:
*d = s.values[i].(sql.NullTime)
default:
panic("unsupported scan dest")
}
}
return nil
}
func TestScanOnePR(t *testing.T) {
now := time.Date(2026, 1, 2, 3, 4, 5, 0, time.UTC)
closed := sql.NullTime{Time: now.Add(time.Hour), Valid: true}
pr, err := scanOnePR(stubScanner{values: []any{
int64(1), 2, int64(3), int64(4), int64(5),
"author", "source-owner", "source-repo", "feature", "target-owner", "target-repo", "main",
"title", "desc", "closed", now, now, closed, sql.NullTime{},
}})
if err != nil {
t.Fatal(err)
}
if pr.ID != 1 || pr.Number != 2 || pr.Author != "author" || pr.ClosedAt == nil || pr.MergedAt != nil {
t.Fatalf("unexpected PR: %#v", pr)
}
}
func TestScanReposAndPRRows(t *testing.T) {
db, mock, err := sqlmock.New()
if err != nil {
t.Fatal(err)
}
defer db.Close()
now := time.Now().UTC()
mock.ExpectQuery("repos").WillReturnRows(sqlmock.NewRows([]string{"id", "owner_user_id", "owner", "name", "visibility", "description", "default_branch", "archived", "forked_from_repository_id", "created_at", "updated_at"}).AddRow(int64(1), int64(2), "alice", "demo", "public", "desc", "main", false, sql.NullInt64{Int64: 9, Valid: true}, now, now))
rows, err := db.Query("repos")
if err != nil {
t.Fatal(err)
}
repos, err := scanRepos(rows)
if err != nil {
t.Fatal(err)
}
if len(repos) != 1 || repos[0].ForkedFromID == nil || *repos[0].ForkedFromID != 9 {
t.Fatalf("unexpected repos: %#v", repos)
}
mock.ExpectQuery("prs").WillReturnRows(sqlmock.NewRows([]string{"id", "number", "target_repository_id", "source_repository_id", "author_user_id", "author", "source_owner", "source_repo", "source_branch", "target_owner", "target_repo", "target_branch", "title", "description", "status", "created_at", "updated_at", "closed_at", "merged_at"}).AddRow(int64(1), 2, int64(3), int64(4), int64(5), "author", "so", "sr", "feature", "to", "tr", "main", "title", "desc", "open", now, now, sql.NullTime{}, sql.NullTime{}))
prRows, err := db.Query("prs")
if err != nil {
t.Fatal(err)
}
prs, err := scanPRs(prRows)
if err != nil {
t.Fatal(err)
}
if len(prs) != 1 || prs[0].Number != 2 || prs[0].Status != "open" {
t.Fatalf("unexpected prs: %#v", prs)
}
if err := mock.ExpectationsWereMet(); err != nil {
t.Fatal(err)
}
}