munch-ease-frontend/tests/auth.api.test.ts

75 lines
3.1 KiB
TypeScript
Raw Permalink Normal View History

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
})