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:
@@ -74,7 +74,7 @@ func createTestQueueItem(t *testing.T, db *database.Queries, userID uuid.UUID) (
|
||||
func TestListAllQueueItems_Admin(t *testing.T) {
|
||||
setup := setupTestServer(t)
|
||||
|
||||
token := loginAdminUser(t, setup.Server, setup.DB)
|
||||
token := setup.Token
|
||||
|
||||
req := httptest.NewRequest("GET", "/api/queue/items", nil)
|
||||
req.Header.Set("Authorization", "Bearer "+token)
|
||||
@@ -91,7 +91,7 @@ func TestListAllQueueItems_Admin(t *testing.T) {
|
||||
func TestGetDeviceQueueStats(t *testing.T) {
|
||||
setup := setupTestServer(t)
|
||||
|
||||
token := loginTestUser(t, setup.Server, setup.DB)
|
||||
token := setup.Token
|
||||
|
||||
userID := getTestUserID(t, setup.DB)
|
||||
|
||||
@@ -131,7 +131,7 @@ func TestGetDeviceQueueStats(t *testing.T) {
|
||||
func TestListDeviceQueueItems(t *testing.T) {
|
||||
setup := setupTestServer(t)
|
||||
|
||||
token := loginTestUser(t, setup.Server, setup.DB)
|
||||
token := setup.Token
|
||||
|
||||
userID := getTestUserID(t, setup.DB)
|
||||
|
||||
@@ -168,7 +168,7 @@ func TestListDeviceQueueItems(t *testing.T) {
|
||||
|
||||
func TestRetryQueueItem(t *testing.T) {
|
||||
setup := setupTestServer(t)
|
||||
token := loginTestUser(t, setup.Server, setup.DB)
|
||||
token := setup.Token
|
||||
|
||||
// Get the current test user's ID from database
|
||||
user, err := setup.DB.GetUserByEmail(context.Background(), "testuser@example.com")
|
||||
@@ -189,7 +189,7 @@ func TestRetryQueueItem(t *testing.T) {
|
||||
|
||||
func TestDeleteQueueItem(t *testing.T) {
|
||||
setup := setupTestServer(t)
|
||||
token := loginTestUser(t, setup.Server, setup.DB)
|
||||
token := setup.Token
|
||||
|
||||
// Get the current test user's ID from database
|
||||
user, err := setup.DB.GetUserByEmail(context.Background(), "testuser@example.com")
|
||||
@@ -211,7 +211,7 @@ func TestDeleteQueueItem(t *testing.T) {
|
||||
func TestClearDeviceQueue(t *testing.T) {
|
||||
setup := setupTestServer(t)
|
||||
|
||||
token := loginTestUser(t, setup.Server, setup.DB)
|
||||
token := setup.Token
|
||||
|
||||
userID := getTestUserID(t, setup.DB)
|
||||
|
||||
@@ -268,65 +268,3 @@ func TestQueueEndpoints_Unauthorized(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func loginAdminUser(t *testing.T, ts *httptest.Server, db *database.Queries) string {
|
||||
ctx := context.Background()
|
||||
|
||||
// Check if admin user exists and delete them first to ensure fresh state
|
||||
// (using database delete directly to bypass "last admin" check)
|
||||
user, err := db.GetUserByEmail(ctx, "admin@example.com")
|
||||
if err == nil {
|
||||
err = db.DeleteUser(ctx, user.ID)
|
||||
if err != nil {
|
||||
t.Logf("Warning: Could not delete existing admin user: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// Create a fresh admin user with known password
|
||||
// Password: "Test@Pass123!" meets complexity requirements
|
||||
// This is the bcrypt hash for "Test@Pass123!"
|
||||
passwordHash := "$2a$10$JjAtK7PPa1WexQC3AUGe8OXLeuseZ/haN1Mz7emMo6CfOvMiTVXWq"
|
||||
|
||||
adminUser, err := db.CreateUser(ctx, database.CreateUserParams{
|
||||
Email: "admin@example.com",
|
||||
Username: "admin",
|
||||
PasswordHash: passwordHash,
|
||||
FirstName: pgtype.Text{String: "Admin", Valid: true},
|
||||
LastName: pgtype.Text{String: "User", Valid: true},
|
||||
Role: "admin",
|
||||
Theme: pgtype.Text{String: "tokyo-night", Valid: true},
|
||||
})
|
||||
require.NoError(t, err, "Failed to create admin user")
|
||||
|
||||
userUUID, err := uuid.FromBytes(adminUser.ID.Bytes[:])
|
||||
require.NoError(t, err, "Should parse admin user UUID")
|
||||
|
||||
return loginUserWithID(t, ts, db, userUUID, "admin@example.com", "Test@Pass123!")
|
||||
}
|
||||
|
||||
func loginUserWithID(t *testing.T, ts *httptest.Server, db *database.Queries, userID uuid.UUID, email, password string) string {
|
||||
loginRequest := map[string]interface{}{
|
||||
"login": email,
|
||||
"password": password,
|
||||
}
|
||||
body, _ := json.Marshal(loginRequest)
|
||||
|
||||
req, _ := http.NewRequest("POST", ts.URL+"/api/auth/login", bytes.NewBuffer(body))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
|
||||
client := &http.Client{}
|
||||
resp, err := client.Do(req)
|
||||
require.NoError(t, err, "Failed to login")
|
||||
defer resp.Body.Close()
|
||||
|
||||
require.Equal(t, http.StatusOK, resp.StatusCode, "Login should succeed")
|
||||
|
||||
var result map[string]interface{}
|
||||
json.NewDecoder(resp.Body).Decode(&result)
|
||||
|
||||
token, ok := result["access_token"].(string)
|
||||
require.True(t, ok, "Should have access_token")
|
||||
require.NotEmpty(t, token, "Access token should not be empty")
|
||||
|
||||
return token
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user