diff --git a/src/__tests__/app.test.ts b/src/__tests__/app.test.ts index e0b47c2..348c5ae 100644 --- a/src/__tests__/app.test.ts +++ b/src/__tests__/app.test.ts @@ -12,6 +12,8 @@ const testUserCredentials = { password: "aaaaaaaaaa" } +let category_id: number + // Mettre a jour les routes Category en stockant les IDs sur GET pour reutiliser sur DELETE beforeAll(async () => { @@ -133,17 +135,36 @@ describe('GET /v1/category', () => { .set('Content-Type', 'application/json') .set('Cookie', jwtCookie as string) - expect(res.status).toEqual(200) - expect(res.body).toHaveProperty('categories') - }) + category_id = res.body.categories[0].id - it('returns status code 400 and error message', async () => { + expect(res.status).toEqual(200) + expect(res.body.categories[0].name).toEqual('VueJS Composition API') + }) +}) + +describe('PUT /v1/category', () => { + it('returns status code 200 and a success message', async () => { const res = await request(app) - .post('/v1/category') + .put('/v1/category') .set('Content-Type', 'application/json') .set('Cookie', jwtCookie as string) .send(JSON.stringify({ - pouet: 'VueJS Composition API' + id: category_id, + name: 'VueJS v3 Composition API' + })) + + expect(res.status).toEqual(200) + expect(res.body).toHaveProperty('message') + }) + + it('returns status code 400 and an error message', async () => { + const res = await request(app) + .put('/v1/category') + .set('Content-Type', 'application/json') + .set('Cookie', jwtCookie as string) + .send(JSON.stringify({ + id: 2, + pouet: 'salut' })) expect(res.status).toEqual(400) @@ -158,7 +179,7 @@ describe('DELETE /v1/category', () => { .set('Content-Type', 'application/json') .set('Cookie', jwtCookie as string) .send(JSON.stringify({ - name: 'VueJS Composition API' + id: category_id })) expect(res.status).toEqual(200) diff --git a/src/routers/category.ts b/src/routers/category.ts index ef60f4e..6cc8f6c 100644 --- a/src/routers/category.ts +++ b/src/routers/category.ts @@ -14,6 +14,12 @@ const categoryDeleteParser = z.object({ id: z.number() }).required() +const categoryUpdateParser = z.object({ + id: z.number(), + name: z.string().max(50) +}).required() + +// TODO Ajouter pagination et queries de recherche const categoryGet: RequestHandler = async (req, res) => { let categories: Category[] | null = null @@ -44,6 +50,28 @@ const categoryPost: RequestHandler = async (req, res) => { res.json({ message: 'Category successfully added.' }) } +const categoryUpdate: RequestHandler = async (req, res) => { + let updated: Prisma.BatchPayload + + try { + const categoryToUpdate = categoryUpdateParser.parse(req.body) + updated = await prisma.category.updateMany({ + where: { + id: categoryToUpdate.id, + user_id: req.body.userId + }, + data: { + name: categoryToUpdate.name + } + }) + } catch (error: any) { + res.status(400).json({ message: (error.issues ?? error) }) + return; + } + + res.json({ message: `${updated.count} category / categories successfully updated.` }) +} + const categoryDelete: RequestHandler = async (req, res) => { let deleted: Prisma.BatchPayload @@ -65,6 +93,7 @@ const categoryDelete: RequestHandler = async (req, res) => { categoryRouter.get('/', userIdMiddleware, categoryGet) categoryRouter.post('/', userIdMiddleware, categoryPost) +categoryRouter.put('/', userIdMiddleware, categoryUpdate) categoryRouter.delete('/', userIdMiddleware, categoryDelete) export default categoryRouter