Config: Enhance tests for configuration and database file names #5304

Signed-off-by: Michael Mayer <michael@photoprism.app>
This commit is contained in:
Michael Mayer 2025-11-02 11:49:00 +01:00
parent d6f0e808eb
commit 3874bc5422
7 changed files with 148 additions and 43 deletions

View file

@ -174,7 +174,7 @@ func TestConfig_DatabasePortString(t *testing.T) {
func TestConfig_DatabaseName(t *testing.T) {
c := NewConfig(CliTestContext())
resetDatabaseOptions(c)
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage/testdata/index.db?_busy_timeout=5000", c.DatabaseName())
assert.Equal(t, ProjectRoot+"/storage/testdata/index.db?_busy_timeout=5000", c.DatabaseName())
}
func TestConfig_DatabaseUser(t *testing.T) {
@ -251,13 +251,13 @@ func TestConfig_DatabaseDSN(t *testing.T) {
c.options.DatabaseDriver = "MariaDB"
assert.Equal(t, "photoprism:@tcp(localhost)/photoprism?charset=utf8mb4,utf8&collation=utf8mb4_unicode_ci&parseTime=true&timeout=15s", c.DatabaseDSN())
c.options.DatabaseDriver = "tidb"
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage/testdata/index.db?_busy_timeout=5000", c.DatabaseDSN())
assert.Equal(t, ProjectRoot+"/storage/testdata/index.db?_busy_timeout=5000", c.DatabaseDSN())
c.options.DatabaseDriver = "Postgres"
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage/testdata/index.db?_busy_timeout=5000", c.DatabaseDSN())
assert.Equal(t, ProjectRoot+"/storage/testdata/index.db?_busy_timeout=5000", c.DatabaseDSN())
c.options.DatabaseDriver = "SQLite"
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage/testdata/index.db?_busy_timeout=5000", c.DatabaseDSN())
assert.Equal(t, ProjectRoot+"/storage/testdata/index.db?_busy_timeout=5000", c.DatabaseDSN())
c.options.DatabaseDriver = ""
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage/testdata/index.db?_busy_timeout=5000", c.DatabaseDSN())
assert.Equal(t, ProjectRoot+"/storage/testdata/index.db?_busy_timeout=5000", c.DatabaseDSN())
}
func TestConfig_DatabaseDSNFlags(t *testing.T) {
@ -304,8 +304,8 @@ func TestConfig_DatabaseFile(t *testing.T) {
driver := c.DatabaseDriver()
assert.Equal(t, SQLite3, driver)
c.options.DatabaseDSN = ""
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage/testdata/index.db", c.DatabaseFile())
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage/testdata/index.db?_busy_timeout=5000", c.DatabaseDSN())
assert.Equal(t, ProjectRoot+"/storage/testdata/index.db", c.DatabaseFile())
assert.Equal(t, ProjectRoot+"/storage/testdata/index.db?_busy_timeout=5000", c.DatabaseDSN())
}
func TestConfig_DatabaseTimeout(t *testing.T) {

View file

@ -1,6 +1,8 @@
package config
import (
"os"
"path/filepath"
"strings"
"testing"
"time"
@ -30,7 +32,7 @@ func TestConfig_SidecarPath(t *testing.T) {
c.options.SidecarPath = ".photoprism"
assert.Equal(t, ".photoprism", c.SidecarPath())
c.options.SidecarPath = ""
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage/testdata/sidecar", c.SidecarPath())
assert.Equal(t, ProjectRoot+"/storage/testdata/sidecar", c.SidecarPath())
}
func TestConfig_SidecarYaml(t *testing.T) {
@ -135,7 +137,7 @@ func TestConfig_TempPath(t *testing.T) {
t.Logf("c.options.TempPath: '%s'", c.options.TempPath)
t.Logf("c.tempPath(): '%s'", d0)
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage/testdata/temp", c.tempPath())
assert.Equal(t, ProjectRoot+"/storage/testdata/temp", c.tempPath())
c.options.TempPath = ""
@ -192,22 +194,60 @@ func TestConfig_CmdLibPath(t *testing.T) {
func TestConfig_CachePath2(t *testing.T) {
c := NewConfig(CliTestContext())
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage/testdata/cache", c.CachePath())
assert.Equal(t, ProjectRoot+"/storage/testdata/cache", c.CachePath())
c.options.CachePath = ""
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage/testdata/cache", c.CachePath())
assert.Equal(t, ProjectRoot+"/storage/testdata/cache", c.CachePath())
}
func TestConfig_SettingsYaml(t *testing.T) {
t.Run("Default", func(t *testing.T) {
c := NewConfig(CliTestContext())
assert.Contains(t, c.SettingsYaml(), "settings.yml")
})
t.Run("PreferYamlExtension", func(t *testing.T) {
c := NewConfig(CliTestContext())
tempDir := t.TempDir()
c.options.ConfigPath = tempDir
yamlPath := filepath.Join(tempDir, "settings"+fs.ExtYaml)
if err := os.WriteFile(yamlPath, []byte("ui:\n"), fs.ModeFile); err != nil {
t.Fatalf("write %s: %v", yamlPath, err)
}
assert.Equal(t, yamlPath, c.SettingsYaml())
})
}
func TestConfig_HubConfigFile(t *testing.T) {
t.Run("Default", func(t *testing.T) {
c := NewConfig(CliTestContext())
assert.Contains(t, c.HubConfigFile(), "hub.yml")
})
t.Run("PreferYamlExtension", func(t *testing.T) {
c := NewConfig(CliTestContext())
tempDir := t.TempDir()
c.options.ConfigPath = tempDir
yamlPath := filepath.Join(tempDir, "hub"+fs.ExtYaml)
if err := os.WriteFile(yamlPath, []byte("host: example\n"), fs.ModeFile); err != nil {
t.Fatalf("write %s: %v", yamlPath, err)
}
assert.Equal(t, yamlPath, c.HubConfigFile())
})
}
func TestConfig_StoragePath(t *testing.T) {
c := NewConfig(CliTestContext())
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage/testdata", c.StoragePath())
assert.Equal(t, ProjectRoot+"/storage/testdata", c.StoragePath())
c.options.StoragePath = ""
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage/testdata/originals/.photoprism/storage", c.StoragePath())
assert.Equal(t, ProjectRoot+"/storage/testdata/originals/.photoprism/storage", c.StoragePath())
}
func TestConfig_TestdataPath(t *testing.T) {
c := NewConfig(CliTestContext())
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage/testdata/testdata", c.TestdataPath())
assert.Equal(t, ProjectRoot+"/storage/testdata/testdata", c.TestdataPath())
}
func TestConfig_AlbumsPath(t *testing.T) {
@ -218,13 +258,13 @@ func TestConfig_AlbumsPath(t *testing.T) {
// If this test fails, please manually move “albums” to the “backup” folder
// in the “storage/testdata” directory within your development environment:
// https://github.com/photoprism/photoprism/discussions/4520
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage/testdata/backup/albums", c.BackupAlbumsPath())
assert.Equal(t, ProjectRoot+"/storage/testdata/backup/albums", c.BackupAlbumsPath())
}
func TestConfig_OriginalsAlbumsPath(t *testing.T) {
c := NewConfig(CliTestContext())
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage/testdata/originals/albums", c.OriginalsAlbumsPath())
assert.Equal(t, ProjectRoot+"/storage/testdata/originals/albums", c.OriginalsAlbumsPath())
}
func TestConfig_CreateDirectories(t *testing.T) {
@ -419,21 +459,21 @@ func TestConfig_CreateDirectories2(t *testing.T) {
func TestConfig_PIDFilename2(t *testing.T) {
c := NewConfig(CliTestContext())
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage/testdata/photoprism.pid", c.PIDFilename())
c.options.PIDFilename = "/go/src/github.com/photoprism/photoprism/internal/config/testdata/test.pid"
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/internal/config/testdata/test.pid", c.PIDFilename())
assert.Equal(t, ProjectRoot+"/storage/testdata/photoprism.pid", c.PIDFilename())
c.options.PIDFilename = ProjectRoot + "/internal/config/testdata/test.pid"
assert.Equal(t, ProjectRoot+"/internal/config/testdata/test.pid", c.PIDFilename())
}
func TestConfig_LogFilename2(t *testing.T) {
c := NewConfig(CliTestContext())
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage/testdata/photoprism.log", c.LogFilename())
c.options.LogFilename = "/go/src/github.com/photoprism/photoprism/internal/config/testdata/test.log"
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/internal/config/testdata/test.log", c.LogFilename())
assert.Equal(t, ProjectRoot+"/storage/testdata/photoprism.log", c.LogFilename())
c.options.LogFilename = ProjectRoot + "/internal/config/testdata/test.log"
assert.Equal(t, ProjectRoot+"/internal/config/testdata/test.log", c.LogFilename())
}
func TestConfig_OriginalsPath2(t *testing.T) {
c := NewConfig(CliTestContext())
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage/testdata/originals", c.OriginalsPath())
assert.Equal(t, ProjectRoot+"/storage/testdata/originals", c.OriginalsPath())
c.options.OriginalsPath = ""
if s := c.OriginalsPath(); s != "" && s != "/photoprism/originals" {
t.Errorf("unexpected originals path: %s", s)
@ -467,7 +507,7 @@ func TestConfig_AssetsPath(t *testing.T) {
c := NewConfig(CliTestContext())
assert.True(t, strings.HasSuffix(c.AssetsPath(), "/assets"))
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/assets", c.AssetsPath())
assert.Equal(t, ProjectRoot+"/assets", c.AssetsPath())
c.options.AssetsPath = ""
if s := c.AssetsPath(); s != "" && s != "/opt/photoprism/assets" {
t.Errorf("unexpected assets path: %s", s)

View file

@ -14,6 +14,9 @@ import (
"github.com/photoprism/photoprism/pkg/fs"
)
// ProjectRoot references the project root directory for use in tests.
var ProjectRoot = fs.Abs("../../")
// Runs first when package is tested.
func init() {
hub.ApplyTestConfig()
@ -127,8 +130,21 @@ func TestConfig_OptionsYaml(t *testing.T) {
t.Run("ChangePath", func(t *testing.T) {
c := NewConfig(CliTestContext())
assert.Contains(t, c.OptionsYaml(), "options.yml")
c.options.ConfigPath = "/go/src/github.com/photoprism/photoprism/internal/config/testdata/"
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/internal/config/testdata/options.yml", c.OptionsYaml())
c.options.ConfigPath = ProjectRoot + "/internal/config/testdata/"
assert.Equal(t, ProjectRoot+"/internal/config/testdata/options.yml", c.OptionsYaml())
})
t.Run("PreferYamlExtension", func(t *testing.T) {
c := NewConfig(CliTestContext())
tempDir := t.TempDir()
c.options.ConfigPath = tempDir
c.options.OptionsYaml = ""
yamlPath := filepath.Join(tempDir, "options"+fs.ExtYaml)
if err := os.WriteFile(yamlPath, []byte("foo: bar\n"), fs.ModeFile); err != nil {
t.Fatalf("write %s: %v", yamlPath, err)
}
assert.Equal(t, yamlPath, c.OptionsYaml())
})
}
@ -163,7 +179,7 @@ func TestConfig_ImportPath(t *testing.T) {
c := NewConfig(CliTestContext())
c.AssertTestData(t)
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage/testdata/import", c.ImportPath())
assert.Equal(t, ProjectRoot+"/storage/testdata/import", c.ImportPath())
result := c.ImportPath()
assert.True(t, strings.HasPrefix(result, "/"))
assert.True(t, strings.HasSuffix(result, "/storage/testdata/import"))
@ -217,14 +233,14 @@ func TestConfig_ExamplesPath(t *testing.T) {
c := NewConfig(CliTestContext())
path := c.ExamplesPath()
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/assets/examples", path)
assert.Equal(t, ProjectRoot+"/assets/examples", path)
}
func TestConfig_TemplatesPath(t *testing.T) {
c := NewConfig(CliTestContext())
path := c.TemplatesPath()
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/assets/templates", path)
assert.Equal(t, ProjectRoot+"/assets/templates", path)
}
func TestConfig_CustomTemplatesPath(t *testing.T) {
@ -246,14 +262,14 @@ func TestConfig_StaticPath(t *testing.T) {
c := NewConfig(CliTestContext())
path := c.StaticPath()
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/assets/static", path)
assert.Equal(t, ProjectRoot+"/assets/static", path)
}
func TestConfig_StaticFile(t *testing.T) {
c := NewConfig(CliTestContext())
path := c.StaticFile("video/404.mp4")
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/assets/static/video/404.mp4", path)
assert.Equal(t, ProjectRoot+"/assets/static/video/404.mp4", path)
path = c.StaticFile("/img/logo.png")
assert.Equal(t, filepath.Join(c.StaticPath(), "img/logo.png"), path)
@ -263,7 +279,7 @@ func TestConfig_StaticBuildPath(t *testing.T) {
c := NewConfig(CliTestContext())
path := c.StaticBuildPath()
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/assets/static/build", path)
assert.Equal(t, ProjectRoot+"/assets/static/build", path)
}
func TestConfig_StaticBuildFile(t *testing.T) {
@ -277,7 +293,7 @@ func TestConfig_StaticImgPath(t *testing.T) {
c := NewConfig(CliTestContext())
result := c.StaticImgPath()
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/assets/static/img", result)
assert.Equal(t, ProjectRoot+"/assets/static/img", result)
}
func TestConfig_StaticImgFile(t *testing.T) {
@ -290,11 +306,11 @@ func TestConfig_StaticImgFile(t *testing.T) {
func TestConfig_ThemePath(t *testing.T) {
c := NewConfig(CliTestContext())
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage/testdata/config/theme", c.ThemePath())
assert.Equal(t, ProjectRoot+"/storage/testdata/config/theme", c.ThemePath())
c.SetThemePath("testdata/static/img/wallpaper")
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/internal/config/testdata/static/img/wallpaper", c.ThemePath())
assert.Equal(t, ProjectRoot+"/internal/config/testdata/static/img/wallpaper", c.ThemePath())
c.SetThemePath("")
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage/testdata/config/theme", c.ThemePath())
assert.Equal(t, ProjectRoot+"/storage/testdata/config/theme", c.ThemePath())
}
func TestConfig_IndexWorkers(t *testing.T) {

View file

@ -1,17 +1,35 @@
package config
import (
"os"
"path/filepath"
"strings"
"testing"
"github.com/stretchr/testify/assert"
"github.com/photoprism/photoprism/internal/ai/vision"
"github.com/photoprism/photoprism/pkg/fs"
)
func TestConfig_VisionYaml(t *testing.T) {
c := NewConfig(CliTestContext())
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage/testdata/config/vision.yml", c.VisionYaml())
t.Run("Default", func(t *testing.T) {
c := NewConfig(CliTestContext())
assert.Equal(t, ProjectRoot+"/storage/testdata/config/vision.yml", c.VisionYaml())
})
t.Run("PreferYamlExtension", func(t *testing.T) {
c := NewConfig(CliTestContext())
tempDir := t.TempDir()
c.options.ConfigPath = tempDir
c.options.VisionYaml = ""
yamlPath := filepath.Join(tempDir, "vision"+fs.ExtYaml)
if err := os.WriteFile(yamlPath, []byte("models: []\n"), fs.ModeFile); err != nil {
t.Fatalf("write %s: %v", yamlPath, err)
}
assert.Equal(t, yamlPath, c.VisionYaml())
})
}
func TestConfig_VisionApi(t *testing.T) {
@ -42,7 +60,7 @@ func TestConfig_ModelsPath(t *testing.T) {
path := c.NasnetModelPath()
assert.True(t, strings.HasPrefix(path, c.ModelsPath()))
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/assets/models/nasnet", path)
assert.Equal(t, ProjectRoot+"/assets/models/nasnet", path)
}
func TestConfig_TensorFlowDisabled(t *testing.T) {

View file

@ -9,13 +9,13 @@ import (
func TestNewDSN(t *testing.T) {
t.Run("File", func(t *testing.T) {
dsn := NewDSN("/go/src/github.com/photoprism/photoprism/storage/index.db?_busy_timeout=5000")
dsn := NewDSN(ProjectRoot + "/storage/index.db?_busy_timeout=5000")
assert.Equal(t, "", dsn.Driver)
assert.Equal(t, "", dsn.User)
assert.Equal(t, "", dsn.Password)
assert.Equal(t, "", dsn.Net)
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/storage", dsn.Server)
assert.Equal(t, ProjectRoot+"/storage", dsn.Server)
assert.Equal(t, "index.db", dsn.Name)
assert.Equal(t, "_busy_timeout=5000", dsn.Params)
})

View file

@ -49,6 +49,6 @@ func TestOptions_ExpandFilenames(t *testing.T) {
assert.Equal(t, "tmp", p.TempPath)
assert.Equal(t, "import", p.ImportPath)
p.expandFilenames()
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/internal/config/tmp", p.TempPath)
assert.Equal(t, "/go/src/github.com/photoprism/photoprism/internal/config/import", p.ImportPath)
assert.Equal(t, ProjectRoot+"/internal/config/tmp", p.TempPath)
assert.Equal(t, ProjectRoot+"/internal/config/import", p.ImportPath)
}

View file

@ -114,4 +114,35 @@ func TestConfigFilePath(t *testing.T) {
})
}
})
t.Run("DefaultExtensionPreferred", func(t *testing.T) {
tests := []struct {
name string
defaultExt string
altExt string
}{
{name: "yaml-vs-yml", defaultExt: ExtYaml, altExt: ExtYml},
{name: "html-vs-htm", defaultExt: ExtHTML, altExt: ExtHTM},
{name: "proto-vs-pb", defaultExt: ExtProto, altExt: ExtPb},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
dir := t.TempDir()
base := "prefer-" + tc.name
defaultPath := filepath.Join(dir, base+tc.defaultExt)
if err := os.WriteFile(defaultPath, []byte("default"), ModeFile); err != nil {
t.Fatalf("write %s: %v", defaultPath, err)
}
altPath := filepath.Join(dir, base+tc.altExt)
if err := os.WriteFile(altPath, []byte("alt"), ModeFile); err != nil {
t.Fatalf("write %s: %v", altPath, err)
}
got := ConfigFilePath(dir, base, tc.defaultExt)
assert.Equal(t, defaultPath, got)
})
}
})
}