Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
Guillaume committed Dec 4, 2024
1 parent 48c39fd commit 1697124
Show file tree
Hide file tree
Showing 2 changed files with 183 additions and 0 deletions.
41 changes: 41 additions & 0 deletions api/src/profile/scripts/sixth-grade-attestation-reward.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { CampaignParticipationStatuses } from '../../prescription/shared/domain/constants.js';
import { Script } from '../../shared/application/scripts/script.js';
import { ScriptRunner } from '../../shared/application/scripts/script-runner.js';
import { DomainTransaction } from '../../shared/domain/DomainTransaction.js';

export const PRODUCTION_SIXTH_GRADE_TARGET_PROFILE_IDS = [107068, 107074, 107078];

const firstDateLimitDefault = new Date('2024-12-01T00:00:00Z');
const secondDateLimitDefault = new Date('2024-12-03T23:59:59Z');

export const fetchUserIds = async () => {
const knexConnection = DomainTransaction.getConnection();
const users = await knexConnection('campaign-participations')
.select('campaign-participations.userId')
.distinct()
.join('campaigns', 'campaign-participations.campaignId', 'campaigns.id')
.whereIn('campaigns.targetProfileId', PRODUCTION_SIXTH_GRADE_TARGET_PROFILE_IDS)
.andWhere('campaign-participations.createdAt', '>', firstDateLimitDefault)
.andWhere('campaign-participations.createdAt', '<', secondDateLimitDefault)
.andWhere('campaign-participations.status', '<>', CampaignParticipationStatuses.STARTED);
return users.map(({ userId }) => userId);
};

export class SixthGradeAttestationRewardScript extends Script {
constructor() {
super({
description: 'This is the complete description of my awesome script',
permanent: true,
options: {
firstDateLimitDefault,
secondDateLimitDefault,
},
});
}
async handle({ options, logger }) {
const users = await fetchUserIds(options);
logger.info(users.length);
}
}

await ScriptRunner.execute(import.meta.url, SixthGradeAttestationRewardScript);
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
import { CampaignParticipationStatuses } from '../../../../src/prescription/shared/domain/constants.js';
import {
fetchUserIds,
PRODUCTION_SIXTH_GRADE_TARGET_PROFILE_IDS,
} from '../../../../src/profile/scripts/sixth-grade-attestation-reward.js';
import { databaseBuilder, expect } from '../../../test-helper.js';

