package account import ( "testing" "time" "galaxy/user/internal/domain/common" "github.com/stretchr/testify/require" ) func TestUserAccountValidate(t *testing.T) { t.Parallel() createdAt := time.Unix(1_775_240_000, 0).UTC() updatedAt := createdAt.Add(2 * time.Hour) tests := []struct { name string record UserAccount wantErr bool }{ { name: "valid without declared country or display name", record: UserAccount{ UserID: common.UserID("user-123"), Email: common.Email("pilot@example.com"), UserName: common.UserName("player-abcdefgh"), PreferredLanguage: common.LanguageTag("en"), TimeZone: common.TimeZoneName("Europe/Berlin"), CreatedAt: createdAt, UpdatedAt: updatedAt, }, }, { name: "valid with declared country and display name", record: UserAccount{ UserID: common.UserID("user-123"), Email: common.Email("pilot@example.com"), UserName: common.UserName("player-abcdefgh"), DisplayName: common.DisplayName("PilotNova"), PreferredLanguage: common.LanguageTag("en"), TimeZone: common.TimeZoneName("Europe/Berlin"), DeclaredCountry: common.CountryCode("DE"), CreatedAt: createdAt, UpdatedAt: updatedAt, }, }, { name: "missing user name", record: UserAccount{ UserID: common.UserID("user-123"), Email: common.Email("pilot@example.com"), PreferredLanguage: common.LanguageTag("en"), TimeZone: common.TimeZoneName("Europe/Berlin"), CreatedAt: createdAt, UpdatedAt: updatedAt, }, wantErr: true, }, { name: "invalid display name", record: UserAccount{ UserID: common.UserID("user-123"), Email: common.Email("pilot@example.com"), UserName: common.UserName("player-abcdefgh"), DisplayName: common.DisplayName("Pilot Nova"), PreferredLanguage: common.LanguageTag("en"), TimeZone: common.TimeZoneName("Europe/Berlin"), CreatedAt: createdAt, UpdatedAt: updatedAt, }, wantErr: true, }, { name: "updated before created", record: UserAccount{ UserID: common.UserID("user-123"), Email: common.Email("pilot@example.com"), UserName: common.UserName("player-abcdefgh"), PreferredLanguage: common.LanguageTag("en"), TimeZone: common.TimeZoneName("Europe/Berlin"), CreatedAt: createdAt, UpdatedAt: createdAt.Add(-time.Second), }, wantErr: true, }, { name: "valid soft-deleted after update", record: UserAccount{ UserID: common.UserID("user-123"), Email: common.Email("pilot@example.com"), UserName: common.UserName("player-abcdefgh"), PreferredLanguage: common.LanguageTag("en"), TimeZone: common.TimeZoneName("Europe/Berlin"), CreatedAt: createdAt, UpdatedAt: updatedAt, DeletedAt: timePtr(updatedAt), }, }, { name: "deleted at before created", record: UserAccount{ UserID: common.UserID("user-123"), Email: common.Email("pilot@example.com"), UserName: common.UserName("player-abcdefgh"), PreferredLanguage: common.LanguageTag("en"), TimeZone: common.TimeZoneName("Europe/Berlin"), CreatedAt: createdAt, UpdatedAt: updatedAt, DeletedAt: timePtr(createdAt.Add(-time.Second)), }, wantErr: true, }, { name: "deleted at zero", record: UserAccount{ UserID: common.UserID("user-123"), Email: common.Email("pilot@example.com"), UserName: common.UserName("player-abcdefgh"), PreferredLanguage: common.LanguageTag("en"), TimeZone: common.TimeZoneName("Europe/Berlin"), CreatedAt: createdAt, UpdatedAt: updatedAt, DeletedAt: timePtr(time.Time{}), }, wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { t.Parallel() err := tt.record.Validate() if tt.wantErr { require.Error(t, err) return } require.NoError(t, err) }) } } func TestUserAccountIsDeleted(t *testing.T) { t.Parallel() createdAt := time.Unix(1_775_240_000, 0).UTC() record := UserAccount{ UserID: common.UserID("user-123"), Email: common.Email("pilot@example.com"), UserName: common.UserName("player-abcdefgh"), PreferredLanguage: common.LanguageTag("en"), TimeZone: common.TimeZoneName("Europe/Berlin"), CreatedAt: createdAt, UpdatedAt: createdAt, } require.False(t, record.IsDeleted()) deleted := record deletedAt := createdAt.Add(time.Minute) deleted.DeletedAt = &deletedAt require.True(t, deleted.IsDeleted()) } func timePtr(value time.Time) *time.Time { return &value }