diff --git a/package-lock.json b/package-lock.json index a081b50..7d6b31b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -324,9 +324,9 @@ "dev": true }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "dependencies": { "path-key": "^3.1.0", diff --git a/src/helpers/functions.js b/src/helpers/functions.js new file mode 100644 index 0000000..1f2a674 --- /dev/null +++ b/src/helpers/functions.js @@ -0,0 +1,100 @@ +export function jdiNaRegistraci(page) { + return page.goto('/registrace') +} + +export function jmenoAPrijmeni(page) { + return page.getByLabel("Jméno a příjmení") +} + +export function emailPole(page) { + return page.getByLabel("Email") +} + +export function hesloPole(page) { + return page.getByLabel("Heslo") +} + +export function kontrolaHeslaPole(page) { + return page.getByLabel("Kontrola hesla") +} + +export function tlacitkoZaregistrovat(page) { + return page.getByRole("button", { name: "Zaregistrovat" }) +} + +export function prihlasen(page) { + return page.getByRole("button", { name: "Iv Jindrová" }) +} + +export function neprihlasen(page) { + return page.getByRole('link', { name: ' Přihlásit' }) +} + +export function generujNáhodneIco() { + return String(Math.floor(Math.random() * 90000000) + 10000000) +} + +export function generujNazevSkoly() { + const krajskáMěsta = [ + "Praha", "Brno", "Ostrava", "Plzeň", "Liberec", + "Hradec Králové", "Olomouc", "Pardubice", "Ústí nad Labem", + "Zlín", "České Budějovice" + ]; + + const typSkoly = Math.random() < 0.5 ? "ZŠ" : "MŠ"; + + const randomIndex = Math.floor(Math.random() * krajskáMěsta.length); + const mesto = krajskáMěsta[randomIndex]; + + const cisloSkoly = Math.floor(Math.random() * 100) + 1; + + return `${typSkoly} ${mesto} ${cisloSkoly}`; +} + +export function generujZastupce() { + const jmena = [ + "Alena", "Andrea", "Barbora", "Cecílie", "Daniela", + "Evžénie", "Gabriela", "Ivana", "Jitka", + "Karolína", "Lucie" + ]; + + const prijmeni = [ + "Nová", "Stará", "Zelená", "Červená", "Fialová", + "Novotná", "Nováková", "Müllerová", "Zemanová", + "Grosmanová", "Dvořáková" + ]; + + const titul = Math.random() < 0.5 ? "Ing." : "Mgr."; + + const nahodneJmeno = jmena[Math.floor(Math.random() * jmena.length)]; + const nahodnePrijmeni = prijmeni[Math.floor(Math.random() * prijmeni.length)]; + + return `${titul} ${nahodneJmeno} ${nahodnePrijmeni}`; +} + +export function generujDnesniDen() { + const dnes = new Date(); + const rok = dnes.getFullYear(); + const mesic = dnes.getMonth() + 1; + const den = dnes.getDate(); + const datumJakoRetezec = `${den}.${mesic}.${rok}`; + console.log(datumJakoRetezec); + return datumJakoRetezec +} + +export function pridejNahodneDnyKDatu(datum) { + function generujNahodneCislo() { + return Math.floor(Math.random() * 11) + 4; + } + + const nahodnyPocetDni = generujNahodneCislo(); + + datum.setDate(datum.getDate() + nahodnyPocetDni); + + return datum.toLocaleDateString('cs-CZ'); + } + +export async function ziskejPlaceholderText(selector, page) { + const element = await page.$(selector); + return await element.evaluate(element => element.placeholder); + } \ No newline at end of file diff --git a/src/tests/cistykod.spec.js b/src/tests/cistykod.spec.js new file mode 100644 index 0000000..36c4458 --- /dev/null +++ b/src/tests/cistykod.spec.js @@ -0,0 +1,93 @@ +import { expect, test } from "@playwright/test"; + +test("Zobrazení formuláře registrace", async ({ page }) => { + await page.goto("/registrace"); + + const jmenoAPrijmeni = page.getByLabel("Jméno a příjmení"); + const emailPole = page.getByLabel("Email"); + const hesloPole = page.getByLabel("Heslo"); + const kontrolaHeslaPole = page.getByLabel("Kontrola hesla"); + const tlacitkoZaregistrovat = page.getByRole("button", { name: "Zaregistrovat" }); + + await expect(jmenoAPrijmeni).toBeVisible(); + await expect(emailPole).toBeVisible(); + await expect(hesloPole).toBeVisible(); + await expect(kontrolaHeslaPole).toBeVisible(); + + await expect(tlacitkoZaregistrovat).toBeVisible(); + await expect(tlacitkoZaregistrovat).toHaveText("Zaregistrovat"); +}) + +test("Validní registrace uživatele", async ({ page }) => { + await page.goto("/registrace"); + + // Proměnné k jednotlivým objektům + const jmenoAPrijmeni = page.getByLabel("Jméno a příjmení"); + const emailPole = page.getByLabel("Email"); + const hesloPole = page.getByLabel("Heslo"); + const kontrolaHeslaPole = page.getByLabel("Kontrola hesla"); + const tlacitkoZaregistrovat = page.getByRole("button", { name: "Zaregistrovat" }); + const prihlasen = page.getByRole("button", { name: "Iv Jindrová" }) + const prihlasen1 = page.locator('strong:has-text("Iv Jindrová")'); + + await jmenoAPrijmeni.fill("Iv Jindrová"); + await emailPole.fill("yjindrova@gmail.com"); + await hesloPole.fill("Zima2024!"); + await kontrolaHeslaPole.fill("Zima2024!"); + await tlacitkoZaregistrovat.click(); + + await expect(prihlasen).toHaveText("Iv Jindrová") + +}) + +test("Nevalidní registrace uživatele - stejný email", async ({ page }) => { + await page.goto("/registrace"); + + const jmenoAPrijmeni = page.getByLabel("Jméno a příjmení"); + const emailPole = page.getByLabel("Email"); + const hesloPole = page.getByLabel("Heslo"); + const kontrolaHeslaPole = page.getByLabel("Kontrola hesla"); + const tlacitkoZaregistrovat = page.getByRole("button", { name: "Zaregistrovat" }); + + const textovaChybaEmail = page.locator("span.invalid-feedback"); + const chybaSkakaci = page.locator(".toast.toast-error"); + + await jmenoAPrijmeni.fill("Ivan Jindrová"); + await emailPole.fill("ivanjindrova@gmail.com"); + await hesloPole.fill("Zima2024!"); + await kontrolaHeslaPole.fill("Zima2024!"); + await tlacitkoZaregistrovat.click(); + + await textovaChybaEmail.isVisible(); + await chybaSkakaci.isVisible(); + + await expect(textovaChybaEmail).toHaveText("Účet s tímto emailem již existuje"); + await expect(chybaSkakaci).toHaveText("׊patně zadané poleNěkteré pole obsahuje špatně zadanou hodnotu") + +}) + +test("Nevalidní registrace uživatele - heslo jen s čísly", async ({ page }) => { + await page.goto("/registrace"); + + const jmenoAPrijmeni = page.getByLabel("Jméno a příjmení"); + const emailPole = page.getByLabel("Email"); + const hesloPole = page.getByLabel("Heslo"); + const kontrolaHeslaPole = page.getByLabel("Kontrola hesla"); + const tlacitkoZaregistrovat = page.getByRole("button", { name: "Zaregistrovat" }); + + const textovaChybaEmailCisla = page.getByText('Heslo musí obsahovat minimálně 6 znaků, velké i malé písmeno a číslici') + const chybaSkakaci = page.locator(".toast.toast-error"); + + await jmenoAPrijmeni.fill("Iva Jindrová"); + await emailPole.fill("ivajindrova@gmail.com"); + await hesloPole.fill("123456"); + await kontrolaHeslaPole.fill("123456"); + await tlacitkoZaregistrovat.click(); + + await textovaChybaEmailCisla.isVisible(); + await chybaSkakaci.isVisible(); + + await expect(textovaChybaEmailCisla).toHaveText("Heslo musí obsahovat minimálně 6 znaků, velké i malé písmeno a číslici"); + await expect(chybaSkakaci).toHaveText("׊patně zadaná poleVíce polí obsahuje špatně zadanou hodnotu") + +}) \ No newline at end of file diff --git a/src/tests/example.spec.js b/src/tests/example.spec.js deleted file mode 100644 index 4d2f244..0000000 --- a/src/tests/example.spec.js +++ /dev/null @@ -1,6 +0,0 @@ -import { test } from "@playwright/test"; - -test("should open login page", async ({ page }) => { - await page.goto("/prihlaseni"); - console.log(await page.title()); -}); diff --git a/src/tests/forTeachers/novaObjednavka.spec.js b/src/tests/forTeachers/novaObjednavka.spec.js new file mode 100644 index 0000000..387aef3 --- /dev/null +++ b/src/tests/forTeachers/novaObjednavka.spec.js @@ -0,0 +1,119 @@ +import { expect, test } from "@playwright/test"; +import { StrankaNoveObjednavky } from "./pages/novaObjednavka.page"; +import { generujDnesniDen, generujNazevSkoly, generujNáhodneIco, generujZastupce, neprihlasen, pridejNahodneDnyKDatu, ziskejPlaceholderText } from "../../helpers/functions"; + +test.describe("Zobrazení formuláře objednávky", async () => { + test.beforeEach(async ({page}) => { + const strankaNoveObjednavky = new StrankaNoveObjednavky(page); + await strankaNoveObjednavky.otevrit(); + + const neprihlaseni = await neprihlasen(page); + await expect(neprihlaseni).toHaveText("Přihlásit"); + }); + + test("Lze zobrazit objednávkový formulář", async ({ page }) => { + const strankaNoveObjednavky = new StrankaNoveObjednavky(page); + await strankaNoveObjednavky.otevrit(); + await expect(strankaNoveObjednavky.heading).toBeVisible(); + }) + + test("Lze prokliknout na stránku s objednávkou", async ({ page }) => { + await page.goto("https://team8-2022brno.herokuapp.com"); + + const proklikProUcitele = new StrankaNoveObjednavky(page); + await expect(proklikProUcitele.proUcitele).toBeVisible(); + await proklikProUcitele.proUcitele.click(); + + const proklikObjednavkaMSZS = new StrankaNoveObjednavky(page); + await proklikObjednavkaMSZS.objednavkaMSZS.click(); + + await page.getByRole('button', { name: 'Pro učitelé' }).click(); + await page.locator('.dropdown-item').filter({ hasText: 'Objednávka pro MŠ/ZŠ' }).click(); + }) + + test("Lze vyplnit IČO a dojde k hledání v Ares", async ({ page }) => { + const strankaNoveObjednavky = new StrankaNoveObjednavky(page); + const icoNahodne = await generujNáhodneIco(); + await strankaNoveObjednavky.ico.fill(icoNahodne); + console.log(icoNahodne); + await expect(strankaNoveObjednavky.ico).toHaveValue(icoNahodne); + + await strankaNoveObjednavky.page.locator('#ico').press('Enter'); + + await expect(strankaNoveObjednavky.odberatel).not.toBeEditable(); + await expect(strankaNoveObjednavky.celaAdresa).not.toBeEditable(); + + const selektorOdberatel = '#client'; + const placeHoldTextOdb = await ziskejPlaceholderText(selektorOdberatel, strankaNoveObjednavky.page); + console.log('Text z placeholderu na poli Odběratel:', placeHoldTextOdb); + + const selektorAdresa = '#address'; + const placeHoldTextAdr = await ziskejPlaceholderText(selektorAdresa, strankaNoveObjednavky.page); + console.log('Text z placeholderu na poli Úplná adresa:', placeHoldTextAdr); + + await expect(strankaNoveObjednavky.toggle).toBeVisible(); + }); +}) + +test.describe("Vytvoření objednávky", async () => { + test.beforeEach(async ({page}) => { + const strankaNoveObjednavky = new StrankaNoveObjednavky(page); + await strankaNoveObjednavky.otevrit(); + + const neprihlaseni = await neprihlasen(page); + await expect(neprihlaseni).toHaveText("Přihlásit"); + }); + + test("Validní vyplnění a odeslání objednávky", async ({ page }) => { + const strankaNoveObjednavky = new StrankaNoveObjednavky(page); + + //Nejprve chci vyplnit název odběratele + const odberatelNahodne = await generujNazevSkoly(); + await strankaNoveObjednavky.odberatel.fill(odberatelNahodne); + console.log(odberatelNahodne); + await expect(strankaNoveObjednavky.odberatel).toHaveValue(odberatelNahodne); + + //Pak až IČO + const icoNahodne = await generujNáhodneIco(); + await strankaNoveObjednavky.ico.fill(icoNahodne); + console.log(icoNahodne); + await expect(strankaNoveObjednavky.ico).toHaveValue(icoNahodne); + + await strankaNoveObjednavky.celaAdresa.fill("Nová ulice 1685/8, 140 00 Praha"); + + const zastupceNahodne = await generujZastupce(); + await strankaNoveObjednavky.zastupce.fill(zastupceNahodne); + console.log(zastupceNahodne); + await expect(strankaNoveObjednavky.zastupce).toHaveValue(zastupceNahodne); + + await strankaNoveObjednavky.kontaktniOsoba.fill(zastupceNahodne); + await strankaNoveObjednavky.telefon.fill("796852147"); + await strankaNoveObjednavky.email.fill("skolaMSZS@gmail.com"); + + const dnesek = await generujDnesniDen(); + await strankaNoveObjednavky.startDate.fill(dnesek); + + const mojeDatum = new Date(); + const noveDatum = pridejNahodneDnyKDatu(mojeDatum); + await strankaNoveObjednavky.endDate.fill(noveDatum); + + await strankaNoveObjednavky.primestkyTabor.click(); + await strankaNoveObjednavky.pocetDeti.fill("12"); + await strankaNoveObjednavky.vekDeti.fill("7"); + await strankaNoveObjednavky.doprovod.fill("4"); + await strankaNoveObjednavky.ulozitObjednavku.click(); + //await page.pause(50000) + + //await expect(page.locator('Děkujeme za objednávku')).toHaveText("Děkujeme za objednávku"); + + }) + + test("Nelze odeslat prázdnou objednávku", async ({ page }) => { + const strankaNoveObjednavky = new StrankaNoveObjednavky(page); + + await strankaNoveObjednavky.primestkyTabor.click(); + await strankaNoveObjednavky.ulozitObjednavku.click(); + + await expect(strankaNoveObjednavky.heading).toBeVisible(); + }) +}) \ No newline at end of file diff --git a/src/tests/forTeachers/pages/novaObjednavka.page.js b/src/tests/forTeachers/pages/novaObjednavka.page.js new file mode 100644 index 0000000..22fff81 --- /dev/null +++ b/src/tests/forTeachers/pages/novaObjednavka.page.js @@ -0,0 +1,32 @@ +export class StrankaNoveObjednavky { + constructor(page) { + this.page = page; + this.heading = this.page.getByRole("heading", { level: 3 }); + this.proUcitele = this.page.getByRole('button', { name: 'Pro učitelé' }); + this.objednavkaMSZS = this.page.getByRole('link', { name: 'Objednávka pro MŠ/ZŠ' }) + this.ico = this.page.getByLabel('IČO') + this.odberatel = this.page.getByLabel('Odběratel') + this.celaAdresa = this.page.getByLabel('Úplná adresa') + this.toggle = this.page.getByText('Data z ARESu se nepodařilo načíst, vyplňte je prosím ručně') + this.primestkyTabor = this.page.getByRole('tab', { name: 'Příměstský tábor' }) + this.ulozitObjednavku = this.page.getByRole('button', { name: 'Uložit objednávku' }) + + this.zastupce = this.page.getByLabel('Zastoupena - ředitel(ka) školy') + this.kontaktniOsoba = this.page.getByLabel('Jméno a příjmení') + this.telefon = this.page.getByLabel('Telefon') + this.email = this.page.getByLabel('Email') + this.startDate = this.page.getByLabel('Upřednostňovaný termín 1') + this.endDate = this.page.locator('#end_date_1') + this.pocetDeti = this.page.getByRole('spinbutton', { name: 'Počet dětí' }) + this.vekDeti = this.page.getByRole('textbox', { name: 've věku' }) + this.doprovod = this.page.getByRole('spinbutton', { name: 'Počet pedagogického doprovodu' }) + } + + async otevrit() { + await this.page.goto("/objednavka/pridat") + } + + + + +} \ No newline at end of file diff --git a/src/tests/homework.spec.js b/src/tests/homework.spec.js new file mode 100644 index 0000000..19cf227 --- /dev/null +++ b/src/tests/homework.spec.js @@ -0,0 +1,97 @@ +import { expect, test } from "@playwright/test"; +import { emailPole, hesloPole, jdiNaRegistraci, jmenoAPrijmeni, kontrolaHeslaPole, prihlasen, tlacitkoZaregistrovat } from "../helpers/functions"; + +test.describe("Registrační stránka a validní registrace", async () => { + + test.beforeEach(async ({page}) => { + await jdiNaRegistraci(page); + }); + + test("Zobrazení formuláře registrace", async ({ page }) => { + const poleJmenoPrijmeni= await jmenoAPrijmeni(page); + const poleEmail = await emailPole(page); + const poleHeslo = await hesloPole(page); + const poleKontrolaHesla = await kontrolaHeslaPole(page); + const zaregistrovatTlacitko = await tlacitkoZaregistrovat(page); + + await expect(poleJmenoPrijmeni).toBeVisible(); + await expect(poleEmail).toBeVisible(); + await expect(poleHeslo).toBeVisible(); + await expect(poleKontrolaHesla).toBeVisible(); + + await expect(zaregistrovatTlacitko).toBeVisible(); + await expect(zaregistrovatTlacitko).toHaveText("Zaregistrovat"); + }); + + test("Validní registrace uživatele", async ({ page }) => { + const poleJmenoPrijmeni= await jmenoAPrijmeni(page); + const poleEmail = await emailPole(page); + const poleHeslo = await hesloPole(page); + const poleKontrolaHesla = await kontrolaHeslaPole(page); + const zaregistrovatTlacitko = await tlacitkoZaregistrovat(page); + const prihlaseni = await prihlasen(page); + + await poleJmenoPrijmeni.fill("Iv Jindrová"); + await poleEmail.fill('ivjindrova' + Date.now() + '@gmail.com') + await poleHeslo.fill("Zima2024!"); + await poleKontrolaHesla.fill("Zima2024!"); + await zaregistrovatTlacitko.click(); + + await expect(prihlaseni).toHaveText("Iv Jindrová"); + }); +}) + +test.describe("Nevalidní registrace", () => { + + test.beforeEach(async ({page}) => { + await jdiNaRegistraci(page); + }); + + test("Nevalidní registrace uživatele - stejný email", async ({ page }) => { + const poleJmenoPrijmeni= await jmenoAPrijmeni(page); + const poleEmail = await emailPole(page); + const poleHeslo = await hesloPole(page); + const poleKontrolaHesla = await kontrolaHeslaPole(page); + const zaregistrovatTlacitko = await tlacitkoZaregistrovat(page); + + const textovaChybaEmail = page.locator("span.invalid-feedback"); + const chybaSkakaci = page.locator(".toast.toast-error"); + + await poleJmenoPrijmeni.fill("Ivan Jindrová"); + await poleEmail.fill("ivanjindrova@gmail.com"); + await poleHeslo.fill("Zima2024!"); + await poleKontrolaHesla.fill("Zima2024!"); + await zaregistrovatTlacitko.click(); + + await textovaChybaEmail.isVisible(); + await chybaSkakaci.isVisible(); + + await expect(textovaChybaEmail).toHaveText("Účet s tímto emailem již existuje"); + await expect(chybaSkakaci).toHaveText("׊patně zadané poleNěkteré pole obsahuje špatně zadanou hodnotu"); + + }); + + test("Nevalidní registrace uživatele - heslo jen s čísly", async ({ page }) => { + const poleJmenoPrijmeni= await jmenoAPrijmeni(page); + const poleEmail = await emailPole(page); + const poleHeslo = await hesloPole(page); + const poleKontrolaHesla = await kontrolaHeslaPole(page); + const zaregistrovatTlacitko = await tlacitkoZaregistrovat(page); + + const textovaChybaEmailCisla = page.getByText("Heslo musí obsahovat minimálně 6 znaků, velké i malé písmeno a číslici"); + const chybaSkakaci = page.locator(".toast.toast-error"); + + await poleJmenoPrijmeni.fill("Iva Jindrová"); + await poleEmail.fill("ivajindrova@gmail.com"); + await poleHeslo.fill("123456"); + await poleKontrolaHesla.fill("123456"); + await zaregistrovatTlacitko.click(); + + await textovaChybaEmailCisla.isVisible(); + await chybaSkakaci.isVisible(); + + await expect(textovaChybaEmailCisla).toHaveText("Heslo musí obsahovat minimálně 6 znaků, velké i malé písmeno a číslici"); + await expect(chybaSkakaci).toHaveText("׊patně zadaná poleVíce polí obsahuje špatně zadanou hodnotu"); + }); + +}); \ No newline at end of file