Skip to content

Commit 4e02849

Browse files
committed
Merge branch 'develop' into ax/scrum-60-share-timetable-frontend
2 parents e7d806c + a166876 commit 4e02849

25 files changed

+849
-403
lines changed

.github/workflows/autodeploy.yml

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -115,21 +115,20 @@ jobs:
115115
cd /home/masahisasekita/term-group-project-c01w25-project-course-matrix || { echo "Error: Directory /root/myapp does not exist!"; exit 1; }
116116
117117
# Step 13: Clears deployment environment
118+
sudo docker stop $(sudo docker ps -q)
118119
sudo docker rmi -f $(sudo docker images -q)
119120
sudo docker system prune -a --volumes -f
120121
121122
# Step 14: Pull the latest images
122-
docker pull ${{ secrets.DOCKERHUB_USERNAME }}/course-matrix-frontend:master
123-
docker pull ${{ secrets.DOCKERHUB_USERNAME }}/course-matrix-backend:master
123+
sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/course-matrix-frontend:master
124+
sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/course-matrix-backend:master
124125
125126
# Step 15: Run the docker containers
126-
docker run -d -p 5173:5173 ${{ secrets.DOCKERHUB_USERNAME }}/course-matrix-frontend:master
127-
docker run -d -p 8081:8081 ${{ secrets.DOCKERHUB_USERNAME }}/course-matrix-backend:master
127+
sudo docker run -d -p 5173:5173 ${{ secrets.DOCKERHUB_USERNAME }}/course-matrix-frontend:master
128+
sudo docker run -d -p 8081:8081 ${{ secrets.DOCKERHUB_USERNAME }}/course-matrix-backend:master
128129
129130
# Step 16: Run post deployment tests
130-
docker compose down
131-
docker compose up -d --pull always
132-
docker ps
133-
docker exec -it ${{ secrets.DOCKERHUB_USERNAME }}/course-matrix-frontend:master npm test
134-
docker exec -it ${{ secrets.DOCKERHUB_USERNAME }}/course-matrix-backend:master npm test
131+
sudo docker ps
132+
sudo docker run --rm ${{ secrets.DOCKERHUB_USERNAME }}/course-matrix-frontend:master npm test
133+
sudo docker run --rm ${{ secrets.DOCKERHUB_USERNAME }}/course-matrix-backend:master npm test
135134
EOF

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

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
import { describe, expect, it, test } from "@jest/globals";
22

3-
import { createOffering, canInsert } from "../src/utils/generatorHelpers";
43
import { Offering } from "../src/types/generatorTypes";
4+
import {
5+
canInsert,
6+
canInsertList,
7+
createOffering,
8+
} from "../src/utils/generatorHelpers";
59

