初始化
This commit is contained in:
239
database_test.go
Normal file
239
database_test.go
Normal file
@@ -0,0 +1,239 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestStoreProjectAndSnapshot(t *testing.T) {
|
||||
s, e := OpenStore(filepath.Join(t.TempDir(), "test.db"))
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
defer s.db.Close()
|
||||
dir := t.TempDir()
|
||||
p, e := s.SaveProject(0, ProjectInput{Name: "demo", Path: dir})
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
if _, e = s.SaveProject(0, ProjectInput{Name: "duplicate", Path: dir}); e == nil {
|
||||
t.Fatal("duplicate path accepted")
|
||||
}
|
||||
e = s.ReplaceScan(p.ID, []LanguageStat{{Name: "Go", Files: 1, Code: 2, Comments: 1, Blanks: 1}}, []FileEntry{{Path: "main.go", Name: "main.go", Extension: ".go", Size: 20}})
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
got, e := s.GetProject(p.ID)
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
if got.Stats.TotalLines != 4 || got.Stats.FileCount != 1 {
|
||||
t.Fatalf("unexpected stats: %#v", got.Stats)
|
||||
}
|
||||
}
|
||||
|
||||
func TestNormalizePath(t *testing.T) {
|
||||
if _, e := normalizePath(filepath.Join(t.TempDir(), "missing")); e == nil {
|
||||
t.Fatal("missing directory accepted")
|
||||
}
|
||||
d := t.TempDir()
|
||||
p, e := normalizePath(d)
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
if _, e = os.Stat(p); e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
}
|
||||
|
||||
func TestDuplicateProjectReturnsStableCode(t *testing.T) {
|
||||
s, e := OpenStore(filepath.Join(t.TempDir(), "test.db"))
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
defer s.db.Close()
|
||||
dir := t.TempDir()
|
||||
if _, e = s.SaveProject(0, ProjectInput{Name: "one", Path: dir}); e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
if _, e = s.SaveProject(0, ProjectInput{Name: "two", Path: dir}); e == nil || !strings.HasPrefix(e.Error(), "PROJECT_PATH_DUPLICATE") {
|
||||
t.Fatalf("unexpected error: %v", e)
|
||||
}
|
||||
}
|
||||
|
||||
func TestProjectGroupsFilterProjectsAndDashboard(t *testing.T) {
|
||||
s, e := OpenStore(filepath.Join(t.TempDir(), "groups.db"))
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
defer s.db.Close()
|
||||
g, e := s.SaveProjectGroup(0, "Backend")
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
dir1 := t.TempDir()
|
||||
dir2 := t.TempDir()
|
||||
p1, e := s.SaveProject(0, ProjectInput{Name: "api", Path: dir1, GroupID: g.ID})
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
if _, e = s.SaveProject(0, ProjectInput{Name: "web", Path: dir2}); e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
if e = s.ReplaceScan(p1.ID, []LanguageStat{{Name: "Go", Files: 2, Code: 10, Comments: 1, Blanks: 1}}, nil); e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
projects, e := s.ListProjects(g.ID)
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
if len(projects) != 1 || projects[0].GroupID != g.ID || projects[0].GroupName != "Backend" {
|
||||
t.Fatalf("unexpected grouped projects: %#v", projects)
|
||||
}
|
||||
d, e := s.Dashboard(g.ID)
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
if d.Projects != 1 || d.TotalLines != 12 {
|
||||
t.Fatalf("unexpected dashboard: %#v", d)
|
||||
}
|
||||
}
|
||||
|
||||
func TestDeleteProjectGroupMovesProjectsToDefault(t *testing.T) {
|
||||
s, e := OpenStore(filepath.Join(t.TempDir(), "groups.db"))
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
defer s.db.Close()
|
||||
g, e := s.SaveProjectGroup(0, "Temp")
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
p, e := s.SaveProject(0, ProjectInput{Name: "demo", Path: t.TempDir(), GroupID: g.ID})
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
if e = s.DeleteProjectGroup(g.ID); e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
got, e := s.GetProject(p.ID)
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
if got.GroupID != 1 {
|
||||
t.Fatalf("groupId=%d want 1", got.GroupID)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSettingsReturnsActiveDatabasePath(t *testing.T) {
|
||||
dbPath := filepath.Join(t.TempDir(), "active.db")
|
||||
s, e := OpenStore(dbPath)
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
defer s.db.Close()
|
||||
settings, e := s.Settings()
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
if settings.DatabasePath != dbPath {
|
||||
t.Fatalf("databasePath=%q want %q", settings.DatabasePath, dbPath)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGlassOpacityPersistsAndValidates(t *testing.T) {
|
||||
s, e := OpenStore(filepath.Join(t.TempDir(), "settings.db"))
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
defer s.db.Close()
|
||||
if e = s.SaveSettings(AppSettings{Theme: "dark", Locale: "zh-CN", GitScope: "current", AutoRefresh: true, GlassOpacity: 30}); e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
got, e := s.Settings()
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
if got.GlassOpacity != 30 {
|
||||
t.Fatalf("glassOpacity=%d", got.GlassOpacity)
|
||||
}
|
||||
if e = s.SaveSettings(AppSettings{GlassOpacity: 99}); e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
got, e = s.Settings()
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
if got.GlassOpacity != 55 {
|
||||
t.Fatalf("invalid opacity did not reset: %d", got.GlassOpacity)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadingStylePersistsAndValidates(t *testing.T) {
|
||||
s, e := OpenStore(filepath.Join(t.TempDir(), "settings.db"))
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
defer s.db.Close()
|
||||
if e = s.SaveSettings(AppSettings{Theme: "dark", Locale: "zh-CN", GitScope: "current", AutoRefresh: true, GlassOpacity: 55, LoadingStyle: "fullscreen-grid"}); e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
got, e := s.Settings()
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
if got.LoadingStyle != "fullscreen-grid" {
|
||||
t.Fatalf("loadingStyle=%q", got.LoadingStyle)
|
||||
}
|
||||
if e = s.SaveSettings(AppSettings{GlassOpacity: 55, LoadingStyle: "floating"}); e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
got, e = s.Settings()
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
if got.LoadingStyle != "fullscreen-orbit" {
|
||||
t.Fatalf("invalid loadingStyle did not reset: %q", got.LoadingStyle)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLegacyLoadingStyleDefaultMigratesOnce(t *testing.T) {
|
||||
db := filepath.Join(t.TempDir(), "settings.db")
|
||||
s, e := OpenStore(db)
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
if _, e = s.db.Exec(`UPDATE settings SET value='bar' WHERE key='loadingStyle'`); e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
s.db.Close()
|
||||
s, e = OpenStore(db)
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
got, e := s.Settings()
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
if got.LoadingStyle != "fullscreen-orbit" {
|
||||
t.Fatalf("legacy loadingStyle=%q", got.LoadingStyle)
|
||||
}
|
||||
if e = s.SaveSettings(AppSettings{GlassOpacity: 55, LoadingStyle: "bar"}); e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
s.db.Close()
|
||||
s, e = OpenStore(db)
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
defer s.db.Close()
|
||||
got, e = s.Settings()
|
||||
if e != nil {
|
||||
t.Fatal(e)
|
||||
}
|
||||
if got.LoadingStyle != "bar" {
|
||||
t.Fatalf("explicit loadingStyle=%q", got.LoadingStyle)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user