Files
bamort/backend/api/api_test.go
T
2026-04-22 10:29:40 +02:00

102 lines
2.5 KiB
Go

package api
import (
"bamort/bmrt/ptpl"
"bamort/database"
"bamort/router"
"bamort/user"
"encoding/json"
"net/http"
"net/http/httptest"
"os"
"testing"
"github.com/gin-gonic/gin"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func setupTestEnvironment(t *testing.T) {
t.Helper()
original := os.Getenv("ENVIRONMENT")
os.Setenv("ENVIRONMENT", "test")
t.Cleanup(func() {
if original != "" {
os.Setenv("ENVIRONMENT", original)
} else {
os.Unsetenv("ENVIRONMENT")
}
})
database.SetupTestDB(true, true)
t.Cleanup(database.ResetTestDB)
require.NoError(t, database.MigrateStructure())
require.NoError(t, user.MigrateStructure())
require.NoError(t, ptpl.MigrateStructure())
gin.SetMode(gin.TestMode)
}
func buildRouter() *gin.Engine {
r := gin.Default()
router.SetupGin(r)
protected := router.BaseRouterGrp(r)
ptpl.RegisterRoutes(protected)
ptpl.RegisterPublicRoutes(r)
return r
}
// TestPublicInfo verifies the public /public/ptpl/info endpoint (no auth required).
func TestPublicInfo(t *testing.T) {
setupTestEnvironment(t)
r := buildRouter()
req, _ := http.NewRequest(http.MethodGet, "/public/ptpl/info", nil)
w := httptest.NewRecorder()
r.ServeHTTP(w, req)
assert.Equal(t, http.StatusOK, w.Code)
var body map[string]string
require.NoError(t, json.Unmarshal(w.Body.Bytes(), &body))
assert.Equal(t, "ptpl", body["module"])
assert.Equal(t, "active", body["status"])
}
// TestProtectedRouteWithoutToken verifies that /api/ptpl returns 401 without a JWT.
func TestProtectedRouteWithoutToken(t *testing.T) {
setupTestEnvironment(t)
r := buildRouter()
req, _ := http.NewRequest(http.MethodGet, "/api/ptpl", nil)
w := httptest.NewRecorder()
r.ServeHTTP(w, req)
assert.Equal(t, http.StatusUnauthorized, w.Code)
}
// TestProtectedRouteWithToken verifies that /api/ptpl returns 200 with a valid JWT.
func TestProtectedRouteWithToken(t *testing.T) {
setupTestEnvironment(t)
r := buildRouter()
u := &user.User{
Username: "apitest",
DisplayName: "API Test",
PasswordHash: "irrelevant",
Email: "apitest@test.local",
Role: user.RoleStandardUser,
}
require.NoError(t, database.DB.Create(u).Error)
token := user.GenerateToken(u)
req, _ := http.NewRequest(http.MethodGet, "/api/ptpl", nil)
req.Header.Set("Authorization", "Bearer "+token)
w := httptest.NewRecorder()
r.ServeHTTP(w, req)
assert.Equal(t, http.StatusOK, w.Code)
var items []ptpl.PtplItem
require.NoError(t, json.Unmarshal(w.Body.Bytes(), &items))
assert.Empty(t, items)
}