diff --git a/frontendtests/codecept.conf.ts b/frontendtests/codecept.conf.ts index aff13437..7bcc44f3 100644 --- a/frontendtests/codecept.conf.ts +++ b/frontendtests/codecept.conf.ts @@ -68,6 +68,8 @@ export const config: CodeceptJS.MainConfig = { include: { filters: "./helpers/filters", ortePage: "./pages/OrtePage", + konzertPage: "./pages/KonzertPage", + konzertGaestePage: "./pages/KonzertGaestePage", }, bootstrap: async () => { new SqliteHelper(config).createData("userstore", "admin"); diff --git a/frontendtests/data/veranstaltungenstore/Replacervorlage.json b/frontendtests/data/veranstaltungenstore/Replacervorlage.json new file mode 100644 index 00000000..e2f9d6df --- /dev/null +++ b/frontendtests/data/veranstaltungenstore/Replacervorlage.json @@ -0,0 +1,27 @@ +{ + "startDate": "2020-03-20T17:30:00.000Z", + "endDate": "2020-03-20T19:00:00.000Z", + "id": "[title]", + "url": "[title]", + "kopf": { + "titel": "[title]", + "beschreibung": "", + "eventTyp": "Club Konzert", + "flaeche": 100, + "kooperation": "", + "ort": "Jazzclub", + "pressename": "Jazzclub Karlsruhe", + "presseIn": "im Jazzclub Karlsruhe", + "genre": "", + "confirmed": false, + "rechnungAnKooperation": false, + "abgesagt": false, + "fotografBestellen": false, + "kannAufHomePage": false, + "kannInSocialMedia": false + }, + "artist": {}, + "presse": {}, + "technik": {}, + "unterkunft": {} +} diff --git a/frontendtests/helpers/SqliteHelper.ts b/frontendtests/helpers/SqliteHelper.ts index d0a608f3..db615add 100644 --- a/frontendtests/helpers/SqliteHelper.ts +++ b/frontendtests/helpers/SqliteHelper.ts @@ -59,6 +59,26 @@ class SqliteHelper extends Helper { }); } + createDataWithReplacer( + collectionName: string, + filename: string, + replacer: Map, + ) { + doInSqlite((db) => { + let json = fs.readFileSync( + `${__dirname}/../data/${collectionName}/${filename}.json`, + "utf8", + ); + + replacer.forEach((value, key) => { + json = json.replaceAll("[" + key + "]", value); + }); + + const object = JSON.parse(json); + this.storeInCollection(db, collectionName, object); + }); + } + createObject(collectionName, object) { doInSqlite((db) => { this.storeInCollection(db, collectionName, object); diff --git a/frontendtests/pages/KonzertGaestePage.ts b/frontendtests/pages/KonzertGaestePage.ts new file mode 100644 index 00000000..fad8271f --- /dev/null +++ b/frontendtests/pages/KonzertGaestePage.ts @@ -0,0 +1,63 @@ +const { I } = inject(); + +const buttons = { + addInTable: '(//button[@data-testid="add-in-table"])', + speichern: "Speichern", +}; + +export async function goToGaestePage() { + I.click(locate('div[role="tab"]').withText("Gäste am Abend")); + + I.waitForText("Gästeliste"); +} + +export async function addGaesteListe(guest: { + name: string; + comment: string; + number: number; + alreadyIn: number; +}) { + I.click(buttons.addInTable); + I.click('[data-testid="name0"]'); + I.fillField("#name", guest.name); + I.pressKey("Tab"); + I.fillField("#comment", guest.comment); + I.pressKey("Tab"); + I.fillField("#number", guest.number); + + I.click(buttons.speichern); +} + +export async function setAlreadyIn(row: number, value: number) { + I.click('[data-testid="alreadyIn' + row + '"]'); + I.fillField("#alreadyIn", value); + + // I.wait(5); + + I.pressKey("Tab"); + + // I.wait(5); + + I.click(buttons.speichern); +} + +export async function verifyGuestInStore( + title: string, + guest: { + name: string; + comment: string; + number: number; + alreadyIn: number; + }, + index: number = 0, +) { + const res = await I.loadObjectInCollection("veranstaltungenstore", title); + + I.assertDeepEqual(res.gaesteliste[index], { + name: guest.name, + comment: guest.comment, + number: guest.number, + alreadyIn: guest.alreadyIn, + key: "row" + index, + }); +} diff --git a/frontendtests/pages/KonzertPage.ts b/frontendtests/pages/KonzertPage.ts new file mode 100644 index 00000000..2c952def --- /dev/null +++ b/frontendtests/pages/KonzertPage.ts @@ -0,0 +1,21 @@ +const { I } = inject(); + +export async function createExampleKonzert(title: string) { + I.createData("optionenstore", "optionen"); + I.createData("optionenstore", "orte"); + + const replacer = new Map(); + replacer.set("title", title); + + I.createDataWithReplacer("veranstaltungenstore", "Replacervorlage", replacer); +} + +export async function goToEditKonzert(konzertTitle: string) { + I.amOnPage("/vue/veranstaltungen"); + I.waitForText(konzertTitle); + + I.click(locate("span.ant-collapse-header-text").withText(konzertTitle)); + + I.click(".bi-keyboard"); + I.waitForText("Allgemein"); +} diff --git a/frontendtests/steps.d.ts b/frontendtests/steps.d.ts index ace1ae96..b80b33fe 100644 --- a/frontendtests/steps.d.ts +++ b/frontendtests/steps.d.ts @@ -1,6 +1,8 @@ /// type filters = typeof import("./helpers/filters"); type ortePage = typeof import("./pages/OrtePage"); +type konzertPage = typeof import("./pages/KonzertPage"); +type konzertGaestePage = typeof import("./pages/KonzertGaestePage"); type SqliteHelper = import("./helpers/SqliteHelper"); type ChaiWrapper = import("codeceptjs-chai"); @@ -11,6 +13,8 @@ declare namespace CodeceptJS { login: any; filters: filters; ortePage: ortePage; + konzertPage: konzertPage; + konzertGaestePage: konzertGaestePage; } interface Methods extends Playwright, SqliteHelper, ChaiWrapper {} interface I extends WithTranslation {} diff --git a/frontendtests/tests/05_konzert_gaeste_test.ts b/frontendtests/tests/05_konzert_gaeste_test.ts new file mode 100644 index 00000000..1b868f42 --- /dev/null +++ b/frontendtests/tests/05_konzert_gaeste_test.ts @@ -0,0 +1,34 @@ +Feature("Konzert Gäste"); + +Before(({ login }) => { + login("admin"); +}); + +Scenario( + "Erstelle Gast in Gästeliste und setze alreadyIn", + async ({ konzertPage, konzertGaestePage }) => { + const konzertTitle = "GaesteBeispiel"; + await konzertPage.createExampleKonzert(konzertTitle); + + await konzertPage.goToEditKonzert(konzertTitle); + await konzertGaestePage.goToGaestePage(); + + const guest = { + name: "Stefan Rinderle", + comment: "Kommt später", + number: 2, + alreadyIn: 0, + }; + + await konzertGaestePage.addGaesteListe(guest); + + await konzertGaestePage.verifyGuestInStore(konzertTitle, guest); + + await konzertGaestePage.setAlreadyIn(0, 1); + + await konzertGaestePage.verifyGuestInStore(konzertTitle, { + ...guest, + alreadyIn: 1, + }); + }, +);