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
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import * as Migration from "../../__migration__/testActivity";
import * as UserTestData from "../__testData__/users";
import * as UserDal from "../../src/dal/user";
import * as ResultDal from "../../src/dal/result";
import { DBResult } from "../../src/utils/result";
import * as Migration from "../../../__migration__/testActivity";
import * as UserTestData from "../../__testData__/users";
import * as UserDal from "../../../src/dal/user";
import * as ResultDal from "../../../src/dal/result";
import { DBResult } from "../../../src/utils/result";
import { describeIntegration } from "..";

describe("testActivity migration", () => {
describeIntegration()("testActivity migration", () => {
it("migrates users without results", async () => {
//given
const user1 = await UserTestData.createUser();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { ObjectId } from "mongodb";
import * as AdminUidsDal from "../../src/dal/admin-uids";
import * as AdminUidsDal from "../../../src/dal/admin-uids";
import { describeIntegration } from "..";

describe("AdminUidsDal", () => {
describeIntegration()("AdminUidsDal", () => {
describe("isAdmin", () => {
it("should return true for existing admin user", async () => {
//GIVEN
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { ObjectId } from "mongodb";
import { addApeKey } from "../../src/dal/ape-keys";
import { addApeKey } from "../../../src/dal/ape-keys";
import { describeIntegration } from "..";

describe("ApeKeysDal", () => {
describeIntegration()("ApeKeysDal", () => {
it("should be able to add a new ape key", async () => {
const apeKey = {
_id: new ObjectId(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { ObjectId } from "mongodb";
import * as BlacklistDal from "../../src/dal/blocklist";
import * as BlacklistDal from "../../../src/dal/blocklist";
import { describeIntegration } from "..";

describe("BlocklistDal", () => {
describeIntegration()("BlocklistDal", () => {
describe("add", () => {
beforeEach(() => {
vitest.useFakeTimers();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
import _ from "lodash";
import { ObjectId } from "mongodb";
import * as UserDal from "../../src/dal/user";
import * as LeaderboardsDal from "../../src/dal/leaderboards";
import * as PublicDal from "../../src/dal/public";
import * as Configuration from "../../src/init/configuration";
import type { DBLeaderboardEntry } from "../../src/dal/leaderboards";
import * as UserDal from "../../../src/dal/user";
import * as LeaderboardsDal from "../../../src/dal/leaderboards";
import * as PublicDal from "../../../src/dal/public";
import * as Configuration from "../../../src/init/configuration";
import type { DBLeaderboardEntry } from "../../../src/dal/leaderboards";
import type { PersonalBest } from "@monkeytype/schemas/shared";
const configuration = Configuration.getCachedConfiguration();

import * as DB from "../../src/init/db";
import { LbPersonalBests } from "../../src/utils/pb";
import * as DB from "../../../src/init/db";
import { LbPersonalBests } from "../../../src/utils/pb";
import { describeIntegration } from "..";
import { pb } from "../../__testData__/users";

describe("LeaderboardsDal", () => {
describeIntegration()("LeaderboardsDal", () => {
describe("update", () => {
it("should ignore unapplicable users on leaderboard", async () => {
//GIVEN
Expand Down Expand Up @@ -328,24 +330,6 @@ function lbBests(pb15?: PersonalBest, pb60?: PersonalBest): LbPersonalBests {
return result;
}

export function pb(
wpm: number,
acc: number = 90,
timestamp: number = 1
): PersonalBest {
return {
acc,
consistency: 100,
difficulty: "normal",
lazyMode: false,
language: "english",
punctuation: false,
raw: wpm + 1,
wpm,
timestamp,
};
}

function premium(expirationDeltaSeconds: number) {
return {
premium: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { ObjectId } from "mongodb";
import * as PresetDal from "../../src/dal/preset";
import * as PresetDal from "../../../src/dal/preset";
import _ from "lodash";
import { describeIntegration } from "..";

describe("PresetDal", () => {
describeIntegration()("PresetDal", () => {
describe("readPreset", () => {
it("should read", async () => {
//GIVEN
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import * as PublicDAL from "../../src/dal/public";
import { describeIntegration } from "..";
import * as PublicDAL from "../../../src/dal/public";

describe("PublicDAL", function () {
describeIntegration()("PublicDAL", function () {
it("should be able to update stats", async function () {
// checks it doesn't throw an error. the actual values are checked in another test.
await PublicDAL.updateStats(1, 15);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import * as ResultDal from "../../src/dal/result";
import * as ResultDal from "../../../src/dal/result";
import { ObjectId } from "mongodb";
import * as UserDal from "../../src/dal/user";
import { DBResult } from "../../src/utils/result";
import * as UserDal from "../../../src/dal/user";
import { DBResult } from "../../../src/utils/result";
import { describeIntegration } from "..";

let uid: string;
const timestamp = Date.now() - 60000;
Expand Down Expand Up @@ -62,7 +63,7 @@ async function createDummyData(
});
}
}
describe("ResultDal", () => {
describeIntegration()("ResultDal", () => {
beforeEach(() => {
uid = new ObjectId().toHexString();
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import _ from "lodash";
import * as UserDAL from "../../src/dal/user";
import * as UserTestData from "../__testData__/users";
import * as UserDAL from "../../../src/dal/user";
import * as UserTestData from "../../__testData__/users";
import { ObjectId } from "mongodb";
import { MonkeyMail, ResultFilters } from "@monkeytype/schemas/users";
import { PersonalBest, PersonalBests } from "@monkeytype/schemas/shared";
import { CustomThemeColors } from "@monkeytype/schemas/configs";
import { describeIntegration } from "..";

const mockPersonalBest = {
acc: 1,
Expand Down Expand Up @@ -85,7 +86,7 @@ const mockResultFilter: ResultFilters = {

const mockDbResultFilter = { ...mockResultFilter, _id: new ObjectId() };

describe("UserDal", () => {
describeIntegration()("UserDal", () => {
it("should be able to insert users", async () => {
// given
const newUser = {
Expand Down
5 changes: 5 additions & 0 deletions backend/__tests__/__integration__/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export const isIntegrationTest = process.env["INTEGRATION_TESTS"] === "true";

export function describeIntegration() {
return describe.runIf(isIntegrationTest);
}
65 changes: 65 additions & 0 deletions backend/__tests__/__integration__/setup-integration-tests.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import { Collection, Db, MongoClient, WithId } from "mongodb";
import { afterAll, beforeAll, afterEach } from "vitest";
import * as MongoDbMock from "vitest-mongodb";
import { MongoDbMockConfig } from "../global-setup";
import { isIntegrationTest } from ".";
import { setupCommonMocks } from "../setup-common-mocks";

process.env["MODE"] = "dev";
//process.env["MONGOMS_DISTRO"] = "ubuntu-22.04";

if (!isIntegrationTest) {
console.error("wrong environment");
process.exit();
}

if (!process.env["REDIS_URI"]) {
// use mock if not set
process.env["REDIS_URI"] = "redis://mock";
}

let db: Db;
let client: MongoClient;
const collectionsForCleanUp = ["users"];

beforeAll(async () => {
//don't add any configuration here, add to global-setup.ts instead.

console.log("integration setup mongo");
await MongoDbMock.setup(MongoDbMockConfig);

client = new MongoClient(globalThis.__MONGO_URI__);
await client.connect();
db = client.db();

vi.mock("../../src/init/db", () => ({
__esModule: true,
getDb: (): Db => db,
collection: <T>(name: string): Collection<WithId<T>> =>
db.collection<WithId<T>>(name),
close: () => {
//
},
}));
setupCommonMocks();
});

afterEach(async () => {
if (globalThis.__MONGO_URI__) {
await Promise.all(
collectionsForCleanUp.map((collection) =>
db.collection(collection).deleteMany({})
)
);
}
});

afterAll(async () => {
await client?.close();
await MongoDbMock.teardown();
// @ts-ignore
db = undefined;
//@ts-ignore
client = undefined;
vi.resetAllMocks();
});
19 changes: 19 additions & 0 deletions backend/__tests__/__testData__/users.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import * as DB from "../../src/init/db";
import * as UserDAL from "../../src/dal/user";
import { ObjectId } from "mongodb";
import { PersonalBest } from "@monkeytype/schemas/shared";

export async function createUser(
user?: Partial<UserDAL.DBUser>
Expand All @@ -24,3 +25,21 @@ export async function createUserWithoutMigration(

return await UserDAL.getUser(uid, "test");
}

export function pb(
wpm: number,
acc: number = 90,
timestamp: number = 1
): PersonalBest {
return {
acc,
consistency: 100,
difficulty: "normal",
lazyMode: false,
language: "english",
punctuation: false,
raw: wpm + 1,
wpm,
timestamp,
};
}
6 changes: 5 additions & 1 deletion backend/__tests__/api/controllers/leaderboard.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,18 @@ describe("Loaderboard Controller", () => {
});
describe("get leaderboard", () => {
const getLeaderboardMock = vi.spyOn(LeaderboardDal, "get");
const getLeaderboardCountMock = vi.spyOn(LeaderboardDal, "getCount");

beforeEach(() => {
getLeaderboardMock.mockReset();
getLeaderboardCountMock.mockReset();
});

it("should get for english time 60", async () => {
//GIVEN

const resultData = {
count: 0,
count: 42,
pageSize: 50,
entries: [
{
Expand Down Expand Up @@ -78,6 +80,7 @@ describe("Loaderboard Controller", () => {
_id: new ObjectId(),
}));
getLeaderboardMock.mockResolvedValue(mockData);
getLeaderboardCountMock.mockResolvedValue(42);

//WHEN

Expand All @@ -104,6 +107,7 @@ describe("Loaderboard Controller", () => {
it("should get for english time 60 with page", async () => {
//GIVEN
getLeaderboardMock.mockResolvedValue([]);
getLeaderboardCountMock.mockResolvedValue(0);
const page = 0;
const pageSize = 25;

Expand Down
49 changes: 37 additions & 12 deletions backend/__tests__/api/controllers/result.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import * as Configuration from "../../../src/init/configuration";
import * as ResultDal from "../../../src/dal/result";
import * as UserDal from "../../../src/dal/user";
import * as LogsDal from "../../../src/dal/logs";
import * as PublicDal from "../../../src/dal/public";
import { ObjectId } from "mongodb";
import {
mockAuthenticateWithApeKey,
Expand Down Expand Up @@ -504,6 +505,7 @@ describe("result controller test", () => {
it("should delete", async () => {
//GIVEN
mockAuth.modifyToken({ iat: Date.now() - 1000 });
deleteAllMock.mockResolvedValue(undefined as any);

//WHEN
const { body } = await mockApp
Expand Down Expand Up @@ -672,22 +674,34 @@ describe("result controller test", () => {
describe("addResult", () => {
//TODO improve test coverage for addResult
const insertedId = new ObjectId();
const getUserMock = vi.spyOn(UserDal, "getUser");
const updateStreakMock = vi.spyOn(UserDal, "updateStreak");
const checkIfTagPbMock = vi.spyOn(UserDal, "checkIfTagPb");
const addResultMock = vi.spyOn(ResultDal, "addResult");
const userGetMock = vi.spyOn(UserDal, "getUser");
const userUpdateStreakMock = vi.spyOn(UserDal, "updateStreak");
const userCheckIfTagPbMock = vi.spyOn(UserDal, "checkIfTagPb");
const userCheckIfPbMock = vi.spyOn(UserDal, "checkIfPb");
const userIncrementXpMock = vi.spyOn(UserDal, "incrementXp");
const userUpdateTypingStatsMock = vi.spyOn(UserDal, "updateTypingStats");
const resultAddMock = vi.spyOn(ResultDal, "addResult");
const publicUpdateStatsMock = vi.spyOn(PublicDal, "updateStats");

beforeEach(async () => {
await enableResultsSaving(true);

[getUserMock, updateStreakMock, checkIfTagPbMock, addResultMock].forEach(
(it) => it.mockReset()
);
[
userGetMock,
userUpdateStreakMock,
userCheckIfTagPbMock,
userCheckIfPbMock,
userIncrementXpMock,
userUpdateTypingStatsMock,
resultAddMock,
publicUpdateStatsMock,
].forEach((it) => it.mockReset());

getUserMock.mockResolvedValue({ name: "bob" } as any);
updateStreakMock.mockResolvedValue(0);
checkIfTagPbMock.mockResolvedValue([]);
addResultMock.mockResolvedValue({ insertedId });
userGetMock.mockResolvedValue({ name: "bob" } as any);
userUpdateStreakMock.mockResolvedValue(0);
userCheckIfTagPbMock.mockResolvedValue([]);
userCheckIfPbMock.mockResolvedValue(true);
resultAddMock.mockResolvedValue({ insertedId });
});

it("should add result", async () => {
Expand Down Expand Up @@ -749,7 +763,7 @@ describe("result controller test", () => {
insertedId: insertedId.toHexString(),
});

expect(addResultMock).toHaveBeenCalledWith(
expect(resultAddMock).toHaveBeenCalledWith(
uid,
expect.objectContaining({
acc: 86,
Expand Down Expand Up @@ -783,6 +797,17 @@ describe("result controller test", () => {
wpm: 80,
})
);

expect(publicUpdateStatsMock).toHaveBeenCalledWith(
4,
15.1 + 2 - 5 //duration + incompleteTestSeconds-afk
);
expect(userIncrementXpMock).toHaveBeenCalledWith(uid, 0);
expect(userUpdateTypingStatsMock).toHaveBeenCalledWith(
uid,
4,
15.1 + 2 - 5 //duration + incompleteTestSeconds-afk
);
});
it("should fail if result saving is disabled", async () => {
//GIVEN
Expand Down
Loading
Loading