wishli-api/tests/unit/mock_auth.go
2025-03-23 20:05:51 +03:00

122 lines
3.0 KiB
Go

package unit
import (
"errors"
"time"
"wish-list-api/pkg/auth"
"wish-list-api/pkg/entities"
"github.com/golang-jwt/jwt/v5"
"go.mongodb.org/mongo-driver/bson/primitive"
)
type MockAuthService struct {
users map[primitive.ObjectID]*entities.User
tokens map[string]primitive.ObjectID
}
func NewMockAuthService() auth.Service {
return &MockAuthService{
users: make(map[primitive.ObjectID]*entities.User),
tokens: make(map[string]primitive.ObjectID),
}
}
func (m *MockAuthService) AddMockUser(user *entities.User, token string) {
m.users[user.ID] = user
m.tokens[token] = user.ID
}
func (m *MockAuthService) Login(credentials *entities.LoginRequest) (*entities.TokenPair, error) {
for _, user := range m.users {
if user.Email == credentials.Email && m.ComparePasswords(user.Password, credentials.Password) {
token := "mock-token-for-" + user.ID.Hex()
m.tokens[token] = user.ID
return &entities.TokenPair{
AccessToken: token,
RefreshToken: "refresh-" + token,
}, nil
}
}
return nil, errors.New("invalid credentials")
}
func (m *MockAuthService) Register(userData *entities.RegisterRequest) (*entities.User, error) {
for _, existingUser := range m.users {
if existingUser.Email == userData.Email {
return nil, errors.New("email already exists")
}
}
hashedPassword, _ := m.HashPassword(userData.Password)
user := &entities.User{
ID: primitive.NewObjectID(),
Email: userData.Email,
Password: hashedPassword,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
m.users[user.ID] = user
return user, nil
}
func (m *MockAuthService) RefreshToken(refreshToken string) (*entities.TokenPair, error) {
if len(refreshToken) < 8 {
return nil, errors.New("invalid refresh token")
}
accessToken := refreshToken[8:]
userID, ok := m.tokens[accessToken]
if !ok {
return nil, errors.New("invalid refresh token")
}
newToken := "mock-token-for-" + userID.Hex() + "-refreshed"
m.tokens[newToken] = userID
return &entities.TokenPair{
AccessToken: newToken,
RefreshToken: "refresh-" + newToken,
}, nil
}
func (m *MockAuthService) ValidateToken(tokenString string) (*jwt.Token, error) {
if len(tokenString) > 7 && tokenString[:7] == "Bearer " {
tokenString = tokenString[7:]
}
userID, ok := m.tokens[tokenString]
if !ok {
return nil, errors.New("invalid token")
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"user_id": userID.Hex(),
"exp": time.Now().Add(time.Hour).Unix(),
})
return token, nil
}
func (m *MockAuthService) GetUserIDFromToken(tokenString string) (string, error) {
if len(tokenString) > 7 && tokenString[:7] == "Bearer " {
tokenString = tokenString[7:]
}
userID, ok := m.tokens[tokenString]
if !ok {
return "", errors.New("invalid token")
}
return userID.Hex(), nil
}
func (m *MockAuthService) HashPassword(password string) (string, error) {
return "hashed_" + password, nil
}
func (m *MockAuthService) ComparePasswords(hashedPassword string, plainPassword string) bool {
return hashedPassword == "hashed_"+plainPassword
}