Skip to content

Commit

Permalink
feat(api): add business rules to can-self-delete-account usecase
Browse files Browse the repository at this point in the history
  • Loading branch information
bpetetot authored Nov 29, 2024
1 parent b4ca8f3 commit 6661601
Show file tree
Hide file tree
Showing 3 changed files with 153 additions and 19 deletions.
25 changes: 22 additions & 3 deletions api/src/privacy/domain/usecases/can-self-delete-account.usecase.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,33 @@ import { config } from '../../../shared/config.js';
*
* @param {Object} params - The parameters for the use case.
* @param {number} params.userId - The ID of the user.
* @param {Object} [params.featureToggles] - The feature toggles configuration.
* @param {Object} params.featureToggles - The feature toggles configuration.
* @param {Object} params.candidatesApiRepository - The repository for candidate-related operations.
* @param {Object} params.learnersApiRepository - The repository for learner-related operations.
* @param {Object} params.userTeamsApiRepository - The repository for user team access operations.
* @returns {Promise<boolean>} - A promise that resolves to a boolean indicating if self-account deletion is enabled.
*/
const canSelfDeleteAccount = async ({ featureToggles = config.featureToggles }) => {
const canSelfDeleteAccount = async ({
userId,
featureToggles = config.featureToggles,
candidatesApiRepository,
learnersApiRepository,
userTeamsApiRepository,
}) => {
const { isSelfAccountDeletionEnabled } = featureToggles;

if (!isSelfAccountDeletionEnabled) return false;

const hasBeenLearner = await learnersApiRepository.hasBeenLearner({ userId });
if (hasBeenLearner) return false;

const hasBeenCandidate = await candidatesApiRepository.hasBeenCandidate({ userId });
if (hasBeenCandidate) return false;

const userTeamsInfo = await userTeamsApiRepository.getUserTeamsInfo({ userId });
if (userTeamsInfo.isPixAgent) return false;
if (userTeamsInfo.isOrganizationMember) return false;
if (userTeamsInfo.isCertificationCenterMember) return false;

return true;
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,7 @@ import { usecases } from '../../../../../src/privacy/domain/usecases/index.js';
import { databaseBuilder, expect } from '../../../../test-helper.js';

describe('Integration | Privacy | Domain | UseCase | can-self-delete-account', function () {
context('Feature flag is disabled', function () {
it('returns false', async function () {
// given
const featureToggles = { isSelfAccountDeletionEnabled: false };
const user = databaseBuilder.factory.buildUser();
await databaseBuilder.commit();

// when
const result = await usecases.canSelfDeleteAccount({ userId: user.id, featureToggles });

// then
expect(result).to.be.false;
});
});

context('Feature flag is enabled', function () {
context('When user is eligible', function () {
it('returns true', async function () {
// given
const featureToggles = { isSelfAccountDeletionEnabled: true };
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
import { usecases } from '../../../../../src/privacy/domain/usecases/index.js';
import { expect, sinon } from '../../../../test-helper.js';

describe('Unit | Privacy | Domain | UseCase | can-self-delete-account', function () {
const userId = '123';
let dependencies;

beforeEach(function () {
dependencies = {
featureToggles: { isSelfAccountDeletionEnabled: false },
learnersApiRepository: { hasBeenLearner: sinon.stub().resolves(false) },
candidatesApiRepository: { hasBeenCandidate: sinon.stub().resolves(false) },
userTeamsApiRepository: {
getUserTeamsInfo: sinon.stub().resolves({
isPixAgent: false,
isOrganizationMember: false,
isCertificationCenterMember: false,
}),
},
};
});

context('When feature flag is enabled', function () {
beforeEach(function () {
sinon.stub(dependencies.featureToggles, 'isSelfAccountDeletionEnabled').value(true);
});

context('When user is eligible', function () {
it('returns true', async function () {
// when
const result = await usecases.canSelfDeleteAccount({ userId, ...dependencies });

// then
expect(result).to.be.true;
});
});

context('When user has been a learner', function () {
it('returns false', async function () {
// given
dependencies.learnersApiRepository.hasBeenLearner.withArgs({ userId }).resolves(true);

// when
const result = await usecases.canSelfDeleteAccount({ userId, ...dependencies });

// then
expect(result).to.be.false;
});
});

context('User has been a candidate to certification', function () {
it('returns false', async function () {
// given
dependencies.candidatesApiRepository.hasBeenCandidate.withArgs({ userId }).resolves(true);

// when
const result = await usecases.canSelfDeleteAccount({ userId, ...dependencies });

// then
expect(result).to.be.false;
});
});

context('User if user is a Pix agent', function () {
it('returns false', async function () {
// given
dependencies.userTeamsApiRepository.getUserTeamsInfo.withArgs({ userId }).resolves({
isPixAgent: true,
isOrganizationMember: false,
isCertificationCenterMember: false,
});

// when
const result = await usecases.canSelfDeleteAccount({ userId, ...dependencies });

// then
expect(result).to.be.false;
});
});

context('User if user is member of an organization', function () {
it('returns false', async function () {
// given
dependencies.userTeamsApiRepository.getUserTeamsInfo.withArgs({ userId }).resolves({
isPixAgent: false,
isOrganizationMember: true,
isCertificationCenterMember: false,
});

// when
const result = await usecases.canSelfDeleteAccount({ userId, ...dependencies });

// then
expect(result).to.be.false;
});
});

context('User if user is member of a certification center', function () {
it('returns false', async function () {
// given
dependencies.userTeamsApiRepository.getUserTeamsInfo.withArgs({ userId }).resolves({
isPixAgent: false,
isOrganizationMember: false,
isCertificationCenterMember: true,
});

// when
const result = await usecases.canSelfDeleteAccount({ userId, ...dependencies });

// then
expect(result).to.be.false;
});
});
});

context('Feature flag is disabled', function () {
context('When user is eligible', function () {
it('returns false', async function () {
// given
sinon.stub(dependencies.featureToggles, 'isSelfAccountDeletionEnabled').value(false);

// when
const result = await usecases.canSelfDeleteAccount({ userId: '123', ...dependencies });

// then
expect(result).to.be.false;
});
});
});
});

0 comments on commit 6661601

Please sign in to comment.