Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 81 additions & 0 deletions course-matrix/backend/__tests__/auth.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import request from "supertest";
import { describe, expect, it, test } from "@jest/globals";
import app from "../src/index";

describe("Authentication API", () => {
// The unit tests below are currently commented out because they require a database connection.
// They will be uncommented out once all the necessary mocks are in place.

// describe('POST /auth/login', () => {
// it('should return 200 and a token for valid credentials', async () => {
// const response = await request(app)
// .post('/auth/login')
// .send({ username: 'validUser', password: 'validPassword' });
// expect(response.status).toBe(200);
// expect(response.body).toHaveProperty('token');
// });
// it('should return 401 for invalid credentials', async () => {
// const response = await request(app)
// .post('/auth/login')
// .send({ username: 'invalidUser', password: 'wrongPassword' });
// expect(response.status).toBe(401);
// expect(response.body).toHaveProperty('error', 'Invalid credentials');
// });
// it('should return 400 if username or password is missing', async () => {
// const response = await request(app)
// .post('/auth/login')
// .send({ username: 'validUser' });
// expect(response.status).toBe(400);
// expect(response.body).toHaveProperty('error', 'Username and password are required');
// });
// });
// describe('POST /auth/register', () => {
// it('should return 201 and create a new user for valid input', async () => {
// const response = await request(app)
// .post('/auth/register')
// .send({ username: 'newUser', password: 'newPassword' });
// expect(response.status).toBe(201);
// expect(response.body).toHaveProperty('message', 'User registered successfully');
// });
// it('should return 400 if username is already taken', async () => {
// await request(app)
// .post('/auth/register')
// .send({ username: 'existingUser', password: 'password123' });
// const response = await request(app)
// .post('/auth/register')
// .send({ username: 'existingUser', password: 'password123' });
// expect(response.status).toBe(400);
// expect(response.body).toHaveProperty('error', 'Username is already taken');
// });
// it('should return 400 if username or password is missing', async () => {
// const response = await request(app)
// .post('/auth/register')
// .send({ username: '' });
// expect(response.status).toBe(400);
// expect(response.body).toHaveProperty('error', 'Username and password are required');
// });
// });
// describe('GET /auth/profile', () => {
// it('should return 200 and user profile for valid token', async () => {
// const loginResponse = await request(app)
// .post('/auth/login')
// .send({ username: 'validUser', password: 'validPassword' });
// const token = loginResponse.body.token;
// const response = await request(app)
// .get('/auth/profile')
// .set('Authorization', `Bearer ${token}`);
// expect(response.status).toBe(200);
// expect(response.body).toHaveProperty('username', 'validUser');
// });
// it('should return 401 if token is missing or invalid', async () => {
// const response = await request(app)
// .get('/auth/profile')
// .set('Authorization', 'Bearer invalidToken');
// expect(response.status).toBe(401);
// expect(response.body).toHaveProperty('error', 'Unauthorized');
// });
// });
it("template test", () => {
expect(2 + 3).toEqual(5);
});
});
9 changes: 0 additions & 9 deletions course-matrix/backend/__tests__/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,3 @@ describe("Sum function", () => {
expect(2 + 3).toEqual(5);
});
});

// Will finish the rest of the tests below in Sprint 3

// describe("GET /auth/session", () => {
// test("It should respond with 200 status", async () => {
// const response = await request(app).get("/auth/session");
// expect(response.statusCode).toBe(200);
// });
// });
83 changes: 0 additions & 83 deletions course-matrix/frontend/__tests__/UserMenu.test.tsx

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
import "@testing-library/jest-dom/jest-globals";
import "@testing-library/jest-dom";

import { render, screen, fireEvent } from "@testing-library/react";
import React from "react";
import { MemoryRouter } from "react-router-dom";
import { expect, test } from "@jest/globals";
import App from "../../src/App";
import SignupPage from "../../src/pages/Signup/SignUpPage";
import LoginPage from "../../src/pages/Login/LoginPage";
import Dashboard from "../../src/pages/Dashboard/Dashboard";
import TimetableBuilder from "../../src/pages/TimetableBuilder/TimetableBuilder";
import Home from "../../src/pages/Home/Home";

