From 828ac25d34452d1fb36cf6d81eaab559548cc88c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20H=C3=A4nninen?= Date: Thu, 2 Jan 2025 14:22:05 +0200 Subject: [PATCH] wip: testit kuntoon --- web/app/components-v2/controls/Checkbox.tsx | 2 +- .../opiskeluoikeus/KoodistoField.tsx | 15 +- .../opiskeluoikeus/OpiskeluoikeudenTila.tsx | 17 +- .../opiskeluoikeus/OppiaineTable.tsx | 180 ++-- web/app/ib/IBEditor.tsx | 167 ++-- web/app/ib/IBPaatasonSuoritusTiedot.tsx | 7 +- .../dialogs/UusiPreIB2015OppiaineDialog.tsx | 2 +- .../UusiPreIB2015OsasuoritusDialog.tsx | 17 +- .../UusiPreIB2019OsasuoritusDialog.tsx | 26 +- web/app/ib/oppiaineet/preIBKurssi2015.ts | 45 +- web/app/ib/oppiaineet/preIBOppiaine2015.ts | 16 +- web/app/ib/oppiaineet/preIBOppiaine2019.ts | 3 +- web/app/ib/oppiaineet/tunnisteet.ts | 11 +- web/app/ib/state/options.ts | 23 +- web/app/ib/state/preIB2015Kurssi.ts | 7 +- web/app/util/suoritus.ts | 10 + web/test/e2e/base.ts | 5 + web/test/e2e/ib.spec.ts | 827 ++++++++++++++++++ .../e2e/pages/oppija/KoskiIBOppijaPage.ts | 138 +++ .../e2e/pages/oppija/uiV2builder/Input.ts | 1 + .../e2e/pages/oppija/uiV2builder/Label.ts | 1 + .../e2e/pages/oppija/uiV2builder/controls.ts | 4 +- 22 files changed, 1317 insertions(+), 207 deletions(-) create mode 100644 web/test/e2e/ib.spec.ts create mode 100644 web/test/e2e/pages/oppija/KoskiIBOppijaPage.ts diff --git a/web/app/components-v2/controls/Checkbox.tsx b/web/app/components-v2/controls/Checkbox.tsx index eac2ae630c..4faf44c36d 100644 --- a/web/app/components-v2/controls/Checkbox.tsx +++ b/web/app/components-v2/controls/Checkbox.tsx @@ -25,7 +25,7 @@ export const Checkbox: React.FC = (props) => { onChange={(event) => props.onChange(event.target.checked)} data-testid={testId} /> - )} diff --git a/web/app/ib/dialogs/UusiPreIB2015OsasuoritusDialog.tsx b/web/app/ib/dialogs/UusiPreIB2015OsasuoritusDialog.tsx index a8fbca59d2..125d34b69d 100644 --- a/web/app/ib/dialogs/UusiPreIB2015OsasuoritusDialog.tsx +++ b/web/app/ib/dialogs/UusiPreIB2015OsasuoritusDialog.tsx @@ -48,7 +48,6 @@ import { export const UusiPreIB2015OsasuoritusDialog: AddOppiaineenOsasuoritusDialog< PreIBKurssinSuoritus2015 > = ({ onAdd, ...props }) => { - const koulutus = props.oppiaine.koulutusmoduuli const { preferences: paikallisetLukionKurssit, store: storePaikallinenLukionKurssi, @@ -63,7 +62,9 @@ export const UusiPreIB2015OsasuoritusDialog: AddOppiaineenOsasuoritusDialog< remove: removeIBKurssi } = usePreferences(props.organisaatioOid, 'ibkurssi') - const state = usePreIB2015OsasuoritusState() + const state = usePreIB2015OsasuoritusState( + props.oppiaine.koulutusmoduuli.tunniste + ) const valtakunnallisetTunnisteetOptions = useOppiaineenKurssiOptions( @@ -217,7 +218,7 @@ export const UusiPreIB2015OsasuoritusDialog: AddOppiaineenOsasuoritusDialog< koodiviiteId(state.lukiokurssinTyyppi.value) } onChange={(o) => state.lukiokurssinTyyppi.set(o?.value)} - testId="tunniste" + testId="tyyppi" /> )} @@ -245,8 +246,14 @@ export const UusiPreIB2015OsasuoritusDialog: AddOppiaineenOsasuoritusDialog< )} - {t('Peruuta')} - + + {t('Peruuta')} + + {t('Lisää')} diff --git a/web/app/ib/dialogs/UusiPreIB2019OsasuoritusDialog.tsx b/web/app/ib/dialogs/UusiPreIB2019OsasuoritusDialog.tsx index ac139f4725..04a583669e 100644 --- a/web/app/ib/dialogs/UusiPreIB2019OsasuoritusDialog.tsx +++ b/web/app/ib/dialogs/UusiPreIB2019OsasuoritusDialog.tsx @@ -70,7 +70,7 @@ export const UusiPreIB2019OsasuoritusDialog: AddOppiaineenOsasuoritusDialog< const paikallisetTunnisteetOptions = useMemo( () => [ - optionGroup(t('Paikalliset moduulit'), [ + optionGroup(t('Paikalliset opintojaksot'), [ ...paikallisetOpintojaksot.map((kurssi) => paikallinenKoodiToOption(kurssi.tunniste, { removable: true }) ), @@ -204,19 +204,23 @@ export const UusiPreIB2019OsasuoritusDialog: AddOppiaineenOsasuoritusDialog< /> )} {state.pakollinen.visible && ( - + )} - {t('Peruuta')} - + + {t('Peruuta')} + + {t('Lisää')} diff --git a/web/app/ib/oppiaineet/preIBKurssi2015.ts b/web/app/ib/oppiaineet/preIBKurssi2015.ts index 351b3d3684..6389aa1790 100644 --- a/web/app/ib/oppiaineet/preIBKurssi2015.ts +++ b/web/app/ib/oppiaineet/preIBKurssi2015.ts @@ -1,3 +1,4 @@ +import { t } from '../../i18n/i18n' import { IBKurssi } from '../../types/fi/oph/koski/schema/IBKurssi' import { Koodistokoodiviite } from '../../types/fi/oph/koski/schema/Koodistokoodiviite' import { LaajuusKursseissa } from '../../types/fi/oph/koski/schema/LaajuusKursseissa' @@ -9,9 +10,14 @@ import { import { PaikallinenLukionKurssi2015 } from '../../types/fi/oph/koski/schema/PaikallinenLukionKurssi2015' import { PreIBKurssi2015 } from '../../types/fi/oph/koski/schema/PreIBKurssi2015' import { PreIBKurssinSuoritus2015 } from '../../types/fi/oph/koski/schema/PreIBKurssinSuoritus2015' +import { PreIBSuorituksenOsasuoritus2015 } from '../../types/fi/oph/koski/schema/PreIBSuorituksenOsasuoritus2015' import { ValtakunnallinenLukionKurssi2015 } from '../../types/fi/oph/koski/schema/ValtakunnallinenLukionKurssi2015' +import { PermissiveKoodiviite } from '../../util/koodisto' +import { KoulutusmoduuliOf, TunnisteOf } from '../../util/schema' +import { isValidPaikallinenKoodi } from './tunnisteet' export type PreIBKurssi2015Props = { + oppiaineenTunniste: PreIB2015KurssiOppiaineenTunniste tunniste?: PreIB2015OsasuoritusTunniste lukiokurssinTyyppi?: Koodistokoodiviite<'lukionkurssintyyppi'> kuvaus?: LocalizedString @@ -19,6 +25,10 @@ export type PreIBKurssi2015Props = { laajuus?: LaajuusKursseissa } +export type PreIB2015KurssiOppiaineenTunniste = PermissiveKoodiviite< + TunnisteOf> +> + export type PreIB2015OsasuoritusTunniste = | Koodistokoodiviite | PaikallinenKoodi @@ -47,6 +57,7 @@ export const createPreIBKurssinSuoritus2015 = ( } const createPreIBKurssi2015 = ({ + oppiaineenTunniste, tunniste, lukiokurssinTyyppi, kuvaus, @@ -61,22 +72,24 @@ const createPreIBKurssi2015 = ({ }) } - if (lukiokurssinTyyppi && isPaikallinenKoodi(tunniste) && kuvaus) { - return PaikallinenLukionKurssi2015({ - tunniste, - kurssinTyyppi: lukiokurssinTyyppi, - kuvaus, - laajuus - }) - } - - if (isPaikallinenKoodi(tunniste) && kuvaus) { - return IBKurssi({ - tunniste, - kuvaus, - pakollinen: !!pakollinen, - laajuus - }) + if (isValidPaikallinenKoodi(tunniste) && kuvaus) { + if (oppiaineenTunniste.koodistoUri === 'oppiaineetib') { + return IBKurssi({ + tunniste, + kuvaus, + pakollinen: !!pakollinen, + laajuus + }) + } else { + return lukiokurssinTyyppi + ? PaikallinenLukionKurssi2015({ + tunniste, + kurssinTyyppi: lukiokurssinTyyppi, + kuvaus, + laajuus + }) + : null + } } return null diff --git a/web/app/ib/oppiaineet/preIBOppiaine2015.ts b/web/app/ib/oppiaineet/preIBOppiaine2015.ts index 16282e42a2..5726e5ad29 100644 --- a/web/app/ib/oppiaineet/preIBOppiaine2015.ts +++ b/web/app/ib/oppiaineet/preIBOppiaine2015.ts @@ -1,3 +1,4 @@ +import { t } from '../../i18n/i18n' import { IBOppiaineLanguage } from '../../types/fi/oph/koski/schema/IBOppiaineLanguage' import { IBOppiaineMuu } from '../../types/fi/oph/koski/schema/IBOppiaineMuu' import { LukionÄidinkieliJaKirjallisuus2015 } from '../../types/fi/oph/koski/schema/LukionAidinkieliJaKirjallisuus2015' @@ -17,6 +18,7 @@ import { isLukionMuuValtakunnallinenOppiaine2015Tunniste, isLukionUskonto2015Tunniste, isLukionÄidinkieliJaKirjallisuus2015Tunniste, + isValidPaikallinenKoodi, isVierasTaiToinenKotimainenKieli2015Tunniste } from './tunnisteet' @@ -101,14 +103,12 @@ const createPreIBOppiaine2015 = ({ : null } - if (paikallinenTunniste) { - return paikallinenKuvaus - ? PaikallinenLukionOppiaine2015({ - pakollinen: true, - kuvaus: paikallinenKuvaus, - tunniste: paikallinenTunniste - }) - : null + if (isValidPaikallinenKoodi(paikallinenTunniste) && paikallinenKuvaus) { + return PaikallinenLukionOppiaine2015({ + pakollinen: true, + kuvaus: paikallinenKuvaus, + tunniste: paikallinenTunniste + }) } return null diff --git a/web/app/ib/oppiaineet/preIBOppiaine2019.ts b/web/app/ib/oppiaineet/preIBOppiaine2019.ts index 3f86718044..590dd5db87 100644 --- a/web/app/ib/oppiaineet/preIBOppiaine2019.ts +++ b/web/app/ib/oppiaineet/preIBOppiaine2019.ts @@ -21,6 +21,7 @@ import { isLukionÄidinkieliJaKirjallisuus2019Tunniste, isMuutLukionSuoritukset2019Tunniste, isTemaattisetOpinnot2019Tunniste, + isValidPaikallinenKoodi, isVierasTaiToinenKotimainenKieli2019Tunniste } from './tunnisteet' @@ -91,7 +92,7 @@ const createPreIBLukionOppiaine2019 = ({ : null } - if (paikallinenTunniste && paikallinenKuvaus) { + if (isValidPaikallinenKoodi(paikallinenTunniste) && paikallinenKuvaus) { return PaikallinenLukionOppiaine2019({ tunniste: paikallinenTunniste, kuvaus: paikallinenKuvaus, diff --git a/web/app/ib/oppiaineet/tunnisteet.ts b/web/app/ib/oppiaineet/tunnisteet.ts index a350219ab7..135bb9e416 100644 --- a/web/app/ib/oppiaineet/tunnisteet.ts +++ b/web/app/ib/oppiaineet/tunnisteet.ts @@ -1,8 +1,12 @@ +import { t } from '../../i18n/i18n' import { isKoodistokoodiviite, Koodistokoodiviite } from '../../types/fi/oph/koski/schema/Koodistokoodiviite' -import { PaikallinenKoodi } from '../../types/fi/oph/koski/schema/PaikallinenKoodi' +import { + isPaikallinenKoodi, + PaikallinenKoodi +} from '../../types/fi/oph/koski/schema/PaikallinenKoodi' import { ItemOf } from '../../util/types' export const koodiviiteTunnisteGuard = @@ -192,3 +196,8 @@ export const isLukionMuuModuuliMuissaOpinnoissa2019OppiaineenTunniste = export const isLukionVieraanKielenModuuliMuissaOpinnoissa2019OppiaineenTunniste = koodiviiteTunnisteGuard('lukionmuutopinnot', ['MS']) + +export const isValidPaikallinenKoodi = ( + koodi?: any +): koodi is PaikallinenKoodi => + isPaikallinenKoodi(koodi) && !!koodi?.koodiarvo && !!t(koodi?.nimi) diff --git a/web/app/ib/state/options.ts b/web/app/ib/state/options.ts index 13f18e98fe..187b62a9bf 100644 --- a/web/app/ib/state/options.ts +++ b/web/app/ib/state/options.ts @@ -132,7 +132,28 @@ export const usePreIB2019TunnisteOptions = ( päätasonSuoritus: PäätasonSuoritusOf, paikallisetOppiaineet: PaikallinenLukionOppiaine2019[] ): SelectOption[] => { - const koodisto = useKoodisto('koskioppiaineetyleissivistava') + const koodisto = useKoodisto('koskioppiaineetyleissivistava', [ + 'A', + 'B1', + 'B2', + 'B3', + 'AI', + 'KT', + 'BI', + 'ET', + 'FI', + 'FY', + 'GE', + 'KE', + 'KU', + 'LI', + 'MU', + 'OP', + 'PS', + 'TE', + 'YH', + 'MA' + ]) const existingOppiaineet = useMemo( () => diff --git a/web/app/ib/state/preIB2015Kurssi.ts b/web/app/ib/state/preIB2015Kurssi.ts index ac586e7f6b..58789a1619 100644 --- a/web/app/ib/state/preIB2015Kurssi.ts +++ b/web/app/ib/state/preIB2015Kurssi.ts @@ -9,6 +9,7 @@ import { LocalizedString } from '../../types/fi/oph/koski/schema/LocalizedString import { PreIBKurssinSuoritus2015 } from '../../types/fi/oph/koski/schema/PreIBKurssinSuoritus2015' import { createPreIBKurssinSuoritus2015, + PreIB2015KurssiOppiaineenTunniste, PreIB2015OsasuoritusTunniste, PreIBKurssi2015Props } from '../oppiaineet/preIBKurssi2015' @@ -30,7 +31,9 @@ export type PreIB2015OsasuoritusState = { export type UusiOsasuoritustyyppi = 'lukio' | 'ib' -export const usePreIB2015OsasuoritusState = (): PreIB2015OsasuoritusState => { +export const usePreIB2015OsasuoritusState = ( + oppiaineenTunniste: PreIB2015KurssiOppiaineenTunniste +): PreIB2015OsasuoritusState => { const tunniste = useDialogField(true) const uusiTyyppi = useDialogField(false) @@ -56,6 +59,7 @@ export const usePreIB2015OsasuoritusState = (): PreIB2015OsasuoritusState => { const result = useMemo( () => createPreIBKurssinSuoritus2015({ + oppiaineenTunniste, tunniste: tunniste.value, lukiokurssinTyyppi: lukiokurssinTyyppi.value, kuvaus: kuvaus.value, @@ -63,6 +67,7 @@ export const usePreIB2015OsasuoritusState = (): PreIB2015OsasuoritusState => { laajuus: laajuus.value }), [ + oppiaineenTunniste, tunniste.value, lukiokurssinTyyppi.value, kuvaus.value, diff --git a/web/app/util/suoritus.ts b/web/app/util/suoritus.ts index f4c030a870..0d75a2b75a 100644 --- a/web/app/util/suoritus.ts +++ b/web/app/util/suoritus.ts @@ -3,6 +3,8 @@ import { isArvioinniton } from '../types/fi/oph/koski/schema/Arvioinniton' import { Arviointi } from '../types/fi/oph/koski/schema/Arviointi' import { isMahdollisestiArvioinniton } from '../types/fi/oph/koski/schema/MahdollisestiArvioinniton' import { isPäätasonSuoritus } from '../types/fi/oph/koski/schema/PaatasonSuoritus' +import { isPaikallinenKoodi } from '../types/fi/oph/koski/schema/PaikallinenKoodi' +import { isPreIBKurssinSuoritus2015 } from '../types/fi/oph/koski/schema/PreIBKurssinSuoritus2015' import { Suoritus } from '../types/fi/oph/koski/schema/Suoritus' import { parasArviointi } from './arvioinnit' @@ -29,3 +31,11 @@ export const suoritusValmis = (suoritus: Suoritus) => { const isInPast = (dateStr?: string) => dateStr !== undefined && parseISODate(dateStr) <= new Date() + +export const containsPaikallinenSuoritus = (s: Suoritus): boolean => { + if (isPaikallinenKoodi(s.koulutusmoduuli.tunniste)) { + return true + } + const osasuoritukset: Suoritus[] | undefined = (s as any).osasuoritukset + return osasuoritukset?.some(containsPaikallinenSuoritus) ?? false +} diff --git a/web/test/e2e/base.ts b/web/test/e2e/base.ts index 7274c4f304..7921ec6755 100644 --- a/web/test/e2e/base.ts +++ b/web/test/e2e/base.ts @@ -13,6 +13,7 @@ import { KoskiEshOppijaPage } from './pages/oppija/KoskiEshOppijaPage' import { KoskiPerusopetusOppijaPage } from './pages/oppija/KoskiPerusopetusOppijaPage' import { KoskiTpoOppijaPage } from './pages/oppija/KoskiTpoOppijaPage' import { KoskiVSTOppijaPage } from './pages/oppija/KoskiVSTOppijaPage' +import { KoskiIBOppijaPage } from './pages/oppija/KoskiIBOppijaPage' type Fixtures = { virkailijaLoginPage: VirkailijaLoginPage @@ -27,6 +28,7 @@ type Fixtures = { kansalainenPage: KoskiKansalainenPage taiteenPerusopetusPage: KoskiTpoOppijaPage vstOppijaPage: KoskiVSTOppijaPage + ibOppijaPage: KoskiIBOppijaPage fixtures: KoskiFixtures makeAxeBuilder: () => AxeBuilder } @@ -68,6 +70,9 @@ export const test = base.extend({ vstOppijaPage: async ({ page }, use) => { await use(new KoskiVSTOppijaPage(page)) }, + ibOppijaPage: async ({ page }, use) => { + await use(new KoskiIBOppijaPage(page)) + }, fixtures: async ({ browser }, use) => { const ctx = await browser.newContext() const page = await ctx.newPage() diff --git a/web/test/e2e/ib.spec.ts b/web/test/e2e/ib.spec.ts new file mode 100644 index 0000000000..8cc72cb105 --- /dev/null +++ b/web/test/e2e/ib.spec.ts @@ -0,0 +1,827 @@ +import { expect, test } from './base' +import { virkailija } from './setup/auth' + +test.describe('IB', () => { + test.use({ storageState: virkailija('kalle') }) + test.beforeAll(async ({ fixtures }) => { + await fixtures.reset() + }) + + test.describe('Pre-IB 2015', () => { + const oppijaOid = '1.2.246.562.24.00000000060' + + test.beforeEach(async ({ oppijaPage }) => { + await oppijaPage.goto(oppijaOid) + }) + + test('Opiskeluoikeuden tiedot näytetään oikein', async ({ + ibOppijaPage + }) => { + const tiedot = ibOppijaPage.$.opiskeluoikeus + + await expect(tiedot.voimassaoloaika.elem).toHaveText( + 'Opiskeluoikeuden voimassaoloaika: 1.9.2012 – 4.6.2016' + ) + await expect(tiedot.tila.value.items(0).tila.elem).toHaveText( + 'Valmistunut' + ) + await expect(tiedot.tila.value.items(0).rahoitus.elem).toHaveText( + 'Valtionosuusrahoitteinen koulutus' + ) + await expect(tiedot.tila.value.items(1).tila.elem).toHaveText('Läsnä') + await expect(tiedot.tila.value.items(1).rahoitus.elem).toHaveText( + 'Valtionosuusrahoitteinen koulutus' + ) + }) + + test('Suorituksen tiedot näkyvissä', async ({ ibOppijaPage }) => { + const suoritus = ibOppijaPage.$.suoritukset(0) + await expect(suoritus.koulutus.elem).toHaveText('Pre-IB') + await expect(await suoritus.organisaatio.value()).toEqual('Ressun lukio') + await expect(await suoritus.suorituskieli.value()).toEqual('englanti') + + const vahvistus = suoritus.suorituksenVahvistus.value + await expect(vahvistus.status.elem).toHaveText('Suoritus valmis') + await expect(vahvistus.henkilö(0).elem).toHaveText( + 'Reijo Reksi (rehtori)' + ) + }) + + test('Oppiaineiden ja kurssien arvosanat näytetään', async ({ + ibOppijaPage + }) => { + await ibOppijaPage.testOppiaineryhmät({ + oppiaineet: [ + { + nimi: 'Äidinkieli ja kirjallisuus, Suomen kieli ja kirjallisuus', + arvosana: '8', + kurssit: [ + { tunniste: 'ÄI1', arvosana: '8', laajuus: 1 }, + { tunniste: 'ÄI2', arvosana: '8', laajuus: 1 }, + { tunniste: 'ÄI3', arvosana: '8', laajuus: 1 } + ] + }, + { + nimi: 'A1-kieli, englanti', + arvosana: '10', + kurssit: [ + { tunniste: 'ENA1', arvosana: '10', laajuus: 1 }, + { tunniste: 'ENA2', arvosana: '10', laajuus: 1 }, + { tunniste: 'ENA5', arvosana: '10', laajuus: 1 } + ] + }, + { + nimi: 'B1-kieli, ruotsi', + arvosana: '7', + kurssit: [ + { tunniste: 'RUB11', arvosana: '8', laajuus: 1 }, + { tunniste: 'RUB12', arvosana: '7', laajuus: 1 } + ] + }, + { + nimi: 'B2-kieli, ranska', + arvosana: '9', + kurssit: [ + { + tunniste: 'RAN3', + paikallinen: true, + arvosana: '9', + laajuus: 1 + } + ] + }, + { + nimi: 'B3-kieli, espanja', + arvosana: '6', + kurssit: [ + { + tunniste: 'ES1', + paikallinen: true, + arvosana: 'S', + laajuus: 1 + } + ] + }, + { + nimi: 'Matematiikka, pitkä oppimäärä', + arvosana: '7', + kurssit: [ + { tunniste: 'MAA2', arvosana: '7', laajuus: 1 }, + { tunniste: 'MAA11', arvosana: '7', laajuus: 1 }, + { tunniste: 'MAA12', arvosana: '7', laajuus: 1 }, + { tunniste: 'MAA13', arvosana: '7', laajuus: 1 } + ] + }, + { + nimi: 'Biologia', + arvosana: '8', + kurssit: [ + { tunniste: 'BI1', arvosana: '8', laajuus: 1 }, + { + tunniste: 'BI10', + paikallinen: true, + arvosana: 'S', + laajuus: 1 + } + ] + }, + { + nimi: 'Maantieto', + arvosana: '10', + kurssit: [{ tunniste: 'GE2', arvosana: '10', laajuus: 1 }] + }, + { + nimi: 'Fysiikka', + arvosana: '7', + kurssit: [{ tunniste: 'FY1', arvosana: '7', laajuus: 1 }] + }, + { + nimi: 'Kemia', + arvosana: '8', + kurssit: [{ tunniste: 'KE1', arvosana: '8', laajuus: 1 }] + }, + { + nimi: 'Uskonto/Elämänkatsomustieto', + arvosana: '10', + kurssit: [{ tunniste: 'UK4', arvosana: '10', laajuus: 1 }] + }, + { + nimi: 'Filosofia', + arvosana: '7', + kurssit: [{ tunniste: 'FI1', arvosana: 'S', laajuus: 1 }] + }, + { + nimi: 'Psykologia', + arvosana: '8', + kurssit: [{ tunniste: 'PS1', arvosana: '8', laajuus: 1 }] + }, + { + nimi: 'Historia', + arvosana: '8', + kurssit: [ + { tunniste: 'HI3', arvosana: '9', laajuus: 1 }, + { tunniste: 'HI4', arvosana: '8', laajuus: 1 }, + { + tunniste: 'HI10', + paikallinen: true, + arvosana: 'S', + laajuus: 1 + } + ] + }, + { + nimi: 'Yhteiskuntaoppi', + arvosana: '8', + kurssit: [{ tunniste: 'YH1', arvosana: '8', laajuus: 1 }] + }, + { + nimi: 'Liikunta', + arvosana: '8', + kurssit: [{ tunniste: 'LI1', arvosana: '8', laajuus: 1 }] + }, + { + nimi: 'Musiikki', + arvosana: '8', + kurssit: [{ tunniste: 'MU1', arvosana: '8', laajuus: 1 }] + }, + { + nimi: 'Kuvataide', + arvosana: '9', + kurssit: [{ tunniste: 'KU1', arvosana: '9', laajuus: 1 }] + }, + { + nimi: 'Terveystieto', + arvosana: '7', + kurssit: [{ tunniste: 'TE1', arvosana: '7', laajuus: 1 }] + }, + { + nimi: 'Opinto-ohjaus', + arvosana: '7', + kurssit: [{ tunniste: 'OP1', arvosana: 'S', laajuus: 1 }] + }, + { + nimi: 'Teemaopinnot', + arvosana: 'S', + kurssit: [ + { + tunniste: 'MTA', + paikallinen: true, + arvosana: 'S', + laajuus: 1 + } + ] + } + ] + }) + + await expect( + ibOppijaPage.$.suoritukset(0).suoritettujaKurssejaYhteensä.elem + ).toHaveText('32') + }) + + test.describe('Tietojen muokkaaminen', () => { + test.beforeEach(async ({ ibOppijaPage }) => { + await ibOppijaPage.edit() + }) + + test.describe('Suoritusten tiedot', () => { + test.describe('Oppiaineiden muokkaus', () => { + test('Arvosana-asteikko on oikea', async ({ ibOppijaPage }) => { + const oppiaine = ibOppijaPage.oppiaineryhmä().oppiaineet(0) + expect(await oppiaine.arvosana.options()).toEqual([ + '4', + '5', + '6', + '7', + '8', + '9', + '10', + 'H', + 'O', + 'S' + ]) + }) + + test('Arvosanan muuttaminen', async ({ ibOppijaPage }) => { + const oppiaine = ibOppijaPage.oppiaineryhmä().oppiaineet(0) + await oppiaine.arvosana.set('arviointiasteikkoyleissivistava_10') + await ibOppijaPage.tallenna() + await expect(oppiaine.arvosana.viewer).toHaveText('10') + }) + + test.describe('Kurssit', () => { + test('Arvosanan muuttaminen', async ({ ibOppijaPage }) => { + const kurssi = ibOppijaPage + .oppiaineryhmä() + .oppiaineet(0) + .kurssit(0) + await kurssi.arvosana.set('arviointiasteikkoyleissivistava_10') + await ibOppijaPage.tallenna() + await expect(kurssi.arvosana.viewer).toHaveText('10') + }) + + test('Lukion valtakunnallinen kurssi', async ({ ibOppijaPage }) => { + const oppiaine = ibOppijaPage.oppiaineryhmä().oppiaineet(0) + await oppiaine.addKurssi.button.click() + + const modal = oppiaine.modal + await expect(modal.submit.button).toBeDisabled() + + await modal.tunniste.setByLabel('ÄI5 Teksti ja konteksti') + await expect(modal.submit.button).toBeDisabled() + + await modal.tyyppi.setByLabel('Pakollinen') + await modal.submit.button.click() + + const kurssi = oppiaine.kurssit(3) + await expect(kurssi.tunniste.elem).toHaveText('ÄI5') + + await kurssi.delete.button.click() + await expect(kurssi.tunniste.elem).not.toBeAttached() + }) + + test('Lukion paikallinen kurssi', async ({ ibOppijaPage }) => { + const oppiaine = ibOppijaPage.oppiaineryhmä().oppiaineet(0) + await oppiaine.addKurssi.button.click() + + const modal = oppiaine.modal + await expect(modal.submit.button).toBeDisabled() + + await modal.tunniste.set( + 'Paikalliset lukion kurssit.__uusi_paikallinen_lukio__' + ) + await expect(modal.submit.button).toBeDisabled() + + await modal.paikallinenKoulutus.nimi.set( + 'Sosiaalisen median lukutaito' + ) + await expect(modal.submit.button).toBeDisabled() + + await modal.paikallinenKoulutus.koodiarvo.set('ÄI11') + await expect(modal.submit.button).toBeDisabled() + + await modal.paikallinenKoulutus.kuvaus.set( + 'Tutustutaan sosiaalisen median vaikutuskeinoihin' + ) + await expect(modal.submit.button).toBeDisabled() + + await modal.tyyppi.setByLabel('Pakollinen') + await modal.submit.button.click() + + const kurssi = oppiaine.kurssit(3) + await expect(kurssi.tunniste.elem).toHaveText('ÄI11 *') + + await kurssi.delete.button.click() + await expect(kurssi.tunniste.elem).not.toBeAttached() + }) + }) + }) + + test.describe('Oppiaineen lisäys', () => { + test('IB-oppiaine', async ({ ibOppijaPage }) => { + const suoritus = ibOppijaPage.$.suoritukset(0) + await suoritus.addOppiaine.button.click() + + const modal = suoritus.modal + await modal.tunniste.setByLabel('DAN Dance') + + await expect(modal.submit.button).toBeDisabled() + await expect(modal.kieli.input).not.toBeAttached() + await expect(modal.äidinkielenKieli.input).not.toBeAttached() + await expect(modal.matematiikanOppimäärä.input).not.toBeAttached() + + await modal.aineryhmä.setByLabel('The arts') + await modal.submit.button.click() + + const uusiAineryhmä = ibOppijaPage.oppiaineryhmä(0, 1) + await expect(uusiAineryhmä.nimi.elem).toHaveText('The arts') + + const uusiOppiaine = uusiAineryhmä.oppiaineet(0) + await expect(uusiOppiaine.nimi.elem).toHaveText('Dance') + + await uusiOppiaine.delete.button.click() + await expect(uusiOppiaine.nimi.elem).not.toBeAttached() + }) + + test('Lukion kieliaine', async ({ ibOppijaPage }) => { + const suoritus = ibOppijaPage.$.suoritukset(0) + await suoritus.addOppiaine.button.click() + + const modal = suoritus.modal + await modal.tunniste.setByLabel('A2 A2-kieli') + + await expect(modal.submit.button).toBeDisabled() + await expect(modal.aineryhmä.input).not.toBeAttached() + await expect(modal.äidinkielenKieli.input).not.toBeAttached() + await expect(modal.matematiikanOppimäärä.input).not.toBeAttached() + + await modal.kieli.setByLabel('albania') + await modal.submit.button.click() + + const uusiOppiaine = ibOppijaPage.oppiaineryhmä(0, 0).oppiaineet(21) + await expect(uusiOppiaine.nimi.elem).toHaveText('A2-kieli, albania') + + await uusiOppiaine.delete.button.click() + await expect(uusiOppiaine.nimi.elem).not.toBeAttached() + }) + + test('Lukion matematiikka', async ({ ibOppijaPage }) => { + const suoritus = ibOppijaPage.$.suoritukset(0) + + await suoritus.oppiaineryhmät(0).oppiaineet(5).delete.button.click() // Poista opiskeluoikeudella jo oleva matematiikka + + await suoritus.addOppiaine.button.click() + + const modal = suoritus.modal + await modal.tunniste.setByLabel('MA Matematiikka') + + await expect(modal.submit.button).toBeDisabled() + await expect(modal.aineryhmä.input).not.toBeAttached() + await expect(modal.kieli.input).not.toBeAttached() + await expect(modal.äidinkielenKieli.input).not.toBeAttached() + + await modal.matematiikanOppimäärä.setByLabel( + 'Matematiikka, pitkä oppimäärä' + ) + await modal.submit.button.click() + + const uusiOppiaine = ibOppijaPage.oppiaineryhmä(0, 0).oppiaineet(20) + await expect(uusiOppiaine.nimi.elem).toHaveText( + 'Matematiikka, pitkä oppimäärä' + ) + + await uusiOppiaine.delete.button.click() + await expect(uusiOppiaine.nimi.elem).not.toBeAttached() + }) + + test('Lukion äidinkieli', async ({ ibOppijaPage }) => { + const suoritus = ibOppijaPage.$.suoritukset(0) + + await suoritus.oppiaineryhmät(0).oppiaineet(0).delete.button.click() // Poista opiskeluoikeudella jo oleva äidinkielen oppiaine + + await suoritus.addOppiaine.button.click() + + const modal = suoritus.modal + await modal.tunniste.setByLabel('AI Äidinkieli ja kirjallisuus') + + await expect(modal.submit.button).toBeDisabled() + await expect(modal.aineryhmä.input).not.toBeAttached() + await expect(modal.kieli.input).not.toBeAttached() + await expect(modal.matematiikanOppimäärä.input).not.toBeAttached() + + await modal.äidinkielenKieli.setByLabel('Suomi viittomakielisille') + await modal.submit.button.click() + + const uusiOppiaine = ibOppijaPage.oppiaineryhmä(0, 0).oppiaineet(20) + await expect(uusiOppiaine.nimi.elem).toHaveText( + 'Äidinkieli ja kirjallisuus, Suomi viittomakielisille' + ) + + await uusiOppiaine.delete.button.click() + await expect(uusiOppiaine.nimi.elem).not.toBeAttached() + }) + + test('Paikallinen oppiaine', async ({ ibOppijaPage }) => { + const suoritus = ibOppijaPage.$.suoritukset(0) + + await suoritus.addOppiaine.button.click() + + const modal = suoritus.modal + await modal.tunniste.set( + 'Paikallinen oppiaine.__uusi_paikallinen_oppiaine__' + ) + + await expect(modal.submit.button).toBeDisabled() + await expect(modal.aineryhmä.input).not.toBeAttached() + await expect(modal.kieli.input).not.toBeAttached() + await expect(modal.matematiikanOppimäärä.input).not.toBeAttached() + await expect(modal.äidinkielenKieli.input).not.toBeAttached() + + await modal.paikallinenKoulutus.nimi.set('Elektroniikka') + await expect(modal.submit.button).toBeDisabled() + + await modal.paikallinenKoulutus.koodiarvo.set('ELE') + await expect(modal.submit.button).toBeDisabled() + + await modal.paikallinenKoulutus.kuvaus.set('Kolvi tutuksi') + await modal.submit.button.click() + + const uusiOppiaine = ibOppijaPage.oppiaineryhmä(0, 0).oppiaineet(21) + await expect(uusiOppiaine.nimi.elem).toHaveText('Elektroniikka') + + await uusiOppiaine.delete.button.click() + await expect(uusiOppiaine.nimi.elem).not.toBeAttached() + }) + }) + }) + }) + }) + + test.describe('Pre-IB 2019', () => { + const oppijaOid = '1.2.246.562.24.00000000062' + + test.beforeEach(async ({ oppijaPage }) => { + await oppijaPage.goto(oppijaOid) + }) + + test.describe('Tietojen näyttäminen', () => { + test('Opiskeluoikeuden tiedot näytetään oikein', async ({ + ibOppijaPage + }) => { + const tiedot = ibOppijaPage.$.opiskeluoikeus + + await expect(tiedot.voimassaoloaika.elem).toHaveText( + 'Opiskeluoikeuden voimassaoloaika: 1.9.2012 – 4.6.2016' + ) + await expect(tiedot.tila.value.items(0).tila.elem).toHaveText( + 'Valmistunut' + ) + await expect(tiedot.tila.value.items(0).rahoitus.elem).toHaveText( + 'Valtionosuusrahoitteinen koulutus' + ) + await expect(tiedot.tila.value.items(1).tila.elem).toHaveText('Läsnä') + await expect(tiedot.tila.value.items(1).rahoitus.elem).toHaveText( + 'Valtionosuusrahoitteinen koulutus' + ) + }) + + test('Suorituksen tiedot näkyvissä', async ({ ibOppijaPage }) => { + const suoritus = ibOppijaPage.$.suoritukset(0) + await expect(suoritus.koulutus.elem).toHaveText('Pre-IB 2019') + await expect(await suoritus.organisaatio.value()).toEqual( + 'Ressun lukio' + ) + await expect(await suoritus.suorituskieli.value()).toEqual('englanti') + await expect( + await suoritus.todistuksellaNäkyvätLisätiedot.value() + ).toEqual('Suorittanut etäopetuskokeiluna') + + const vahvistus = suoritus.suorituksenVahvistus.value + await expect(vahvistus.status.elem).toHaveText('Suoritus valmis') + await expect(vahvistus.henkilö(0).elem).toHaveText( + 'Reijo Reksi (rehtori)' + ) + }) + + test('Oppiaineiden ja kurssien arvosanat näytetään', async ({ + ibOppijaPage + }) => { + await ibOppijaPage.testOppiaineryhmät({ + oppiaineet: [ + { + nimi: 'Äidinkieli ja kirjallisuus, Suomen kieli ja kirjallisuus', + arvosana: '9', + kurssit: [ + { tunniste: 'ÄI1', arvosana: '8', laajuus: 2 }, + { tunniste: 'ÄI2', arvosana: '8', laajuus: 2 } + ] + }, + { + nimi: 'Matematiikka, lyhyt oppimäärä', + arvosana: '10', + kurssit: [ + { tunniste: 'MAB2', arvosana: '10', laajuus: 2 }, + { tunniste: 'MAB3', arvosana: '10', laajuus: 2 } + ] + }, + { + nimi: 'Uskonto/Elämänkatsomustieto', + arvosana: '9', + kurssit: [{ tunniste: 'UK1', arvosana: '9', laajuus: 2 }] + }, + { + nimi: 'Liikunta', + arvosana: '8', + kurssit: [ + { tunniste: 'LI2', arvosana: '8', laajuus: 2 }, + { + tunniste: 'LITT1', + paikallinen: true, + arvosana: 'S', + laajuus: 1 + } + ] + }, + { + nimi: 'Fysiikka', + arvosana: '8', + kurssit: [] + }, + { + nimi: 'Kemia', + arvosana: '7', + kurssit: [{ tunniste: 'KE1', arvosana: '6', laajuus: 2 }] + }, + { + nimi: 'A-kieli, englanti', + arvosana: '9', + kurssit: [ + { tunniste: 'ENA1', arvosana: '10', laajuus: 2 }, + { tunniste: 'ENA2', arvosana: '9', laajuus: 2 } + ] + }, + { + nimi: 'A-kieli, espanja', + arvosana: '6', + kurssit: [ + { tunniste: 'VKA1', arvosana: '6', laajuus: 2 }, + { tunniste: 'VKA2', arvosana: '7', laajuus: 2 } + ] + }, + { + nimi: 'Tanssi ja liike', + arvosana: '6', + kurssit: [ + { + tunniste: 'ITT234', + paikallinen: true, + arvosana: '6', + laajuus: 1 + }, + { + tunniste: 'ITT235', + paikallinen: true, + arvosana: '7', + laajuus: 1 + } + ] + }, + { + nimi: 'Muut suoritukset', + kurssit: [ + { tunniste: 'RUB11', arvosana: '6', laajuus: 2 }, + { tunniste: 'VKAAB31', arvosana: '6', laajuus: 2 }, + { tunniste: 'ÄI1', arvosana: '7', laajuus: 2 } + ] + }, + { + nimi: 'Lukiodiplomit', + kurssit: [{ tunniste: 'KULD2', arvosana: '9', laajuus: 2 }] + }, + { + nimi: 'Teemaopinnot', + kurssit: [ + { + tunniste: 'HAI765', + paikallinen: true, + arvosana: 'S', + laajuus: 1 + } + ] + } + ] + }) + }) + }) + + test.describe('Tietojen muokkaaminen', () => { + test.beforeEach(async ({ ibOppijaPage }) => { + await ibOppijaPage.edit() + }) + + test.describe('Oppiaineiden muokkaus', () => { + test.describe('Oppiaineen arvosana', () => { + test('Arvosana-asteikko on oikea', async ({ ibOppijaPage }) => { + const oppiaine = ibOppijaPage.oppiaineryhmä().oppiaineet(0) + expect(await oppiaine.arvosana.options()).toEqual([ + '4', + '5', + '6', + '7', + '8', + '9', + '10', + 'H', + 'S' + ]) + }) + + test('Arvosanan muuttaminen', async ({ ibOppijaPage }) => { + const oppiaine = ibOppijaPage.oppiaineryhmä().oppiaineet(0) + await oppiaine.arvosana.set('arviointiasteikkoyleissivistava_10') + await ibOppijaPage.tallenna() + await expect(oppiaine.arvosana.viewer).toHaveText('10') + }) + }) + + test.describe('Kurssien muokkaus', () => { + test('Arvosanan muuttaminen', async ({ ibOppijaPage }) => { + const kurssi = ibOppijaPage.oppiaineryhmä().oppiaineet(0).kurssit(0) + await kurssi.arvosana.set('arviointiasteikkoyleissivistava_10') + await ibOppijaPage.tallenna() + await expect(kurssi.arvosana.viewer).toHaveText('10') + }) + + test('Lukion moduulin suoritus oppiaineissa', async ({ + ibOppijaPage + }) => { + const oppiaine = ibOppijaPage.oppiaineryhmä().oppiaineet(0) + await oppiaine.addKurssi.button.click() + + const modal = oppiaine.modal + await expect(modal.submit.button).toBeDisabled() + + await modal.tunniste.setByLabel('ÄI9 Vuorovaikutus 3') + await expect(modal.submit.button).toBeDisabled() + + await modal.laajuus.set('2') + await modal.submit.button.click() + + const kurssi = oppiaine.kurssit(2) + await expect(kurssi.tunniste.elem).toHaveText('ÄI9') + + await kurssi.delete.button.click() + await expect(kurssi.tunniste.elem).not.toBeAttached() + }) + + test('Lukion paikallisen opintojakson suoritus', async ({ + ibOppijaPage + }) => { + const oppiaine = ibOppijaPage.oppiaineryhmä().oppiaineet(0) + await oppiaine.addKurssi.button.click() + + const modal = oppiaine.modal + await expect(modal.submit.button).toBeDisabled() + + await modal.tunniste.set( + 'Paikalliset opintojaksot.__uusi_paikallinen_lukio__' + ) + await expect(modal.submit.button).toBeDisabled() + + await modal.paikallinenKoulutus.nimi.set( + 'Sosiaalisen median lukutaito' + ) + await expect(modal.submit.button).toBeDisabled() + + await modal.paikallinenKoulutus.koodiarvo.set('ÄI11') + await expect(modal.submit.button).toBeDisabled() + + await modal.paikallinenKoulutus.kuvaus.set( + 'Tutustutaan sosiaalisen median vaikutuskeinoihin' + ) + await expect(modal.submit.button).toBeDisabled() + + await modal.laajuus.set('2') + await modal.submit.button.click() + + const kurssi = oppiaine.kurssit(2) + await expect(kurssi.tunniste.elem).toHaveText('ÄI11 *') + + await kurssi.delete.button.click() + await expect(kurssi.tunniste.elem).not.toBeAttached() + }) + }) + + test.describe('Oppiaineen lisäys', () => { + test('Lukion kieliaine', async ({ ibOppijaPage }) => { + const suoritus = ibOppijaPage.$.suoritukset(0) + await suoritus.addOppiaine.button.click() + + const modal = suoritus.modal + await modal.tunniste.setByLabel('B2 B2-kieli') + + await expect(modal.submit.button).toBeDisabled() + await expect(modal.äidinkielenKieli.input).not.toBeAttached() + await expect(modal.matematiikanOppimäärä.input).not.toBeAttached() + + await modal.kieli.setByLabel('albania') + await modal.submit.button.click() + + const uusiOppiaine = ibOppijaPage.oppiaineryhmä(0, 0).oppiaineet(12) + await expect(uusiOppiaine.nimi.elem).toHaveText('B2-kieli, albania') + + await uusiOppiaine.delete.button.click() + await expect(uusiOppiaine.nimi.elem).not.toBeAttached() + }) + + test('Lukion matematiikka', async ({ ibOppijaPage }) => { + const suoritus = ibOppijaPage.$.suoritukset(0) + + await suoritus.oppiaineryhmät(0).oppiaineet(1).delete.button.click() // Poista opiskeluoikeudella jo oleva matematiikka + + await suoritus.addOppiaine.button.click() + + const modal = suoritus.modal + await modal.tunniste.setByLabel('MA Matematiikka') + + await expect(modal.submit.button).toBeDisabled() + await expect(modal.kieli.input).not.toBeAttached() + await expect(modal.äidinkielenKieli.input).not.toBeAttached() + + await modal.matematiikanOppimäärä.setByLabel( + 'Matematiikka, pitkä oppimäärä' + ) + await modal.submit.button.click() + + const uusiOppiaine = ibOppijaPage.oppiaineryhmä(0, 0).oppiaineet(11) + await expect(uusiOppiaine.nimi.elem).toHaveText( + 'Matematiikka, pitkä oppimäärä' + ) + + await uusiOppiaine.delete.button.click() + await expect(uusiOppiaine.nimi.elem).not.toBeAttached() + }) + + test('Lukion äidinkieli', async ({ ibOppijaPage }) => { + const suoritus = ibOppijaPage.$.suoritukset(0) + + await suoritus.oppiaineryhmät(0).oppiaineet(0).delete.button.click() // Poista opiskeluoikeudella jo oleva äidinkielen oppiaine + + await suoritus.addOppiaine.button.click() + + const modal = suoritus.modal + await modal.tunniste.setByLabel('AI Äidinkieli ja kirjallisuus') + + await expect(modal.submit.button).toBeDisabled() + await expect(modal.aineryhmä.input).not.toBeAttached() + await expect(modal.kieli.input).not.toBeAttached() + await expect(modal.matematiikanOppimäärä.input).not.toBeAttached() + + await modal.äidinkielenKieli.setByLabel('Suomi viittomakielisille') + await modal.submit.button.click() + + const uusiOppiaine = ibOppijaPage.oppiaineryhmä(0, 0).oppiaineet(11) + await expect(uusiOppiaine.nimi.elem).toHaveText( + 'Äidinkieli ja kirjallisuus, Suomi viittomakielisille' + ) + + await uusiOppiaine.delete.button.click() + await expect(uusiOppiaine.nimi.elem).not.toBeAttached() + }) + + test('Paikallinen oppiaine', async ({ ibOppijaPage }) => { + const suoritus = ibOppijaPage.$.suoritukset(0) + + await suoritus.addOppiaine.button.click() + + const modal = suoritus.modal + await modal.tunniste.set( + 'Paikallinen oppiaine.__uusi_paikallinen_oppiaine__' + ) + + await expect(modal.submit.button).toBeDisabled() + await expect(modal.aineryhmä.input).not.toBeAttached() + await expect(modal.kieli.input).not.toBeAttached() + await expect(modal.matematiikanOppimäärä.input).not.toBeAttached() + await expect(modal.äidinkielenKieli.input).not.toBeAttached() + + await modal.paikallinenKoulutus.nimi.set('Elektroniikka') + await expect(modal.submit.button).toBeDisabled() + + await modal.paikallinenKoulutus.koodiarvo.set('ELE') + await expect(modal.submit.button).toBeDisabled() + + await modal.paikallinenKoulutus.kuvaus.set('Kolvi tutuksi') + await modal.submit.button.click() + + const uusiOppiaine = ibOppijaPage.oppiaineryhmä(0, 0).oppiaineet(12) + await expect(uusiOppiaine.nimi.elem).toHaveText('Elektroniikka') + + await uusiOppiaine.delete.button.click() + await expect(uusiOppiaine.nimi.elem).not.toBeAttached() + }) + }) + }) + }) + }) +}) diff --git a/web/test/e2e/pages/oppija/KoskiIBOppijaPage.ts b/web/test/e2e/pages/oppija/KoskiIBOppijaPage.ts new file mode 100644 index 0000000000..76212bd5c3 --- /dev/null +++ b/web/test/e2e/pages/oppija/KoskiIBOppijaPage.ts @@ -0,0 +1,138 @@ +import { Page } from '@playwright/test' +import { sum } from '../../../../app/util/numbers' +import { expect } from '../../base' +import { KoskiOppijaPageV2 } from './KoskiOppijaPageV2' +import { arrayOf } from './uiV2builder/builder' +import { Button } from './uiV2builder/Button' +import { FormField } from './uiV2builder/controls' +import { Input } from './uiV2builder/Input' +import { Label } from './uiV2builder/Label' +import { OpiskeluoikeusHeader } from './uiV2builder/OpiskeluoikeusHeader' +import { Select } from './uiV2builder/Select' +import { SuorituksenVahvistus } from './uiV2builder/SuorituksenVahvistus' +import { Checkbox } from './uiV2builder/Checkbox' + +export class KoskiIBOppijaPage extends KoskiOppijaPageV2 { + constructor(page: Page) { + super(page, IBTestIds) + } + + async testOppiaineryhmät(...odotetutTiedot: OppiaineryhmätExpectedData[]) { + for (const aineryhmäIndex in odotetutTiedot) { + const { aineryhmä: aineryhmänNimi, oppiaineet } = + odotetutTiedot[aineryhmäIndex] + const oppiaineryhmä = this.oppiaineryhmä(0, parseInt(aineryhmäIndex)) + + if (aineryhmänNimi) { + await expect(oppiaineryhmä.nimi.elem).toHaveText(aineryhmänNimi) + } + + for (const oppiaineIndex in oppiaineet) { + const { nimi, arvosana, kurssit } = oppiaineet[oppiaineIndex] + const laajuus = sum(kurssit.map((kurssi) => kurssi.laajuus)) + const oppiaine = oppiaineryhmä.oppiaineet(parseInt(oppiaineIndex)) + + await expect(oppiaine.nimi.elem).toHaveText(nimi) + if (arvosana) { + await expect(oppiaine.arvosana.viewer).toHaveText(arvosana) + } + await expect(oppiaine.laajuus.elem).toHaveText(laajuus.toString()) + + for (const kurssiIndex in kurssit) { + const { + tunniste, + arvosana: kurssinArvosana, + paikallinen + } = kurssit[kurssiIndex] + const kurssi = oppiaine.kurssit(parseInt(kurssiIndex)) + + await expect(kurssi.tunniste.elem).toHaveText( + paikallinen ? `${tunniste} *` : tunniste + ) + await expect(kurssi.arvosana.viewer).toHaveText(kurssinArvosana) + } + const olematonKurssi = oppiaine.kurssit(kurssit.length) + await expect(olematonKurssi.tunniste.elem).not.toBeAttached() + } + } + } + + oppiaineryhmä(suoritusIndex: number = 0, ryhmäIndex: number = 0) { + return this.$.suoritukset(suoritusIndex).oppiaineryhmät(ryhmäIndex) + } +} + +const PaikallinenKoulutusIds = { + nimi: Input, + koodiarvo: Input, + kuvaus: Input +} + +export const IBTestIds = { + opiskeluoikeus: OpiskeluoikeusHeader(), + suoritusTabs: arrayOf({ tab: Button }), + suoritukset: arrayOf({ + koulutus: Label, + organisaatio: FormField(Label, Select), + suorituskieli: FormField(Label, Select), + todistuksellaNäkyvätLisätiedot: FormField(Label, Input), + + suorituksenVahvistus: SuorituksenVahvistus(), + + oppiaineryhmät: arrayOf({ + nimi: Label, + oppiaineet: arrayOf({ + nimi: Label, + laajuus: Label, + arvosana: FormField(Label, Select), + kurssit: arrayOf({ + tunniste: Label, + arvosana: FormField(Label, Select), + delete: Button + }), + // Uuden kurssin lisäys: + addKurssi: Button, + modal: { + tunniste: Select, + tyyppi: Select, + kieli: Select, + laajuus: FormField(Label, Input), + paikallinenKoulutus: PaikallinenKoulutusIds, + pakollinen: Checkbox, + cancel: Button, + submit: Button + }, + // Oppiaineen poisto + delete: Button + }) + }), + suoritettujaKurssejaYhteensä: Label, + + // Oppiaineen lisäys + addOppiaine: Button, + modal: { + tunniste: Select, + aineryhmä: Select, + kieli: Select, + matematiikanOppimäärä: Select, + äidinkielenKieli: Select, + paikallinenKoulutus: PaikallinenKoulutusIds, + cancel: Button, + submit: Button + } + }) +} + +export type OppiaineryhmätExpectedData = { + aineryhmä?: string + oppiaineet: Array<{ + nimi: string + arvosana?: string + kurssit: Array<{ + tunniste: string + paikallinen?: boolean + arvosana: string + laajuus: number + }> + }> +} diff --git a/web/test/e2e/pages/oppija/uiV2builder/Input.ts b/web/test/e2e/pages/oppija/uiV2builder/Input.ts index f282430699..f57f37ca17 100644 --- a/web/test/e2e/pages/oppija/uiV2builder/Input.ts +++ b/web/test/e2e/pages/oppija/uiV2builder/Input.ts @@ -1,6 +1,7 @@ import { createControl } from './controls' export const Input = createControl((self, child) => ({ + elem: child('input'), click: () => self.click(), value: () => child('input').inputValue(), set: async (value: string) => { diff --git a/web/test/e2e/pages/oppija/uiV2builder/Label.ts b/web/test/e2e/pages/oppija/uiV2builder/Label.ts index ae67e6197d..d55bc742be 100644 --- a/web/test/e2e/pages/oppija/uiV2builder/Label.ts +++ b/web/test/e2e/pages/oppija/uiV2builder/Label.ts @@ -1,6 +1,7 @@ import { createControl } from './controls' export const Label = createControl((self) => ({ + elem: self, value: () => self.innerText(), waitFor: (timeout?: number) => self.waitFor({ timeout }), waitForToDisappear: (timeout?: number) => diff --git a/web/test/e2e/pages/oppija/uiV2builder/controls.ts b/web/test/e2e/pages/oppija/uiV2builder/controls.ts index 5905fc4623..d873082758 100644 --- a/web/test/e2e/pages/oppija/uiV2builder/controls.ts +++ b/web/test/e2e/pages/oppija/uiV2builder/controls.ts @@ -50,11 +50,13 @@ export const FormField = ( throw new Error('Trying to set an editor value without editor') } return edit.set(value) - } + }, + viewer: child('value') } }) as Control< E & { value: (editMode: boolean) => Promise set: (value: string) => Promise + viewer: Locator } >