Skip to content

Commit 9c358fc

Browse files
authored
Ax/scrum 144 Add integration tests (#83)
Co-authored-by: Austin-X <[email protected]>
1 parent e93d766 commit 9c358fc

File tree

11 files changed

+887
-96
lines changed

11 files changed

+887
-96
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import request from "supertest";
2+
import { describe, expect, it, test } from "@jest/globals";
3+
import app from "../src/index";
4+
5+
describe("Authentication API", () => {
6+
// The unit tests below are currently commented out because they require a database connection.
7+
// They will be uncommented out once all the necessary mocks are in place.
8+
9+
// describe('POST /auth/login', () => {
10+
// it('should return 200 and a token for valid credentials', async () => {
11+
// const response = await request(app)
12+
// .post('/auth/login')
13+
// .send({ username: 'validUser', password: 'validPassword' });
14+
// expect(response.status).toBe(200);
15+
// expect(response.body).toHaveProperty('token');
16+
// });
17+
// it('should return 401 for invalid credentials', async () => {
18+
// const response = await request(app)
19+
// .post('/auth/login')
20+
// .send({ username: 'invalidUser', password: 'wrongPassword' });
21+
// expect(response.status).toBe(401);
22+
// expect(response.body).toHaveProperty('error', 'Invalid credentials');
23+
// });
24+
// it('should return 400 if username or password is missing', async () => {
25+
// const response = await request(app)
26+
// .post('/auth/login')
27+
// .send({ username: 'validUser' });
28+
// expect(response.status).toBe(400);
29+
// expect(response.body).toHaveProperty('error', 'Username and password are required');
30+
// });
31+
// });
32+
// describe('POST /auth/register', () => {
33+
// it('should return 201 and create a new user for valid input', async () => {
34+
// const response = await request(app)
35+
// .post('/auth/register')
36+
// .send({ username: 'newUser', password: 'newPassword' });
37+
// expect(response.status).toBe(201);
38+
// expect(response.body).toHaveProperty('message', 'User registered successfully');
39+
// });
40+
// it('should return 400 if username is already taken', async () => {
41+
// await request(app)
42+
// .post('/auth/register')
43+
// .send({ username: 'existingUser', password: 'password123' });
44+
// const response = await request(app)
45+
// .post('/auth/register')
46+
// .send({ username: 'existingUser', password: 'password123' });
47+
// expect(response.status).toBe(400);
48+
// expect(response.body).toHaveProperty('error', 'Username is already taken');
49+
// });
50+
// it('should return 400 if username or password is missing', async () => {
51+
// const response = await request(app)
52+
// .post('/auth/register')
53+
// .send({ username: '' });
54+
// expect(response.status).toBe(400);
55+
// expect(response.body).toHaveProperty('error', 'Username and password are required');
56+
// });
57+
// });
58+
// describe('GET /auth/profile', () => {
59+
// it('should return 200 and user profile for valid token', async () => {
60+
// const loginResponse = await request(app)
61+
// .post('/auth/login')
62+
// .send({ username: 'validUser', password: 'validPassword' });
63+
// const token = loginResponse.body.token;
64+
// const response = await request(app)
65+
// .get('/auth/profile')
66+
// .set('Authorization', `Bearer ${token}`);
67+
// expect(response.status).toBe(200);
68+
// expect(response.body).toHaveProperty('username', 'validUser');
69+
// });
70+
// it('should return 401 if token is missing or invalid', async () => {
71+
// const response = await request(app)
72+
// .get('/auth/profile')
73+
// .set('Authorization', 'Bearer invalidToken');
74+
// expect(response.status).toBe(401);
75+
// expect(response.body).toHaveProperty('error', 'Unauthorized');
76+
// });
77+
// });
78+
it("template test", () => {
79+
expect(2 + 3).toEqual(5);
80+
});
81+
});

course-matrix/backend/__tests__/index.test.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,3 @@ describe("Sum function", () => {
77
expect(2 + 3).toEqual(5);
88
});
99
});
10-
11-
// Will finish the rest of the tests below in Sprint 3
12-
13-
// describe("GET /auth/session", () => {
14-
// test("It should respond with 200 status", async () => {
15-
// const response = await request(app).get("/auth/session");
16-
// expect(response.statusCode).toBe(200);
17-
// });
18-
// });

course-matrix/frontend/__tests__/UserMenu.test.tsx

