精简后的项目:仅保留 api/ui 源码、文档、构建依赖
This commit is contained in:
@@ -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...)
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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")
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user