Skip to content

Commit

Permalink
test(ab): initialize seeding data (#15)
Browse files Browse the repository at this point in the history
  • Loading branch information
mfrachet committed Jun 30, 2022
1 parent 6c3611d commit a4e71f9
Show file tree
Hide file tree
Showing 7 changed files with 197 additions and 8 deletions.
1 change: 0 additions & 1 deletion packages/backend/prisma/ab.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ model Experiment {
createdAt DateTime @default(now())
ExperimentEnvironment ExperimentEnvironment[]
varations Variation[]
variationUuid String
}

model Variation {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
Warnings:
- You are about to drop the column `variationUuid` on the `Experiment` table. All the data in the column will be lost.
*/
-- AlterTable
ALTER TABLE "Experiment" DROP COLUMN "variationUuid";
35 changes: 35 additions & 0 deletions packages/backend/src/environments/environments.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,41 @@ export class EnvironmentsService {
});
}

// Remove A/B tests
const experimentsEnv = await this.prisma.experimentEnvironment.findMany({
where: {
environmentId: envId,
},
});

for (const experimentEnv of experimentsEnv) {
const variations = await this.prisma.variation.findMany({
where: {
experimentUuid: experimentEnv.experimentId,
},
});

for (const variation of variations) {
await this.prisma.variationHit.deleteMany({
where: {
variationUuid: variation.uuid,
},
});
}

await this.prisma.variation.deleteMany({
where: {
experimentUuid: experimentEnv.experimentId,
},
});
}

await this.prisma.experimentEnvironment.deleteMany({
where: {
environmentId: envId,
},
});

