Some checks failed
Go Benchmark / Performance Regression Check (push) Has been cancelled
Cerberus Integration / Cerberus Security Stack Integration (push) Has been cancelled
Upload Coverage to Codecov / Backend Codecov Upload (push) Has been cancelled
Upload Coverage to Codecov / Frontend Codecov Upload (push) Has been cancelled
CodeQL - Analyze / CodeQL analysis (go) (push) Has been cancelled
CodeQL - Analyze / CodeQL analysis (javascript-typescript) (push) Has been cancelled
CrowdSec Integration / CrowdSec Bouncer Integration (push) Has been cancelled
Docker Build, Publish & Test / build-and-push (push) Has been cancelled
Quality Checks / Auth Route Protection Contract (push) Has been cancelled
Quality Checks / Codecov Trigger/Comment Parity Guard (push) Has been cancelled
Quality Checks / Backend (Go) (push) Has been cancelled
Quality Checks / Frontend (React) (push) Has been cancelled
Rate Limit integration / Rate Limiting Integration (push) Has been cancelled
Security Scan (PR) / Trivy Binary Scan (push) Has been cancelled
Supply Chain Verification (PR) / Verify Supply Chain (push) Has been cancelled
WAF integration / Coraza WAF Integration (push) Has been cancelled
Docker Build, Publish & Test / Security Scan PR Image (push) Has been cancelled
Repo Health Check / Repo health (push) Has been cancelled
History Rewrite Dry-Run / Dry-run preview for history rewrite (push) Has been cancelled
Prune Renovate Branches / prune (push) Has been cancelled
Renovate / renovate (push) Has been cancelled
Nightly Build & Package / sync-development-to-nightly (push) Has been cancelled
Nightly Build & Package / Trigger Nightly Validation Workflows (push) Has been cancelled
Nightly Build & Package / build-and-push-nightly (push) Has been cancelled
Nightly Build & Package / test-nightly-image (push) Has been cancelled
Nightly Build & Package / verify-nightly-supply-chain (push) Has been cancelled
Update GeoLite2 Checksum / update-checksum (push) Has been cancelled
Container Registry Prune / prune-ghcr (push) Has been cancelled
Container Registry Prune / prune-dockerhub (push) Has been cancelled
Container Registry Prune / summarize (push) Has been cancelled
Supply Chain Verification / Verify SBOM (push) Has been cancelled
Supply Chain Verification / Verify Release Artifacts (push) Has been cancelled
Supply Chain Verification / Verify Docker Image Supply Chain (push) Has been cancelled
Monitor Caddy Major Release / check-caddy-major (push) Has been cancelled
Weekly Nightly to Main Promotion / Verify Nightly Branch Health (push) Has been cancelled
Weekly Nightly to Main Promotion / Create Promotion PR (push) Has been cancelled
Weekly Nightly to Main Promotion / Trigger Missing Required Checks (push) Has been cancelled
Weekly Nightly to Main Promotion / Notify on Failure (push) Has been cancelled
Weekly Nightly to Main Promotion / Workflow Summary (push) Has been cancelled
Weekly Security Rebuild / Security Rebuild & Scan (push) Has been cancelled
118 lines
3.5 KiB
Go
Executable File
118 lines
3.5 KiB
Go
Executable File
package handlers
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/Wikid82/charon/backend/internal/config"
|
|
"github.com/Wikid82/charon/backend/internal/models"
|
|
"github.com/Wikid82/charon/backend/internal/services"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func TestUserLoginAfterEmailChange(t *testing.T) {
|
|
// Setup DB
|
|
dbName := "file:" + t.Name() + "?mode=memory&cache=shared"
|
|
db, err := gorm.Open(sqlite.Open(dbName), &gorm.Config{})
|
|
require.NoError(t, err)
|
|
_ = db.AutoMigrate(&models.User{}, &models.Setting{})
|
|
|
|
// Setup Services and Handlers
|
|
cfg := config.Config{}
|
|
authService := services.NewAuthService(db, cfg)
|
|
authHandler := NewAuthHandler(authService)
|
|
userHandler := NewUserHandler(db, nil)
|
|
|
|
// Setup Router
|
|
r := gin.New()
|
|
|
|
// Register Routes
|
|
r.POST("/auth/login", authHandler.Login)
|
|
|
|
// Mock Auth Middleware for UpdateProfile
|
|
r.POST("/user/profile", func(c *gin.Context) {
|
|
// Simulate authenticated user
|
|
var user models.User
|
|
db.First(&user)
|
|
c.Set("userID", user.ID)
|
|
c.Set("role", user.Role)
|
|
c.Next()
|
|
}, userHandler.UpdateProfile)
|
|
|
|
// 1. Create Initial User
|
|
initialEmail := "initial@example.com"
|
|
password := "password123"
|
|
user, err := authService.Register(initialEmail, password, "Test User")
|
|
require.NoError(t, err)
|
|
require.NotNil(t, user)
|
|
|
|
// 2. Login with Initial Credentials (Verify it works)
|
|
loginBody := map[string]string{
|
|
"email": initialEmail,
|
|
"password": password,
|
|
}
|
|
jsonBody, _ := json.Marshal(loginBody)
|
|
req, _ := http.NewRequest("POST", "/auth/login", bytes.NewBuffer(jsonBody))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
w := httptest.NewRecorder()
|
|
r.ServeHTTP(w, req)
|
|
assert.Equal(t, http.StatusOK, w.Code, "Initial login should succeed")
|
|
|
|
// 3. Update Profile (Change Email)
|
|
newEmail := "updated@example.com"
|
|
updateBody := map[string]string{
|
|
"name": "Test User Updated",
|
|
"email": newEmail,
|
|
"current_password": password,
|
|
}
|
|
jsonUpdate, _ := json.Marshal(updateBody)
|
|
req, _ = http.NewRequest("POST", "/user/profile", bytes.NewBuffer(jsonUpdate))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
w = httptest.NewRecorder()
|
|
r.ServeHTTP(w, req)
|
|
assert.Equal(t, http.StatusOK, w.Code, "Update profile should succeed")
|
|
|
|
// Verify DB update
|
|
var updatedUser models.User
|
|
db.First(&updatedUser, user.ID)
|
|
assert.Equal(t, newEmail, updatedUser.Email, "Email should be updated in DB")
|
|
|
|
// 4. Login with New Email
|
|
loginBodyNew := map[string]string{
|
|
"email": newEmail,
|
|
"password": password,
|
|
}
|
|
jsonBodyNew, _ := json.Marshal(loginBodyNew)
|
|
req, _ = http.NewRequest("POST", "/auth/login", bytes.NewBuffer(jsonBodyNew))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
w = httptest.NewRecorder()
|
|
r.ServeHTTP(w, req)
|
|
|
|
// This is where the user says it fails
|
|
assert.Equal(t, http.StatusOK, w.Code, "Login with new email should succeed")
|
|
if w.Code != http.StatusOK {
|
|
t.Logf("Response Body: %s", w.Body.String())
|
|
}
|
|
|
|
// 5. Login with New Email (Different Case)
|
|
loginBodyCase := map[string]string{
|
|
"email": "Updated@Example.com", // Different case
|
|
"password": password,
|
|
}
|
|
jsonBodyCase, _ := json.Marshal(loginBodyCase)
|
|
req, _ = http.NewRequest("POST", "/auth/login", bytes.NewBuffer(jsonBodyCase))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
w = httptest.NewRecorder()
|
|
r.ServeHTTP(w, req)
|
|
|
|
// If this fails, it confirms case sensitivity issue
|
|
assert.Equal(t, http.StatusOK, w.Code, "Login with mixed case email should succeed")
|
|
}
|