Files
david a2aa8b2a76 Add i18n support with English and Spanish translations
- Created i18n package with translator and middleware
- Added translation files for English (en.json) and Spanish (es.json)
- Updated all HTTP handlers to use i18n for error/success messages
- Added comprehensive test coverage for i18n (87%)
- Updated CI workflow to use Go 1.24
- All tests passing with 50.8% total coverage
2025-11-29 12:27:26 +01:00

100 lines
2.3 KiB
Go

package i18n
import (
"context"
"net/http"
"net/http/httptest"
"testing"
"golang.org/x/text/language"
)
func TestLanguageMiddleware(t *testing.T) {
translator, _ := NewTranslator()
middleware := LanguageMiddleware(translator)
tests := []struct {
name string
acceptLanguage string
expectedLang language.Tag
}{
{
name: "English header",
acceptLanguage: "en-US",
expectedLang: language.English,
},
{
name: "Spanish header",
acceptLanguage: "es-ES",
expectedLang: language.Spanish,
},
{
name: "No header defaults to English",
acceptLanguage: "",
expectedLang: language.English,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
var capturedLang language.Tag
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
capturedLang = GetLanguageFromContext(r.Context())
w.WriteHeader(http.StatusOK)
})
wrappedHandler := middleware(handler)
req := httptest.NewRequest("GET", "/test", nil)
if tt.acceptLanguage != "" {
req.Header.Set("Accept-Language", tt.acceptLanguage)
}
w := httptest.NewRecorder()
wrappedHandler.ServeHTTP(w, req)
if capturedLang != tt.expectedLang {
t.Errorf("Expected language %v, got %v", tt.expectedLang, capturedLang)
}
})
}
}
func TestGetLanguageFromContext(t *testing.T) {
tests := []struct {
name string
ctx context.Context
expected language.Tag
}{
{
name: "Context with English",
ctx: context.WithValue(context.Background(), languageKey, language.English),
expected: language.English,
},
{
name: "Context with Spanish",
ctx: context.WithValue(context.Background(), languageKey, language.Spanish),
expected: language.Spanish,
},
{
name: "Context without language defaults to English",
ctx: context.Background(),
expected: language.English,
},
{
name: "Context with wrong value type defaults to English",
ctx: context.WithValue(context.Background(), languageKey, "invalid"),
expected: language.English,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := GetLanguageFromContext(tt.ctx)
if result != tt.expected {
t.Errorf("Expected %v, got %v", tt.expected, result)
}
})
}
}