return this.prisma.environment.delete({
where: {
uuid: envId,
Expand Down
30 changes: 30 additions & 0 deletions packages/backend/src/projects/projects.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ export class ProjectsService {
environments: {
include: {
flagEnvironment: true,
ExperimentEnvironment: true,
},
},
},
Expand All @@ -161,6 +162,35 @@ export class ProjectsService {
});
}

// Remove A/B tests
for (const experimentEnv of env.ExperimentEnvironment) {
const variations = await this.prisma.variation.findMany({
where: {
experimentUuid: experimentEnv.experimentId,
},
});

for (const variation of variations) {
await this.prisma.variationHit.deleteMany({
where: {
variationUuid: variation.uuid,
},
});
}

await this.prisma.variation.deleteMany({
where: {
experimentUuid: experimentEnv.experimentId,
},
});
}

await this.prisma.experimentEnvironment.deleteMany({
where: {
environmentId: env.uuid,
},
});

// remove all the flagEnv from the given project
await this.prisma.flagEnvironment.deleteMany({
where: {
Expand Down
32 changes: 26 additions & 6 deletions packages/backend/test/helpers/seed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ import { PrismaClient } from '@prisma/client';
import { UserRoles } from '../../src/users/roles';
import { seedPasswordReset, seedUsers } from './seeds/users';
import { seedProjects } from './seeds/projects';
import { seedFlags, seedHits } from './seeds/flags';
import { seedFlags, seedFlagHits } from './seeds/flags';
import { seedAbExperiments } from './seeds/ab';

const prismaClient = new PrismaClient();

Expand All @@ -15,7 +16,7 @@ export const seedDb = async () => {
const [projectFromSeeding, otherFromSeeding] = await seedProjects(
prismaClient,
);
const [homePageFlag, footerFlag, asideFlag] = await seedFlags(prismaClient);

await seedPasswordReset(prismaClient, john); // Necessary to e2e test password reset

// Contextual seeding
Expand Down Expand Up @@ -62,6 +63,9 @@ export const seedDb = async () => {
},
});

// Flag setup
const [homePageFlag, footerFlag, asideFlag] = await seedFlags(prismaClient);

const flagEnv = await prismaClient.flagEnvironment.create({
data: {
environmentId: production.uuid,
Expand Down Expand Up @@ -120,10 +124,22 @@ export const seedDb = async () => {
},
});

await seedHits(prismaClient, flagEnv, new Date(1992, 0, 1, 1), 10);
await seedHits(prismaClient, flagEnv, new Date(1992, 0, 3, 1), 20);
await seedHits(prismaClient, flagEnv, new Date(1992, 0, 2, 1), 40);
await seedHits(prismaClient, flagEnv, new Date(1992, 0, 6, 1), 10);
await seedFlagHits(prismaClient, flagEnv, new Date(1992, 0, 1, 1), 10);
await seedFlagHits(prismaClient, flagEnv, new Date(1992, 0, 3, 1), 20);
await seedFlagHits(prismaClient, flagEnv, new Date(1992, 0, 2, 1), 40);
await seedFlagHits(prismaClient, flagEnv, new Date(1992, 0, 6, 1), 10);
// End of Flag setup

// Ab experiments setup
const [homePageExperiment] = await seedAbExperiments(prismaClient);
await prismaClient.experimentEnvironment.create({
data: {
environmentId: production.uuid,
experimentId: homePageExperiment.uuid,
},
});

// End of Ab experiments setup
} catch (e) {
console.error(e);
}
Expand All @@ -138,6 +154,10 @@ export const cleanupDb = async () => {
await prismaClient.flagHit.deleteMany();
await prismaClient.flagEnvironment.deleteMany();
await prismaClient.flag.deleteMany();
await prismaClient.variationHit.deleteMany();
await prismaClient.variation.deleteMany();
await prismaClient.experimentEnvironment.deleteMany();
await prismaClient.experiment.deleteMany();
await prismaClient.environment.deleteMany();
await prismaClient.passwordResetTokens.deleteMany();
await prismaClient.userProject.deleteMany();
Expand Down
97 changes: 97 additions & 0 deletions packages/backend/test/helpers/seeds/ab.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
import { PrismaClient, Variation } from '@prisma/client';

export const seedAbExperiments = async (prismaClient: PrismaClient) => {
const homeExperiment = await prismaClient.experiment.create({
data: {
uuid: '1',
name: 'New homepage experiment',
description: 'Switch the new homepage design (experiment)',
key: 'newHomepageExperiment',
},
});

const controlVariation = await prismaClient.variation.create({
data: {
uuid: '1',
name: 'Control variation for home',
description: 'Controls the homepage variation',
key: 'control',
experimentUuid: homeExperiment.uuid,
},
});

const alternativeHomepage = await prismaClient.variation.create({
data: {
uuid: '2',
name: 'Alternative homepage',
description: 'Alternative homepage',
key: 'alternative',
experimentUuid: homeExperiment.uuid,
},
});

await seedVariationHits(
prismaClient,
controlVariation,
alternativeHomepage,
new Date(1992, 0, 1, 1),
10,
);

await seedVariationHits(
prismaClient,
controlVariation,
alternativeHomepage,
new Date(1992, 0, 3, 1),
20,
);

await seedVariationHits(
prismaClient,
controlVariation,
alternativeHomepage,
new Date(1992, 0, 2, 1),
40,
);

await seedVariationHits(
prismaClient,
controlVariation,
alternativeHomepage,
new Date(1992, 0, 6, 1),
10,
);

return [homeExperiment] as const;
};

const seedVariationHits = async (
prismaClient: PrismaClient,
control: Variation,
variation: Variation,
date: Date,
count = 10,
) => {
date.setHours(2);
date.setMinutes(2);
date.setSeconds(2);
date.setMilliseconds(2);

for (let i = 0; i < count; i++) {
await prismaClient.variationHit.create({
data: {
variationUuid: variation.uuid,
date,
},
});

if (i < count / 2) {
await prismaClient.variationHit.create({
data: {
variationUuid: control.uuid,
date,
},
});
}
}
};
2 changes: 1 addition & 1 deletion packages/backend/test/helpers/seeds/flags.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ export const seedFlags = async (prismaClient: PrismaClient) => {
return [homePageFlag, footerFlag, asideFlag] as const;
};

export const seedHits = async (
export const seedFlagHits = async (
prismaClient: PrismaClient,
flagEnv: any,
date: Date,
Expand Down

0 comments on commit a4e71f9

Please sign in to comment.