photoprism/internal/entity/details_test.go
Michael Mayer 82d61d1f93 File Types: Add experimental support for animated GIFs #590 #2207
Animated GIFs are transcoded to AVC because it is much smaller and
thus also suitable for long/large animations. In addition, this commit
adds support for more metadata fields such as frame rate, number of
frames, file capture timestamp (unix milliseconds), media type,
and software version. Support for SVG files can later be implemented in
a similar way.
2022-04-13 22:17:59 +02:00

358 lines
11 KiB
Go

package entity
import (
"testing"
"time"
"github.com/stretchr/testify/assert"
)
func TestFirstOrCreateDetails(t *testing.T) {
t.Run("not existing details", func(t *testing.T) {
details := &Details{PhotoID: 123, Keywords: ""}
details = FirstOrCreateDetails(details)
if details == nil {
t.Fatal("details should not be nil")
}
})
t.Run("existing details", func(t *testing.T) {
details := &Details{PhotoID: 1000000}
details = FirstOrCreateDetails(details)
if details == nil {
t.Fatal("details should not be nil")
}
})
t.Run("error", func(t *testing.T) {
details := &Details{PhotoID: 0}
assert.Nil(t, FirstOrCreateDetails(details))
})
}
func TestDetails_NoKeywords(t *testing.T) {
t.Run("no keywords", func(t *testing.T) {
description := &Details{PhotoID: 123, Keywords: ""}
assert.Equal(t, true, description.NoKeywords())
assert.False(t, description.HasKeywords())
})
t.Run("keywords", func(t *testing.T) {
description := &Details{PhotoID: 123, Keywords: "test cat dog", Subject: "animals", Artist: "Bender", Notes: "notes", Copyright: "copy"}
assert.Equal(t, false, description.NoKeywords())
assert.True(t, description.HasKeywords())
})
}
func TestDetails_NoSubject(t *testing.T) {
t.Run("no subject", func(t *testing.T) {
description := &Details{PhotoID: 123, Subject: ""}
assert.Equal(t, true, description.NoSubject())
assert.False(t, description.HasSubject())
})
t.Run("subject", func(t *testing.T) {
description := &Details{PhotoID: 123, Keywords: "test cat dog", Subject: "animals", Artist: "Bender", Notes: "notes", Copyright: "copy"}
assert.Equal(t, false, description.NoSubject())
assert.True(t, description.HasSubject())
})
}
func TestDetails_NoNotes(t *testing.T) {
t.Run("no notes", func(t *testing.T) {
description := &Details{PhotoID: 123, Notes: ""}
assert.Equal(t, true, description.NoNotes())
assert.False(t, description.HasNotes())
})
t.Run("notes", func(t *testing.T) {
description := &Details{PhotoID: 123, Keywords: "test cat dog", Subject: "animals", Artist: "Bender", Notes: "notes", Copyright: "copy"}
assert.Equal(t, false, description.NoNotes())
assert.True(t, description.HasNotes())
})
}
func TestDetails_NoArtist(t *testing.T) {
t.Run("no artist", func(t *testing.T) {
description := &Details{PhotoID: 123, Artist: ""}
assert.Equal(t, true, description.NoArtist())
assert.False(t, description.HasArtist())
})
t.Run("artist", func(t *testing.T) {
description := &Details{PhotoID: 123, Keywords: "test cat dog", Subject: "animals", Artist: "Bender", Notes: "notes", Copyright: "copy"}
assert.Equal(t, false, description.NoArtist())
assert.True(t, description.HasArtist())
})
}
func TestDetails_NoCopyright(t *testing.T) {
t.Run("no copyright", func(t *testing.T) {
description := &Details{PhotoID: 123, Copyright: ""}
assert.Equal(t, true, description.NoCopyright())
assert.False(t, description.HasCopyright())
})
t.Run("copyright", func(t *testing.T) {
description := &Details{PhotoID: 123, Keywords: "test cat dog", Subject: "animals", Artist: "Bender", Notes: "notes", Copyright: "copy"}
assert.Equal(t, false, description.NoCopyright())
assert.True(t, description.HasCopyright())
})
}
func TestDetails_NoLicense(t *testing.T) {
t.Run("no license", func(t *testing.T) {
description := &Details{PhotoID: 123, License: ""}
assert.Equal(t, true, description.NoLicense())
assert.False(t, description.HasLicense())
})
t.Run("license", func(t *testing.T) {
description := &Details{PhotoID: 123, Keywords: "test cat dog", Subject: "animals", Artist: "Bender", Notes: "notes", License: "copy"}
assert.Equal(t, false, description.NoLicense())
assert.True(t, description.HasLicense())
})
}
func TestNewDetails(t *testing.T) {
t.Run("add to photo", func(t *testing.T) {
p := NewPhoto(true)
assert.Equal(t, UnknownTitle, p.PhotoTitle)
d := NewDetails(p)
p.Details = &d
d.Subject = "Foo Bar"
d.Keywords = "Baz"
err := p.Save()
if err != nil {
t.Fatal(err)
}
// t.Logf("PHOTO: %#v", p)
// t.Logf("DETAILS: %#v", d)
})
}
func TestDetails_Create(t *testing.T) {
t.Run("error", func(t *testing.T) {
details := Details{PhotoID: 0}
assert.Error(t, details.Create())
})
t.Run("success", func(t *testing.T) {
details := Details{PhotoID: 1236799955432}
err := details.Create()
if err != nil {
t.Fatal(err)
}
})
}
func TestDetails_Save(t *testing.T) {
t.Run("success", func(t *testing.T) {
details := Details{PhotoID: 123678955432, UpdatedAt: time.Date(2020, 2, 1, 0, 0, 0, 0, time.UTC)}
initialDate := details.UpdatedAt
err := details.Save()
if err != nil {
t.Fatal(err)
}
afterDate := details.UpdatedAt
assert.True(t, afterDate.After(initialDate))
})
t.Run("error", func(t *testing.T) {
details := Details{PhotoID: 0}
assert.Error(t, details.Save())
})
}
func TestDetails_SetKeywords(t *testing.T) {
t.Run("no keywords", func(t *testing.T) {
description := &Details{PhotoID: 123, Keywords: ""}
assert.False(t, description.HasKeywords())
description.SetKeywords("", "manual")
assert.False(t, description.HasKeywords())
})
t.Run("new keywords have no priority", func(t *testing.T) {
description := &Details{PhotoID: 123, Keywords: "cat, brown", KeywordsSrc: SrcManual}
assert.Equal(t, "cat, brown", description.Keywords)
description.SetKeywords("dog", SrcMeta)
assert.Equal(t, "cat, brown", description.Keywords)
})
t.Run("new keywords set - merge", func(t *testing.T) {
description := &Details{PhotoID: 123, Keywords: "cat, brown", KeywordsSrc: SrcMeta}
assert.Equal(t, "cat, brown", description.Keywords)
description.SetKeywords("dog", SrcMeta)
assert.Equal(t, "brown, cat, dog", description.Keywords)
})
t.Run("new keywords overwrite", func(t *testing.T) {
description := &Details{PhotoID: 123, Keywords: "cat, brown", KeywordsSrc: SrcMeta}
assert.Equal(t, "cat, brown", description.Keywords)
description.SetKeywords("dog", SrcManual)
assert.Equal(t, "dog", description.Keywords)
})
}
func TestDetails_SetSubject(t *testing.T) {
t.Run("no subject", func(t *testing.T) {
description := &Details{PhotoID: 123, Subject: ""}
assert.False(t, description.HasSubject())
description.SetSubject("", "manual")
assert.False(t, description.HasSubject())
})
t.Run("new subject has no priority", func(t *testing.T) {
description := &Details{PhotoID: 123, Subject: "My cat", SubjectSrc: SrcManual}
assert.Equal(t, "My cat", description.Subject)
description.SetSubject("My dog", SrcMeta)
assert.Equal(t, "My cat", description.Subject)
})
t.Run("new subject set", func(t *testing.T) {
description := &Details{PhotoID: 123, Subject: "My cat", SubjectSrc: SrcMeta}
assert.Equal(t, "My cat", description.Subject)
description.SetSubject("My dog", SrcMeta)
assert.Equal(t, "My dog", description.Subject)
})
}
func TestDetails_SetNotes(t *testing.T) {
t.Run("no notes", func(t *testing.T) {
description := &Details{PhotoID: 123, Notes: ""}
assert.False(t, description.HasNotes())
description.SetNotes("", "manual")
assert.False(t, description.HasNotes())
})
t.Run("new notes has no priority", func(t *testing.T) {
description := &Details{PhotoID: 123, Notes: "My old notes", NotesSrc: SrcManual}
assert.Equal(t, "My old notes", description.Notes)
description.SetNotes("My new notes", SrcAuto)
assert.Equal(t, "My old notes", description.Notes)
})
t.Run("new notes set", func(t *testing.T) {
description := &Details{PhotoID: 123, Notes: "My old notes", NotesSrc: SrcMeta}
assert.Equal(t, "My old notes", description.Notes)
description.SetNotes("My new notes", SrcManual)
assert.Equal(t, "My new notes", description.Notes)
})
}
func TestDetails_SetArtist(t *testing.T) {
t.Run("no artist", func(t *testing.T) {
description := &Details{PhotoID: 123, Artist: ""}
assert.False(t, description.HasArtist())
description.SetArtist("", "manual")
assert.False(t, description.HasArtist())
})
t.Run("new artist has no priority", func(t *testing.T) {
description := &Details{PhotoID: 123, Artist: "Hans", ArtistSrc: SrcManual}
assert.Equal(t, "Hans", description.Artist)
description.SetArtist("Maria", SrcAuto)
assert.Equal(t, "Hans", description.Artist)
})
t.Run("new artist set", func(t *testing.T) {
description := &Details{PhotoID: 123, Artist: "Hans", ArtistSrc: SrcMeta}
assert.Equal(t, "Hans", description.Artist)
description.SetArtist("Maria", SrcManual)
assert.Equal(t, "Maria", description.Artist)
})
}
func TestDetails_SetCopyright(t *testing.T) {
t.Run("no copyright", func(t *testing.T) {
description := &Details{PhotoID: 123, Copyright: ""}
assert.False(t, description.HasCopyright())
description.SetCopyright("", "manual")
assert.False(t, description.HasCopyright())
})
t.Run("new copyright has no priority", func(t *testing.T) {
description := &Details{PhotoID: 123, Copyright: "2018", CopyrightSrc: SrcManual}
assert.Equal(t, "2018", description.Copyright)
description.SetCopyright("3000", SrcAuto)
assert.Equal(t, "2018", description.Copyright)
})
t.Run("new copyright set", func(t *testing.T) {
description := &Details{PhotoID: 123, Copyright: "2018", CopyrightSrc: SrcMeta}
assert.Equal(t, "2018", description.Copyright)
description.SetCopyright("3000", SrcManual)
assert.Equal(t, "3000", description.Copyright)
})
}
func TestDetails_SetLicense(t *testing.T) {
t.Run("no license", func(t *testing.T) {
description := &Details{PhotoID: 123, License: ""}
assert.False(t, description.HasLicense())
description.SetLicense("", "manual")
assert.False(t, description.HasLicense())
})
t.Run("new license has no priority", func(t *testing.T) {
description := &Details{PhotoID: 123, License: "old", LicenseSrc: SrcManual}
assert.Equal(t, "old", description.License)
description.SetLicense("new", SrcAuto)
assert.Equal(t, "old", description.License)
})
t.Run("new license set", func(t *testing.T) {
description := &Details{PhotoID: 123, License: "old", LicenseSrc: SrcMeta}
assert.Equal(t, "old", description.License)
description.SetLicense("new", SrcManual)
assert.Equal(t, "new", description.License)
})
}
func TestDetails_SetSoftware(t *testing.T) {
t.Run("Empty", func(t *testing.T) {
description := &Details{PhotoID: 123, Software: ""}
assert.False(t, description.HasSoftware())
description.SetSoftware("", "manual")
assert.False(t, description.HasSoftware())
})
t.Run("NoPriority", func(t *testing.T) {
description := &Details{PhotoID: 123, Software: "old", SoftwareSrc: SrcManual}
assert.Equal(t, "old", description.Software)
description.SetSoftware("new", SrcAuto)
assert.Equal(t, "old", description.Software)
})
t.Run("NewValue", func(t *testing.T) {
description := &Details{PhotoID: 123, Software: "old", SoftwareSrc: SrcMeta}
assert.Equal(t, "old", description.Software)
description.SetSoftware("new", SrcManual)
assert.Equal(t, "new", description.Software)
})
}