HEAVY: finish music service migration, tidy up services, more tests

This commit is contained in:
ari melody 2026-08-01 00:29:31 +01:00
parent 9e311df462
commit 90a671982c
Signed by: ari
GPG key ID: CF99829C92678188
47 changed files with 2698 additions and 902 deletions

View file

@ -16,8 +16,8 @@ type (
Email sql.NullString `json:"email" db:"email"`
AvatarURL sql.NullString `json:"avatar_url" db:"avatar_url"`
CreatedAt time.Time `json:"created_at" db:"created_at"`
FailAttempts int `json:"fail_attempts" db:"fail_attempts"`
Locked bool `json:"locked" db:"locked"`
FailAttempts int `json:"fail_attempts" db:"fail_attempts"`
Locked bool `json:"locked" db:"locked"`
Privileges []AccountPrivilege `json:"privileges"`
}

View file

@ -8,12 +8,10 @@ import (
"arimelody-web/model/twitch"
logService "arimelody-web/service/log"
inviteService "arimelody-web/service/invite"
//inviteService "arimelody-web/service/invite"
accountService "arimelody-web/service/account"
sessionService "arimelody-web/service/session"
artistService "arimelody-web/service/artist"
releaseService "arimelody-web/service/release"
trackService "arimelody-web/service/track"
//sessionService "arimelody-web/service/session"
musicService "arimelody-web/service/music"
)
type (
@ -55,11 +53,9 @@ type (
PublicFS embed.FS
LogService *logService.LogService
InviteService *inviteService.InviteService
//InviteService *inviteService.InviteService
AccountService *accountService.AccountService
SesisonService *sessionService.SessionService
ArtistService *artistService.ArtistService
ReleaseService *releaseService.ReleaseService
TrackService *trackService.TrackService
//SesisonService *sessionService.SessionService
MusicService *musicService.MusicService
}
)

View file

@ -9,9 +9,11 @@ type (
}
)
const DEFAULT_AVATAR_URL = "/img/default-avatar.png"
func (artist Artist) GetAvatar() string {
if artist.Avatar == "" {
return "/img/default-avatar.png"
return DEFAULT_AVATAR_URL
}
return artist.Avatar
}

View file

