From 6e8cbb38d49b751efd909b4be710ed8115ef7435 Mon Sep 17 00:00:00 2001 From: panw Date: Tue, 31 Mar 2026 16:44:43 +0800 Subject: [PATCH] test: add unit tests for database and Gitea client Co-Authored-By: Claude Opus 4.6 --- internal/database/database_test.go | 108 +++++++++++++++++++++++++++++ internal/gitea/client_test.go | 20 ++++++ 2 files changed, 128 insertions(+) create mode 100644 internal/database/database_test.go create mode 100644 internal/gitea/client_test.go diff --git a/internal/database/database_test.go b/internal/database/database_test.go new file mode 100644 index 0000000..553a975 --- /dev/null +++ b/internal/database/database_test.go @@ -0,0 +1,108 @@ +package database + +import ( + "os" + "testing" + "gitm/internal/models" +) + +func TestDatabase(t *testing.T) { + tmpDB := "/tmp/test_gitm.db" + defer os.Remove(tmpDB) + + if err := Initialize(tmpDB); err != nil { + t.Fatalf("Initialize failed: %v", err) + } + defer Close() + + t.Run("Settings", func(t *testing.T) { + if err := SetSetting("test_key", "test_value"); err != nil { + t.Fatal(err) + } + val, err := GetSetting("test_key") + if err != nil { + t.Fatal(err) + } + if val != "test_value" { + t.Errorf("expected test_value, got %s", val) + } + }) + + t.Run("ServerCRUD", func(t *testing.T) { + s := &models.GiteaServer{Name: "Test", URL: "https://test.com", Token: "tok", Status: "active"} + if err := CreateServer(s); err != nil { + t.Fatal(err) + } + if s.ID == 0 { + t.Error("ID not set") + } + + got, err := GetServer(s.ID) + if err != nil { + t.Fatal(err) + } + if got.Name != "Test" { + t.Error("name mismatch") + } + + servers, err := GetServers() + if err != nil { + t.Fatal(err) + } + if len(servers) != 1 { + t.Errorf("expected 1, got %d", len(servers)) + } + + if err := DeleteServer(s.ID); err != nil { + t.Fatal(err) + } + }) + + t.Run("RepoCRUD", func(t *testing.T) { + s := &models.GiteaServer{Name: "RepoTest", URL: "https://test.com", Token: "tok", Status: "active"} + CreateServer(s) + + r := &models.Repo{ServerID: s.ID, Name: "repo1", FullName: "user/repo1", CloneURL: "https://test.com/user/repo1.git", SyncStatus: "pending"} + if err := CreateRepo(r); err != nil { + t.Fatal(err) + } + + got, err := GetRepoByFullName(s.ID, "user/repo1") + if err != nil { + t.Fatal(err) + } + if got == nil || got.Name != "repo1" { + t.Error("repo not found") + } + + repos, err := GetReposByServer(s.ID) + if err != nil { + t.Fatal(err) + } + if len(repos) != 1 { + t.Errorf("expected 1, got %d", len(repos)) + } + + DeleteServer(s.ID) + }) + + t.Run("SyncLogs", func(t *testing.T) { + s := &models.GiteaServer{Name: "LogTest", URL: "https://test.com", Token: "tok", Status: "active"} + CreateServer(s) + + l := &models.SyncLog{ServerID: s.ID, Status: "success", Message: "test"} + if err := CreateSyncLog(l); err != nil { + t.Fatal(err) + } + + logs, err := GetSyncLogs(s.ID, 10, 0) + if err != nil { + t.Fatal(err) + } + if len(logs) != 1 { + t.Errorf("expected 1, got %d", len(logs)) + } + + DeleteServer(s.ID) + }) +} diff --git a/internal/gitea/client_test.go b/internal/gitea/client_test.go new file mode 100644 index 0000000..95f2a27 --- /dev/null +++ b/internal/gitea/client_test.go @@ -0,0 +1,20 @@ +package gitea + +import "testing" + +func TestNewClient(t *testing.T) { + client, err := NewClient("https://gitea.com", "") + if err != nil { + t.Fatal(err) + } + if client == nil { + t.Error("client is nil") + } +} + +func TestNewClientInvalidURL(t *testing.T) { + _, err := NewClient("://invalid", "") + if err == nil { + t.Error("expected error for invalid URL") + } +}