-
Notifications
You must be signed in to change notification settings - Fork 56
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Guillaume
committed
Dec 4, 2024
1 parent
48c39fd
commit 1697124
Showing
2 changed files
with
183 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); |
142 changes: 142 additions & 0 deletions
142
api/tests/profile/integration/scripts/sixth-grade-attestation-reward_test.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 () {}); | ||
}); | ||
}); |