photoprism/internal/entity/query/covers_test.go
Keith Martin b6687b6c29
Tests: Improve isolation and add fixes #5263
* Tests: fix random selection of deleted record causing test failure
* Tests: fix test folders being left after test
* Tests: ensure that required records are available
* Tests: make each package execute against it's own testdata folder to ensure no interpackage test failures
* Tests: add unit tests of CleanupTestFolder
* Tests:  Allow defer in TestMain
* Tests: rename testMain to runTestMain
2026-07-12 05:47:21 +02:00

149 lines
4.5 KiB
Go

package query
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/photoprism/photoprism/internal/entity"
)
func TestUpdateAlbumManualCovers(t *testing.T) {
assert.NoError(t, UpdateAlbumManualCovers())
}
func TestUpdateAlbumManualCoversFiltered(t *testing.T) {
var album entity.Album
assert.NoError(t, UpdateAlbumManualCovers())
if err := UnscopedDb().Where("album_type = ? AND thumb_src = ? AND thumb <> ''", entity.AlbumManual, entity.SrcAuto).First(&album).Error; err != nil {
t.Skipf("no auto-managed manual album available: %v", err)
}
origThumb := album.Thumb
origSrc := album.ThumbSrc
t.Cleanup(func() {
_ = entity.UpdateAlbum(album.AlbumUID, entity.Values{"thumb": origThumb, "thumb_src": origSrc})
entity.FlushAlbumCache()
})
require.NoError(t, entity.UpdateAlbum(album.AlbumUID, entity.Values{"thumb": "", "thumb_src": entity.SrcAuto}))
entity.FlushAlbumCache()
require.NoError(t, UpdateAlbumManualCovers(album))
entity.FlushAlbumCache()
refreshed, err := AlbumByUID(album.AlbumUID)
require.NoError(t, err)
assert.NotEmpty(t, refreshed.Thumb)
}
func TestUpdateAlbumFolderCovers(t *testing.T) {
assert.NoError(t, UpdateAlbumFolderCovers())
}
func TestUpdateAlbumFolderCoversFiltered(t *testing.T) {
var album entity.Album
assert.NoError(t, UpdateAlbumFolderCovers())
if err := UnscopedDb().Where("album_type = ? AND thumb_src = ? AND album_path <> '' AND thumb <> ''", entity.AlbumFolder, entity.SrcAuto).First(&album).Error; err != nil {
t.Skipf("no auto-managed folder album available: %v", err)
}
origThumb := album.Thumb
origSrc := album.ThumbSrc
t.Cleanup(func() {
_ = entity.UpdateAlbum(album.AlbumUID, entity.Values{"thumb": origThumb, "thumb_src": origSrc})
entity.FlushAlbumCache()
})
require.NoError(t, entity.UpdateAlbum(album.AlbumUID, entity.Values{"thumb": "", "thumb_src": entity.SrcAuto}))
entity.FlushAlbumCache()
require.NoError(t, UpdateAlbumFolderCovers(album))
entity.FlushAlbumCache()
refreshed, err := AlbumByUID(album.AlbumUID)
require.NoError(t, err)
assert.NotEmpty(t, refreshed.Thumb)
}
func TestUpdateAlbumMonthCovers(t *testing.T) {
assert.NoError(t, UpdateAlbumMonthCovers())
}
func TestUpdateAlbumMonthCoversFiltered(t *testing.T) {
var album entity.Album
if err := UnscopedDb().Where("album_type = ? AND thumb_src = ? AND album_year <> 0 AND thumb <> ''", entity.AlbumMonth, entity.SrcAuto).First(&album).Error; err != nil {
t.Skipf("no auto-managed monthly album available: %v", err)
}
origThumb := album.Thumb
origSrc := album.ThumbSrc
t.Cleanup(func() {
_ = entity.UpdateAlbum(album.AlbumUID, entity.Values{"thumb": origThumb, "thumb_src": origSrc})
entity.FlushAlbumCache()
})
require.NoError(t, entity.UpdateAlbum(album.AlbumUID, entity.Values{"thumb": "", "thumb_src": entity.SrcAuto}))
entity.FlushAlbumCache()
require.NoError(t, UpdateAlbumMonthCovers(album))
entity.FlushAlbumCache()
refreshed, err := AlbumByUID(album.AlbumUID)
require.NoError(t, err)
assert.NotEmpty(t, refreshed.Thumb)
}
func TestUpdateAlbumCovers(t *testing.T) {
assert.NoError(t, UpdateAlbumCovers())
}
func TestUpdateLabelCovers(t *testing.T) {
assert.NoError(t, UpdateLabelCovers())
}
func TestUpdateSubjectCovers(t *testing.T) {
assert.NoError(t, UpdateSubjectCovers(false))
assert.NoError(t, UpdateSubjectCovers(true))
}
func TestUpdateCovers(t *testing.T) {
// coversBusy.Store(true)
UpdateCoversAsync()
// Drain the async goroutine so it doesn't race the next test that
// might temporarily swap out the entity DB provider.
entity.WaitForAsyncJobs()
assert.NoError(t, UpdateCovers())
}
func TestUpdateCovers_NilDbReturnsCleanly(t *testing.T) {
// Mirrors TestUpdateCounts_NilDbReturnsCleanly: after CloseDb has
// nilled the entity DB provider, UpdateCovers must return nil instead
// of panicking on a nil dialect lookup so a stray UpdateCoversAsync
// goroutine does not crash the process during shutdown.
prev := swapDbProvider(nil)
defer swapDbProvider(prev)
assert.NoError(t, UpdateCovers())
}
// swapDbProvider replaces the package-level entity DB provider with the
// supplied value and returns a snapshot of the previous one wrapped in
// staticDbProvider so callers can restore the original *gorm.DB. The
// query package's staticDbProvider helper is reused to mirror existing
// override patterns in faces_test.go.
func swapDbProvider(p entity.Gorm) entity.Gorm {
var prev entity.Gorm
if currentDb := entity.Db(); currentDb != nil {
prev = staticDbProvider{db: currentDb}
}
entity.SetDbProvider(p)
return prev
}