107 lines
3.1 KiB
Go
107 lines
3.1 KiB
Go
package services_test
|
|
|
|
import (
|
|
"actatempus_backend/internal/application/repository"
|
|
"actatempus_backend/internal/application/services"
|
|
"actatempus_backend/internal/application/services/dto"
|
|
"actatempus_backend/internal/domain/entities"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"actatempus_backend/tests/mocks"
|
|
"bytes"
|
|
"context"
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
E "github.com/IBM/fp-go/either"
|
|
F "github.com/IBM/fp-go/function"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestAuthService(t *testing.T) {
|
|
// Setup
|
|
gin.SetMode(gin.TestMode)
|
|
authRepo := repository.NewInMemoryAuthRepositoryImpl("secret")
|
|
userDS := mocks.NewMockUserDataSource()
|
|
userRepo := repository.NewUserRepository(userDS)
|
|
authService := services.NewAuthService(authRepo, userRepo)
|
|
|
|
router := gin.Default()
|
|
router.RedirectTrailingSlash = false
|
|
api := router.Group("/api/auth")
|
|
authService.RegisterRoutes(api)
|
|
|
|
populateUser := func(email, password, name string) entities.User {
|
|
newUser, _ := E.Unwrap(F.Pipe1(
|
|
entities.UserCreate{
|
|
Email: email,
|
|
Password: password,
|
|
Name: name,
|
|
},
|
|
userRepo.Create(context.Background()),
|
|
))
|
|
return newUser
|
|
}
|
|
|
|
t.Run("Login - Success", func(t *testing.T) {
|
|
user := populateUser("test.user@example.com", "password123", "Test User")
|
|
|
|
loginRequest := dto.LoginRequestDTO{
|
|
Email: user.Email,
|
|
Password: "password123",
|
|
}
|
|
|
|
body, _ := json.Marshal(loginRequest)
|
|
req := httptest.NewRequest(http.MethodPost, "/api/auth/login", bytes.NewBuffer(body))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
rec := httptest.NewRecorder()
|
|
|
|
router.ServeHTTP(rec, req)
|
|
|
|
assert.Equal(t, http.StatusOK, rec.Code)
|
|
var response dto.TokenResponseDTO
|
|
err := json.Unmarshal(rec.Body.Bytes(), &response)
|
|
assert.NoError(t, err)
|
|
assert.NotEmpty(t, response.Token)
|
|
})
|
|
|
|
t.Run("Validate - Success", func(t *testing.T) {
|
|
user := populateUser("validate.user@example.com", "password123", "Validate User")
|
|
token, _ := E.Unwrap(F.Pipe1(user.ID, authRepo.GenerateToken(context.Background())))
|
|
|
|
req := httptest.NewRequest(http.MethodPost, "/api/auth/validate", nil)
|
|
req.Header.Set("Cookie", "session_token="+token)
|
|
rec := httptest.NewRecorder()
|
|
|
|
router.ServeHTTP(rec, req)
|
|
|
|
assert.Equal(t, http.StatusOK, rec.Code)
|
|
var response map[string]interface{}
|
|
err := json.Unmarshal(rec.Body.Bytes(), &response)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, "Token validated", response["message"])
|
|
assert.Equal(t, user.ID, response["user_id"])
|
|
})
|
|
|
|
t.Run("Logout - Success", func(t *testing.T) {
|
|
user := populateUser("logout.user@example.com", "password123", "Logout User")
|
|
token, _ := E.Unwrap(F.Pipe1(user.ID, authRepo.GenerateToken(context.Background())))
|
|
|
|
req := httptest.NewRequest(http.MethodPost, "/api/auth/logout", nil)
|
|
req.Header.Set("Cookie", "session_token="+token)
|
|
rec := httptest.NewRecorder()
|
|
|
|
router.ServeHTTP(rec, req)
|
|
|
|
assert.Equal(t, http.StatusOK, rec.Code)
|
|
var response map[string]interface{}
|
|
err := json.Unmarshal(rec.Body.Bytes(), &response)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, "Token revoked", response["message"])
|
|
assert.Equal(t, user.ID, response["user_id"])
|
|
})
|
|
}
|