精简后的项目:仅保留 api/ui 源码、文档、构建依赖

This commit is contained in:
gallery
2026-09-11 16:11:09 +08:00
commit 490e85634e
457 changed files with 86862 additions and 0 deletions
+21
View File
@@ -0,0 +1,21 @@
package test_utils
import (
"path/filepath"
"runtime"
)
// PathFromAPIRoot returns the real path in the API project root.
func PathFromAPIRoot(rootRelatedPaths ...string) string {
_, file, _, ok := runtime.Caller(0)
if !ok {
panic("Can't get the path of current function. It should not happen.")
}
base := filepath.Dir(file)
args := make([]string, 0, len(rootRelatedPaths)+2)
args = append(args, []string{base, ".."}...)
args = append(args, rootRelatedPaths...)
return filepath.Join(args...)
}
+23
View File
@@ -0,0 +1,23 @@
package test_utils
import (
"strings"
"testing"
)
func TestPathFromAPIRoot(t *testing.T) {
tests := []struct {
paths []string
want string
}{
{[]string{"server.go"}, "/api/server.go"},
{[]string{"scanner", "..", "server.go"}, "/api/server.go"},
{[]string{"scanner", "scanner_test.go"}, "/api/scanner/scanner_test.go"},
}
for _, tc := range tests {
if got, want := PathFromAPIRoot(tc.paths...), tc.want; !strings.HasSuffix(got, want) {
t.Fatalf("PathFromAPIRoot(%v) = %q, want a suffix: %q", tc.paths, got, want)
}
}
}
+16
View File
@@ -0,0 +1,16 @@
package flags
import "flag"
var (
// Database enables database-integration tests when the `-database` flag is passed to `go test`.
Database bool
// Filesystem enables filesystem-integration tests when the `-filesystem` flag is passed to `go test`.
Filesystem bool
)
func init() {
flag.BoolVar(&Database, "database", false, "run database integration tests")
flag.BoolVar(&Filesystem, "filesystem", false, "run filesystem integration tests")
}
+79
View File
@@ -0,0 +1,79 @@
package test_utils
import (
"flag"
"log"
"os"
"testing"
"github.com/joho/godotenv"
"github.com/photoview/photoview/api/scanner/externaltools/exif"
"github.com/photoview/photoview/api/scanner/media_encoding/executable_worker"
"github.com/photoview/photoview/api/test_utils/flags"
"github.com/photoview/photoview/api/utils"
"gorm.io/gorm"
)
var test_dbm TestDBManager = TestDBManager{}
func UnitTestRun(m *testing.M) {
exitCode := 1
defer func() {
os.Exit(exitCode)
}()
flag.Parse()
exitCode = m.Run()
}
func IntegrationTestRun(m *testing.M) {
exitCode := 1
defer func() {
os.Exit(exitCode)
}()
flag.Parse()
if flags.Database {
envPath := PathFromAPIRoot("testing.env")
if err := godotenv.Load(envPath); err != nil {
log.Println("No testing.env file found")
}
}
defer test_dbm.Close()
faceModelsPath := PathFromAPIRoot("data", "models")
utils.ConfigureTestFaceRecognitionModelsPath(faceModelsPath)
exifCleanup, err := exif.Initialize()
if err != nil {
log.Panicf("init exif error: %v", err)
}
defer exifCleanup()
terminateWorkers := executable_worker.Initialize()
defer terminateWorkers()
exitCode = m.Run()
}
func FilesystemTest(t *testing.T) {
if !flags.Filesystem {
t.Skip("Filesystem integration tests disabled")
}
utils.ConfigureTestCache(t.TempDir())
}
func DatabaseTest(t *testing.T) *gorm.DB {
if !flags.Database {
t.Skip("Database integration tests disabled")
}
if err := test_dbm.SetupAndReset(); err != nil {
t.Fatalf("failed to setup or reset test database: %v", err)
}
return test_dbm.DB
}
+49
View File
@@ -0,0 +1,49 @@
package scanner_utils
import (
"testing"
"time"
"github.com/photoview/photoview/api/graphql/models"
"github.com/photoview/photoview/api/scanner/scanner_queue"
"github.com/stretchr/testify/assert"
"gorm.io/gorm"
)
func RunScannerOnUser(t *testing.T, db *gorm.DB, user *models.User) {
start := time.Now()
defer func() {
dur := time.Now().Sub(start)
t.Logf("RunScannerOnUser(user(id:%d)) took %s.", user.ID, dur)
}()
if !assert.NoError(t, scanner_queue.InitializeScannerQueue(db)) {
return
}
if !assert.NoError(t, scanner_queue.AddUserToQueue(user)) {
return
}
// wait for all jobs to finish
scanner_queue.CloseScannerQueue()
}
func RunScannerAll(t *testing.T, db *gorm.DB) {
start := time.Now()
defer func() {
dur := time.Now().Sub(start)
t.Logf("RunScannerAll() took %s.", dur)
}()
if !assert.NoError(t, scanner_queue.InitializeScannerQueue(db)) {
return
}
if !assert.NoError(t, scanner_queue.AddAllToQueue()) {
return
}
// wait for all jobs to finish
scanner_queue.CloseScannerQueue()
}
+65
View File
@@ -0,0 +1,65 @@
package test_utils
import (
"fmt"
"github.com/photoview/photoview/api/database"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
type TestDBManager struct {
DB *gorm.DB
}
func (dbm *TestDBManager) SetupAndReset() error {
if dbm.DB == nil {
if err := dbm.setup(); err != nil {
return fmt.Errorf("setup db error: %w", err)
}
}
return dbm.reset()
}
func (dbm *TestDBManager) Close() error {
if dbm.DB == nil {
return nil
}
sqlDB, err := dbm.DB.DB()
if err != nil {
return fmt.Errorf("get db instance when closing test database error: %w", err)
}
sqlDB.Close()
dbm.DB = nil
return nil
}
func (dbm *TestDBManager) setup() error {
config := gorm.Config{
Logger: logger.Default.LogMode(logger.Warn),
}
db, err := database.ConfigureDatabase(&config)
if err != nil {
return fmt.Errorf("configure test database error: %w", err)
}
dbm.DB = db
return nil
}
func (dbm *TestDBManager) reset() error {
if err := database.ClearDatabase(dbm.DB); err != nil {
return fmt.Errorf("clean database error: %w", err)
}
if err := database.MigrateDatabase(dbm.DB); err != nil {
return fmt.Errorf("migrate database error: %w", err)
}
return nil
}