From bcc00b2dee6dcc95c209c6d22df2552d725c87dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikko=20Haapam=C3=A4ki?= Date: Wed, 6 Jul 2022 13:46:39 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20salli=20suunnitteluvaiheen=20julkaisu=20?= =?UTF-8?q?vasta=20kun=20aloituskuulutus=20on=20julkaistu.=20Mahdollista?= =?UTF-8?q?=20n=C3=A4ht=C3=A4vill=C3=A4olon=20tallennus=20siten,=20ett?= =?UTF-8?q?=C3=A4=20vain=20ne=20kent=C3=A4t=20tulee=20l=C3=A4hett=C3=A4?= =?UTF-8?q?=C3=A4=20joihin=20haluaa=20muutoksia.=20(#297)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/__snapshots__/api.test.ts.snap | 277 +++++++++++------- .../api/testUtil/nahtavillaolo.ts | 5 +- backend/src/error/IllegalArgumentError.ts | 10 + backend/src/handler/projektiAdapter.ts | 53 +++- .../src/handler/projektiAdapterJulkinen.ts | 15 +- backend/test/projekti/projektiAdapter.test.ts | 43 +++ 6 files changed, 274 insertions(+), 129 deletions(-) create mode 100644 backend/src/error/IllegalArgumentError.ts create mode 100644 backend/test/projekti/projektiAdapter.test.ts diff --git a/backend/integrationtest/api/__snapshots__/api.test.ts.snap b/backend/integrationtest/api/__snapshots__/api.test.ts.snap index 8892802fa..53c9e8815 100644 --- a/backend/integrationtest/api/__snapshots__/api.test.ts.snap +++ b/backend/integrationtest/api/__snapshots__/api.test.ts.snap @@ -2013,113 +2013,180 @@ exports[`Api should search, load and save a project 20`] = ` Object { "description": "testImportNahtavillaoloAineistot", "obj": Object { - "aineistoNahtavilla": Array [ - Object { - "__typename": "Aineisto", - "dokumenttiOid": "1.2.246.578.5.100.2281391320.546836829", - "jarjestys": 1, - "kategoriaId": "T2xx", - "nimi": "T222 Meluesteiden periaatekuvat.txt", - "tila": "ODOTTAA_TUONTIA", - }, - Object { - "__typename": "Aineisto", - "dokumenttiOid": "1.2.246.578.5.100.2400417287.1486592341", - "jarjestys": 2, - "kategoriaId": "T2xx", - "nimi": "T213 Teiden hallinnolsten järjestelyjen kartat.txt", - "tila": "ODOTTAA_TUONTIA", - }, - Object { - "__typename": "Aineisto", - "dokumenttiOid": "1.2.246.578.5.100.2661373170.3358971896", - "jarjestys": 3, - "kategoriaId": "T2xx", - "nimi": "T224 Siltataulukko.txt", - "tila": "ODOTTAA_TUONTIA", - }, - Object { - "__typename": "Aineisto", - "dokumenttiOid": "1.2.246.578.5.100.2717425363.3158441393", - "jarjestys": 4, - "kategoriaId": "T2xx", - "nimi": "T211 Piirustusmerkinnät.txt", - "tila": "ODOTTAA_TUONTIA", - }, - Object { - "__typename": "Aineisto", - "dokumenttiOid": "1.2.246.578.5.100.2723303646.77167902", - "jarjestys": 5, - "kategoriaId": "T2xx", - "nimi": "T212 Yleiskartta.txt", - "tila": "ODOTTAA_TUONTIA", - }, - Object { - "__typename": "Aineisto", - "dokumenttiOid": "1.2.246.578.5.100.2951684371.1595457721", - "jarjestys": 6, - "kategoriaId": "T2xx", - "nimi": "T214 Suunnitelmakartat.txt", - "tila": "ODOTTAA_TUONTIA", - }, - Object { - "__typename": "Aineisto", - "dokumenttiOid": "1.2.246.578.5.100.2984895343.2324123820", - "jarjestys": 7, - "kategoriaId": "T2xx", - "nimi": "T217 Yleiskartta yksityisteistä.txt", - "tila": "ODOTTAA_TUONTIA", - }, - Object { - "__typename": "Aineisto", - "dokumenttiOid": "1.2.246.578.5.100.2989898206.2419448230", - "jarjestys": 8, - "kategoriaId": "T2xx", - "nimi": "T221 Siltojen ja tukimuurien ympäristöpiirustukset.txt", - "tila": "ODOTTAA_TUONTIA", - }, - Object { - "__typename": "Aineisto", - "dokumenttiOid": "1.2.246.578.5.100.3018910986.78749844", - "jarjestys": 9, - "kategoriaId": "T2xx", - "nimi": "T220 Ympäristörakenteet.txt", - "tila": "ODOTTAA_TUONTIA", - }, - Object { - "__typename": "Aineisto", - "dokumenttiOid": "1.2.246.578.5.100.3029722284.1063097585", - "jarjestys": 10, - "kategoriaId": "T2xx", - "nimi": "T218 Radat.txt", - "tila": "ODOTTAA_TUONTIA", - }, - Object { - "__typename": "Aineisto", - "dokumenttiOid": "1.2.246.578.5.100.3115104343.3054025254", - "jarjestys": 11, - "kategoriaId": "T2xx", - "nimi": "T215 Poikkileikkaukset.txt", - "tila": "ODOTTAA_TUONTIA", - }, - Object { - "__typename": "Aineisto", - "dokumenttiOid": "1.2.246.578.5.100.3169279973.376365778", - "jarjestys": 12, - "kategoriaId": "T2xx", - "nimi": "T223 Tunneleiden ympäristöpiirustukset.txt", - "tila": "ODOTTAA_TUONTIA", + "nahtavillaoloVaihe": Object { + "__typename": "NahtavillaoloVaihe", + "aineistoNahtavilla": Array [ + Object { + "__typename": "Aineisto", + "dokumenttiOid": "1.2.246.578.5.100.2281391320.546836829", + "jarjestys": 1, + "kategoriaId": "T2xx", + "nimi": "T222 Meluesteiden periaatekuvat.txt", + "tila": "ODOTTAA_TUONTIA", + }, + Object { + "__typename": "Aineisto", + "dokumenttiOid": "1.2.246.578.5.100.2400417287.1486592341", + "jarjestys": 2, + "kategoriaId": "T2xx", + "nimi": "T213 Teiden hallinnolsten järjestelyjen kartat.txt", + "tila": "ODOTTAA_TUONTIA", + }, + Object { + "__typename": "Aineisto", + "dokumenttiOid": "1.2.246.578.5.100.2661373170.3358971896", + "jarjestys": 3, + "kategoriaId": "T2xx", + "nimi": "T224 Siltataulukko.txt", + "tila": "ODOTTAA_TUONTIA", + }, + Object { + "__typename": "Aineisto", + "dokumenttiOid": "1.2.246.578.5.100.2717425363.3158441393", + "jarjestys": 4, + "kategoriaId": "T2xx", + "nimi": "T211 Piirustusmerkinnät.txt", + "tila": "ODOTTAA_TUONTIA", + }, + Object { + "__typename": "Aineisto", + "dokumenttiOid": "1.2.246.578.5.100.2723303646.77167902", + "jarjestys": 5, + "kategoriaId": "T2xx", + "nimi": "T212 Yleiskartta.txt", + "tila": "ODOTTAA_TUONTIA", + }, + Object { + "__typename": "Aineisto", + "dokumenttiOid": "1.2.246.578.5.100.2951684371.1595457721", + "jarjestys": 6, + "kategoriaId": "T2xx", + "nimi": "T214 Suunnitelmakartat.txt", + "tila": "ODOTTAA_TUONTIA", + }, + Object { + "__typename": "Aineisto", + "dokumenttiOid": "1.2.246.578.5.100.2984895343.2324123820", + "jarjestys": 7, + "kategoriaId": "T2xx", + "nimi": "T217 Yleiskartta yksityisteistä.txt", + "tila": "ODOTTAA_TUONTIA", + }, + Object { + "__typename": "Aineisto", + "dokumenttiOid": "1.2.246.578.5.100.2989898206.2419448230", + "jarjestys": 8, + "kategoriaId": "T2xx", + "nimi": "T221 Siltojen ja tukimuurien ympäristöpiirustukset.txt", + "tila": "ODOTTAA_TUONTIA", + }, + Object { + "__typename": "Aineisto", + "dokumenttiOid": "1.2.246.578.5.100.3018910986.78749844", + "jarjestys": 9, + "kategoriaId": "T2xx", + "nimi": "T220 Ympäristörakenteet.txt", + "tila": "ODOTTAA_TUONTIA", + }, + Object { + "__typename": "Aineisto", + "dokumenttiOid": "1.2.246.578.5.100.3029722284.1063097585", + "jarjestys": 10, + "kategoriaId": "T2xx", + "nimi": "T218 Radat.txt", + "tila": "ODOTTAA_TUONTIA", + }, + Object { + "__typename": "Aineisto", + "dokumenttiOid": "1.2.246.578.5.100.3115104343.3054025254", + "jarjestys": 11, + "kategoriaId": "T2xx", + "nimi": "T215 Poikkileikkaukset.txt", + "tila": "ODOTTAA_TUONTIA", + }, + Object { + "__typename": "Aineisto", + "dokumenttiOid": "1.2.246.578.5.100.3169279973.376365778", + "jarjestys": 12, + "kategoriaId": "T2xx", + "nimi": "T223 Tunneleiden ympäristöpiirustukset.txt", + "tila": "ODOTTAA_TUONTIA", + }, + ], + "hankkeenKuvaus": Object { + "SAAME": "Saameksi nahtavillaoloVaihe", + "SUOMI": "Lorem Ipsum nahtavillaoloVaihe", + "__typename": "HankkeenKuvaukset", }, - ], - "lisaAineisto": Array [ - Object { - "__typename": "Aineisto", - "dokumenttiOid": "1.2.246.578.5.100.2303050596.2160380418", - "jarjestys": 1, - "nimi": "tokatiedosto_toka.pdf", - "tila": "ODOTTAA_TUONTIA", + "id": 1, + "ilmoituksenVastaanottajat": Object { + "__typename": "IlmoituksenVastaanottajat", + "kunnat": Array [ + Object { + "__typename": "KuntaVastaanottaja", + "lahetetty": "2022-03-11T14:54", + "nimi": "Mikkeli", + "sahkoposti": "mikkeli@mikke.li", + }, + Object { + "__typename": "KuntaVastaanottaja", + "lahetetty": "2022-03-11T14:54", + "nimi": " Juva", + "sahkoposti": "juva@ju.va", + }, + Object { + "__typename": "KuntaVastaanottaja", + "lahetetty": "2022-03-11T14:54", + "nimi": " Savonlinna", + "sahkoposti": "savonlinna@savonlin.na", + }, + ], + "viranomaiset": Array [ + Object { + "__typename": "ViranomaisVastaanottaja", + "lahetetty": "2022-03-11T14:54", + "nimi": "ETELA_SAVO_ELY", + "sahkoposti": "kirjaamo.etela-savo@ely-keskus.fi", + }, + ], }, - ], + "kuulutusPaiva": "2022-06-07", + "kuulutusVaihePaattyyPaiva": "2042-06-07", + "kuulutusYhteysHenkilot": Array [ + "A000112", + ], + "kuulutusYhteystiedot": Array [ + Object { + "__typename": "Yhteystieto", + "etunimi": "Etunimi", + "organisaatio": "", + "puhelinnumero": "0293121213", + "sahkoposti": "Etunimi.Sukunimi@vayla.fi", + "sukunimi": "Sukunimi", + "titteli": "Projektipäällikkö", + }, + Object { + "__typename": "Yhteystieto", + "etunimi": "Joku", + "organisaatio": "", + "puhelinnumero": "02998765", + "sahkoposti": "Joku.Jokunen@vayla.fi", + "sukunimi": "Jokunen", + "titteli": "Konsultti", + }, + ], + "lisaAineisto": Array [ + Object { + "__typename": "Aineisto", + "dokumenttiOid": "1.2.246.578.5.100.2303050596.2160380418", + "jarjestys": 1, + "nimi": "tokatiedosto_toka.pdf", + "tila": "ODOTTAA_TUONTIA", + }, + ], + "muistutusoikeusPaattyyPaiva": "2042-06-08", + "nahtavillaoloPDFt": undefined, + }, }, } `; diff --git a/backend/integrationtest/api/testUtil/nahtavillaolo.ts b/backend/integrationtest/api/testUtil/nahtavillaolo.ts index a1b2151a0..4f50ae4b5 100644 --- a/backend/integrationtest/api/testUtil/nahtavillaolo.ts +++ b/backend/integrationtest/api/testUtil/nahtavillaolo.ts @@ -69,7 +69,6 @@ export async function testImportNahtavillaoloAineistot( oid: string, velhoAineistoKategorias: VelhoAineistoKategoria[] ): Promise { - const projekti = await loadProjektiFromDatabase(oid, Status.NAHTAVILLAOLO); const t2xx = velhoAineistoKategorias .reduce((documents, aineistoKategoria) => { aineistoKategoria.aineistot @@ -91,7 +90,6 @@ export async function testImportNahtavillaoloAineistot( await api.tallennaProjekti({ oid, nahtavillaoloVaihe: { - ...projekti.nahtavillaoloVaihe, aineistoNahtavilla: adaptAineistoToInput(t2xx), lisaAineisto: adaptAineistoToInput(lisaAineisto), }, @@ -99,7 +97,6 @@ export async function testImportNahtavillaoloAineistot( const nahtavillaoloVaihe = (await loadProjektiFromDatabase(oid, Status.NAHTAVILLAOLO)).nahtavillaoloVaihe; expectToMatchSnapshot("testImportNahtavillaoloAineistot", { - aineistoNahtavilla: nahtavillaoloVaihe.aineistoNahtavilla, - lisaAineisto: nahtavillaoloVaihe.lisaAineisto, + nahtavillaoloVaihe, }); } diff --git a/backend/src/error/IllegalArgumentError.ts b/backend/src/error/IllegalArgumentError.ts new file mode 100644 index 000000000..b7138eca4 --- /dev/null +++ b/backend/src/error/IllegalArgumentError.ts @@ -0,0 +1,10 @@ +import { ClientError } from "./ClientError"; + +export class IllegalArgumentError extends ClientError { + constructor(m?: string) { + super("IllegalArgumentError", m); + + // Set the prototype explicitly. + Object.setPrototypeOf(this, IllegalArgumentError.prototype); + } +} diff --git a/backend/src/handler/projektiAdapter.ts b/backend/src/handler/projektiAdapter.ts index fc1d8994d..57cf11ee0 100644 --- a/backend/src/handler/projektiAdapter.ts +++ b/backend/src/handler/projektiAdapter.ts @@ -20,7 +20,6 @@ import { Yhteystieto, } from "../database/model"; import * as API from "../../../common/graphql/apiModel"; -import { AineistoTila } from "../../../common/graphql/apiModel"; import mergeWith from "lodash/mergeWith"; import { KayttoOikeudetManager } from "./kayttoOikeudetManager"; import { personSearch } from "../personSearch/personSearchClient"; @@ -32,6 +31,7 @@ import { ValidationError } from "yup"; import { log } from "../logger"; import dayjs, { Dayjs } from "dayjs"; import { kayttoOikeudetSchema } from "../../../src/schemas/kayttoOikeudet"; +import { IllegalArgumentError } from "../error/IllegalArgumentError"; export enum ProjektiEventType { VUOROVAIKUTUS_PUBLISHED = "VUOROVAIKUTUS_PUBLISHED", @@ -150,15 +150,16 @@ export class ProjektiAdapter { projektiAdaptationResult, suunnitteluVaihe?.vuorovaikutus ); + const aloitusKuulutusToSave = adaptAloitusKuulutusToSave(aloitusKuulutus); const dbProjekti = mergeWith( {}, { oid, muistiinpano, - aloitusKuulutus: adaptAloitusKuulutusToSave(aloitusKuulutus), + aloitusKuulutus: aloitusKuulutusToSave, suunnitteluSopimus: adaptSuunnitteluSopimusToSave(projekti, suunnitteluSopimus), kayttoOikeudet: kayttoOikeudetManager.getKayttoOikeudet(), - suunnitteluVaihe: adaptSuunnitteluVaiheToSave(projekti.suunnitteluVaihe, suunnitteluVaihe), + suunnitteluVaihe: adaptSuunnitteluVaiheToSave(projekti, suunnitteluVaihe), nahtavillaoloVaihe: adaptNahtavillaoloVaiheToSave( projekti.nahtavillaoloVaihe, nahtavillaoloVaihe, @@ -287,15 +288,27 @@ function adaptSuunnitteluVaihe( } function adaptSuunnitteluVaiheToSave( - dbSuunnitteluVaihe: SuunnitteluVaihe, + dbProjekti: DBProjekti, suunnitteluVaihe: API.SuunnitteluVaiheInput ): SuunnitteluVaihe { + function validateSuunnitteluVaihePublishing() { + const isSuunnitteluVaiheBeingPublished = !dbProjekti.suunnitteluVaihe?.julkinen && suunnitteluVaihe.julkinen; + if (isSuunnitteluVaiheBeingPublished) { + // Publishing is allowed only if there is a published aloituskuulutusjulkaisu + if (!findPublishedAloitusKuulutusJulkaisu(dbProjekti.aloitusKuulutusJulkaisut)) { + throw new IllegalArgumentError("Suunnitteluvaihetta ei voi julkaista ennen kuin aloituskuulutus on julkaistu"); + } + } + } + if ( suunnitteluVaihe && (suunnitteluVaihe.arvioSeuraavanVaiheenAlkamisesta || suunnitteluVaihe.hankkeenKuvaus || suunnitteluVaihe.suunnittelunEteneminenJaKesto) ) { + validateSuunnitteluVaihePublishing(); + const { arvioSeuraavanVaiheenAlkamisesta, suunnittelunEteneminenJaKesto, @@ -354,7 +367,10 @@ function adaptNahtavillaoloVaiheToSave( kuulutusYhteystiedot, ilmoituksenVastaanottajat, hankkeenKuvaus, - ...rest + kuulutusPaiva, + kuulutusVaihePaattyyPaiva, + muistutusoikeusPaattyyPaiva, + kuulutusYhteysHenkilot, } = nahtavillaoloVaihe; const aineistoNahtavilla = adaptAineistotToSave( @@ -378,15 +394,18 @@ function adaptNahtavillaoloVaiheToSave( } } - return { - ...rest, + return mergeWith({}, dbNahtavillaoloVaihe, { + kuulutusPaiva, + kuulutusVaihePaattyyPaiva, + muistutusoikeusPaattyyPaiva, + kuulutusYhteysHenkilot, id, aineistoNahtavilla, lisaAineisto, kuulutusYhteystiedot: adaptYhteystiedotToSave(kuulutusYhteystiedot), ilmoituksenVastaanottajat: adaptIlmoituksenVastaanottajatToSave(ilmoituksenVastaanottajat), hankkeenKuvaus: adaptHankkeenKuvausToSave(hankkeenKuvaus), - } as NahtavillaoloVaihe; + } as NahtavillaoloVaihe); } function adaptYhteystiedotToSave(yhteystietoInputs: Array) { @@ -580,7 +599,7 @@ export function adaptAineistot(aineistot?: Aineisto[] | null, julkaisuPaiva?: Da } if (aineistot && aineistot.length > 0) { return aineistot - .filter((aineisto) => aineisto.tila != AineistoTila.ODOTTAA_POISTOA) + .filter((aineisto) => aineisto.tila != API.AineistoTila.ODOTTAA_POISTOA) .map((aineisto) => ({ __typename: "Aineisto", dokumenttiOid: aineisto.dokumenttiOid, @@ -880,4 +899,20 @@ export function findVuorovaikutusByNumber( return projekti.vuorovaikutukset?.filter((value) => value.vuorovaikutusNumero == vuorovaikutusNumero).pop(); } +export function findPublishedAloitusKuulutusJulkaisu( + aloitusKuulutusJulkaisut: AloitusKuulutusJulkaisu[] +): AloitusKuulutusJulkaisu | undefined { + return ( + findJulkaisuByStatus(aloitusKuulutusJulkaisut, API.AloitusKuulutusTila.HYVAKSYTTY) || + findJulkaisuByStatus(aloitusKuulutusJulkaisut, API.AloitusKuulutusTila.MIGROITU) + ); +} + +export function findJulkaisuByStatus( + aloitusKuulutusJulkaisut: T[], + tila: API.AloitusKuulutusTila +): T | undefined { + return aloitusKuulutusJulkaisut?.filter((j) => j.tila == tila).pop(); +} + export const projektiAdapter = new ProjektiAdapter(); diff --git a/backend/src/handler/projektiAdapterJulkinen.ts b/backend/src/handler/projektiAdapterJulkinen.ts index 2d193bd80..2d362c71e 100644 --- a/backend/src/handler/projektiAdapterJulkinen.ts +++ b/backend/src/handler/projektiAdapterJulkinen.ts @@ -20,6 +20,8 @@ import { adaptLinkki, adaptLinkkiList, adaptYhteystiedot, + findJulkaisuByStatus, + findPublishedAloitusKuulutusJulkaisu, } from "./projektiAdapter"; import { fileService } from "../files/fileService"; import { log } from "../logger"; @@ -117,9 +119,7 @@ class ProjektiAdapterJulkinen { ): API.AloitusKuulutusJulkaisuJulkinen[] | undefined { if (aloitusKuulutusJulkaisut) { // Pick HYVAKSYTTY or MIGROITU aloituskuulutusjulkaisu, by this order - const julkaisu = - findJulkaisuByStatus(aloitusKuulutusJulkaisut, API.AloitusKuulutusTila.HYVAKSYTTY) || - findJulkaisuByStatus(aloitusKuulutusJulkaisut, API.AloitusKuulutusTila.MIGROITU); + const julkaisu = findPublishedAloitusKuulutusJulkaisu(aloitusKuulutusJulkaisut); if (!julkaisu) { return undefined; } @@ -327,13 +327,6 @@ function adaptVuorovaikutusTilaisuudet( return vuorovaikutusTilaisuudet as undefined; } -function findJulkaisuByStatus( - aloitusKuulutusJulkaisut: T[], - tila: API.AloitusKuulutusTila -): T { - return aloitusKuulutusJulkaisut.filter((j) => j.tila == tila).pop(); -} - function checkIfAloitusKuulutusJulkaisutIsPublic( aloitusKuulutusJulkaisut: API.AloitusKuulutusJulkaisuJulkinen[] ): boolean { @@ -365,7 +358,7 @@ function isNahtavillaoloVaihePublic(nahtavillaoloVaihe: NahtavillaoloVaiheJulkai if (nahtavillaoloVaihe.tila !== API.NahtavillaoloVaiheTila.HYVAKSYTTY) { return false; } - if (parseDate(nahtavillaoloVaihe.kuulutusPaiva).isAfter(dayjs())) { + if (!nahtavillaoloVaihe.kuulutusPaiva || parseDate(nahtavillaoloVaihe.kuulutusPaiva).isAfter(dayjs())) { return false; } return true; diff --git a/backend/test/projekti/projektiAdapter.test.ts b/backend/test/projekti/projektiAdapter.test.ts new file mode 100644 index 000000000..cdbd13f1e --- /dev/null +++ b/backend/test/projekti/projektiAdapter.test.ts @@ -0,0 +1,43 @@ +import { describe, it } from "mocha"; +import { ProjektiFixture } from "../fixture/projektiFixture"; +import cloneDeep from "lodash/cloneDeep"; +import { findPublishedAloitusKuulutusJulkaisu, projektiAdapter } from "../../src/handler/projektiAdapter"; +import { IllegalArgumentError } from "../../src/error/IllegalArgumentError"; + +const { expect } = require("chai"); + +describe("projektiAdapter", () => { + let fixture: ProjektiFixture; + + beforeEach(() => { + fixture = new ProjektiFixture(); + }); + + it("should prevent suunnitteluvaihe publishing without valid aloituskuulutusjulkaisu", async () => { + const projekti = cloneDeep(fixture.dbProjekti2); + + projekti.aloitusKuulutusJulkaisut = undefined; + projekti.suunnitteluVaihe = undefined; + + // Validate that there is an error if trying to publish suunnitteluvaihe before there is a published aloituskuulutusjulkaisu + expect( + projektiAdapter.adaptProjektiToSave(projekti, { + oid: projekti.oid, + suunnitteluVaihe: { hankkeenKuvaus: fixture.hankkeenKuvausSuunnitteluVaiheessa, julkinen: true }, + }) + ).to.be.rejectedWith(IllegalArgumentError); + }); + + it("should allow suunnitteluvaihe publishing with a valid aloituskuulutusjulkaisu", async () => { + const projekti = cloneDeep(fixture.dbProjekti2); + + expect(findPublishedAloitusKuulutusJulkaisu(projekti.aloitusKuulutusJulkaisut)).to.not.be.empty; + expect(projekti.suunnitteluVaihe).to.be.undefined; + + const result = await projektiAdapter.adaptProjektiToSave(projekti, { + oid: projekti.oid, + suunnitteluVaihe: { hankkeenKuvaus: fixture.hankkeenKuvausSuunnitteluVaiheessa, julkinen: true }, + }); + expect(result.projekti.suunnitteluVaihe.julkinen).to.be.true; + }); +});