610
describe("canInsert function", () => {
711
const offering1: Offering = createOffering({
@@ -115,4 +119,52 @@ describe("canInsert function", () => {
115119

116120
expect(result).toBe(true); // Different day, no overlap
117121
});
122+
123+
it("special case", async () => {
124+
const toInsert: Offering = createOffering({
125+
id: 1069,
126+
course_id: 1271,
127+
day: "TH",
128+
start: "05:00:00",
129+
end: "17:00:00",
130+
});
131+
const offering11: Offering = createOffering({
132+
id: 414,
133+
course_id: 337,
134+
day: "TU",
135+
start: "15:00:00",
136+
end: "16:00:00",
137+
});
138+
const offering12: Offering = createOffering({
139+
id: 415,
140+
course_id: 337,
141+
day: "TH",
142+
start: "15:00:00",
143+
end: "17:00:00",
144+
});
145+
const offering13: Offering = createOffering({
146+
id: 1052,
147+
course_id: 1271,
148+
day: "TU",
149+
start: "10:00:00",
150+
end: "11:00:00",
151+
});
152+
const offering14: Offering = createOffering({
153+
id: 1053,
154+
course_id: 1271,
155+
day: "TU",
156+
start: "09:00:00",
157+
end: "11:00:00",
158+
});
159+
const curList: Offering[] = [
160+
offering11,
161+
offering12,
162+
offering13,
163+
offering14,
164+
];
165+
166+
const result = await canInsertList([toInsert], curList);
167+
168+
expect(result).toBe(false); // Special bug-causing case
169+
});
118170
});
Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
import { describe, expect, it, test } from "@jest/globals";
2+
3+
import { Offering } from "../src/types/generatorTypes";
4+
import {
5+
createOffering,
6+
getMinHour,
7+
getMinHourDay,
8+
} from "../src/utils/generatorHelpers";
9+
10+
describe("getMinHourDay function", () => {
11+
it("Back to back to back courses", async () => {
12+
const offering1: Offering = createOffering({
13+
id: 1,
14+
course_id: 101,
15+
day: "MO",
16+
start: "09:00:00",
17+
end: "10:00:00",
18+
});
19+
const offering2: Offering = createOffering({
20+
id: 2,
21+
course_id: 102,
22+
day: "MO",
23+
start: "10:00:00",
24+
end: "11:00:00",
25+
});
26+
const offering3: Offering = createOffering({
27+
id: 3,
28+
course_id: 103,
29+
day: "MO",
30+
start: "11:00:00",
31+
end: "12:00:00",
32+
});
33+
const schedule: Offering[] = [offering1, offering2, offering3];
34+
35+
const result = getMinHourDay(schedule, 0);
36+
37+
expect(result).toBe(true);
38+
});
39+
40+
it("courses that has a max gap of 4 hours", async () => {
41+
const offering1: Offering = createOffering({
42+
id: 1,
43+
course_id: 101,
44+
day: "MO",
45+
start: "09:00:00",
46+
end: "10:00:00",
47+
});
48+
const offering2: Offering = createOffering({
49+
id: 2,
50+
course_id: 102,
51+
day: "MO",
52+
start: "10:00:00",
53+
end: "11:00:00",
54+
});
55+
const offering3: Offering = createOffering({
56+
id: 3,
57+
course_id: 103,
58+
day: "MO",
59+
start: "15:00:00",
60+
end: "16:00:00",
61+
});
62+
const schedule: Offering[] = [offering3, offering2, offering1];
63+
64+
const result = getMinHourDay(schedule, 3);
65+
66+
expect(result).toBe(false);
67+
});
68+
69+
it("only 1 offering in list, return 0", async () => {
70+
const offering1: Offering = createOffering({
71+
id: 1,
72+
course_id: 101,
73+
day: "MO",
74+
start: "09:00:00",
75+
end: "10:00:00",
76+
});
77+
const schedule: Offering[] = [offering1];
78+
79+
const result = getMinHourDay(schedule, 23);
80+
81+
expect(result).toBe(true);
82+
});
83+
84+
it("getMinHour test", async () => {
85+
const arr_day = [
86+
"MO",
87+
"MO",
88+
"TU",
89+
"TH",
90+
"FR",
91+
"MO",
92+
"TU",
93+
"TH",
94+
"MO",
95+
"MO",
96+
];
97+
const arr_start = [
98+
"09:00:00",
99+
"10:00:00",
100+
"09:00:00",
101+
"12:00:00",
102+
"13:00:00",
103+
"12:00:00",
104+
"14:00:00",
105+
"16:00:00",
106+
"13:00:00",
107+
"15:00:00",
108+
];
109+
const arr_end = [
110+
"10:00:00",
111+
"11:00:00",
112+
"10:00:00",
113+
"15:00:00",
114+
"16:00:00",
115+
"13:00:00",
116+
"19:00:00",
117+
"18:00:00",
118+
"14:00:00",
119+
"18:00:00",
120+
];
121+
const schedule: Offering[] = [];
122+
for (let i = 0; i < 10; i++) {
123+
schedule.push(
124+
createOffering({
125+
id: i,
126+
course_id: 100 + i,
127+
day: arr_day[i],
128+
start: arr_start[i],
129+
end: arr_end[i],
130+
}),
131+
);
132+
}
133+
134+
const result = getMinHour(schedule, 4);
135+
136+
expect(result).toEqual(true);
137+
});
138+
139+
it("getMinHour test 2", async () => {
140+
const arr_day = [
141+
"MO",
142+
"MO",
143+
"TU",
144+
"TH",
145+
"FR",
146+
"MO",
147+
"TU",
148+
"TH",
149+
"MO",
150+
"MO",
151+
];
152+
const arr_start = [
153+
"09:00:00",
154+
"10:00:00",
155+
"09:00:00",
156+
"12:00:00",
157+
"13:00:00",
158+
"12:00:00",
159+
"14:00:00",
160+
"16:00:00",
161+
"13:00:00",
162+
"15:00:00",
163+
];
164+
const arr_end = [
165+
"10:00:00",
166+
"11:00:00",
167+
"10:00:00",
168+
"15:00:00",
169+
"16:00:00",
170+
"13:00:00",
171+
"19:00:00",
172+
"18:00:00",
173+
"14:00:00",
174+
"18:00:00",
175+
];
176+
const schedule: Offering[] = [];
177+
for (let i = 0; i < 10; i++) {
178+
schedule.push(
179+
createOffering({
180+
id: i,
181+
course_id: 100 + i,
182+
day: arr_day[i],
183+
start: arr_start[i],
184+
end: arr_end[i],
185+
}),
186+
);
187+
}
188+
189+
const result = getMinHour(schedule, 3);
190+
191+
expect(result).toEqual(false);
192+
});
193+
});

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { describe, expect, it, test } from "@jest/globals";
22

3-
import { createOffering, isValidOffering } from "../src/utils/generatorHelpers";
43
import {
54
Offering,
65
Restriction,
76
RestrictionType,
87
} from "../src/types/generatorTypes";
8+
import { createOffering, isValidOffering } from "../src/utils/generatorHelpers";
99

1010
describe("isValidOffering", () => {
1111
const sampleOffering: Offering = createOffering({
@@ -29,6 +29,7 @@ describe("isValidOffering", () => {
2929
endTime: "09:00:00",
3030
disabled: true,
3131
numDays: 0,
32+
maxGap: 24,
3233
},
3334
];
3435
expect(isValidOffering(sampleOffering, restrictions)).toBe(true);
@@ -43,6 +44,7 @@ describe("isValidOffering", () => {
4344
endTime: "11:00:00",
4445
disabled: false,
4546
numDays: 0,
47+
maxGap: 24,
4648
},
4749
];
4850
expect(isValidOffering(sampleOffering, restrictions)).toBe(false);
@@ -57,6 +59,7 @@ describe("isValidOffering", () => {
5759
endTime: "",
5860
disabled: false,
5961
numDays: 0,
62+
maxGap: 24,
6063
},
6164
];
6265
expect(isValidOffering(sampleOffering, restrictions)).toBe(false);
@@ -71,6 +74,7 @@ describe("isValidOffering", () => {
7174
endTime: "12:00:00",
7275
disabled: false,
7376
numDays: 0,
77+
maxGap: 24,
7478
},
7579
];
7680
expect(isValidOffering(sampleOffering, restrictions)).toBe(false);
@@ -85,6 +89,7 @@ describe("isValidOffering", () => {
8589
endTime: "",
8690
disabled: false,
8791
numDays: 0,
92+
maxGap: 24,
8893
},
8994
];
9095
expect(isValidOffering(sampleOffering, restrictions)).toBe(false);
@@ -99,6 +104,7 @@ describe("isValidOffering", () => {
99104
endTime: "",
100105
disabled: false,
101106
numDays: 0,
107+
maxGap: 24,
102108
},
103109
];
104110
expect(isValidOffering(sampleOffering, restrictions)).toBe(true);

0 commit comments

Comments
 (0)