2025-11-01 02:44:58 +00:00
|
|
|
import { describe, it, expect } from 'vitest'
|
|
|
|
|
import { server, http, HttpResponse } from './test-setup'
|
2025-11-01 02:52:33 +00:00
|
|
|
import { logout, loginWithPassword, createAccount, handleGoogleLogin } from '@/api/auth'
|
|
|
|
|
import { api } from '@/api/client'
|
2025-11-01 02:44:58 +00:00
|
|
|
|
2025-11-01 02:52:33 +00:00
|
|
|
describe('auth api (jwt + households)', () => {
|
|
|
|
|
it('loginWithPassword posts email/password and returns user from token response', async () => {
|
2025-11-01 02:44:58 +00:00
|
|
|
server.use(
|
|
|
|
|
http.post('*/api/v1/auth/login', async ({ request }) => {
|
|
|
|
|
const body = await request.json()
|
2025-11-01 02:52:33 +00:00
|
|
|
expect(body).toEqual({ email: 'test@example.com', password: 'secret' })
|
|
|
|
|
return HttpResponse.json({ accessToken: 'abc123', tokenType: 'bearer', user: { id: 123, email: 'test@example.com', displayName: 'Test User' } })
|
2025-11-01 02:44:58 +00:00
|
|
|
})
|
|
|
|
|
)
|
2025-11-01 02:52:33 +00:00
|
|
|
const user = await loginWithPassword('test@example.com', 'secret')
|
|
|
|
|
expect(user.id).toBe(123)
|
|
|
|
|
expect(user.displayName).toBe('Test User')
|
|
|
|
|
|
|
|
|
|
// Subsequent API call should include Authorization header
|
|
|
|
|
server.use(
|
|
|
|
|
http.get('*/api/v1/users/me/households', ({ request }) => {
|
|
|
|
|
const auth = request.headers.get('authorization')
|
|
|
|
|
expect(auth?.toLowerCase()).toBe('bearer abc123')
|
|
|
|
|
return HttpResponse.json([])
|
|
|
|
|
})
|
|
|
|
|
)
|
|
|
|
|
const res = await api.GET('/api/v1/users/me/households', { params: {} })
|
|
|
|
|
expect(res.response.ok).toBe(true)
|
2025-11-01 02:44:58 +00:00
|
|
|
})
|
|
|
|
|
|
2025-11-01 02:52:33 +00:00
|
|
|
it('createAccount posts to /auth/register and sets token', async () => {
|
2025-11-01 02:44:58 +00:00
|
|
|
server.use(
|
2025-11-01 02:52:33 +00:00
|
|
|
http.post('*/api/v1/auth/register', async ({ request }) => {
|
|
|
|
|
const body = await request.json()
|
|
|
|
|
expect(body).toEqual({ email: 'new@example.com', password: 'pw', displayName: 'New User' })
|
|
|
|
|
return HttpResponse.json({ accessToken: 'xyz789', tokenType: 'bearer', user: { id: 55, email: 'new@example.com', displayName: 'New User' } })
|
2025-11-01 02:44:58 +00:00
|
|
|
})
|
|
|
|
|
)
|
2025-11-01 02:52:33 +00:00
|
|
|
const user = await createAccount('new@example.com', 'New User', 'pw')
|
|
|
|
|
expect(user.id).toBe(55)
|
2025-11-01 02:44:58 +00:00
|
|
|
|
|
|
|
|
server.use(
|
2025-11-01 02:52:33 +00:00
|
|
|
http.get('*/api/v1/users/me/households', ({ request }) => {
|
|
|
|
|
const auth = request.headers.get('authorization')
|
|
|
|
|
expect(auth?.toLowerCase()).toBe('bearer xyz789')
|
|
|
|
|
return HttpResponse.json([])
|
|
|
|
|
})
|
2025-11-01 02:44:58 +00:00
|
|
|
)
|
2025-11-01 02:52:33 +00:00
|
|
|
const res = await api.GET('/api/v1/users/me/households', { params: {} })
|
|
|
|
|
expect(res.response.ok).toBe(true)
|
2025-11-01 02:44:58 +00:00
|
|
|
})
|
|
|
|
|
|
2025-11-01 02:52:33 +00:00
|
|
|
it('handleGoogleLogin exists (not implemented yet)', async () => {
|
2025-11-01 02:44:58 +00:00
|
|
|
await expect(handleGoogleLogin('token-123')).rejects.toBeInstanceOf(Error)
|
|
|
|
|
})
|
2025-11-01 02:52:33 +00:00
|
|
|
|
|
|
|
|
it('logout clears auth token', async () => {
|
|
|
|
|
// Simulate logged-in state then logout and verify header is not sent
|
|
|
|
|
server.use(
|
|
|
|
|
http.post('*/api/v1/auth/login', () => HttpResponse.json({ accessToken: 'tok', tokenType: 'bearer', user: { id: 1, email: 'a@b', displayName: 'A' } }))
|
|
|
|
|
)
|
|
|
|
|
await loginWithPassword('a@b', 'pw')
|
|
|
|
|
await logout()
|
|
|
|
|
server.use(
|
|
|
|
|
http.get('*/api/v1/users/me/households', ({ request }) => {
|
|
|
|
|
const auth = request.headers.get('authorization')
|
|
|
|
|
expect(auth).toBeFalsy()
|
|
|
|
|
return HttpResponse.json([])
|
|
|
|
|
})
|
|
|
|
|
)
|
|
|
|
|
const res = await api.GET('/api/v1/users/me/households', { params: {} })
|
|
|
|
|
expect(res.response.ok).toBe(true)
|
|
|
|
|
})
|
2025-11-01 02:44:58 +00:00
|
|
|
})
|