91 lines
2.7 KiB
Go
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)
|
|
}
|
|
}
|