fix: admin logout clears only admin tokens + add signup token tests

- Fix admin header.html logout to not use localStorage.clear()
  which was clearing vendor/customer tokens too
- Add tests for signup access_token generation
- Test that token is returned in response
- Test that token can authenticate API calls
- Test that vendor_token cookie is set

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-28 18:18:23 +01:00
parent 4298af9f79
commit 81e5cb41d6
2 changed files with 126 additions and 2 deletions

View File

@@ -284,8 +284,10 @@ document.addEventListener('alpine:init', () => {
console.error('Logout API error (continuing anyway):', error);
})
.finally(() => {
// Clear all tokens
localStorage.clear();
// Clear admin tokens only (not vendor or customer tokens)
localStorage.removeItem('admin_token');
localStorage.removeItem('admin_user');
// Note: Do NOT use localStorage.clear() - it would clear vendor/customer tokens too
window.location.href = '/admin/login';
});
}

View File

@@ -463,6 +463,128 @@ class TestCompleteSignupAPI:
assert "redirect_url" in data
assert "trial_ends_at" in data
def test_complete_signup_returns_access_token(
self, client, signup_session, mock_stripe_service, db
):
"""Test that completing signup returns a valid JWT access token for auto-login."""
# Create account
client.post(
"/api/v1/platform/signup/create-account",
json={
"session_id": signup_session,
"email": "token_test@example.com",
"password": "SecurePass123!",
"first_name": "Token",
"last_name": "Test",
"company_name": "Token Test Co",
},
)
# Setup payment
client.post(
"/api/v1/platform/signup/setup-payment",
json={"session_id": signup_session},
)
# Complete signup
response = client.post(
"/api/v1/platform/signup/complete",
json={
"session_id": signup_session,
"setup_intent_id": "seti_test_123",
},
)
assert response.status_code == 200
data = response.json()
# Verify access_token is returned
assert "access_token" in data
assert data["access_token"] is not None
assert len(data["access_token"]) > 50 # JWT tokens are long
def test_complete_signup_token_can_authenticate(
self, client, signup_session, mock_stripe_service, db
):
"""Test that the returned access token can be used to authenticate API calls."""
# Create account
client.post(
"/api/v1/platform/signup/create-account",
json={
"session_id": signup_session,
"email": "auth_test@example.com",
"password": "SecurePass123!",
"first_name": "Auth",
"last_name": "Test",
"company_name": "Auth Test Co",
},
)
# Setup payment
client.post(
"/api/v1/platform/signup/setup-payment",
json={"session_id": signup_session},
)
# Complete signup
complete_response = client.post(
"/api/v1/platform/signup/complete",
json={
"session_id": signup_session,
"setup_intent_id": "seti_test_123",
},
)
assert complete_response.status_code == 200
access_token = complete_response.json()["access_token"]
# Use the token to access a protected vendor endpoint
auth_response = client.get(
"/api/v1/vendor/onboarding/status",
headers={"Authorization": f"Bearer {access_token}"},
)
# Should be able to access the onboarding endpoint
assert auth_response.status_code == 200
def test_complete_signup_sets_vendor_token_cookie(
self, client, signup_session, mock_stripe_service, db
):
"""Test that completing signup sets the vendor_token HTTP-only cookie."""
# Create account
client.post(
"/api/v1/platform/signup/create-account",
json={
"session_id": signup_session,
"email": "cookie_test@example.com",
"password": "SecurePass123!",
"first_name": "Cookie",
"last_name": "Test",
"company_name": "Cookie Test Co",
},
)
# Setup payment
client.post(
"/api/v1/platform/signup/setup-payment",
json={"session_id": signup_session},
)
# Complete signup
response = client.post(
"/api/v1/platform/signup/complete",
json={
"session_id": signup_session,
"setup_intent_id": "seti_test_123",
},
)
assert response.status_code == 200
# Check that vendor_token cookie is set
cookies = response.cookies
assert "vendor_token" in cookies
def test_complete_signup_invalid_session(self, client, mock_stripe_service):
"""Test completing signup with invalid session."""
response = client.post(