package csrf
import (
"testing"
"time"
"dk/internal/auth"
"github.com/valyala/fasthttp"
)
func TestGenerateToken(t *testing.T) {
// Create a mock session
session := &auth.Session{
ID: "test-session",
UserID: 1,
Username: "testuser",
Email: "test@example.com",
CreatedAt: time.Now(),
ExpiresAt: time.Now().Add(time.Hour),
LastSeen: time.Now(),
Data: make(map[string]any),
}
// Create mock context
ctx := &fasthttp.RequestCtx{}
ctx.SetUserValue(SessionCtxKey, session)
// Generate token
token := GenerateToken(ctx, nil)
if token == "" {
t.Error("Expected non-empty token")
}
// Check that token was stored in session
storedToken := GetStoredToken(session)
if storedToken != token {
t.Errorf("Expected stored token %s, got %s", token, storedToken)
}
}
func TestValidateToken(t *testing.T) {
// Create session with token
session := &auth.Session{
ID: "test-session",
UserID: 1,
Username: "testuser",
Email: "test@example.com",
Data: map[string]any{SessionKey: "test-token"},
}
ctx := &fasthttp.RequestCtx{}
ctx.SetUserValue(SessionCtxKey, session)
// Valid token should pass
if !ValidateToken(ctx, nil, "test-token") {
t.Error("Expected valid token to pass validation")
}
// Invalid token should fail
if ValidateToken(ctx, nil, "wrong-token") {
t.Error("Expected invalid token to fail validation")
}
// Empty token should fail
if ValidateToken(ctx, nil, "") {
t.Error("Expected empty token to fail validation")
}
}
func TestValidateTokenNoSession(t *testing.T) {
ctx := &fasthttp.RequestCtx{}
// No session should fail validation
if ValidateToken(ctx, nil, "any-token") {
t.Error("Expected validation to fail with no session")
}
}
func TestHiddenField(t *testing.T) {
session := &auth.Session{
ID: "test-session",
UserID: 1,
Username: "testuser",
Email: "test@example.com",
Data: map[string]any{SessionKey: "test-token"},
}
ctx := &fasthttp.RequestCtx{}
ctx.SetUserValue(SessionCtxKey, session)
field := HiddenField(ctx, nil)
expected := ``
if field != expected {
t.Errorf("Expected %s, got %s", expected, field)
}
}
func TestHiddenFieldNoSession(t *testing.T) {
ctx := &fasthttp.RequestCtx{}
field := HiddenField(ctx, nil)
if field != "" {
t.Errorf("Expected empty field with no session, got %s", field)
}
}
func TestTokenMeta(t *testing.T) {
session := &auth.Session{
ID: "test-session",
UserID: 1,
Username: "testuser",
Email: "test@example.com",
Data: map[string]any{SessionKey: "test-token"},
}
ctx := &fasthttp.RequestCtx{}
ctx.SetUserValue(SessionCtxKey, session)
meta := TokenMeta(ctx, nil)
expected := ``
if meta != expected {
t.Errorf("Expected %s, got %s", expected, meta)
}
}
func TestStoreAndGetToken(t *testing.T) {
session := &auth.Session{
Data: make(map[string]any),
}
token := "test-token"
StoreToken(session, token)
retrieved := GetStoredToken(session)
if retrieved != token {
t.Errorf("Expected %s, got %s", token, retrieved)
}
}
func TestGetStoredTokenNoData(t *testing.T) {
session := &auth.Session{}
token := GetStoredToken(session)
if token != "" {
t.Errorf("Expected empty token, got %s", token)
}
}
func TestValidateFormToken(t *testing.T) {
session := &auth.Session{
ID: "test-session",
UserID: 1,
Username: "testuser",
Email: "test@example.com",
Data: map[string]any{SessionKey: "test-token"},
}
ctx := &fasthttp.RequestCtx{}
ctx.SetUserValue(SessionCtxKey, session)
// Set form data
ctx.PostArgs().Set(TokenFieldName, "test-token")
if !ValidateFormToken(ctx, nil) {
t.Error("Expected form token validation to pass")
}
// Test with wrong token
ctx.PostArgs().Set(TokenFieldName, "wrong-token")
if ValidateFormToken(ctx, nil) {
t.Error("Expected form token validation to fail with wrong token")
}
}