chore: Improve perf of server tests (#5785)

This commit is contained in:
Tom Moor
2023-09-06 07:14:49 -04:00
committed by GitHub
parent a724a21c21
commit 3eb947e9a5
69 changed files with 2045 additions and 1551 deletions

View File

@@ -1,42 +0,0 @@
import { Revision, Event } from "@server/models";
import { buildDocument } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import script from "./20210716000000-backfill-revisions";
setupTestDatabase();
describe("#work", () => {
it("should create events for revisions", async () => {
const document = await buildDocument();
const revision = await Revision.createFromDocument(document);
await script();
const event = await Event.findOne();
expect(event!.name).toEqual("revisions.create");
expect(event!.modelId).toEqual(revision.id);
expect(event!.documentId).toEqual(document.id);
expect(event!.teamId).toEqual(document.teamId);
expect(event!.createdAt).toEqual(revision.createdAt);
});
it("should create events for revisions of deleted documents", async () => {
const document = await buildDocument();
const revision = await Revision.createFromDocument(document);
await document.destroy();
await script();
const event = await Event.findOne();
expect(event!.name).toEqual("revisions.create");
expect(event!.modelId).toEqual(revision.id);
expect(event!.documentId).toEqual(document.id);
expect(event!.teamId).toEqual(document.teamId);
expect(event!.createdAt).toEqual(revision.createdAt);
});
it("should be idempotent", async () => {
const document = await buildDocument();
await Revision.createFromDocument(document);
await script();
await script();
const count = await Event.count();
expect(count).toEqual(1);
});
});

View File

@@ -1,173 +0,0 @@
import { Subscription } from "@server/models";
import { buildDocument, buildUser } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import script from "./20220722000000-backfill-subscriptions";
setupTestDatabase();
describe("#work", () => {
it("should create subscriptions and subscriptions for document creator and collaborators", async () => {
const admin = await buildUser();
// 5 collaborators that have cyclically contributed to documents.
const collaborator0 = await buildUser({ teamId: admin.teamId });
const collaborator1 = await buildUser({ teamId: admin.teamId });
const collaborator2 = await buildUser({ teamId: admin.teamId });
const collaborator3 = await buildUser({ teamId: admin.teamId });
const collaborator4 = await buildUser({ teamId: admin.teamId });
const document0 = await buildDocument({
userId: collaborator0.id,
collaboratorIds: [collaborator1.id, collaborator2.id],
});
const document1 = await buildDocument({
userId: collaborator1.id,
collaboratorIds: [collaborator2.id, collaborator3.id],
});
const document2 = await buildDocument({
userId: collaborator2.id,
collaboratorIds: [collaborator3.id, collaborator4.id],
});
const document3 = await buildDocument({
userId: collaborator3.id,
collaboratorIds: [collaborator4.id, collaborator0.id],
});
const document4 = await buildDocument({
userId: collaborator4.id,
collaboratorIds: [collaborator0.id, collaborator1.id],
});
await script();
const subscriptions = await Subscription.findAll();
subscriptions.forEach((subscription) => {
expect(subscription.id).toBeDefined();
expect(subscription.event).toEqual("documents.update");
});
// 5 documents, 3 collaborators each = 15.
expect(subscriptions.length).toEqual(15);
expect(subscriptions[0].documentId).toEqual(document0.id);
expect(subscriptions[1].documentId).toEqual(document0.id);
expect(subscriptions[2].documentId).toEqual(document0.id);
const s0 = [
subscriptions[0].userId,
subscriptions[1].userId,
subscriptions[2].userId,
];
expect(s0.some((s) => s.includes(collaborator0.id))).toBe(true);
expect(s0.some((s) => s.includes(collaborator1.id))).toBe(true);
expect(s0.some((s) => s.includes(collaborator2.id))).toBe(true);
expect(subscriptions[3].documentId).toEqual(document1.id);
expect(subscriptions[4].documentId).toEqual(document1.id);
expect(subscriptions[5].documentId).toEqual(document1.id);
const s1 = [
subscriptions[3].userId,
subscriptions[4].userId,
subscriptions[5].userId,
];
expect(s1.some((s) => s.includes(collaborator1.id))).toBe(true);
expect(s1.some((s) => s.includes(collaborator2.id))).toBe(true);
expect(s1.some((s) => s.includes(collaborator3.id))).toBe(true);
expect(subscriptions[6].documentId).toEqual(document2.id);
expect(subscriptions[7].documentId).toEqual(document2.id);
expect(subscriptions[8].documentId).toEqual(document2.id);
const s2 = [
subscriptions[6].userId,
subscriptions[7].userId,
subscriptions[8].userId,
];
expect(s2.some((s) => s.includes(collaborator2.id))).toBe(true);
expect(s2.some((s) => s.includes(collaborator3.id))).toBe(true);
expect(s2.some((s) => s.includes(collaborator4.id))).toBe(true);
expect(subscriptions[9].documentId).toEqual(document3.id);
expect(subscriptions[10].documentId).toEqual(document3.id);
expect(subscriptions[11].documentId).toEqual(document3.id);
const s3 = [
subscriptions[9].userId,
subscriptions[10].userId,
subscriptions[11].userId,
];
expect(s3.some((s) => s.includes(collaborator0.id))).toBe(true);
expect(s3.some((s) => s.includes(collaborator3.id))).toBe(true);
expect(s3.some((s) => s.includes(collaborator4.id))).toBe(true);
expect(subscriptions[12].documentId).toEqual(document4.id);
expect(subscriptions[13].documentId).toEqual(document4.id);
expect(subscriptions[14].documentId).toEqual(document4.id);
const s4 = [
subscriptions[12].userId,
subscriptions[13].userId,
subscriptions[14].userId,
];
expect(s4.some((s) => s.includes(collaborator0.id))).toBe(true);
expect(s4.some((s) => s.includes(collaborator1.id))).toBe(true);
expect(s4.some((s) => s.includes(collaborator4.id))).toBe(true);
});
it("should not create subscriptions and subscriptions for non-collaborators", async () => {
const admin = await buildUser();
// 2 collaborators.
const collaborator0 = await buildUser({ teamId: admin.teamId });
const collaborator1 = await buildUser({ teamId: admin.teamId });
// 1 viewer from the same team.
const viewer = await buildUser({ teamId: admin.teamId });
const document0 = await buildDocument({
userId: collaborator0.id,
collaboratorIds: [collaborator1.id],
});
await script();
const subscriptions = await Subscription.findAll();
subscriptions.forEach((subscription) => {
expect(subscription.id).toBeDefined();
});
expect(
subscriptions.filter((subscription) => subscription.userId === viewer.id)
.length
).toEqual(0);
expect(subscriptions[0].documentId).toEqual(document0.id);
expect(subscriptions[1].documentId).toEqual(document0.id);
expect(subscriptions.map((s) => s.userId)).toContain(collaborator1.id);
expect(subscriptions.map((s) => s.userId)).toContain(collaborator0.id);
expect(subscriptions[0].event).toEqual("documents.update");
expect(subscriptions[1].event).toEqual("documents.update");
});
it("should be idempotent", async () => {
await buildDocument();
await script();
await script();
const count = await Subscription.count();
expect(count).toEqual(1);
});
});

View File

@@ -1,120 +0,0 @@
import { Document } from "@server/models";
import { buildDocument, buildDraftDocument } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import script from "./20230815063834-migrate-emoji-in-document-title";
setupTestDatabase();
describe("#work", () => {
it("should correctly update title and emoji for a draft document", async () => {
const document = await buildDraftDocument({
title: "😵 Title draft",
});
expect(document.publishedAt).toBeNull();
expect(document.emoji).toBeNull();
await script();
const draft = await Document.unscoped().findByPk(document.id);
expect(draft).not.toBeNull();
expect(draft?.title).toEqual("Title draft");
expect(draft?.emoji).toEqual("😵");
});
it("should correctly update title and emoji for a published document", async () => {
const document = await buildDocument({
title: "👱🏽‍♀️ Title published",
});
expect(document.publishedAt).toBeTruthy();
expect(document.emoji).toBeNull();
await script();
const published = await Document.unscoped().findByPk(document.id);
expect(published).not.toBeNull();
expect(published?.title).toEqual("Title published");
expect(published?.emoji).toEqual("👱🏽‍♀️");
});
it("should correctly update title and emoji for an archived document", async () => {
const document = await buildDocument({
title: "🍇 Title archived",
});
await document.archive(document.createdById);
expect(document.archivedAt).toBeTruthy();
expect(document.emoji).toBeNull();
await script();
const archived = await Document.unscoped().findByPk(document.id);
expect(archived).not.toBeNull();
expect(archived?.title).toEqual("Title archived");
expect(archived?.emoji).toEqual("🍇");
});
it("should correctly update title and emoji for a template", async () => {
const document = await buildDocument({
title: "🐹 Title template",
template: true,
});
expect(document.template).toBe(true);
expect(document.emoji).toBeNull();
await script();
const template = await Document.unscoped().findByPk(document.id);
expect(template).not.toBeNull();
expect(template?.title).toEqual("Title template");
expect(template?.emoji).toEqual("🐹");
});
it("should correctly update title and emoji for a deleted document", async () => {
const document = await buildDocument({
title: "🚵🏼‍♂️ Title deleted",
});
await document.destroy();
expect(document.deletedAt).toBeTruthy();
expect(document.emoji).toBeNull();
await script();
const deleted = await Document.unscoped().findByPk(document.id, {
paranoid: false,
});
expect(deleted).not.toBeNull();
expect(deleted?.title).toEqual("Title deleted");
expect(deleted?.emoji).toEqual("🚵🏼‍♂️");
});
it("should correctly update title emoji when there are leading spaces", async () => {
const document = await buildDocument({
title: " 🤨 Title with spaces",
});
expect(document.emoji).toBeNull();
await script();
const doc = await Document.unscoped().findByPk(document.id);
expect(doc).not.toBeNull();
expect(doc?.title).toEqual("Title with spaces");
expect(doc?.emoji).toEqual("🤨");
});
it("should correctly paginate and update title emojis", async () => {
const buildManyDocuments = [];
for (let i = 1; i <= 10; i++) {
buildManyDocuments.push(buildDocument({ title: "🚵🏼‍♂️ Title" }));
}
const manyDocuments = await Promise.all(buildManyDocuments);
for (const document of manyDocuments) {
expect(document.title).toEqual("🚵🏼‍♂️ Title");
expect(document.emoji).toBeNull();
}
await script(false, 2);
const documents = await Document.unscoped().findAll();
for (const document of documents) {
expect(document.title).toEqual("Title");
expect(document.emoji).toEqual("🚵🏼‍♂️");
}
});
});