test("typical flow for creating an account and logging in", () => {
render(<App />, { wrapper: MemoryRouter });
render(<LoginPage />, { wrapper: MemoryRouter });
render(<SignupPage />, { wrapper: MemoryRouter });
render(<Dashboard />, { wrapper: MemoryRouter });

// Going to login page
expect(screen.getByText("Login")).toBeInTheDocument();
fireEvent.click(screen.getByText("Login"));

// Logging in with invalid credentials
fireEvent.change(screen.getByLabelText("Email"), { target: { value: "" } });
fireEvent.change(screen.getByLabelText("Password"), {
target: { value: "password" },
});
fireEvent.click(screen.getByText("Login"));
expect(
screen.getByText("Login invalid. Please check your email or password."),
).toBeInTheDocument();

// Going to signup page
fireEvent.click(screen.getByText("Sign up!"));
expect(screen.getByText("Sign up")).toBeInTheDocument();
fireEvent.change(screen.getByLabelText("Email"), { target: { value: "" } });
fireEvent.change(screen.getByLabelText("Password"), {
target: { value: "" },
});
fireEvent.click(screen.getByText("Sign up"));
expect(screen.getByText("Email is required")).toBeInTheDocument();
expect(screen.getByText("Password is required")).toBeInTheDocument();

// Creating an account
fireEvent.change(screen.getByLabelText("Email"), {
target: { value: "[email protected]" },
});
fireEvent.change(screen.getByLabelText("Password"), {
target: { value: "password123" },
});
fireEvent.click(screen.getByText("Sign up"));
expect(screen.getByText("Account created successfully!")).toBeInTheDocument();

// Logging in with valid credentials
fireEvent.change(screen.getByLabelText("Email"), {
target: { value: "[email protected]" },
});
fireEvent.change(screen.getByLabelText("Password"), {
target: { value: "password123" },
});
fireEvent.click(screen.getByText("Login"));

// Check if user is redirected to home page
expect(screen.getByText("Home Page")).toBeInTheDocument();
});

test("typical flow for creating a new timetable, adding courses, adding restrictions, saving the timetable, and editing the timetable", () => {
render(<App />, { wrapper: MemoryRouter });
render(<LoginPage />, { wrapper: MemoryRouter });
render(<SignupPage />, { wrapper: MemoryRouter });
render(<Dashboard />, { wrapper: MemoryRouter });
render(<Home />, { wrapper: MemoryRouter });
render(<TimetableBuilder />, { wrapper: MemoryRouter });

expect(screen.getByText("My Timetables")).toBeInTheDocument();
fireEvent.click(screen.getByText("Create New"));

expect(screen.getByText("New Timetable")).toBeInTheDocument();

// Adding courses
fireEvent.click(screen.getByText("Choose meeting sections manually"));
fireEvent.click(screen.getByText("Search"));
fireEvent.click(screen.getByText("ACMB10H3"));
fireEvent.click(screen.getByText("ACMC01H3"));
fireEvent.click(screen.getByText("ACMD01H3"));
screen.getAllByText("No LEC Selected").forEach((element) => {
fireEvent.click(element);
fireEvent.click(screen.getByText("LEC 01"));
});

// Adding a restriction
fireEvent.click(screen.getByText("Add New"));
fireEvent.click(screen.getByText("Select a type"));
fireEvent.click(screen.getByText("Restrict Entire Day"));
fireEvent.click(screen.getByText("Tuesday"));
fireEvent.click(screen.getByText("Create"));

// Saving the timetable
fireEvent.click(screen.getByText("Create Timetable"));
fireEvent.change(screen.getByLabelText("Timetable Name"), {
target: { value: "Test Timetable Name" },
});
fireEvent.click(screen.getByText("Save"));

// Check if user is redirected to home page and timetable is saved
expect(screen.getByText("My Timetables")).toBeInTheDocument();
expect(screen.getByText("Test Timetable Name")).toBeInTheDocument();

// Editing the timetable by resetting all courses and restrictions
fireEvent.click(screen.getByText("Test Timetable Name"));
expect(screen.getByText("Edit Timetable")).toBeInTheDocument();
fireEvent.click(screen.getByText("Reset"));
expect(screen.queryByText("ACMB10H3")).toBeNull();
expect(screen.queryByText("ACMC01H3")).toBeNull();
expect(screen.queryByText("ACMD01H3")).toBeNull();
expect(screen.queryByText("Tuesday")).toBeNull();
fireEvent.click(screen.getByText("Update Timetable"));

// Check if user is redirected to home page and timetable is updated
expect(screen.getByText("My Timetables")).toBeInTheDocument();
fireEvent.click(screen.getByText("Test Timetable Name"));
expect(screen.queryByText("ACMB10H3")).toBeNull();
expect(screen.queryByText("ACMC01H3")).toBeNull();
expect(screen.queryByText("ACMD01H3")).toBeNull();
expect(screen.queryByText("Tuesday")).toBeNull();
});
Loading