Skip to content

Commit

Permalink
🚚 Séparer les steps de raccordement en plusieurs fichiers (#2643)
Browse files Browse the repository at this point in the history
  • Loading branch information
benjlevesque authored Jan 23, 2025
1 parent 092dc0d commit 86afb18
Show file tree
Hide file tree
Showing 16 changed files with 724 additions and 690 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { ModifierDemandeComplèteRaccordementFixture } from './fixtures/modifierDemandeComplèteDeRaccordement.fixture';
import { TransmettreDemandeComplèteRaccordementFixture } from './fixtures/transmettreDemandeComplèteDeRaccordement.fixture';

export class DemandeComplèteRaccordementWorld {
readonly transmettreFixture = new TransmettreDemandeComplèteRaccordementFixture();
readonly modifierFixture = new ModifierDemandeComplèteRaccordementFixture();

mapToExpected(nouvelleRéférenceDossier: string | undefined) {
return (
this.modifierFixture.mapToExpected(nouvelleRéférenceDossier) ??
this.transmettreFixture.mapToExpected(nouvelleRéférenceDossier)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,24 +9,24 @@ Fonctionnalité: Modifier le gestionnaire de réseau d'un raccordement
Et le porteur "Marcel Patoulatchi" ayant accés au projet lauréat "Du boulodrome de Marseille"

Scénario: Un porteur de projet modifie le gestionnaire de réseau d'un raccordement
Quand un porteur modifie le gestionnaire de réseau du projet avec le gestionnaire "Arc Energies Maurienne"
Quand le porteur modifie le gestionnaire de réseau du projet avec le gestionnaire "Arc Energies Maurienne"
Alors le projet devrait avoir un raccordement attribué au gestionnaire de réseau "Arc Energies Maurienne"

Scénario: Un porteur de projet modifie le gestionnaire de réseau d'un raccordement avec dossier
Etant donné une demande complète de raccordement pour le projet lauréat
Quand un porteur modifie le gestionnaire de réseau du projet avec le gestionnaire "Arc Energies Maurienne"
Quand le porteur modifie le gestionnaire de réseau du projet avec le gestionnaire "Arc Energies Maurienne"
Alors le projet devrait avoir un raccordement attribué au gestionnaire de réseau "Arc Energies Maurienne"

Scénario: Un porteur de projet modifie le gestionnaire de réseau d'un raccordement avec plusieurs dossiers
Etant donné une demande complète de raccordement pour le projet lauréat avec :
| La référence du dossier de raccordement | OUE-RP-2022-000033 |
Et une demande complète de raccordement pour le projet lauréat avec :
| La référence du dossier de raccordement | OUE-RP-2022-000034 |
Quand un porteur modifie le gestionnaire de réseau du projet avec le gestionnaire "Arc Energies Maurienne"
Quand le porteur modifie le gestionnaire de réseau du projet avec le gestionnaire "Arc Energies Maurienne"
Alors le projet devrait avoir un raccordement attribué au gestionnaire de réseau "Arc Energies Maurienne"

Scénario: Un porteur de projet modifie le gestionnaire de réseau d'un raccordement avec un gestionnaire non référencé
Quand un porteur modifie le gestionnaire de réseau du projet avec un gestionnaire non référencé
Quand le porteur modifie le gestionnaire de réseau du projet avec un gestionnaire non référencé
Alors le porteur devrait être informé que "Le gestionnaire de réseau n'est pas référencé"

Scénario: Le système modifie le gestionnaire de réseau d'un raccordement avec un gestionnaire inconnu
Expand All @@ -37,7 +37,7 @@ Fonctionnalité: Modifier le gestionnaire de réseau d'un raccordement
Scénario: Un porteur de projet peut transmettre une demande complète de raccordemnent pour son nouveau gestionnaire de projet
Etant donné une demande complète de raccordement pour le projet lauréat avec :
| La référence du dossier de raccordement | OUE-RP-2022-000033 |
Quand un porteur modifie le gestionnaire de réseau du projet avec le gestionnaire "Arc Energies Maurienne"
Quand le porteur modifie le gestionnaire de réseau du projet avec le gestionnaire "Arc Energies Maurienne"
Et le porteur transmet une demande complète de raccordement pour le projet lauréat avec :
| La référence du dossier de raccordement | OUE-RP-2022-000034 |
Alors le projet lauréat devrait avoir 2 dossiers de raccordement
Expand All @@ -46,7 +46,7 @@ Fonctionnalité: Modifier le gestionnaire de réseau d'un raccordement
Scénario: Impossible pour un porteur de projet de modifier le gestionnaire de réseau d'un raccordement avec mise en service
Etant donné une demande complète de raccordement pour le projet lauréat
Et une date de mise en service pour le dossier de raccordement du projet lauréat
Quand un porteur modifie le gestionnaire de réseau du projet avec le gestionnaire "Arc Energies Maurienne"
Quand le porteur modifie le gestionnaire de réseau du projet avec le gestionnaire "Arc Energies Maurienne"
Alors le porteur devrait être informé que "Le gestionnaire de réseau ne peut être modifié car le raccordement a une date de mise en service"

Scénario: Impossible pour une dreal de modifier le gestionnaire de réseau d'un raccordement avec mise en service
Expand All @@ -62,5 +62,5 @@ Fonctionnalité: Modifier le gestionnaire de réseau d'un raccordement

Scénario: Une tâche est achevée lorsqu'un raccordement est modifié avec un gestionnaire réseau valide
Etant donné une tâche indiquant de "mettre à jour le gestionnaire de réseau" pour le projet lauréat avec gestionnaire inconnu
Quand un porteur modifie le gestionnaire de réseau du projet avec le gestionnaire "Enedis"
Quand le porteur modifie le gestionnaire de réseau du projet avec le gestionnaire "Enedis"
Alors une tâche indiquant de "mettre à jour le gestionnaire de réseau" n'est plus consultable dans la liste des tâches du porteur pour le projet
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { ModifierPropositionTechniqueEtFinancièreFixture } from './fixtures/modifierPropositionTechniqueEtFinancière.fixture';
import { TransmettrePropositionTechniqueEtFinancièreFixture } from './fixtures/transmettrePropositionTechniqueEtFinancière.fixture';

export class PropositionTechniqueEtFinancièreWorld {
readonly transmettreFixture = new TransmettrePropositionTechniqueEtFinancièreFixture();
readonly modifierFixture = new ModifierPropositionTechniqueEtFinancièreFixture();

mapToExpected(nouvelleRéférenceDossier: string | undefined) {
return (
this.modifierFixture.mapToExpected(nouvelleRéférenceDossier) ??
this.transmettreFixture.mapToExpected(nouvelleRéférenceDossier)
);
}
}
41 changes: 10 additions & 31 deletions packages/specifications/src/raccordement/raccordement.world.ts
Original file line number Diff line number Diff line change
@@ -1,33 +1,23 @@
import { IdentifiantProjet } from '@potentiel-domain/common';
import { GestionnaireRéseau, Raccordement } from '@potentiel-domain/reseau';

import { TransmettreDemandeComplèteRaccordementFixture } from './fixtures/transmettreDemandeComplèteDeRaccordement.fixture';
import { TransmettrePropositionTechniqueEtFinancièreFixture } from './fixtures/transmettrePropositionTechniqueEtFinancière.fixture';
import { ModifierDemandeComplèteRaccordementFixture } from './fixtures/modifierDemandeComplèteDeRaccordement.fixture';
import { TransmettreDateMiseEnServiceFixture } from './fixtures/transmettreDateDeMiseEnService.fixture';
import { ModifierPropositionTechniqueEtFinancièreFixture } from './fixtures/modifierPropositionTechniqueEtFinancière.fixture';
import { ModifierRéférenceDossierRaccordementFixture } from './fixtures/modifierRéférenceDossierRaccordement.fixture';
import { DemandeComplèteRaccordementWorld } from './demandeComplèteRaccordement.world';
import { PropositionTechniqueEtFinancièreWorld } from './propositionTechniqueEtFinancière.world';

export class RaccordementWorld {
readonly transmettreDemandeComplèteRaccordementFixture =
new TransmettreDemandeComplèteRaccordementFixture();
readonly modifierDemandeComplèteRaccordementFixture =
new ModifierDemandeComplèteRaccordementFixture();

readonly modifierRéférenceDossierRaccordementFixture =
new ModifierRéférenceDossierRaccordementFixture();

readonly transmettrePropositionTechniqueEtFinancièreFixture =
new TransmettrePropositionTechniqueEtFinancièreFixture();
readonly modifierPropositionTechniqueEtFinancièreFixture =
new ModifierPropositionTechniqueEtFinancièreFixture();

readonly demandeComplèteDeRaccordement = new DemandeComplèteRaccordementWorld();
readonly propositionTechniqueEtFinancière = new PropositionTechniqueEtFinancièreWorld();
readonly transmettreDateMiseEnServiceFixture = new TransmettreDateMiseEnServiceFixture();

get référenceDossier() {
return this.modifierRéférenceDossierRaccordementFixture.aÉtéCréé
? this.modifierRéférenceDossierRaccordementFixture.nouvelleRéférenceDossier
: this.transmettreDemandeComplèteRaccordementFixture.référenceDossier;
: this.demandeComplèteDeRaccordement.transmettreFixture.référenceDossier;
}

#identifiantGestionnaireRéseau!: string;
Expand All @@ -42,27 +32,16 @@ export class RaccordementWorld {
const nouvelleRéférenceDossier = this.modifierRéférenceDossierRaccordementFixture.aÉtéCréé
? this.modifierRéférenceDossierRaccordementFixture.nouvelleRéférenceDossier
: undefined;
const propositionTechniqueEtFinancière =
this.modifierPropositionTechniqueEtFinancièreFixture.mapToExpected(
nouvelleRéférenceDossier,
) ??
this.transmettrePropositionTechniqueEtFinancièreFixture.mapToExpected(
nouvelleRéférenceDossier,
);

const dossier = {
demandeComplèteRaccordement: {
...(this.modifierDemandeComplèteRaccordementFixture.mapToExpected(
nouvelleRéférenceDossier,
) ??
this.transmettreDemandeComplèteRaccordementFixture?.mapToExpected(
nouvelleRéférenceDossier,
)),
},
demandeComplèteRaccordement:
this.demandeComplèteDeRaccordement.mapToExpected(nouvelleRéférenceDossier),
référence: Raccordement.RéférenceDossierRaccordement.convertirEnValueType(
this.référenceDossier,
),
miseEnService: this.transmettreDateMiseEnServiceFixture.mapToExpected(),
propositionTechniqueEtFinancière,
propositionTechniqueEtFinancière:
this.propositionTechniqueEtFinancière.mapToExpected(nouvelleRéférenceDossier),
};
const identifiantGestionnaireRéseau =
GestionnaireRéseau.IdentifiantGestionnaireRéseau.convertirEnValueType(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { Given as EtantDonné } from '@cucumber/cucumber';
import { mediator } from 'mediateur';

import { DateTime } from '@potentiel-domain/common';
import { Raccordement } from '@potentiel-domain/reseau';

import { PotentielWorld } from '../../potentiel.world';

EtantDonné(
'une date de mise en service pour le dossier de raccordement du projet lauréat',
async function (this: PotentielWorld) {
const { identifiantProjet } = this.lauréatWorld;
const { référenceDossier } = this.raccordementWorld;
const { dateMiseEnService } = this.raccordementWorld.transmettreDateMiseEnServiceFixture.créer({
identifiantProjet: identifiantProjet.formatter(),
référenceDossier,
});

try {
await mediator.send<Raccordement.RaccordementUseCase>({
type: 'Réseau.Raccordement.UseCase.TransmettreDateMiseEnService',
data: {
identifiantProjetValue: identifiantProjet.formatter(),
référenceDossierValue: référenceDossier,
dateMiseEnServiceValue: dateMiseEnService,
transmiseLeValue: DateTime.now().formatter(),
transmiseParValue: this.utilisateurWorld.adminFixture.email,
},
});
} catch (e) {
this.error = e as Error;
}
},
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { Then as Alors } from '@cucumber/cucumber';
import { mediator } from 'mediateur';
import waitForExpect from 'wait-for-expect';

import { Raccordement } from '@potentiel-domain/reseau';

import { PotentielWorld } from '../../potentiel.world';

import { vérifierDossierRaccordement } from './raccordement.then';

Alors(
`la date de mise en service devrait être consultable dans le dossier de raccordement du projet lauréat`,
async function (this: PotentielWorld) {
const { identifiantProjet } = this.lauréatWorld;
const { référenceDossier } = this.raccordementWorld;
await waitForExpect(async () => {
const dossierRaccordement =
await mediator.send<Raccordement.ConsulterDossierRaccordementQuery>({
type: 'Réseau.Raccordement.Query.ConsulterDossierRaccordement',
data: {
référenceDossierRaccordementValue: référenceDossier,
identifiantProjetValue: identifiantProjet.formatter(),
},
});

vérifierDossierRaccordement.call(this, identifiantProjet, dossierRaccordement);
});
},
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import { DataTable, When as Quand } from '@cucumber/cucumber';
import { mediator } from 'mediateur';

import { Raccordement } from '@potentiel-domain/reseau';
import { DateTime, IdentifiantProjet } from '@potentiel-domain/common';

import { PotentielWorld } from '../../potentiel.world';

Quand(
`le gestionnaire de réseau transmet la date de mise en service pour le dossier de raccordement du projet lauréat avec :`,
async function (this: PotentielWorld, datatable: DataTable) {
const { identifiantProjet } = this.lauréatWorld;
const { référenceDossier } = this.raccordementWorld;

await transmettreDateMiseEnService.call(
this,
identifiantProjet,
référenceDossier,
datatable.rowsHash(),
);
},
);

Quand(
`le gestionnaire de réseau transmet la date de mise en service pour le dossier de raccordement du projet lauréat`,
async function (this: PotentielWorld) {
const { identifiantProjet } = this.lauréatWorld;
const { référenceDossier } = this.raccordementWorld;

await transmettreDateMiseEnService.call(this, identifiantProjet, référenceDossier);
},
);

async function transmettreDateMiseEnService(
this: PotentielWorld,
identifiantProjet: IdentifiantProjet.ValueType,
référence: string,
data: Record<string, string> = {},
) {
const { dateMiseEnService, référenceDossier } =
this.raccordementWorld.transmettreDateMiseEnServiceFixture.créer({
identifiantProjet: identifiantProjet.formatter(),
référenceDossier: référence,
...this.raccordementWorld.transmettreDateMiseEnServiceFixture.mapExempleToFixtureValues(data),
});
try {
await mediator.send<Raccordement.RaccordementUseCase>({
type: 'Réseau.Raccordement.UseCase.TransmettreDateMiseEnService',
data: {
identifiantProjetValue: identifiantProjet.formatter(),
référenceDossierValue: référenceDossier,
dateMiseEnServiceValue: dateMiseEnService,
transmiseLeValue: DateTime.now().formatter(),
transmiseParValue: this.utilisateurWorld.grdFixture.email,
},
});
} catch (e) {
this.error = e as Error;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { DataTable, Given as EtantDonné } from '@cucumber/cucumber';

import { PotentielWorld } from '../../potentiel.world';

import { transmettreDemandeComplèteRaccordement } from './demandeComplèteRaccordement.when';

EtantDonné(
'une demande complète de raccordement pour le projet lauréat',
async function (this: PotentielWorld) {
await transmettreDemandeComplèteRaccordement.call(this, this.lauréatWorld.identifiantProjet);
},
);

EtantDonné(
'une demande complète de raccordement pour le projet lauréat avec :',
async function (this: PotentielWorld, datatable: DataTable) {
await transmettreDemandeComplèteRaccordement.call(
this,
this.lauréatWorld.identifiantProjet,
datatable.rowsHash(),
);
},
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import { Then as Alors } from '@cucumber/cucumber';
import { mediator } from 'mediateur';
import waitForExpect from 'wait-for-expect';
import { assert } from 'chai';

import { Raccordement } from '@potentiel-domain/reseau';
import { Option } from '@potentiel-libraries/monads';
import { ConsulterDocumentProjetQuery } from '@potentiel-domain/document';
import { IdentifiantProjet } from '@potentiel-domain/common';
import { mapToPlainObject } from '@potentiel-domain/core';

import { PotentielWorld } from '../../potentiel.world';
import { convertReadableStreamToString } from '../../helpers/convertReadableToString';

import { vérifierDossierRaccordement } from './raccordement.then';

Alors(
`la demande complète de raccordement devrait être consultable dans le dossier de raccordement du projet lauréat`,
async function (this: PotentielWorld) {
const { identifiantProjet } = this.lauréatWorld;
const { référenceDossier } = this.raccordementWorld;
await waitForExpect(async () => {
const raccordement = await mediator.send<Raccordement.ConsulterRaccordementQuery>({
type: 'Réseau.Raccordement.Query.ConsulterRaccordement',
data: {
identifiantProjetValue: identifiantProjet.formatter(),
},
});

const dossierRaccordement =
await mediator.send<Raccordement.ConsulterDossierRaccordementQuery>({
type: 'Réseau.Raccordement.Query.ConsulterDossierRaccordement',
data: {
identifiantProjetValue: identifiantProjet.formatter(),
référenceDossierRaccordementValue: référenceDossier,
},
});

vérifierRaccordement.call(this, identifiantProjet, raccordement);
vérifierDossierRaccordement.call(this, identifiantProjet, dossierRaccordement);

assert(Option.isSome(dossierRaccordement), 'dossierRaccordement is undefined');
assert(
dossierRaccordement.demandeComplèteRaccordement,
'demandeComplèteRaccordement is undefined',
);
const actualAccuséRéception = dossierRaccordement.demandeComplèteRaccordement.accuséRéception;
const { accuséRéception: expectedAccuséRéception } = this.raccordementWorld
.demandeComplèteDeRaccordement.modifierFixture.aÉtéCréé
? this.raccordementWorld.demandeComplèteDeRaccordement.modifierFixture
: this.raccordementWorld.demandeComplèteDeRaccordement.transmettreFixture;

assert(actualAccuséRéception, 'actualAccuséRéception is not defined');
const result = await mediator.send<ConsulterDocumentProjetQuery>({
type: 'Document.Query.ConsulterDocumentProjet',
data: {
documentKey: actualAccuséRéception.formatter(),
},
});

const actualContent = await convertReadableStreamToString(result.content);
const expectedContent = await convertReadableStreamToString(expectedAccuséRéception.content);
actualContent.should.be.equal(expectedContent);
});
},
);

function vérifierRaccordement(
this: PotentielWorld,
identifiantProjet: IdentifiantProjet.ValueType,
raccordement: Option.Type<Raccordement.ConsulterRaccordementReadModel>,
) {
const { raccordement: expectedRaccordement } = mapToPlainObject(
this.raccordementWorld.mapToExpected(identifiantProjet),
);
const actualRaccordement = mapToPlainObject(raccordement);

// HACK : misÀJourLe vaut la date de l'event (created_at),
// on ne peut pas calculer cette date de manière exacte dans les tests
if (Option.isSome(actualRaccordement)) {
for (const doss of actualRaccordement.dossiers) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
delete (doss as any).misÀJourLe;
}
}

actualRaccordement.should.be.deep.equal(
expectedRaccordement,
`le raccordement n'est pas identique`,
);
}
Loading

0 comments on commit 86afb18

Please sign in to comment.