package testutils import ( "context" "gorm.io/gorm" "goyco/internal/database" "goyco/internal/repositories" ) type PostRepositoryStub struct { CreateFn func(*database.Post) error GetByIDFn func(uint) (*database.Post, error) GetAllFn func(int, int) ([]database.Post, error) GetByUserIDFn func(uint, int, int) ([]database.Post, error) UpdateFn func(*database.Post) error DeleteFn func(uint) error CountFn func() (int64, error) CountByUserIDFn func(uint) (int64, error) GetTopPostsFn func(int) ([]database.Post, error) GetNewestPostsFn func(int) ([]database.Post, error) SearchFn func(string, int, int) ([]database.Post, error) GetPostsByDeletedUsersFn func() ([]database.Post, error) HardDeletePostsByDeletedUsersFn func() (int64, error) HardDeleteAllFn func() (int64, error) WithTxFn func(*gorm.DB) repositories.PostRepository } func NewPostRepositoryStub() *PostRepositoryStub { return &PostRepositoryStub{} } func (s *PostRepositoryStub) Create(post *database.Post) error { if s != nil && s.CreateFn != nil { return s.CreateFn(post) } return nil } func (s *PostRepositoryStub) GetByID(id uint) (*database.Post, error) { if s != nil && s.GetByIDFn != nil { return s.GetByIDFn(id) } return nil, gorm.ErrRecordNotFound } func (s *PostRepositoryStub) GetAll(limit, offset int) ([]database.Post, error) { if s != nil && s.GetAllFn != nil { return s.GetAllFn(limit, offset) } return nil, nil } func (s *PostRepositoryStub) GetByUserID(userID uint, limit, offset int) ([]database.Post, error) { if s != nil && s.GetByUserIDFn != nil { return s.GetByUserIDFn(userID, limit, offset) } return nil, nil } func (s *PostRepositoryStub) Update(post *database.Post) error { if s != nil && s.UpdateFn != nil { return s.UpdateFn(post) } return nil } func (s *PostRepositoryStub) Delete(id uint) error { if s != nil && s.DeleteFn != nil { return s.DeleteFn(id) } return nil } func (s *PostRepositoryStub) Count() (int64, error) { if s != nil && s.CountFn != nil { return s.CountFn() } return 0, nil } func (s *PostRepositoryStub) CountByUserID(userID uint) (int64, error) { if s != nil && s.CountByUserIDFn != nil { return s.CountByUserIDFn(userID) } return 0, nil } func (s *PostRepositoryStub) GetTopPosts(limit int) ([]database.Post, error) { if s != nil && s.GetTopPostsFn != nil { return s.GetTopPostsFn(limit) } return s.GetAll(limit, 0) } func (s *PostRepositoryStub) GetNewestPosts(limit int) ([]database.Post, error) { if s != nil && s.GetNewestPostsFn != nil { return s.GetNewestPostsFn(limit) } return s.GetAll(limit, 0) } func (s *PostRepositoryStub) Search(query string, limit, offset int) ([]database.Post, error) { if s != nil && s.SearchFn != nil { return s.SearchFn(query, limit, offset) } return nil, nil } func (s *PostRepositoryStub) GetPostsByDeletedUsers() ([]database.Post, error) { if s != nil && s.GetPostsByDeletedUsersFn != nil { return s.GetPostsByDeletedUsersFn() } return nil, nil } func (s *PostRepositoryStub) HardDeletePostsByDeletedUsers() (int64, error) { if s != nil && s.HardDeletePostsByDeletedUsersFn != nil { return s.HardDeletePostsByDeletedUsersFn() } return 0, nil } func (s *PostRepositoryStub) HardDeleteAll() (int64, error) { if s != nil && s.HardDeleteAllFn != nil { return s.HardDeleteAllFn() } return 0, nil } func (s *PostRepositoryStub) WithTx(tx *gorm.DB) repositories.PostRepository { if s != nil && s.WithTxFn != nil { return s.WithTxFn(tx) } return s } type UserRepositoryStub struct { CreateFn func(*database.User) error GetByIDFn func(uint) (*database.User, error) GetByIDIncludingDeletedFn func(uint) (*database.User, error) GetByUsernameFn func(string) (*database.User, error) GetByUsernameIncludingFn func(string) (*database.User, error) GetByEmailFn func(string) (*database.User, error) GetByVerificationFn func(string) (*database.User, error) GetByPasswordResetFn func(string) (*database.User, error) GetAllFn func(int, int) ([]database.User, error) UpdateFn func(*database.User) error DeleteFn func(uint) error HardDeleteFn func(uint) error SoftDeleteWithPostsFn func(uint) error LockFn func(uint) error UnlockFn func(uint) error GetPostsFn func(uint, int, int) ([]database.Post, error) GetDeletedUsersFn func() ([]database.User, error) HardDeleteAllFn func() (int64, error) CountFn func() (int64, error) WithTxFn func(*gorm.DB) repositories.UserRepository } func NewUserRepositoryStub() *UserRepositoryStub { return &UserRepositoryStub{} } func (s *UserRepositoryStub) Create(user *database.User) error { if s != nil && s.CreateFn != nil { return s.CreateFn(user) } return nil } func (s *UserRepositoryStub) GetByID(id uint) (*database.User, error) { if s != nil && s.GetByIDFn != nil { return s.GetByIDFn(id) } return nil, gorm.ErrRecordNotFound } func (s *UserRepositoryStub) GetByIDIncludingDeleted(id uint) (*database.User, error) { if s != nil && s.GetByIDIncludingDeletedFn != nil { return s.GetByIDIncludingDeletedFn(id) } return s.GetByID(id) } func (s *UserRepositoryStub) GetByUsername(username string) (*database.User, error) { if s != nil && s.GetByUsernameFn != nil { return s.GetByUsernameFn(username) } return nil, gorm.ErrRecordNotFound } func (s *UserRepositoryStub) GetByUsernameIncludingDeleted(username string) (*database.User, error) { if s != nil && s.GetByUsernameIncludingFn != nil { return s.GetByUsernameIncludingFn(username) } return s.GetByUsername(username) } func (s *UserRepositoryStub) GetByEmail(email string) (*database.User, error) { if s != nil && s.GetByEmailFn != nil { return s.GetByEmailFn(email) } return nil, gorm.ErrRecordNotFound } func (s *UserRepositoryStub) GetByVerificationToken(token string) (*database.User, error) { if s != nil && s.GetByVerificationFn != nil { return s.GetByVerificationFn(token) } return nil, gorm.ErrRecordNotFound } func (s *UserRepositoryStub) GetByPasswordResetToken(token string) (*database.User, error) { if s != nil && s.GetByPasswordResetFn != nil { return s.GetByPasswordResetFn(token) } return nil, gorm.ErrRecordNotFound } func (s *UserRepositoryStub) GetAll(limit, offset int) ([]database.User, error) { if s != nil && s.GetAllFn != nil { return s.GetAllFn(limit, offset) } return nil, nil } func (s *UserRepositoryStub) Update(user *database.User) error { if s != nil && s.UpdateFn != nil { return s.UpdateFn(user) } return nil } func (s *UserRepositoryStub) Delete(id uint) error { if s != nil && s.DeleteFn != nil { return s.DeleteFn(id) } return nil } func (s *UserRepositoryStub) HardDelete(id uint) error { if s != nil && s.HardDeleteFn != nil { return s.HardDeleteFn(id) } return nil } func (s *UserRepositoryStub) SoftDeleteWithPosts(id uint) error { if s != nil && s.SoftDeleteWithPostsFn != nil { return s.SoftDeleteWithPostsFn(id) } return nil } func (s *UserRepositoryStub) Lock(id uint) error { if s != nil && s.LockFn != nil { return s.LockFn(id) } return nil } func (s *UserRepositoryStub) Unlock(id uint) error { if s != nil && s.UnlockFn != nil { return s.UnlockFn(id) } return nil } func (s *UserRepositoryStub) GetPosts(userID uint, limit, offset int) ([]database.Post, error) { if s != nil && s.GetPostsFn != nil { return s.GetPostsFn(userID, limit, offset) } return nil, nil } func (s *UserRepositoryStub) GetDeletedUsers() ([]database.User, error) { if s != nil && s.GetDeletedUsersFn != nil { return s.GetDeletedUsersFn() } return nil, nil } func (s *UserRepositoryStub) HardDeleteAll() (int64, error) { if s != nil && s.HardDeleteAllFn != nil { return s.HardDeleteAllFn() } return 0, nil } func (s *UserRepositoryStub) Count() (int64, error) { if s != nil && s.CountFn != nil { return s.CountFn() } return 0, nil } func (s *UserRepositoryStub) WithTx(tx *gorm.DB) repositories.UserRepository { if s != nil && s.WithTxFn != nil { return s.WithTxFn(tx) } return s } type EmailSenderStub struct { SendFn func(to, subject, body string) error } func (s *EmailSenderStub) Send(to, subject, body string) error { if s != nil && s.SendFn != nil { return s.SendFn(to, subject, body) } return nil } type TitleFetcherStub struct { FetchTitleFn func(ctx context.Context, rawURL string) (string, error) } func (s *TitleFetcherStub) FetchTitle(ctx context.Context, rawURL string) (string, error) { if s != nil && s.FetchTitleFn != nil { return s.FetchTitleFn(ctx, rawURL) } return "", nil }