Lines changed: 0 additions & 83 deletions
This file was deleted.
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
import "@testing-library/jest-dom/jest-globals";
2+
import "@testing-library/jest-dom";
3+
4+
import { render, screen, fireEvent } from "@testing-library/react";
5+
import React from "react";
6+
import { MemoryRouter } from "react-router-dom";
7+
import { expect, test } from "@jest/globals";
8+
import App from "../../src/App";
9+
import SignupPage from "../../src/pages/Signup/SignUpPage";
10+
import LoginPage from "../../src/pages/Login/LoginPage";
11+
import Dashboard from "../../src/pages/Dashboard/Dashboard";
12+
import TimetableBuilder from "../../src/pages/TimetableBuilder/TimetableBuilder";
13+
import Home from "../../src/pages/Home/Home";
14+
15+
test("typical flow for creating an account and logging in", () => {
16+
render(<App />, { wrapper: MemoryRouter });
17+
render(<LoginPage />, { wrapper: MemoryRouter });
18+
render(<SignupPage />, { wrapper: MemoryRouter });
19+
render(<Dashboard />, { wrapper: MemoryRouter });
20+
21+
// Going to login page
22+
expect(screen.getByText("Login")).toBeInTheDocument();
23+
fireEvent.click(screen.getByText("Login"));
24+
25+
// Logging in with invalid credentials
26+
fireEvent.change(screen.getByLabelText("Email"), { target: { value: "" } });
27+
fireEvent.change(screen.getByLabelText("Password"), {
28+
target: { value: "password" },
29+
});
30+
fireEvent.click(screen.getByText("Login"));
31+
expect(
32+
screen.getByText("Login invalid. Please check your email or password."),
33+
).toBeInTheDocument();
34+
35+
// Going to signup page
36+
fireEvent.click(screen.getByText("Sign up!"));
37+
expect(screen.getByText("Sign up")).toBeInTheDocument();
38+
fireEvent.change(screen.getByLabelText("Email"), { target: { value: "" } });
39+
fireEvent.change(screen.getByLabelText("Password"), {
40+
target: { value: "" },
41+
});
42+
fireEvent.click(screen.getByText("Sign up"));
43+
expect(screen.getByText("Email is required")).toBeInTheDocument();
44+
expect(screen.getByText("Password is required")).toBeInTheDocument();
45+
46+
// Creating an account
47+
fireEvent.change(screen.getByLabelText("Email"), {
48+
target: { value: "[email protected]" },
49+
});
50+
fireEvent.change(screen.getByLabelText("Password"), {
51+
target: { value: "password123" },
52+
});
53+
fireEvent.click(screen.getByText("Sign up"));
54+
expect(screen.getByText("Account created successfully!")).toBeInTheDocument();
55+
56+
// Logging in with valid credentials
57+
fireEvent.change(screen.getByLabelText("Email"), {
58+
target: { value: "[email protected]" },
59+
});
60+
fireEvent.change(screen.getByLabelText("Password"), {
61+
target: { value: "password123" },
62+
});
63+
fireEvent.click(screen.getByText("Login"));
64+
65+
// Check if user is redirected to home page
66+
expect(screen.getByText("Home Page")).toBeInTheDocument();
67+
});
68+
69+
test("typical flow for creating a new timetable, adding courses, adding restrictions, saving the timetable, and editing the timetable", () => {
70+
render(<App />, { wrapper: MemoryRouter });
71+
render(<LoginPage />, { wrapper: MemoryRouter });
72+
render(<SignupPage />, { wrapper: MemoryRouter });
73+
render(<Dashboard />, { wrapper: MemoryRouter });
74+
render(<Home />, { wrapper: MemoryRouter });
75+
render(<TimetableBuilder />, { wrapper: MemoryRouter });
76+
77+
expect(screen.getByText("My Timetables")).toBeInTheDocument();
78+
fireEvent.click(screen.getByText("Create New"));
79+
80+
expect(screen.getByText("New Timetable")).toBeInTheDocument();
81+
82+
// Adding courses
83+
fireEvent.click(screen.getByText("Choose meeting sections manually"));
84+
fireEvent.click(screen.getByText("Search"));
85+
fireEvent.click(screen.getByText("ACMB10H3"));
86+
fireEvent.click(screen.getByText("ACMC01H3"));
87+
fireEvent.click(screen.getByText("ACMD01H3"));
88+
screen.getAllByText("No LEC Selected").forEach((element) => {
89+
fireEvent.click(element);
90+
fireEvent.click(screen.getByText("LEC 01"));
91+
});
92+
93+
// Adding a restriction
94+
fireEvent.click(screen.getByText("Add New"));
95+
fireEvent.click(screen.getByText("Select a type"));
96+
fireEvent.click(screen.getByText("Restrict Entire Day"));
97+
fireEvent.click(screen.getByText("Tuesday"));
98+
fireEvent.click(screen.getByText("Create"));
99+
100+
// Saving the timetable
101+
fireEvent.click(screen.getByText("Create Timetable"));
102+
fireEvent.change(screen.getByLabelText("Timetable Name"), {
103+
target: { value: "Test Timetable Name" },
104+
});
105+
fireEvent.click(screen.getByText("Save"));
106+
107+
// Check if user is redirected to home page and timetable is saved
108+
expect(screen.getByText("My Timetables")).toBeInTheDocument();
109+
expect(screen.getByText("Test Timetable Name")).toBeInTheDocument();
110+
111+
// Editing the timetable by resetting all courses and restrictions
112+
fireEvent.click(screen.getByText("Test Timetable Name"));
113+
expect(screen.getByText("Edit Timetable")).toBeInTheDocument();
114+
fireEvent.click(screen.getByText("Reset"));
115+
expect(screen.queryByText("ACMB10H3")).toBeNull();
116+
expect(screen.queryByText("ACMC01H3")).toBeNull();
117+
expect(screen.queryByText("ACMD01H3")).toBeNull();
118+
expect(screen.queryByText("Tuesday")).toBeNull();
119+
fireEvent.click(screen.getByText("Update Timetable"));
120+
121+
// Check if user is redirected to home page and timetable is updated
122+
expect(screen.getByText("My Timetables")).toBeInTheDocument();
123+
fireEvent.click(screen.getByText("Test Timetable Name"));
124+
expect(screen.queryByText("ACMB10H3")).toBeNull();
125+
expect(screen.queryByText("ACMC01H3")).toBeNull();
126+
expect(screen.queryByText("ACMD01H3")).toBeNull();
127+
expect(screen.queryByText("Tuesday")).toBeNull();
128+
});

0 commit comments

Comments
 (0)