Skip to content

Commit a0f971a

Browse files
committed
Merge branch 'main' into fix-flaky-tests
2 parents c5abb54 + 5394a96 commit a0f971a

28 files changed

+277
-266
lines changed

packages/backend/.env.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ TOKEN_GCAL_NOTIFICATION=ANOTHER_UNIQUE_STRING
2828
####################################################
2929
# 2. Database #
3030
####################################################
31+
MONGOMS_VERSION=8.0.9 # pins the test mongo server binary version
3132
MONGO_URI=mongodb+srv://admin:YOUR_ADMIN_PW@cluster0.m99yy.mongodb.net/dev_calendar?authSource=admin&retryWrites=true&w=majority&tls=true
3233

3334

packages/backend/src/__tests__/backend.test.init.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const mongoUri = (global as unknown as { __MONGO_URI__: string }).__MONGO_URI__;
22

3-
process.env["BASEURL"] = "http;s://foo.yourdomain.app";
3+
process.env["BASEURL"] = "https://foo.yourdomain.app";
44
process.env["CORS"] =
55
"https://foo.yourdomain.app,http://localhost:3000,http://localhost:9080";
66
process.env["PORT"] = "3000";
Lines changed: 10 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
import { Db } from "mongodb";
2-
import { MongoMemoryServer } from "mongodb-memory-server";
2+
import { SyncDriver } from "@backend/__tests__/drivers/sync.driver";
3+
import { UserDriver } from "@backend/__tests__/drivers/user.driver";
4+
import { WaitListDriver } from "@backend/__tests__/drivers/waitlist.driver";
35
import { Collections } from "@backend/common/constants/collections";
46
import mongoService from "@backend/common/services/mongo.service";
5-
import { SyncDriver } from "../drivers/sync.driver";
6-
import { UserDriver } from "../drivers/user.driver";
7-
import { WaitListDriver } from "../drivers/waitlist.driver";
87