describe('Integration | Profile | Scripts | sixth-grade-attestation-reward', function () {
describe('#fetchUsers', function () {
it('should not return the user if the participation date is not included between the start date and the end date ', async function () {
const { id: targetProfileId } = databaseBuilder.factory.buildTargetProfile({
id: PRODUCTION_SIXTH_GRADE_TARGET_PROFILE_IDS[0],
});
const campaign = databaseBuilder.factory.buildCampaign({ targetProfileId });
const { userId } = databaseBuilder.factory.buildCampaignParticipation({
campaignId: campaign.id,
status: CampaignParticipationStatuses.SHARED,
createdAt: '2024-12-02T15:07:57.376Z',
});
databaseBuilder.factory.buildCampaignParticipation({
campaignId: campaign.id,
status: CampaignParticipationStatuses.SHARED,
createdAt: '2024-12-07T15:07:57.376Z',
});
databaseBuilder.factory.buildCampaignParticipation({
campaignId: campaign.id,
status: CampaignParticipationStatuses.SHARED,
createdAt: '2024-11-22T15:07:57.376Z',
});

await databaseBuilder.commit();
const userIds = await fetchUserIds();
expect(userIds).to.have.lengthOf(1);
expect(userIds).to.contains(userId);
});

it('should not return the user if the participation status is different from started', async function () {
const { id: targetProfileId } = databaseBuilder.factory.buildTargetProfile({
id: PRODUCTION_SIXTH_GRADE_TARGET_PROFILE_IDS[0],
});
const campaign = databaseBuilder.factory.buildCampaign({ targetProfileId });
const { userId } = databaseBuilder.factory.buildCampaignParticipation({
campaignId: campaign.id,
status: CampaignParticipationStatuses.STARTED,
createdAt: '2024-12-02T15:07:57.376Z',
});
databaseBuilder.factory.buildCampaignParticipation({
campaignId: campaign.id,
status: CampaignParticipationStatuses.SHARED,
createdAt: '2024-12-02T15:07:57.376Z',
});
databaseBuilder.factory.buildCampaignParticipation({
campaignId: campaign.id,
status: CampaignParticipationStatuses.TO_SHARE,
createdAt: '2024-12-02T15:07:57.376Z',
});

await databaseBuilder.commit();
const userIds = await fetchUserIds();
expect(userIds).to.have.lengthOf(2);
expect(userIds).to.not.contains(userId);
});

it('should not return the user if the campaign target profile is not included in targeted target profiles', async function () {
const { id: targetProfileId1 } = databaseBuilder.factory.buildTargetProfile({
id: PRODUCTION_SIXTH_GRADE_TARGET_PROFILE_IDS[0],
});
const { id: targetProfileId2 } = databaseBuilder.factory.buildTargetProfile({
id: PRODUCTION_SIXTH_GRADE_TARGET_PROFILE_IDS[1],
});
const { id: targetProfileId3 } = databaseBuilder.factory.buildTargetProfile({
id: PRODUCTION_SIXTH_GRADE_TARGET_PROFILE_IDS[2],
});
const { id: targetProfileId4 } = databaseBuilder.factory.buildTargetProfile();
const campaign1 = databaseBuilder.factory.buildCampaign({ targetProfileId: targetProfileId1 });
const campaign2 = databaseBuilder.factory.buildCampaign({ targetProfileId: targetProfileId2 });
const campaign3 = databaseBuilder.factory.buildCampaign({ targetProfileId: targetProfileId3 });
const campaign4 = databaseBuilder.factory.buildCampaign({ targetProfileId: targetProfileId4 });
const otherParameters = { status: CampaignParticipationStatuses.SHARED, createdAt: '2024-12-02T15:07:57.376Z' };
databaseBuilder.factory.buildCampaignParticipation({
campaignId: campaign1.id,
...otherParameters,
});
databaseBuilder.factory.buildCampaignParticipation({
campaignId: campaign2.id,
...otherParameters,
});
databaseBuilder.factory.buildCampaignParticipation({
campaignId: campaign3.id,
...otherParameters,
});
const { userId: otherTargetProfileCampaignParticipationUserId } =
databaseBuilder.factory.buildCampaignParticipation({
campaignId: campaign4.id,
...otherParameters,
});

await databaseBuilder.commit();
const userIds = await fetchUserIds();
expect(userIds).to.have.lengthOf(3);
expect(userIds).to.not.contains(otherTargetProfileCampaignParticipationUserId);
});

it('should return expected users', async function () {
const { id: targetProfileId1 } = databaseBuilder.factory.buildTargetProfile({
id: PRODUCTION_SIXTH_GRADE_TARGET_PROFILE_IDS[0],
});
const { id: targetProfileId2 } = databaseBuilder.factory.buildTargetProfile({
id: PRODUCTION_SIXTH_GRADE_TARGET_PROFILE_IDS[1],
});
const { id: targetProfileId3 } = databaseBuilder.factory.buildTargetProfile({
id: PRODUCTION_SIXTH_GRADE_TARGET_PROFILE_IDS[2],
});
const campaign1 = databaseBuilder.factory.buildCampaign({ targetProfileId: targetProfileId1 });
const campaign2 = databaseBuilder.factory.buildCampaign({ targetProfileId: targetProfileId2 });
const campaign3 = databaseBuilder.factory.buildCampaign({ targetProfileId: targetProfileId3 });
databaseBuilder.factory.buildCampaignParticipation({
campaignId: campaign1.id,
status: CampaignParticipationStatuses.SHARED,
createdAt: '2024-12-01T00:00:01.000Z',
});
databaseBuilder.factory.buildCampaignParticipation({
campaignId: campaign2.id,
status: CampaignParticipationStatuses.TO_SHARE,
createdAt: '2024-12-02T15:00:00.000Z',
});
databaseBuilder.factory.buildCampaignParticipation({
campaignId: campaign3.id,
status: CampaignParticipationStatuses.TO_SHARE,
createdAt: '2024-12-03T23:59:58.000Z',
});

await databaseBuilder.commit();
const userIds = await fetchUserIds();
expect(userIds).to.have.lengthOf(3);
});
});

describe('#handle', function () {
it('should reward expected users', async function () {});
});
});

0 comments on commit 1697124

Please sign in to comment.