@ -1,21 +1,22 @@
package model
package model_test
import (
"testing"
"arimelody-web/model"
"testing"
)
func Test_Artist_GetAvatar(t *testing.T) {
want := "testavatar.png"
artist := Artist{ Avatar: want }
artist := model.Artist{ Avatar: want }
got := artist.GetAvatar()
if want != got {
t.Errorf(`correct value not returned when avatar is populated (want "%s", got "%s")`, want, got)
}
artist = Artist{}
artist = model.Artist{}
want = "/img/default-avatar.png"
want = model.DEFAULT_AVATAR_URL
got = artist.GetAvatar()
if want != got {
t.Errorf(`default value not returned when avatar is empty (want "%s", got "%s")`, want, got)

View file

@ -2,9 +2,9 @@ package model
type (
Credit struct {
Release Release `json:"release"`
Artist Artist `json:"artist"`
Role string `json:"role"`
Primary bool `json:"primary" db:"is_primary"`
Release *Release `json:"release"`
Artist *Artist `json:"artist"`
Role string `json:"role"`
Primary bool `json:"primary" db:"is_primary"`
}
)

View file

@ -1,11 +1,12 @@
package model
package model_test
import (
"testing"
"arimelody-web/model"
"testing"
)
func Test_Link_NormaliseName(t *testing.T) {
link := Link{
link := model.Link{
Name: "!c@o#o$l%-^a&w*e(s)o_m=e+-[l{i]n}k-0123456789ABCDEF",
}

View file

@ -34,6 +34,8 @@ const (
EP ReleaseType = "EP"
Compilation ReleaseType = "compilation"
Upcoming ReleaseType = "upcoming"
DEFAULT_RELEASE_ARTWORK_URL = "/img/default-cover-art.png"
)
// GETTERS
@ -52,7 +54,7 @@ func (release Release) PrintReleaseDate() string {
func (release Release) GetArtwork() string {
if release.Artwork == "" {
return "/img/default-cover-art.png"
return DEFAULT_RELEASE_ARTWORK_URL
}
return release.Artwork
}
@ -93,3 +95,20 @@ func (release Release) PrintArtists(only_primary bool, ampersand bool) string {
return strings.Join(names[:], ", ")
}
}
func ValidReleaseType(releaseType string) (ReleaseType, bool) {
switch releaseType {
case "single":
return Single, true
case "album":
return Album, true
case "EP":
return EP, true
case "compilation":
return Compilation, true
case "upcoming":
return Upcoming, true
default:
return "", false
}
}

View file

@ -1,6 +1,7 @@
package model
package model_test
import (
"arimelody-web/model"
"strings"
"testing"
"time"
@ -10,7 +11,7 @@ import (
func Test_Release(t *testing.T) {
t.Run("prints correct description HTML", func(t *testing.T) {
release := Release{
release := model.Release{
Description: "this is\na test\n<strong>description!</strong>",
}
@ -24,7 +25,7 @@ func Test_Release(t *testing.T) {
})
t.Run("prints correct release date", func(t *testing.T) {
release := Release{
release := model.Release{
ReleaseDate: time.Date(2025, time.July, 26, 16, 0, 0, 0, time.UTC),
}
@ -34,37 +35,37 @@ func Test_Release(t *testing.T) {
t.Run("returns correct artwork", func(t *testing.T) {
artwork := "testartwork.png"
release := Release{ Artwork: artwork }
release := model.Release{ Artwork: artwork }
assert.Equal(t, release.GetArtwork(), artwork)
})
t.Run("returns placeholder artwork when empty", func(t *testing.T) {
release := Release{}
assert.Equal(t, release.GetArtwork(), "/img/default-cover-art.png")
release := model.Release{}
assert.Equal(t, release.GetArtwork(), model.DEFAULT_RELEASE_ARTWORK_URL)
})
t.Run("singles", func(t *testing.T) {
release := Release{
Tracks: []*Track{},
release := model.Release{
Tracks: []*model.Track{},
}
t.Run("false when no tracks are present", func(t *testing.T) {
assert.Equal(t, release.IsSingle(), false)
})
release.Tracks = append(release.Tracks, &Track{})
release.Tracks = append(release.Tracks, &model.Track{})
t.Run("true when one track is present", func(t *testing.T) {
assert.Equal(t, release.IsSingle(), true)
})
release.Tracks = append(release.Tracks, &Track{})
release.Tracks = append(release.Tracks, &model.Track{})
t.Run("false when >1 tracks are present", func(t *testing.T) {
assert.Equal(t, release.IsSingle(), false)
})
})
t.Run("released", func(t *testing.T) {
release := Release {
release := model.Release {
ReleaseDate: time.Now(),
}
@ -84,23 +85,23 @@ func Test_Release(t *testing.T) {
artist3 := "idk"
artist4 := "guest"
release := Release{}
release := model.Release{}
t.Run("prints \"Unknown Artist\" when release has no credits", func(t *testing.T) {
assert.Equal(t, release.PrintArtists(false, true), "Unknown Artist")
})
release.Credits = append(
release.Credits,
&Credit{ Artist: Artist{ Name: artist1 }, Primary: true },
&model.Credit{ Artist: &model.Artist{ Name: artist1 }, Primary: true },
)
t.Run("prints ONLY first artist name when release has one credit", func(t *testing.T) {
assert.Equal(t, release.PrintArtists(false, true), artist1)
})
release.Credits = append(release.Credits, []*Credit{
{ Artist: Artist{ Name: artist2 }, Primary: true },
{ Artist: Artist{ Name: artist3 }, Primary: false },
{ Artist: Artist{ Name: artist4 }, Primary: true },
release.Credits = append(release.Credits, []*model.Credit{
{ Artist: &model.Artist{ Name: artist2 }, Primary: true },
{ Artist: &model.Artist{ Name: artist3 }, Primary: false },
{ Artist: &model.Artist{ Name: artist4 }, Primary: true },
}...)
t.Run("can get only unique primary artist names", func(t *testing.T) {
assert.Equal(
@ -146,4 +147,37 @@ func Test_Release(t *testing.T) {
)
})
})
t.Run("validating release types", func(t *testing.T) {
t.Run("single", func(t *testing.T) {
releaseType, ok := model.ValidReleaseType("single")
assert.Equal(t, ok, true)
assert.Equal(t, releaseType, model.Single)
})
t.Run("album", func(t *testing.T) {
releaseType, ok := model.ValidReleaseType("album")
assert.Equal(t, ok, true)
assert.Equal(t, releaseType, model.Album)
})
t.Run("EP", func(t *testing.T) {
releaseType, ok := model.ValidReleaseType("EP")
assert.Equal(t, ok, true)
assert.Equal(t, releaseType, model.EP)
})
t.Run("compilation", func(t *testing.T) {
releaseType, ok := model.ValidReleaseType("compilation")
assert.Equal(t, ok, true)
assert.Equal(t, releaseType, model.Compilation)
})
t.Run("upcoming", func(t *testing.T) {
releaseType, ok := model.ValidReleaseType("upcoming")
assert.Equal(t, ok, true)
assert.Equal(t, releaseType, model.Upcoming)
})
t.Run("invalid", func(t *testing.T) {
releaseType, ok := model.ValidReleaseType("invalid")
assert.Equal(t, ok, false)
assert.Equal(t, string(releaseType), "")
})
})
}

View file

@ -1,11 +1,12 @@
package model
package model_test
import (
"testing"
"arimelody-web/model"
"testing"
)
func Test_Track_DescriptionHTML(t *testing.T) {
track := Track{
track := model.Track{
Description: "this is\na test\n<strong>description!</strong>",
}
@ -19,7 +20,7 @@ func Test_Track_DescriptionHTML(t *testing.T) {
}
func Test_Track_LyricsHTML(t *testing.T) {
track := Track{
track := model.Track{
Lyrics: "these are\ntest\n<strong>lyrics!</strong>",
}