import { expect } from "chai"; import request from "supertest"; import { StatusCodes } from "http-status-codes"; //import { Log } from "@ubccpsc310/project-support"; import { clearDisk, loadTestQuery } from "../TestUtil"; import Server from "../../src/rest/Server"; import * as fs from "fs-extra"; import { InsightDatasetKind } from "../../src/controller/IInsightFacade"; describe("Facade C3", function () { let server: Server; // let sections: string; // let campus: string; let sectionsBinary: any; let roomsBinary: any; let validQuery: any; let expectedValue: any; let invalidQuery: any; const port = 4321; const SERVER_URL = `http://localhost:${port}`; const validCode = StatusCodes.OK; const invalidCode = StatusCodes.BAD_REQUEST; const notFoundCode = StatusCodes.NOT_FOUND; before(async function () { // TODO: start server here once and handle errors properly await clearDisk(); // sections = await getContentFromArchives("pair.zip"); // campus = await getContentFromArchives("campus.zip"); sectionsBinary = await fs.readFile("test/resources/archives/" + "pair.zip"); roomsBinary = await fs.readFile("test/resources/archives/" + "campus.zip"); const { input, expected } = await loadTestQuery("[valid/nestedLogic.json] nestedLogic"); validQuery = input; expectedValue = expected; const { input: input1 } = await loadTestQuery("[invalid/doubleUnderscoreIsInvalid.json] doubleUnderscoreIsInvalid"); invalidQuery = input1; server = new Server(port); await server.start(); }); after(async function () { // TODO: stop server here once! await server.stop(); await clearDisk(); }); beforeEach(function () { // might want to add some process logging here to keep track of what is going on }); afterEach(function () { // might want to add some process logging here to keep track of what is going on }); // Sample on how to format PUT requests it("PUT test for courses dataset sections", async function () { const ENDPOINT_URL = "/dataset/sections/sections"; const ZIP_FILE_DATA = sectionsBinary; try { const res = await request(SERVER_URL) .put(ENDPOINT_URL) .send(ZIP_FILE_DATA) .set("Content-Type", "application/x-zip-compressed"); expect(res.status).to.be.equal(validCode); // TODO add assertions that check res.body expect(res.body.result).to.have.members(["sections"]); } catch (_err) { //Log.error(err); //console.error(err); expect.fail(); } }); it("PUT test for campus dataset rooms", async function () { const ENDPOINT_URL = "/dataset/rooms/rooms"; const ZIP_FILE_DATA = roomsBinary; try { const res = await request(SERVER_URL) .put(ENDPOINT_URL) .send(ZIP_FILE_DATA) .set("Content-Type", "application/x-zip-compressed"); expect(res.status).to.be.equal(validCode); expect(res.body.result).to.have.members(["sections", "rooms"]); } catch (_err) { //Log.error(err); //console.error(err); expect.fail(); } }); it("PUT test for courses dataset invalid", async function () { const ENDPOINT_URL = "/dataset/invalid/sections"; const ZIP_FILE_DATA = roomsBinary; try { const res = await request(SERVER_URL) .put(ENDPOINT_URL) .send(ZIP_FILE_DATA) .set("Content-Type", "application/x-zip-compressed"); expect(res.status).to.be.equal(invalidCode); } catch (_err) { //Log.error(err); //console.error(err); expect.fail(); } }); it("DELETE test for courses dataset", async function () { const ENDPOINT_URL = "/dataset/rooms"; try { const res = await request(SERVER_URL).delete(ENDPOINT_URL); expect(res.status).to.be.equal(validCode); expect(res.body.result).to.be.equal("rooms"); } catch (_err) { //Log.error(err); //console.error(err); expect.fail(); } }); it("DELETE test for courses dataset invalid not found", async function () { const ENDPOINT_URL = "/dataset/rooms"; try { const res = await request(SERVER_URL).delete(ENDPOINT_URL); expect(res.status).to.be.equal(notFoundCode); } catch (_err) { //Log.error(err); //console.error(err); expect.fail(); } }); it("DELETE test for courses dataset invalid", async function () { const ENDPOINT_URL = "/dataset/ro_oms"; try { const res = await request(SERVER_URL).delete(ENDPOINT_URL); expect(res.status).to.be.equal(invalidCode); } catch (_err) { //Log.error(err); //console.error(err); expect.fail(); } }); it("GET test for courses dataset", async function () { const ENDPOINT_URL = "/datasets"; try { const res = await request(SERVER_URL).get(ENDPOINT_URL); expect(res.status).to.be.equal(validCode); expect(res.body.result).to.deep.equal([ { id: "sections", kind: InsightDatasetKind.Sections, numRows: 64612, }, ]); } catch (_err) { //Log.error(err); //console.error(err); expect.fail(); } }); it("POST test for courses dataset", async function () { const ENDPOINT_URL = "/query"; try { const res = await request(SERVER_URL).post(ENDPOINT_URL).send(validQuery).set("Content-Type", "application/json"); expect(res.status).to.be.equal(validCode); const result = res.body.result; expect(result).to.have.deep.members(expectedValue); } catch (_err) { //Log.error(err); //console.error(err); expect.fail(); } }); it("POST test for courses dataset invalid", async function () { const ENDPOINT_URL = "/query"; try { const res = await request(SERVER_URL) .post(ENDPOINT_URL) .send(invalidQuery) .set("Content-Type", "application/json"); expect(res.status).to.be.equal(invalidCode); } catch (_err) { //Log.error(err); //console.error(err); expect.fail(); } }); // The other endpoints work similarly. You should be able to find all instructions in the supertest documentation });