173 lines
5.8 KiB
Go
173 lines
5.8 KiB
Go
package fixtures
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"allaboutapps.dev/aw/go-starter/internal/models"
|
|
"allaboutapps.dev/aw/go-starter/internal/util"
|
|
"github.com/aarondl/null/v8"
|
|
"github.com/aarondl/sqlboiler/v4/boil"
|
|
)
|
|
|
|
const (
|
|
PlainTestUserPassword = "password"
|
|
HashedTestUserPassword = "$argon2id$v=19$m=65536,t=1,p=4$RFO8ulg2c2zloG0029pAUQ$2Po6NUIhVCMm9vivVDuzo7k5KVWfZzJJfeXzC+n+row" //nolint:gosec
|
|
)
|
|
|
|
// Insertable represents a common interface for all model instances so they may be inserted via the Inserts() func
|
|
type Insertable interface {
|
|
Insert(ctx context.Context, exec boil.ContextExecutor, columns boil.Columns) error
|
|
}
|
|
|
|
// The main definition which fixtures are available through Fixtures().
|
|
// Mind the declaration order! The fields get inserted exactly in the order they are declared.
|
|
type FixtureMap struct {
|
|
User1 *models.User
|
|
User1AppUserProfile *models.AppUserProfile
|
|
User1AccessToken1 *models.AccessToken
|
|
User1RefreshToken1 *models.RefreshToken
|
|
User2 *models.User
|
|
User2AppUserProfile *models.AppUserProfile
|
|
User2AccessToken1 *models.AccessToken
|
|
User2RefreshToken1 *models.RefreshToken
|
|
UserDeactivated *models.User
|
|
UserDeactivatedAppUserProfile *models.AppUserProfile
|
|
UserDeactivatedAccessToken1 *models.AccessToken
|
|
UserDeactivatedRefreshToken1 *models.RefreshToken
|
|
User1PushToken *models.PushToken
|
|
User1PushTokenAPN *models.PushToken
|
|
UserRequiresConfirmation *models.User
|
|
UserRequiresConfirmationAppUserProfile *models.AppUserProfile
|
|
UserRequiresConfirmationConfirmationToken *models.ConfirmationToken
|
|
}
|
|
|
|
// Fixtures returns a function wrapping our fixtures, which tests are allowed to manipulate.
|
|
// Each test (which may run concurrently) receives a fresh copy, preventing side effects between test runs.
|
|
func Fixtures() FixtureMap {
|
|
now := time.Now()
|
|
f := FixtureMap{}
|
|
|
|
f.User1 = &models.User{
|
|
ID: "f6ede5d8-e22a-4ca5-aa12-67821865a3e5",
|
|
IsActive: true,
|
|
Username: null.StringFrom("user1@example.com"),
|
|
Password: null.StringFrom(HashedTestUserPassword),
|
|
Scopes: []string{"app"},
|
|
}
|
|
|
|
f.User1AppUserProfile = &models.AppUserProfile{
|
|
UserID: f.User1.ID,
|
|
LegalAcceptedAt: null.TimeFrom(now.Add(time.Minute * -10)),
|
|
}
|
|
|
|
f.User1AccessToken1 = &models.AccessToken{
|
|
Token: "1cfc27d7-a178-4051-802b-f3ff3967c95c",
|
|
ValidUntil: now.Add(10 * 365 * 24 * time.Hour),
|
|
UserID: f.User1.ID,
|
|
}
|
|
|
|
f.User1RefreshToken1 = &models.RefreshToken{
|
|
Token: "66412eaf-2b89-404d-bbb5-46c3b8bf1a53",
|
|
UserID: f.User1.ID,
|
|
}
|
|
|
|
f.User2 = &models.User{
|
|
ID: "76a79a2b-fbd8-45a0-b35b-671a28a87acf",
|
|
IsActive: true,
|
|
Username: null.StringFrom("user2@example.com"),
|
|
Password: null.StringFrom(HashedTestUserPassword),
|
|
Scopes: []string{"app"},
|
|
}
|
|
|
|
f.User2AppUserProfile = &models.AppUserProfile{
|
|
UserID: f.User2.ID,
|
|
LegalAcceptedAt: null.TimeFrom(now.Add(time.Minute * -10)),
|
|
}
|
|
|
|
f.User2AccessToken1 = &models.AccessToken{
|
|
Token: "115d28c5-f585-4fb5-9656-fb321739fee5",
|
|
ValidUntil: now.Add(10 * 365 * 24 * time.Hour),
|
|
UserID: f.User2.ID,
|
|
}
|
|
|
|
f.User2RefreshToken1 = &models.RefreshToken{
|
|
Token: "ea909c75-63d1-4348-a63c-4bcf8ab334a2",
|
|
UserID: f.User2.ID,
|
|
}
|
|
|
|
f.UserRequiresConfirmation = &models.User{
|
|
ID: "402e1669-fff7-43ca-8f08-071c06409479",
|
|
IsActive: false,
|
|
RequiresConfirmation: true,
|
|
Username: null.StringFrom("userrequiresconfirmation@example.com"),
|
|
Password: null.StringFrom(HashedTestUserPassword),
|
|
Scopes: []string{"app"},
|
|
}
|
|
|
|
f.UserRequiresConfirmationAppUserProfile = &models.AppUserProfile{
|
|
UserID: f.UserRequiresConfirmation.ID,
|
|
LegalAcceptedAt: null.TimeFrom(now.Add(time.Minute * -10)),
|
|
}
|
|
|
|
f.UserRequiresConfirmationConfirmationToken = &models.ConfirmationToken{
|
|
Token: "c9182e0b-4a46-4825-9f10-56f04a8b1665",
|
|
ValidUntil: now.Add(time.Hour),
|
|
UserID: f.UserRequiresConfirmation.ID,
|
|
}
|
|
|
|
f.UserDeactivated = &models.User{
|
|
ID: "d9c0dee9-239e-4323-979a-a5354d289627",
|
|
IsActive: false,
|
|
Username: null.StringFrom("userdeactivated@example.com"),
|
|
Password: null.StringFrom(HashedTestUserPassword),
|
|
Scopes: []string{"app"},
|
|
}
|
|
|
|
f.UserDeactivatedAppUserProfile = &models.AppUserProfile{
|
|
UserID: f.UserDeactivated.ID,
|
|
LegalAcceptedAt: null.Time{},
|
|
}
|
|
|
|
f.UserDeactivatedAccessToken1 = &models.AccessToken{
|
|
Token: "24d0b38d-387c-400c-80fc-a71d85031d4c",
|
|
ValidUntil: now.Add(10 * 365 * 24 * time.Hour),
|
|
UserID: f.UserDeactivated.ID,
|
|
}
|
|
|
|
f.UserDeactivatedRefreshToken1 = &models.RefreshToken{
|
|
Token: "b6e13a88-7b18-4f17-b819-71b196be2444",
|
|
UserID: f.UserDeactivated.ID,
|
|
}
|
|
|
|
f.User1PushToken = &models.PushToken{
|
|
ID: "98ad176b-af90-44b7-b991-d9ebfc5dd9a0",
|
|
Token: "cQ_Qk3ZCCZelUZ_K_Yn2BV:APA91bG4jst5srGYZqBAn_wRfiJUzAOQ4k8tV0sDcV4uas2ln5wNwkE_ebneR5Fqk7GvndZ-h3mWnjWaI8yZ4sVwo8qu_Aztotqup4mlEPNYgFGqTlJ5ltQrJG5oKp4RoYQ_0CeFaymn",
|
|
UserID: f.User1.ID,
|
|
Provider: models.ProviderTypeFCM,
|
|
}
|
|
|
|
f.User1PushTokenAPN = &models.PushToken{
|
|
ID: "5909b472-86f8-4d15-bb63-d49f4fad41a3",
|
|
Token: "0a863a72-d391-4217-9f26-388801684744",
|
|
UserID: f.User1.ID,
|
|
Provider: models.ProviderTypeApn,
|
|
}
|
|
|
|
return f
|
|
}
|
|
|
|
// Inserts defines the order in which the fixtures will be inserted
|
|
// into the test database
|
|
func Inserts() []Insertable {
|
|
fix := Fixtures()
|
|
insertableIfc := (*Insertable)(nil)
|
|
inserts, err := util.GetFieldsImplementing(&fix, insertableIfc)
|
|
if err != nil {
|
|
panic(fmt.Errorf("failed to get insertable fixture fields: %w", err))
|
|
}
|
|
|
|
return inserts
|
|
}
|