test: improve test isolation and setup management

Add Token and RegularToken fields to TestServerSetup for pre-authenticated
access. Update setupTestServer to create fresh users with valid tokens at
initialization time. Simplify createTestMediaItemID to use setup.Token.
Remove loginTestUser, loginRegularUser, loginAdminUser functions in favor
of setup.Token/setup.RegularToken. Update createTestUserOnce and
getTestUserID/getRegularUserID to be idempotent. Update all test files to
use setup.Token instead of calling login helpers.
This commit is contained in:
2026-02-22 01:57:22 -05:00
parent 9a09161f24
commit f54508e4dd
16 changed files with 819 additions and 793 deletions
+19 -23
View File
@@ -15,7 +15,6 @@ import (
// TestAnalyticsReadingStats tests the reading statistics endpoint
func TestAnalyticsReadingStats(t *testing.T) {
setup := setupTestServer(t)
token := loginTestUser(t, setup.Server, setup.DB)
client := &http.Client{}
t.Run("GetReadingStats_WithoutAuth", func(t *testing.T) {
@@ -29,7 +28,7 @@ func TestAnalyticsReadingStats(t *testing.T) {
t.Run("GetReadingStats_WithAuth_DefaultDates", func(t *testing.T) {
req, _ := http.NewRequest("GET", setup.Server.URL+"/api/analytics/reading-stats", nil)
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req)
require.NoError(t, err)
@@ -50,7 +49,7 @@ func TestAnalyticsReadingStats(t *testing.T) {
endDate := time.Now().Format("2006-01-02")
req, _ := http.NewRequest("GET", setup.Server.URL+"/api/analytics/reading-stats?start_date="+startDate+"&end_date="+endDate, nil)
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req)
require.NoError(t, err)
@@ -61,7 +60,7 @@ func TestAnalyticsReadingStats(t *testing.T) {
t.Run("GetReadingStats_InvalidStartDate", func(t *testing.T) {
req, _ := http.NewRequest("GET", setup.Server.URL+"/api/analytics/reading-stats?start_date=invalid-date", nil)
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req)
require.NoError(t, err)
@@ -72,7 +71,7 @@ func TestAnalyticsReadingStats(t *testing.T) {
t.Run("GetReadingStats_InvalidEndDate", func(t *testing.T) {
req, _ := http.NewRequest("GET", setup.Server.URL+"/api/analytics/reading-stats?end_date=not-a-date", nil)
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req)
require.NoError(t, err)
@@ -83,7 +82,7 @@ func TestAnalyticsReadingStats(t *testing.T) {
t.Run("GetReadingStats_EmptyHistory", func(t *testing.T) {
req, _ := http.NewRequest("GET", setup.Server.URL+"/api/analytics/reading-stats", nil)
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req)
require.NoError(t, err)
@@ -103,7 +102,6 @@ func TestAnalyticsReadingStats(t *testing.T) {
// TestAnalyticsDeviceUsage tests the device usage endpoint
func TestAnalyticsDeviceUsage(t *testing.T) {
setup := setupTestServer(t)
token := loginTestUser(t, setup.Server, setup.DB)
client := &http.Client{}
t.Run("GetDeviceUsage_WithoutAuth", func(t *testing.T) {
@@ -117,7 +115,7 @@ func TestAnalyticsDeviceUsage(t *testing.T) {
t.Run("GetDeviceUsage_WithAuth_NoDevices", func(t *testing.T) {
req, _ := http.NewRequest("GET", setup.Server.URL+"/api/analytics/device-usage", nil)
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req)
require.NoError(t, err)
@@ -142,7 +140,7 @@ func TestAnalyticsDeviceUsage(t *testing.T) {
deviceReqHTTP, _ := http.NewRequest("POST", setup.Server.URL+"/api/devices/register", bytes.NewBuffer(deviceBody))
deviceReqHTTP.Header.Set("Content-Type", "application/json")
deviceReqHTTP.Header.Set("Authorization", "Bearer "+token)
deviceReqHTTP.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(deviceReqHTTP)
require.NoError(t, err)
@@ -150,7 +148,7 @@ func TestAnalyticsDeviceUsage(t *testing.T) {
// Now get device usage
req, _ := http.NewRequest("GET", setup.Server.URL+"/api/analytics/device-usage", nil)
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err = client.Do(req)
require.NoError(t, err)
@@ -169,7 +167,7 @@ func TestAnalyticsDeviceUsage(t *testing.T) {
t.Run("GetDeviceUsage_ResponseStructure", func(t *testing.T) {
req, _ := http.NewRequest("GET", setup.Server.URL+"/api/analytics/device-usage", nil)
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req)
require.NoError(t, err)
@@ -199,7 +197,6 @@ func TestAnalyticsDeviceUsage(t *testing.T) {
// TestAnalyticsPopularBooks tests the popular books endpoint
func TestAnalyticsPopularBooks(t *testing.T) {
setup := setupTestServer(t)
token := loginTestUser(t, setup.Server, setup.DB)
client := &http.Client{}
t.Run("GetPopularBooks_WithoutAuth", func(t *testing.T) {
@@ -213,7 +210,7 @@ func TestAnalyticsPopularBooks(t *testing.T) {
t.Run("GetPopularBooks_WithAuth_DefaultLimit", func(t *testing.T) {
req, _ := http.NewRequest("GET", setup.Server.URL+"/api/analytics/popular-books", nil)
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req)
require.NoError(t, err)
@@ -231,7 +228,7 @@ func TestAnalyticsPopularBooks(t *testing.T) {
t.Run("GetPopularBooks_WithCustomLimit", func(t *testing.T) {
req, _ := http.NewRequest("GET", setup.Server.URL+"/api/analytics/popular-books?limit=5", nil)
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req)
require.NoError(t, err)
@@ -248,7 +245,7 @@ func TestAnalyticsPopularBooks(t *testing.T) {
t.Run("GetPopularBooks_InvalidLimit", func(t *testing.T) {
req, _ := http.NewRequest("GET", setup.Server.URL+"/api/analytics/popular-books?limit=invalid", nil)
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req)
require.NoError(t, err)
@@ -266,7 +263,7 @@ func TestAnalyticsPopularBooks(t *testing.T) {
t.Run("GetPopularBooks_ResponseStructure", func(t *testing.T) {
// First create a book and some reading history
bookID := createTestMediaItemID(t, setup.Server)
bookID := createTestMediaItemID(t, setup)
// Create reading history for the book
historyReq := map[string]interface{}{
@@ -279,7 +276,7 @@ func TestAnalyticsPopularBooks(t *testing.T) {
historyHTTP, _ := http.NewRequest("POST", setup.Server.URL+"/api/media-items/"+bookID+"/progress", bytes.NewBuffer(historyBody))
historyHTTP.Header.Set("Content-Type", "application/json")
historyHTTP.Header.Set("Authorization", "Bearer "+token)
historyHTTP.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(historyHTTP)
require.NoError(t, err)
@@ -287,7 +284,7 @@ func TestAnalyticsPopularBooks(t *testing.T) {
// Now get popular books
req, _ := http.NewRequest("GET", setup.Server.URL+"/api/analytics/popular-books", nil)
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err = client.Do(req)
require.NoError(t, err)
@@ -314,7 +311,7 @@ func TestAnalyticsPopularBooks(t *testing.T) {
t.Run("GetPopularBooks_NoReadingHistory", func(t *testing.T) {
req, _ := http.NewRequest("GET", setup.Server.URL+"/api/analytics/popular-books", nil)
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req)
require.NoError(t, err)
@@ -334,7 +331,6 @@ func TestAnalyticsPopularBooks(t *testing.T) {
// TestAnalyticsEdgeCases tests edge cases for analytics endpoints
func TestAnalyticsEdgeCases(t *testing.T) {
setup := setupTestServer(t)
token := loginTestUser(t, setup.Server, setup.DB)
client := &http.Client{}
t.Run("ReadingStats_FutureDateRange", func(t *testing.T) {
@@ -342,7 +338,7 @@ func TestAnalyticsEdgeCases(t *testing.T) {
endDate := time.Now().AddDate(0, 0, 14).Format("2006-01-02")
req, _ := http.NewRequest("GET", setup.Server.URL+"/api/analytics/reading-stats?start_date="+startDate+"&end_date="+endDate, nil)
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req)
require.NoError(t, err)
@@ -359,7 +355,7 @@ func TestAnalyticsEdgeCases(t *testing.T) {
t.Run("PopularBooks_LimitZero", func(t *testing.T) {
req, _ := http.NewRequest("GET", setup.Server.URL+"/api/analytics/popular-books?limit=0", nil)
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req)
require.NoError(t, err)
@@ -377,7 +373,7 @@ func TestAnalyticsEdgeCases(t *testing.T) {
t.Run("PopularBooks_VeryLargeLimit", func(t *testing.T) {
req, _ := http.NewRequest("GET", setup.Server.URL+"/api/analytics/popular-books?limit=999999", nil)
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req)
require.NoError(t, err)