98
export interface TestSetup {
10-
mongoServer: MongoMemoryServer;
11-
mongoClient: typeof mongoService;
129
db: Db;
1310
userId: string;
1411
email: string;
@@ -21,13 +18,7 @@ export interface TestSetup {
2118
*/
2219
export async function setupTestDb(): Promise<TestSetup> {
2320
try {
24-
const dbName = process.env["DB"];
25-
26-
// Setup in-memory MongoDB
27-
const mongoServer = new MongoMemoryServer({ instance: { dbName } });
28-
29-
await mongoServer.start();
30-
await mongoService.start(mongoServer.getUri());
21+
await mongoService.start();
3122

3223
const user = await UserDriver.createUser();
3324

@@ -37,8 +28,6 @@ export async function setupTestDb(): Promise<TestSetup> {
3728
]);
3829

3930
return {
40-
mongoServer,
41-
mongoClient: mongoService,
4231
db: mongoService.db,
4332
userId: user._id.toString(),
4433
email: user.email,
@@ -55,14 +44,10 @@ export async function setupTestDb(): Promise<TestSetup> {
5544
}
5645
}
5746

58-
export async function cleanupCollections(db: Db): Promise<void> {
59-
const collections = await db.collections();
47+
export async function cleanupCollections(): Promise<void> {
48+
const collections = await mongoService.db.collections();
6049

61-
const SKIP_COLLECTIONS = [
62-
Collections.USER,
63-
Collections.SYNC,
64-
Collections.WAITLIST,
65-
];
50+
const SKIP_COLLECTIONS = [Collections.USER, Collections.SYNC];
6651

6752
const selectedCollections = collections.filter(
6853
(collection) => !SKIP_COLLECTIONS.includes(collection.collectionName),
@@ -73,14 +58,10 @@ export async function cleanupCollections(db: Db): Promise<void> {
7358
);
7459
}
7560

76-
export async function cleanupTestMongo({
77-
mongoServer,
78-
mongoClient,
79-
}: TestSetup): Promise<void> {
61+
export async function cleanupTestDb(): Promise<void> {
8062
try {
81-
await mongoClient.stop();
82-
await mongoServer.stop({ force: true, doCleanup: true });
63+
await mongoService.stop();
8364
} catch (err) {
84-
console.error("Error during cleanup:", err);
65+
console.error("Error during test db cleanup:", err);
8566
}
8667
}

packages/backend/src/event/services/event.delete.test.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,33 @@
11
import dayjs from "dayjs";
2-
import { Collection, Db, MongoClient, ObjectId } from "mongodb";
3-
import { YEAR_MONTH_DAY_FORMAT } from "@core/constants/date.constants";
4-
import { Schema_Event } from "@core/types/event.types";
2+
import { Collection, ObjectId } from "mongodb";
53
import {
64
mockSomedayRecurrences,
75
newsletterId,
8-
} from "../../../../core/src/__mocks__/v1/events/events.someday.recur";
9-
import { getDeleteByIdFilter } from "./event.service.util";
6+
} from "@core/__mocks__/v1/events/events.someday.recur";
7+
import { YEAR_MONTH_DAY_FORMAT } from "@core/constants/date.constants";
8+
import { Schema_Event } from "@core/types/event.types";
9+
import {
10+
cleanupTestDb,
11+
setupTestDb,
12+
} from "@backend/__tests__/helpers/mock.db.setup";
13+
import mongoService from "@backend/common/services/mongo.service";
14+
import { getDeleteByIdFilter } from "@backend/event/services/event.service.util";
1015

1116
describe("Delete Events", () => {
12-
let connection: MongoClient;
13-
let db: Db;
1417
let eventCollection: Collection<Schema_Event>;
1518

1619
beforeAll(async () => {
17-
// setup in-memory connection using jest-mongodb
18-
connection = await MongoClient.connect(process.env["MONGO_URL"] as string);
19-
db = await connection.db();
20-
eventCollection = db.collection("event.delete.test");
20+
await setupTestDb();
21+
22+
eventCollection = mongoService.db.collection("event.delete.test");
2123
});
2224

2325
beforeEach(async () => {
2426
await eventCollection.deleteMany({});
2527
await eventCollection.insertMany([...mockSomedayRecurrences]);
2628
});
2729

28-
afterAll(async () => {
29-
await connection.close();
30-
});
30+
afterAll(cleanupTestDb);
3131

3232
describe("Recurring events: someday", () => {
3333
it("only deletes future instances", async () => {

packages/backend/src/event/services/event.find.allday.test.ts

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,31 @@
1-
import { Collection, Db, Filter, MongoClient } from "mongodb";
1+
import { Filter } from "mongodb";
2+
import { mockEventSetMar22 } from "@core/__mocks__/v1/events/events.22mar";
23
import { Schema_Event } from "@core/types/event.types";
3-
import { mockEventSetMar22 } from "../../../../core/src/__mocks__/v1/events/events.22mar";
4-
import { getReadAllFilter } from "./event.service.util";
4+
import {
5+
cleanupTestDb,
6+
setupTestDb,
7+
} from "@backend/__tests__/helpers/mock.db.setup";
8+
import mongoService from "@backend/common/services/mongo.service";
9+
import { getReadAllFilter } from "@backend/event/services/event.service.util";
510

611
describe("Mar 6 - 12, 2022: All-Day Events", () => {
7-
let connection: MongoClient;
8-
let db: Db;
9-
let eventCollection: Collection<Schema_Event>;
1012
let filter: Filter<Schema_Event>;
1113
let titles: string[];
1214

1315
beforeAll(async () => {
14-
// setup in-memory connection using jest-mongodb
15-
connection = await MongoClient.connect(process.env["MONGO_URL"] as string);
16-
db = await connection.db();
17-
eventCollection = db.collection("event");
18-
await eventCollection.insertMany(mockEventSetMar22);
16+
await setupTestDb();
17+
18+
await mongoService.event.insertMany(mockEventSetMar22);
1919

2020
filter = getReadAllFilter("user1", {
2121
start: "2022-03-06T00:00:00-07:00",
2222
end: "2022-03-12T23:59:59-07:00",
2323
});
24-
const result = await eventCollection.find(filter).toArray();
24+
const result = await mongoService.event.find(filter).toArray();
2525
titles = result.map((e) => e.title);
2626
});
2727

28-
afterAll(async () => {
29-
await connection.close();
30-
});
28+
afterAll(cleanupTestDb);
3129

3230
it("finds overlapping multi-week event", async () => {
3331
expect(titles.includes("Feb 14 - Mar 8")).toBe(true);

packages/backend/src/event/services/event.find.test.ts

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
1-
import { Collection, Db, MongoClient } from "mongodb";
1+
import { Collection } from "mongodb";
2+
import { mockEventSetJan22 } from "@core/__mocks__/v1/events/events.22jan";
3+
import { mockEventSetSomeday1 } from "@core/__mocks__/v1/events/events.someday.1";
24
import { MapEvent } from "@core/mappers/map.event";
35
import { Schema_Event } from "@core/types/event.types";
46
import { isBase, isExistingInstance } from "@core/util/event/event.util";
7+
import {
8+
cleanupTestDb,
9+
setupTestDb,
10+
} from "@backend/__tests__/helpers/mock.db.setup";
511
import {
612
mockRecurringGcalBaseEvent,
713
mockRecurringGcalInstances,
814
} from "@backend/__tests__/mocks.gcal/factories/gcal.event.factory";
9-
import { mockEventSetJan22 } from "../../../../core/src/__mocks__/v1/events/events.22jan";
10-
import { mockEventSetSomeday1 } from "../../../../core/src/__mocks__/v1/events/events.someday.1";
11-
import { getReadAllFilter } from "./event.service.util";
15+
import mongoService from "@backend/common/services/mongo.service";
16+
import { getReadAllFilter } from "@backend/event/services/event.service.util";
1217

1318
const gBase = mockRecurringGcalBaseEvent();
1419
const gInstances = mockRecurringGcalInstances(gBase, 10, 7);
@@ -23,22 +28,17 @@ instances.forEach((i) => {
2328
const recurring = [base, ...instances];
2429
const allEvents = [...mockEventSetJan22, ...mockEventSetSomeday1, ...recurring];
2530
describe("Jan 2022: Many Formats", () => {
26-
let connection: MongoClient;
27-
let db: Db;
2831
let eventCollection: Collection<Schema_Event>;
2932

3033
beforeAll(async () => {
31-
// setup in-memory connection using jest-mongodb
32-
connection = await MongoClient.connect(process.env["MONGO_URL"] as string);
33-
db = await connection.db();
34-
eventCollection = db.collection("event.find.test");
34+
await setupTestDb();
35+
36+
eventCollection = mongoService.db.collection("event.find.test");
3537

3638
await eventCollection.insertMany(allEvents);
3739
});
3840

39-
afterAll(async () => {
40-
await connection.close();
41-
});
41+
afterAll(cleanupTestDb);
4242

4343
it("returns events by provided user only", async () => {
4444
const filter = getReadAllFilter("user1", {
@@ -49,11 +49,11 @@ describe("Jan 2022: Many Formats", () => {
4949
events.forEach((e) => expect(e.user).toBe("user1"));
5050
});
5151
it("does NOT transform query dates to ISO format", () => {
52-
/*
52+
/*
5353
it shouldn't transform the format, because mongo
5454
will do that during its date comparison
5555
56-
this depends on the frontend passing the date values in the correct format
56+
this depends on the frontend passing the date values in the correct format
5757
*/
5858
const start = "2011-10-20T00:00:00-10:00";
5959
const end = "2011-11-26T00:00:00-10:00";

packages/backend/src/servers/websocket/websocket.server.test.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
/**
2+
* @jest-environment node
3+
*
4+
* we do not need the database for this test
5+
*/
16
import { randomUUID } from "node:crypto";
27
import { updateUserMetadata } from "supertokens-node/recipe/usermetadata";
38
import {
@@ -17,7 +22,7 @@ describe("WebSocket Server", () => {
1722
const baseDriver = new BaseDriver();
1823

1924
const userMetadata: UserMetadata = {
20-
sync: { importGCal: { importing: false } },
25+
sync: { importGCal: null },
2126
};
2227

2328
beforeAll(async () => {

packages/backend/src/sync/controllers/sync.controller.test.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,19 @@ import { EVENT_CHANGED } from "@core/constants/websocket.constants";
33
import { isBase, isExistingInstance } from "@core/util/event/event.util";
44
import { BaseDriver } from "@backend/__tests__/drivers/base.driver";
55
import { SyncControllerDriver } from "@backend/__tests__/drivers/sync.controller.driver";
6+
import { SyncDriver } from "@backend/__tests__/drivers/sync.driver";
7+
import { UserDriver } from "@backend/__tests__/drivers/user.driver";
68
import { getCategorizedEventsInDb } from "@backend/__tests__/helpers/mock.db.queries";
79
import {
810
cleanupCollections,
9-
cleanupTestMongo,
11+
cleanupTestDb,
1012
setupTestDb,
1113
} from "@backend/__tests__/helpers/mock.db.setup";
14+
import { waitUntilEvent } from "@backend/common/helpers/common.util";
1215
import gcalService from "@backend/common/services/gcal/gcal.service";
1316
import mongoService from "@backend/common/services/mongo.service";
1417
import * as syncQueries from "@backend/sync/util/sync.queries";
15-
import { SyncDriver } from "../../__tests__/drivers/sync.driver";
16-
import { UserDriver } from "../../__tests__/drivers/user.driver";
17-
import { waitUntilEvent } from "../../common/helpers/common.util";
18-
import userService from "../../user/services/user.service";
18+
import userService from "@backend/user/services/user.service";
1919

2020
describe("SyncController", () => {
2121
const baseDriver = new BaseDriver();
@@ -33,7 +33,7 @@ describe("SyncController", () => {
3333

3434
afterAll(async () => {
3535
await baseDriver.teardown();
36-
await cleanupTestMongo(setup);
36+
await cleanupTestDb();
3737
jest.clearAllMocks();
3838
});
3939

@@ -45,7 +45,7 @@ describe("SyncController", () => {
4545
sessionId: randomUUID(),
4646
});
4747

48-
await cleanupCollections(setup.db);
48+
await cleanupCollections();
4949

5050
const failReason = await syncDriver.waitUntilImportGCalEnd(
5151
websocketClient,
@@ -369,7 +369,7 @@ describe("SyncController", () => {
369369
});
370370

371371
describe("Frontend Notifications", () => {
372-
beforeEach(() => cleanupCollections(setup.db));
372+
beforeEach(cleanupCollections);
373373

374374
it("should notify the frontend that the import has started", async () => {
375375
const user = await UserDriver.createUser();

packages/backend/src/sync/services/import/sync.import.full.test.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ import { isBase, isExistingInstance } from "@core/util/event/event.util";
22
import { getCategorizedEventsInDb } from "@backend/__tests__/helpers/mock.db.queries";
33
import {
44
cleanupCollections,
5-
cleanupTestMongo,
5+
cleanupTestDb,
66
setupTestDb,
77
} from "@backend/__tests__/helpers/mock.db.setup";
88
import mongoService from "@backend/common/services/mongo.service";
9-
import { createSyncImport } from "./sync.import";
9+
import { createSyncImport } from "@backend/sync/services/import/sync.import";
1010

1111
describe("SyncImport: Full", () => {
1212
let syncImport: Awaited<ReturnType<typeof createSyncImport>>;
@@ -17,13 +17,9 @@ describe("SyncImport: Full", () => {
1717
syncImport = await createSyncImport(setup.userId);
1818
});
1919

20-
beforeEach(async () => {
21-
await cleanupCollections(setup.db);
22-
});
20+
beforeEach(cleanupCollections);
2321

24-
afterAll(async () => {
25-
await cleanupTestMongo(setup);
26-
});
22+
afterAll(cleanupTestDb);
2723

2824
it("should import the first instance of a recurring event (and the base)", async () => {
2925
// Importing both the bae and first instance helps us find the series recurrence rule.

packages/backend/src/sync/services/import/sync.import.series.test.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
} from "@core/util/event/event.util";
66
import {
77
cleanupCollections,
8-
cleanupTestMongo,
8+
cleanupTestDb,
99
setupTestDb,
1010
} from "@backend/__tests__/helpers/mock.db.setup";
1111
import { mockRecurringGcalBaseEvent } from "@backend/__tests__/mocks.gcal/factories/gcal.event.factory";
@@ -21,13 +21,9 @@ describe("SyncImport: Series", () => {
2121
syncImport = await createSyncImport(setup.userId);
2222
});
2323

24-
beforeEach(async () => {
25-
await cleanupCollections(setup.db);
26-
});
24+
beforeEach(cleanupCollections);
2725

28-
afterAll(async () => {
29-
await cleanupTestMongo(setup);
30-
});
26+
afterAll(cleanupTestDb);
3127

3228
it("should import a series when provided a gcal base event", async () => {
3329
/* Assemble */

0 commit comments

Comments
 (0)