import type { Document } from '@/lib/db/schema'; import { generateUUID } from '@/lib/utils'; import { expect, test } from '../fixtures'; import { getMessageByErrorCode } from '@/lib/errors'; const documentsCreatedByAda: Array = []; test.describe .serial('/api/document', () => { test('Ada cannot retrieve a document without specifying an id', async ({ adaContext, }) => { const response = await adaContext.request.get('/api/document'); expect(response.status()).toBe(400); const { code, message } = await response.json(); expect(code).toEqual('bad_request:api'); expect(message).toEqual(getMessageByErrorCode(code)); }); test('Ada cannot retrieve a document that does not exist', async ({ adaContext, }) => { const documentId = generateUUID(); const response = await adaContext.request.get( `/api/document?id=${documentId}`, ); expect(response.status()).toBe(404); const { code, message } = await response.json(); expect(code).toEqual('not_found:document'); expect(message).toEqual(getMessageByErrorCode(code)); }); test('Ada can create a document', async ({ adaContext }) => { const documentId = generateUUID(); const draftDocument = { title: "Ada's Document", kind: 'text', content: 'Created by Ada', }; const response = await adaContext.request.post( `/api/document?id=${documentId}`, { data: draftDocument, }, ); expect(response.status()).toBe(200); const [createdDocument] = await response.json(); expect(createdDocument).toMatchObject(draftDocument); documentsCreatedByAda.push(createdDocument); }); test('Ada can retrieve a created document', async ({ adaContext }) => { const [document] = documentsCreatedByAda; const response = await adaContext.request.get( `/api/document?id=${document.id}`, ); expect(response.status()).toBe(200); const retrievedDocuments = await response.json(); expect(retrievedDocuments).toHaveLength(1); const [retrievedDocument] = retrievedDocuments; expect(retrievedDocument).toMatchObject(document); }); test('Ada can save a new version of the document', async ({ adaContext, }) => { const [firstDocument] = documentsCreatedByAda; const draftDocument = { title: "Ada's Document", kind: 'text', content: 'Updated by Ada', }; const response = await adaContext.request.post( `/api/document?id=${firstDocument.id}`, { data: draftDocument, }, ); expect(response.status()).toBe(200); const [createdDocument] = await response.json(); expect(createdDocument).toMatchObject(draftDocument); documentsCreatedByAda.push(createdDocument); }); test('Ada can retrieve all versions of her documents', async ({ adaContext, }) => { const [firstDocument, secondDocument] = documentsCreatedByAda; const response = await adaContext.request.get( `/api/document?id=${firstDocument.id}`, ); expect(response.status()).toBe(200); const retrievedDocuments = await response.json(); expect(retrievedDocuments).toHaveLength(2); const [firstRetrievedDocument, secondRetrievedDocument] = retrievedDocuments; expect(firstRetrievedDocument).toMatchObject(firstDocument); expect(secondRetrievedDocument).toMatchObject(secondDocument); }); test('Ada cannot delete a document without specifying an id', async ({ adaContext, }) => { const response = await adaContext.request.delete(`/api/document`); expect(response.status()).toBe(400); const { code, message } = await response.json(); expect(code).toEqual('bad_request:api'); expect(message).toEqual(getMessageByErrorCode(code)); }); test('Ada cannot delete a document without specifying a timestamp', async ({ adaContext, }) => { const [firstDocument] = documentsCreatedByAda; const response = await adaContext.request.delete( `/api/document?id=${firstDocument.id}`, ); expect(response.status()).toBe(400); const { code, message } = await response.json(); expect(code).toEqual('bad_request:api'); expect(message).toEqual(getMessageByErrorCode(code)); }); test('Ada can delete a document by specifying id and timestamp', async ({ adaContext, }) => { const [firstDocument, secondDocument] = documentsCreatedByAda; const response = await adaContext.request.delete( `/api/document?id=${firstDocument.id}×tamp=${firstDocument.createdAt}`, ); expect(response.status()).toBe(200); const deletedDocuments = await response.json(); expect(deletedDocuments).toHaveLength(1); const [deletedDocument] = deletedDocuments; expect(deletedDocument).toMatchObject(secondDocument); }); test('Ada can retrieve documents without deleted versions', async ({ adaContext, }) => { const [firstDocument] = documentsCreatedByAda; const response = await adaContext.request.get( `/api/document?id=${firstDocument.id}`, ); expect(response.status()).toBe(200); const retrievedDocuments = await response.json(); expect(retrievedDocuments).toHaveLength(1); const [firstRetrievedDocument] = retrievedDocuments; expect(firstRetrievedDocument).toMatchObject(firstDocument); }); test("Babbage cannot update Ada's document", async ({ babbageContext }) => { const [firstDocument] = documentsCreatedByAda; const draftDocument = { title: "Babbage's Document", kind: 'text', content: 'Created by Babbage', }; const response = await babbageContext.request.post( `/api/document?id=${firstDocument.id}`, { data: draftDocument, }, ); expect(response.status()).toBe(403); const { code, message } = await response.json(); expect(code).toEqual('forbidden:document'); expect(message).toEqual(getMessageByErrorCode(code)); }); test("Ada's documents did not get updated", async ({ adaContext }) => { const [firstDocument] = documentsCreatedByAda; const response = await adaContext.request.get( `/api/document?id=${firstDocument.id}`, ); expect(response.status()).toBe(200); const documentsRetrieved = await response.json(); expect(documentsRetrieved).toHaveLength(1); }); });