From 49d42130d71afedaaaba58f43a2f041314196ac5 Mon Sep 17 00:00:00 2001 From: Aydan Pirani Date: Sat, 11 Nov 2023 13:36:39 -0600 Subject: [PATCH 1/9] Initial event get tests --- src/services/event/event-router.test.ts | 84 +++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 src/services/event/event-router.test.ts diff --git a/src/services/event/event-router.test.ts b/src/services/event/event-router.test.ts new file mode 100644 index 00000000..e1f5936d --- /dev/null +++ b/src/services/event/event-router.test.ts @@ -0,0 +1,84 @@ +import { describe, expect, it, beforeEach } from "@jest/globals"; +import { StatusCode } from "status-code-enum"; +import Models from "../../database/models.js"; +import { getAsAttendee, getAsStaff } from "../../testTools.js"; + +const EXTERNAL_PUBLIC_EVENT = { + eventId: "52fdfc072182654f163f5f0f9a621d72", + name: "Example Event 10", + description: "This is a description", + startTime: 1532202702, + endTime: 1532212702, + locations: [ + { + description: "Example Location", + tags: ["SIEBEL0", "ECEB1"], + latitude: 40.1138, + longitude: -88.2249, + }, + ], + sponsor: "Example sponsor", + eventType: "WORKSHOP", + points: 0, +}; + +const INTERNAL_PUBLIC_EVENT = { + ...EXTERNAL_PUBLIC_EVENT, + displayOnStaffCheckIn: false, + isPrivate: false, + isAsync: false, +}; + +const STAFF_EVENT = { + eventId: "52fdfc072182654f163f5f0f9a621d72", + name: "Example Event 10", + description: "This is a description", + startTime: 1532202702, + endTime: 1532212702, + locations: [], + sponsor: "Example sponsor", + eventType: "WORKSHOP", + isStaff: true, + isPrivate: true, + isAsync: true, + displayOnStaffCheckIn: true, +}; + +beforeEach(async () => { + Models.initialize(); + await Models.StaffEvent.create(STAFF_EVENT); + await Models.PublicEvent.create(INTERNAL_PUBLIC_EVENT); +}); + +describe("GET /event/", () => { + it("returns only filtered attendee events for attendees", async () => { + const response = await getAsAttendee("/event/").expect(StatusCode.SuccessOK); + + expect(JSON.parse(response.text)).toMatchObject({ + events: [EXTERNAL_PUBLIC_EVENT], + }); + }); + + it("returns all attendee events for staff", async () => { + const response = await getAsStaff("/event/").expect(StatusCode.SuccessOK); + + expect(JSON.parse(response.text)).toMatchObject({ + events: [INTERNAL_PUBLIC_EVENT], + }); + }); +}); + +describe("GET /staff/", () => { + it("cannot be accessed by a non-staff attendee", async () => { + const response = await getAsAttendee("/event/staff/").expect(StatusCode.ClientErrorForbidden); + expect(response).toHaveProperty("error"); + }); + + it("returns staff events for staff endpoint", async () => { + const response = await getAsStaff("/event/staff/").expect(StatusCode.SuccessOK); + + expect(JSON.parse(response.text)).toMatchObject({ + events: [STAFF_EVENT], + }); + }); +}); From ea9722454a60d0da64e4ac4f29e0f51c6cf9fd12 Mon Sep 17 00:00:00 2001 From: Aydan Pirani Date: Sat, 11 Nov 2023 13:52:30 -0600 Subject: [PATCH 2/9] probably not a good idea for test events to have the same id... --- src/database/event-db.ts | 2 ++ src/services/event/event-router.test.ts | 34 ++++++++++++++----------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/database/event-db.ts b/src/database/event-db.ts index 6493ceba..b7da1607 100644 --- a/src/database/event-db.ts +++ b/src/database/event-db.ts @@ -124,4 +124,6 @@ export class EventAttendance { }, }) public attendees: string[]; + + public isStaff = true; } diff --git a/src/services/event/event-router.test.ts b/src/services/event/event-router.test.ts index e1f5936d..30799aca 100644 --- a/src/services/event/event-router.test.ts +++ b/src/services/event/event-router.test.ts @@ -4,8 +4,8 @@ import Models from "../../database/models.js"; import { getAsAttendee, getAsStaff } from "../../testTools.js"; const EXTERNAL_PUBLIC_EVENT = { - eventId: "52fdfc072182654f163f5f0f9a621d72", - name: "Example Event 10", + eventId: "11111c072182654f163f5f0f9a621d72", + name: "Example Pub Event 10", description: "This is a description", startTime: 1532202702, endTime: 1532212702, @@ -18,7 +18,7 @@ const EXTERNAL_PUBLIC_EVENT = { }, ], sponsor: "Example sponsor", - eventType: "WORKSHOP", + eventType: "OTHER", points: 0, }; @@ -29,24 +29,29 @@ const INTERNAL_PUBLIC_EVENT = { isAsync: false, }; -const STAFF_EVENT = { - eventId: "52fdfc072182654f163f5f0f9a621d72", - name: "Example Event 10", +const EXTERNAL_STAFF_EVENT = { + eventId: "00000c072182654f163f5f0f9a621d72", + name: "Example Staff Event 10", description: "This is a description", startTime: 1532202702, endTime: 1532212702, locations: [], - sponsor: "Example sponsor", - eventType: "WORKSHOP", - isStaff: true, - isPrivate: true, - isAsync: true, - displayOnStaffCheckIn: true, + eventType: "OTHER", + }; +const INTERNAL_STAFF_EVENT = { + ...EXTERNAL_STAFF_EVENT, + sponsor: "Example sponsor", + displayOnStaffCheckIn: false, + isPrivate: false, + isAsync: false, + isStaff: true +} + beforeEach(async () => { Models.initialize(); - await Models.StaffEvent.create(STAFF_EVENT); + await Models.StaffEvent.create(INTERNAL_STAFF_EVENT); await Models.PublicEvent.create(INTERNAL_PUBLIC_EVENT); }); @@ -76,9 +81,8 @@ describe("GET /staff/", () => { it("returns staff events for staff endpoint", async () => { const response = await getAsStaff("/event/staff/").expect(StatusCode.SuccessOK); - expect(JSON.parse(response.text)).toMatchObject({ - events: [STAFF_EVENT], + events: [EXTERNAL_STAFF_EVENT], }); }); }); From cdff6f31a30480bda1519316bf67cce14125d43b Mon Sep 17 00:00:00 2001 From: Aydan Pirani Date: Sat, 11 Nov 2023 13:54:04 -0600 Subject: [PATCH 3/9] removed extra error handler --- src/services/event/event-router.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/services/event/event-router.ts b/src/services/event/event-router.ts index 0700d955..76be7af7 100644 --- a/src/services/event/event-router.ts +++ b/src/services/event/event-router.ts @@ -633,14 +633,4 @@ eventsRouter.put("/", strongJwtVerification, async (req: Request, res: Response) } }); -// Prototype error handler -eventsRouter.use((err: Error, req: Request, res: Response) => { - if (!err) { - return res.status(StatusCode.SuccessOK).send({ status: "OK" }); - } - - console.error(err.stack, req.body); - return res.status(StatusCode.ServerErrorInternal).send({ error: err.message }); -}); - export default eventsRouter; From 155f37cc30109f2470ad5a5eef977e0c3f5340b1 Mon Sep 17 00:00:00 2001 From: Aydan Pirani Date: Sat, 11 Nov 2023 16:10:53 -0600 Subject: [PATCH 4/9] Added tests for metadata get --- src/services/event/event-router.test.ts | 31 +++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/services/event/event-router.test.ts b/src/services/event/event-router.test.ts index 30799aca..d942cfd9 100644 --- a/src/services/event/event-router.test.ts +++ b/src/services/event/event-router.test.ts @@ -49,10 +49,17 @@ const INTERNAL_STAFF_EVENT = { isStaff: true } +const METADATA = { + eventId: "22222c072182654f163f5f0f9a621d72", + isStaff: false, + exp: 1234567890, +}; + beforeEach(async () => { Models.initialize(); await Models.StaffEvent.create(INTERNAL_STAFF_EVENT); await Models.PublicEvent.create(INTERNAL_PUBLIC_EVENT); + await Models.EventMetadata.create(METADATA); }); describe("GET /event/", () => { @@ -73,8 +80,8 @@ describe("GET /event/", () => { }); }); -describe("GET /staff/", () => { - it("cannot be accessed by a non-staff attendee", async () => { +describe("GET /event/staff/", () => { + it("cannot be accessed by a non-staff user", async () => { const response = await getAsAttendee("/event/staff/").expect(StatusCode.ClientErrorForbidden); expect(response).toHaveProperty("error"); }); @@ -86,3 +93,23 @@ describe("GET /staff/", () => { }); }); }); + +describe("GET /event/metadata/:EVENTID", () => { + it("cannot be accessed by a non-staff user", async () => { + const eventId = METADATA.eventId; + const response = await getAsAttendee(`/event/metadata/${eventId}`).expect(StatusCode.ClientErrorForbidden); + expect(response).toHaveProperty("error"); + }); + + it("returns metadata for a particular eventId", async () => { + const eventId = METADATA.eventId; + const response = await getAsStaff(`/event/metadata/${eventId}`).expect(StatusCode.SuccessOK); + expect(JSON.parse(response.text)).toMatchObject(METADATA); + }); + + it("throws an error if a bad eventId is passed in", async () => { + const eventId = "badEventId"; + const response = await getAsStaff(`/event/metadata/${eventId}`).expect(StatusCode.ClientErrorBadRequest); + expect(JSON.parse(response.text)).toHaveProperty("error"); + }); +}); From 3923a2ccf8f18f4f4fded8c2cb4c828cd3f84516 Mon Sep 17 00:00:00 2001 From: Aydan Pirani Date: Sat, 11 Nov 2023 16:13:37 -0600 Subject: [PATCH 5/9] Formatter changes --- src/services/event/event-router.test.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/services/event/event-router.test.ts b/src/services/event/event-router.test.ts index d942cfd9..621db714 100644 --- a/src/services/event/event-router.test.ts +++ b/src/services/event/event-router.test.ts @@ -37,17 +37,16 @@ const EXTERNAL_STAFF_EVENT = { endTime: 1532212702, locations: [], eventType: "OTHER", - }; const INTERNAL_STAFF_EVENT = { - ...EXTERNAL_STAFF_EVENT, + ...EXTERNAL_STAFF_EVENT, sponsor: "Example sponsor", displayOnStaffCheckIn: false, isPrivate: false, isAsync: false, - isStaff: true -} + isStaff: true, +}; const METADATA = { eventId: "22222c072182654f163f5f0f9a621d72", @@ -104,12 +103,12 @@ describe("GET /event/metadata/:EVENTID", () => { it("returns metadata for a particular eventId", async () => { const eventId = METADATA.eventId; const response = await getAsStaff(`/event/metadata/${eventId}`).expect(StatusCode.SuccessOK); - expect(JSON.parse(response.text)).toMatchObject(METADATA); + expect(JSON.parse(response.text)).toMatchObject(METADATA); }); it("throws an error if a bad eventId is passed in", async () => { const eventId = "badEventId"; const response = await getAsStaff(`/event/metadata/${eventId}`).expect(StatusCode.ClientErrorBadRequest); - expect(JSON.parse(response.text)).toHaveProperty("error"); + expect(JSON.parse(response.text)).toHaveProperty("error"); }); }); From b2aa8376db91d94ba7d7c217e83e17a09dd88569 Mon Sep 17 00:00:00 2001 From: Aydan Pirani Date: Sat, 11 Nov 2023 16:57:54 -0600 Subject: [PATCH 6/9] Added tests for get endpoint --- src/services/event/event-router.test.ts | 68 ++++++++++++++++++++++--- src/services/event/event-router.ts | 32 +++++------- 2 files changed, 76 insertions(+), 24 deletions(-) diff --git a/src/services/event/event-router.test.ts b/src/services/event/event-router.test.ts index 621db714..e662e7c2 100644 --- a/src/services/event/event-router.test.ts +++ b/src/services/event/event-router.test.ts @@ -48,17 +48,25 @@ const INTERNAL_STAFF_EVENT = { isStaff: true, }; -const METADATA = { - eventId: "22222c072182654f163f5f0f9a621d72", +const PUBLIC_METADATA = { + eventId: "11111c072182654f163f5f0f9a621d72", isStaff: false, exp: 1234567890, }; + +const STAFF_METADATA = { + eventId: "00000c072182654f163f5f0f9a621d72", + isStaff: true, + exp: 1234567890, +}; + beforeEach(async () => { Models.initialize(); await Models.StaffEvent.create(INTERNAL_STAFF_EVENT); await Models.PublicEvent.create(INTERNAL_PUBLIC_EVENT); - await Models.EventMetadata.create(METADATA); + await Models.EventMetadata.create(PUBLIC_METADATA); + await Models.EventMetadata.create(STAFF_METADATA); }); describe("GET /event/", () => { @@ -93,17 +101,65 @@ describe("GET /event/staff/", () => { }); }); +describe("GET /event/:EVENTID", () => { + it("throws an error if the event doesn't exist", async () => { + const eventId = "00000"; + const response = await getAsAttendee(`/event/${eventId}`).expect(StatusCode.ClientErrorBadRequest); + expect(response).toHaveProperty("error"); + }); + + it("throws an error if attendees try to access staff events", async () => { + const eventId = STAFF_METADATA.eventId; + const response = await getAsAttendee(`/event/${eventId}`).expect(StatusCode.ClientErrorForbidden); + expect(response).toHaveProperty("error"); + }) + + it("throws an error if it cannot find a staff event", async () => { + const eventId = STAFF_METADATA.eventId; + await Models.StaffEvent.deleteOne({eventId: eventId}); + const response = await getAsStaff(`/event/${eventId}`).expect(StatusCode.ServerErrorInternal); + expect(response).toHaveProperty("error"); + }); + + it("throws an error if it cannot find a public event", async () => { + const eventId = PUBLIC_METADATA.eventId; + await Models.PublicEvent.deleteOne({eventId: eventId}); + const response = await getAsAttendee(`/event/${eventId}`).expect(StatusCode.ServerErrorInternal); + expect(response).toHaveProperty("error"); + }); + + it("successfully returns staff events", async () => { + const eventId = STAFF_METADATA.eventId; + const response = await getAsStaff(`/event/${eventId}`).expect(StatusCode.SuccessOK); + expect(JSON.parse(response.text)).toMatchObject(EXTERNAL_STAFF_EVENT); + }); + + it("successfully filters and returns a public event for staff", async () => { + const eventId = PUBLIC_METADATA.eventId; + const response = await getAsStaff(`/event/${eventId}`).expect(StatusCode.SuccessOK); + expect(JSON.parse(response.text)).toMatchObject(INTERNAL_PUBLIC_EVENT); + }) + + it("successfully filters and returns a public event for attendees", async () => { + const eventId = PUBLIC_METADATA.eventId; + const response = await getAsAttendee(`/event/${eventId}`).expect(StatusCode.SuccessOK); + expect(JSON.parse(response.text)).toMatchObject(EXTERNAL_PUBLIC_EVENT); + }) + +}); + + describe("GET /event/metadata/:EVENTID", () => { it("cannot be accessed by a non-staff user", async () => { - const eventId = METADATA.eventId; + const eventId = PUBLIC_METADATA.eventId; const response = await getAsAttendee(`/event/metadata/${eventId}`).expect(StatusCode.ClientErrorForbidden); expect(response).toHaveProperty("error"); }); it("returns metadata for a particular eventId", async () => { - const eventId = METADATA.eventId; + const eventId = PUBLIC_METADATA.eventId; const response = await getAsStaff(`/event/metadata/${eventId}`).expect(StatusCode.SuccessOK); - expect(JSON.parse(response.text)).toMatchObject(METADATA); + expect(JSON.parse(response.text)).toMatchObject(PUBLIC_METADATA); }); it("throws an error if a bad eventId is passed in", async () => { diff --git a/src/services/event/event-router.ts b/src/services/event/event-router.ts index 76be7af7..3f5cbcf6 100644 --- a/src/services/event/event-router.ts +++ b/src/services/event/event-router.ts @@ -1,7 +1,6 @@ import cors from "cors"; import crypto from "crypto"; -import { Request, Router } from "express"; -import { NextFunction, Response } from "express-serve-static-core"; +import { Request, Response, Router } from "express"; import Config from "../../config.js"; import { strongJwtVerification, weakJwtVerification } from "../../middleware/verify-jwt.js"; @@ -132,21 +131,16 @@ eventsRouter.get("/staff/", strongJwtVerification, async (_: Request, res: Respo * HTTP/1.1 403 Forbidden * {"error": "PrivateEvent"} */ -eventsRouter.get("/:EVENTID/", weakJwtVerification, async (req: Request, res: Response, next: NextFunction) => { +eventsRouter.get("/:EVENTID/", weakJwtVerification, async (req: Request, res: Response) => { const eventId: string | undefined = req.params.EVENTID; - if (!eventId) { - return res.redirect("/"); - } - const payload: JwtPayload = res.locals.payload as JwtPayload; const isStaff: boolean = hasStaffPerms(payload); const metadata: EventMetadata | null = await Models.EventMetadata.findOne({ eventId: eventId }); if (!metadata) { - console.error("no metadata found!"); - return next(new Error("no event found!")); + return res.status(StatusCode.ClientErrorBadRequest).send({error: "EventNotFound"}); } if (metadata.isStaff) { @@ -155,18 +149,24 @@ eventsRouter.get("/:EVENTID/", weakJwtVerification, async (req: Request, res: Re } const event: StaffEvent | null = await Models.StaffEvent.findOne({ eventId: eventId }); - return res.status(StatusCode.SuccessOK).send({ event: event }); + if (!event) { + return res.status(StatusCode.ServerErrorInternal).send({error: "InternalDatabaseError"}); + } + + return res.status(StatusCode.SuccessOK).send(event); } else { - // Not a private event -> convert to Public event and return const event: PublicEvent | null = await Models.PublicEvent.findOne({ eventId: eventId }); if (!event) { - console.error("no metadata found!"); - return next(new Error("no event found!")); + return res.status(StatusCode.ServerErrorInternal).send({error: "InternalDatabaseError"}); + } + + if (isStaff) { + return res.status(StatusCode.SuccessOK).send(event); } const filteredEvent: FilteredEventView = createFilteredEventView(event); - return res.status(StatusCode.SuccessOK).send({ event: filteredEvent }); + return res.status(StatusCode.SuccessOK).send(filteredEvent); } }); @@ -369,7 +369,6 @@ eventsRouter.post("/", strongJwtVerification, async (req: Request, res: Response const eventId: string = crypto.randomBytes(Config.EVENT_BYTES_GEN).toString("hex"); const isStaffEvent: boolean = eventFormat.isStaff; const metadata: EventMetadata = new EventMetadata(eventId, isStaffEvent, eventFormat.endTime); - console.log(eventId); // Populate the new eventFormat object with the needed params eventFormat._id = new ObjectId().toString(); eventFormat.eventId = eventId; @@ -383,14 +382,12 @@ eventsRouter.post("/", strongJwtVerification, async (req: Request, res: Response return res.status(StatusCode.ClientErrorBadRequest).send({ error: "InvalidParams" }); } const event: StaffEvent = new StaffEvent(eventFormat); - console.log(event, metadata); newEvent = await Models.StaffEvent.create(event); } else { if (!isValidPublicFormat(eventFormat)) { return res.status(StatusCode.ClientErrorBadRequest).send({ error: "InvalidParams" }); } const event: PublicEvent = new PublicEvent(eventFormat); - console.log(event, metadata); newEvent = await Models.PublicEvent.create(event); } await Models.EventMetadata.create(metadata); @@ -603,7 +600,6 @@ eventsRouter.put("/", strongJwtVerification, async (req: Request, res: Response) const eventFormat: GenericEventFormat = req.body as GenericEventFormat; const eventId: string = eventFormat.eventId; - console.log(eventFormat.eventId); if (!eventId) { return res.status(StatusCode.ClientErrorBadRequest).send({ message: "NoEventId" }); } From cde3cf2267451c4a887b7867bbbd534af7e29eee Mon Sep 17 00:00:00 2001 From: Aydan Pirani Date: Sat, 11 Nov 2023 16:59:05 -0600 Subject: [PATCH 7/9] Formatter changes --- src/services/event/event-router.test.ts | 15 ++++++--------- src/services/event/event-router.ts | 8 ++++---- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/services/event/event-router.test.ts b/src/services/event/event-router.test.ts index e662e7c2..745fe750 100644 --- a/src/services/event/event-router.test.ts +++ b/src/services/event/event-router.test.ts @@ -53,13 +53,12 @@ const PUBLIC_METADATA = { isStaff: false, exp: 1234567890, }; - + const STAFF_METADATA = { eventId: "00000c072182654f163f5f0f9a621d72", isStaff: true, exp: 1234567890, }; - beforeEach(async () => { Models.initialize(); @@ -112,18 +111,18 @@ describe("GET /event/:EVENTID", () => { const eventId = STAFF_METADATA.eventId; const response = await getAsAttendee(`/event/${eventId}`).expect(StatusCode.ClientErrorForbidden); expect(response).toHaveProperty("error"); - }) + }); it("throws an error if it cannot find a staff event", async () => { const eventId = STAFF_METADATA.eventId; - await Models.StaffEvent.deleteOne({eventId: eventId}); + await Models.StaffEvent.deleteOne({ eventId: eventId }); const response = await getAsStaff(`/event/${eventId}`).expect(StatusCode.ServerErrorInternal); expect(response).toHaveProperty("error"); }); it("throws an error if it cannot find a public event", async () => { const eventId = PUBLIC_METADATA.eventId; - await Models.PublicEvent.deleteOne({eventId: eventId}); + await Models.PublicEvent.deleteOne({ eventId: eventId }); const response = await getAsAttendee(`/event/${eventId}`).expect(StatusCode.ServerErrorInternal); expect(response).toHaveProperty("error"); }); @@ -138,17 +137,15 @@ describe("GET /event/:EVENTID", () => { const eventId = PUBLIC_METADATA.eventId; const response = await getAsStaff(`/event/${eventId}`).expect(StatusCode.SuccessOK); expect(JSON.parse(response.text)).toMatchObject(INTERNAL_PUBLIC_EVENT); - }) + }); it("successfully filters and returns a public event for attendees", async () => { const eventId = PUBLIC_METADATA.eventId; const response = await getAsAttendee(`/event/${eventId}`).expect(StatusCode.SuccessOK); expect(JSON.parse(response.text)).toMatchObject(EXTERNAL_PUBLIC_EVENT); - }) - + }); }); - describe("GET /event/metadata/:EVENTID", () => { it("cannot be accessed by a non-staff user", async () => { const eventId = PUBLIC_METADATA.eventId; diff --git a/src/services/event/event-router.ts b/src/services/event/event-router.ts index 3f5cbcf6..11f72444 100644 --- a/src/services/event/event-router.ts +++ b/src/services/event/event-router.ts @@ -140,7 +140,7 @@ eventsRouter.get("/:EVENTID/", weakJwtVerification, async (req: Request, res: Re const metadata: EventMetadata | null = await Models.EventMetadata.findOne({ eventId: eventId }); if (!metadata) { - return res.status(StatusCode.ClientErrorBadRequest).send({error: "EventNotFound"}); + return res.status(StatusCode.ClientErrorBadRequest).send({ error: "EventNotFound" }); } if (metadata.isStaff) { @@ -150,7 +150,7 @@ eventsRouter.get("/:EVENTID/", weakJwtVerification, async (req: Request, res: Re const event: StaffEvent | null = await Models.StaffEvent.findOne({ eventId: eventId }); if (!event) { - return res.status(StatusCode.ServerErrorInternal).send({error: "InternalDatabaseError"}); + return res.status(StatusCode.ServerErrorInternal).send({ error: "InternalDatabaseError" }); } return res.status(StatusCode.SuccessOK).send(event); @@ -158,9 +158,9 @@ eventsRouter.get("/:EVENTID/", weakJwtVerification, async (req: Request, res: Re const event: PublicEvent | null = await Models.PublicEvent.findOne({ eventId: eventId }); if (!event) { - return res.status(StatusCode.ServerErrorInternal).send({error: "InternalDatabaseError"}); + return res.status(StatusCode.ServerErrorInternal).send({ error: "InternalDatabaseError" }); } - + if (isStaff) { return res.status(StatusCode.SuccessOK).send(event); } From 5c5caae9749bd6b7357013a4e936dff81afb9ac0 Mon Sep 17 00:00:00 2001 From: Aydan Pirani Date: Sun, 12 Nov 2023 12:35:04 -0600 Subject: [PATCH 8/9] added event delete tests --- src/services/event/event-router.test.ts | 27 ++++++++++++++++++++++++- src/services/event/event-router.ts | 5 ----- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/services/event/event-router.test.ts b/src/services/event/event-router.test.ts index 745fe750..f9c9250f 100644 --- a/src/services/event/event-router.test.ts +++ b/src/services/event/event-router.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it, beforeEach } from "@jest/globals"; import { StatusCode } from "status-code-enum"; import Models from "../../database/models.js"; -import { getAsAttendee, getAsStaff } from "../../testTools.js"; +import { delAsAdmin, delAsAttendee, delAsStaff, getAsAttendee, getAsStaff } from "../../testTools.js"; const EXTERNAL_PUBLIC_EVENT = { eventId: "11111c072182654f163f5f0f9a621d72", @@ -165,3 +165,28 @@ describe("GET /event/metadata/:EVENTID", () => { expect(JSON.parse(response.text)).toHaveProperty("error"); }); }); + +describe("DELETE /event/:EVENTID", () => { + it("cannot be accessed by an attendee", async () => { + const eventId = "deleteEventId"; + const response = await delAsAttendee(`/event/${eventId}`).expect(StatusCode.ClientErrorForbidden); + expect(response).toHaveProperty("error"); + }); + + it("cannot be accessed by staff", async () => { + const eventId = "deleteEventId"; + const response = await delAsStaff(`/event/${eventId}`).expect(StatusCode.ClientErrorForbidden); + expect(response).toHaveProperty("error"); + }); + + it("deletes the events correctly from both tables", async () => { + const eventId = "deleteEventId"; + await delAsAdmin(`/event/${eventId}`).expect(StatusCode.SuccessNoContent); + + const metadata = await Models.EventMetadata.findOne({ eventId: eventId }); + const event = await Models.PublicEvent.findOne({ eventId: eventId }); + + expect(metadata).toBeNull(); + expect(event).toBeNull(); + }); +}); diff --git a/src/services/event/event-router.ts b/src/services/event/event-router.ts index 11f72444..201fa73b 100644 --- a/src/services/event/event-router.ts +++ b/src/services/event/event-router.ts @@ -418,11 +418,6 @@ eventsRouter.delete("/:EVENTID/", strongJwtVerification, async (req: Request, re return res.status(StatusCode.ClientErrorForbidden).send({ error: "InvalidPermission" }); } - // Check if eventid field doesn't exist -> if not, returns error - if (!eventId) { - return res.status(StatusCode.ClientErrorBadRequest).send({ error: "InvalidParams" }); - } - // Perform a lazy delete on both databases, and return true if the operation succeeds await Models.StaffEvent.findOneAndDelete({ eventId: eventId }); await Models.PublicEvent.findOneAndDelete({ eventId: eventId }); From 11149e2fbe57d75e1a14fc126a7de466af19a708 Mon Sep 17 00:00:00 2001 From: Aydan Pirani Date: Sun, 12 Nov 2023 13:01:04 -0600 Subject: [PATCH 9/9] Added metadata put tests --- src/services/event/event-router.test.ts | 54 ++++++++++++++++++++++++- src/services/event/event-router.ts | 2 +- 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/src/services/event/event-router.test.ts b/src/services/event/event-router.test.ts index f9c9250f..0f205c44 100644 --- a/src/services/event/event-router.test.ts +++ b/src/services/event/event-router.test.ts @@ -1,7 +1,16 @@ import { describe, expect, it, beforeEach } from "@jest/globals"; import { StatusCode } from "status-code-enum"; import Models from "../../database/models.js"; -import { delAsAdmin, delAsAttendee, delAsStaff, getAsAttendee, getAsStaff } from "../../testTools.js"; +import { + delAsAdmin, + delAsAttendee, + delAsStaff, + getAsAttendee, + getAsStaff, + putAsAdmin, + putAsAttendee, + putAsStaff, +} from "../../testTools.js"; const EXTERNAL_PUBLIC_EVENT = { eventId: "11111c072182654f163f5f0f9a621d72", @@ -190,3 +199,46 @@ describe("DELETE /event/:EVENTID", () => { expect(event).toBeNull(); }); }); + +describe("PUT /event/metadata/", () => { + it("cannot be accessed by attendee", async () => { + const response = await putAsAttendee(`/event/metadata/`).expect(StatusCode.ClientErrorForbidden); + expect(response).toHaveProperty("error"); + }); + + it("cannot be accessed by staff", async () => { + const response = await putAsStaff(`/event/metadata/`).expect(StatusCode.ClientErrorForbidden); + expect(response).toHaveProperty("error"); + }); + + it("throws an error if an invalid input is passed in", async () => { + const mockInput = { + eventId: EXTERNAL_PUBLIC_EVENT.eventId, + }; + + const response = await putAsAdmin(`/event/metadata/`).send(mockInput).expect(StatusCode.ClientErrorBadRequest); + expect(response).toHaveProperty("error"); + }); + + it("throws an error if an event does not exist", async () => { + const mockInput = { + eventId: "0".repeat(32), + exp: 100, + }; + + const response = await putAsAdmin(`/event/metadata/`).send(mockInput).expect(StatusCode.ClientErrorBadRequest); + expect(response).toHaveProperty("error"); + }); + + it("modifies the event expiration dates", async () => { + const eventId = EXTERNAL_PUBLIC_EVENT.eventId; + const mockInput = { + eventId: eventId, + exp: 100, + }; + + const response = await putAsAdmin(`/event/metadata/`).send(mockInput).expect(StatusCode.SuccessOK); + expect(JSON.parse(response.text)); + expect(await Models.EventMetadata.findOne({ eventId })).toMatchObject(mockInput); + }); +}); diff --git a/src/services/event/event-router.ts b/src/services/event/event-router.ts index 201fa73b..65720e30 100644 --- a/src/services/event/event-router.ts +++ b/src/services/event/event-router.ts @@ -509,7 +509,7 @@ eventsRouter.put("/metadata/", strongJwtVerification, async (req: Request, res: metadata, ); - if (!metadata) { + if (!updatedMetadata) { return res.status(StatusCode.ClientErrorBadRequest).send({ error: "EventNotFound" }); }