diff --git a/src/main/java/cz/czechitas/automation/ApplicationAction.java b/src/main/java/cz/czechitas/automation/ApplicationAction.java index 448191c..0f9ed51 100644 --- a/src/main/java/cz/czechitas/automation/ApplicationAction.java +++ b/src/main/java/cz/czechitas/automation/ApplicationAction.java @@ -36,7 +36,7 @@ void selectProgrammingSection() { */ void clickCreatePythonApplicationButton() { //TODO: modify css selector to reflect python course instead of first course (method parameter?) - var createApplicationButton = elementFinder.findByCssSelector(".card-body a"); + var createApplicationButton = elementFinder.findByXPath("/html/body/div/div/div/div/div/div[2]/div/div[2]/a"); createApplicationButton.click(); } diff --git a/src/main/java/cz/czechitas/automation/InternalMenuAction.java b/src/main/java/cz/czechitas/automation/InternalMenuAction.java index efd364d..9aeacc9 100644 --- a/src/main/java/cz/czechitas/automation/InternalMenuAction.java +++ b/src/main/java/cz/czechitas/automation/InternalMenuAction.java @@ -48,4 +48,9 @@ void goToExportsSection() { var exportsMenuItem = elementFinder.findByXPath("//*[@id='adminNavbar']//a[contains(text(), 'Exporty')]"); exportsMenuItem.click(); } + + void goToUsersSection() { + var usersMenuItem = elementFinder.findByXPath("//*[@id='adminNavbar']//a[contains(text(), 'Uživatelé')]"); + usersMenuItem.click(); + } } diff --git a/src/main/java/cz/czechitas/automation/LoginAction.java b/src/main/java/cz/czechitas/automation/LoginAction.java index d34a908..ab0da6e 100644 --- a/src/main/java/cz/czechitas/automation/LoginAction.java +++ b/src/main/java/cz/czechitas/automation/LoginAction.java @@ -3,6 +3,8 @@ import javax.annotation.ParametersAreNonnullByDefault; import java.util.Objects; +import static org.assertj.core.api.Assertions.assertThat; + /** * Login/logout specific selenium actions * diff --git a/src/main/java/cz/czechitas/automation/OrderAction.java b/src/main/java/cz/czechitas/automation/OrderAction.java index 4dd19c6..ddd28c9 100644 --- a/src/main/java/cz/czechitas/automation/OrderAction.java +++ b/src/main/java/cz/czechitas/automation/OrderAction.java @@ -52,4 +52,10 @@ void search(String textToSearch) { searchInput.clear(); searchInput.sendKeys(textToSearch); } + void deleteOrder() { + var deleteButton = elementFinder.findByCssSelector(".odd > td:nth-child(6) > div:nth-child(1) > a:nth-child(3)"); + deleteButton.click(); + var confirmButton = elementFinder.findByXPath("/html/body/div[1]/div/div/div/div/div[2]/div[2]/div/table/tbody/tr/td[6]/div[2]/div/div/div/div[2]/form/button"); + confirmButton.click(); + } } diff --git a/src/main/java/cz/czechitas/automation/OrderDetailAction.java b/src/main/java/cz/czechitas/automation/OrderDetailAction.java index 445bc67..6361dab 100644 --- a/src/main/java/cz/czechitas/automation/OrderDetailAction.java +++ b/src/main/java/cz/czechitas/automation/OrderDetailAction.java @@ -1,5 +1,7 @@ package cz.czechitas.automation; +import org.openqa.selenium.Keys; + import java.util.Objects; /** @@ -39,11 +41,27 @@ void insertStartDate(String startDate) { var startDateInput = elementFinder.findByXPath("//*[@id=\"start_date_1\"]"); startDateInput.sendKeys(startDate); } + void insertStartDate2(String startDate) { + var startDateInput = elementFinder.findByXPath("//*[@id=\"start_date_2\"]"); + startDateInput.sendKeys(startDate); + } + void insertStartDate3(String startDate) { + var startDateInput = elementFinder.findByXPath("//*[@id=\"start_date_3\"]"); + startDateInput.sendKeys(startDate); + } void insertEndDate(String endDate) { var endDateInput = elementFinder.findByXPath("//*[@id=\"end_date_1\"]"); endDateInput.sendKeys(endDate); } + void insertEndDate2(String endDate) { + var endDateInput = elementFinder.findByXPath("//*[@id=\"end_date_2\"]"); + endDateInput.sendKeys(endDate); + } + void insertEndDate3(String endDate) { + var endDateInput = elementFinder.findByXPath("//*[@id=\"end_date_3\"]"); + endDateInput.sendKeys(endDate); + } void selectForenoonSuburbanCampVariant() { var element = elementFinder.findByXPath("//*[@id=\"camp-date_part\"]"); @@ -105,9 +123,19 @@ void insertFullAddress(String fullAddress) { fullAddressInput.sendKeys(fullAddress); } - void insertStartTime(String arrivalTime) { + /*void insertStartTime(String arrivalTime) { var arrivalTimeInput = elementFinder.findByXPath("//*[@id=\"nature-start_time\"]"); arrivalTimeInput.sendKeys(arrivalTime); + }*/ + + void insertStartTime(String arrivalTime) { + var arrivalTimeField = elementFinder.findByXPath("//*[@id=\"nature-start_time\"]"); + arrivalTimeField.click(); + var arrivalTimeInput = elementFinder.findByXPath("/html/body/div[8]/div/div[1]/input"); + arrivalTimeInput.click(); + arrivalTimeInput.sendKeys(arrivalTime); + arrivalTimeInput.sendKeys(Keys.ENTER); + arrivalTimeField.sendKeys(Keys.ENTER); } void selectBreakfastStartToSchoolInNature() { @@ -120,6 +148,11 @@ void selectBreakfastStartToSchoolInNature() { option.click(); } + /*void insertEndTime(String endTime) { + var arrivalTimeInput = elementFinder.findByXPath("//*[@id=\"nature-end_time\"]"); + arrivalTimeInput.sendKeys(endTime); + }*/ + void selectLunchStartToSchoolInNature() { var element = elementFinder.findByXPath("//*[@id=\"nature-start_food\"]"); @@ -142,7 +175,13 @@ void selectDinnerStartToSchoolInNature() { void insertEndTime(String endTime) { var arrivalTimeInput = elementFinder.findByXPath("//*[@id=\"nature-end_time\"]"); - arrivalTimeInput.sendKeys(endTime); + //arrivalTimeInput.sendKeys(endTime); + arrivalTimeInput.click(); + var endTimeInput = elementFinder.findByCssSelector("div.flatpickr-calendar:nth-child(11) > div:nth-child(1) > div:nth-child(1) > input:nth-child(1)"); + endTimeInput.click(); + endTimeInput.sendKeys(endTime); + endTimeInput.sendKeys(Keys.ENTER); + arrivalTimeInput.sendKeys(Keys.ENTER); } void selectBreakfastEndToSchoolInNature() { @@ -184,4 +223,13 @@ void saveSchoolInNatureOrder() { var saveButton = elementFinder.findByXPath("/html/body/div[1]/div/div/div/div/div/form/div[5]/div[2]/div[2]/input"); saveButton.click(); } + void insertICO(String ico) { + Objects.requireNonNull(ico); + + var icoInputBox = elementFinder.findByXPath("//*[@id='ico']"); + icoInputBox.sendKeys(ico); + icoInputBox.sendKeys(Keys.ENTER); + /*var fullAddressElement = elementFinder.findByXPath("//*[@id='address']"); + fullAddressElement.click();*/ + } } diff --git a/src/main/java/cz/czechitas/automation/SeleniumActionFacade.java b/src/main/java/cz/czechitas/automation/SeleniumActionFacade.java index 0980d6a..eed37bf 100644 --- a/src/main/java/cz/czechitas/automation/SeleniumActionFacade.java +++ b/src/main/java/cz/czechitas/automation/SeleniumActionFacade.java @@ -28,6 +28,7 @@ final class SeleniumActionFacade { final ApplicationDetail applicationDetailsSection; final ProfileAction profileSection; final RegisterAction registerSection; + final UsersAction usersSection; public SeleniumActionFacade(WebDriver driver) { var elementFinder = new ElementFinder(Objects.requireNonNull(driver)); @@ -40,6 +41,7 @@ public SeleniumActionFacade(WebDriver driver) { this.applicationDetailsSection = new ApplicationDetail(elementFinder); this.profileSection = new ProfileAction(elementFinder); this.registerSection = new RegisterAction(elementFinder); + this.usersSection = new UsersAction(elementFinder); } void waitFor(long seconds) { diff --git a/src/main/java/cz/czechitas/automation/UsersAction.java b/src/main/java/cz/czechitas/automation/UsersAction.java new file mode 100644 index 0000000..35ba5bb --- /dev/null +++ b/src/main/java/cz/czechitas/automation/UsersAction.java @@ -0,0 +1,26 @@ +package cz.czechitas.automation; + +import java.util.Objects; + +final class UsersAction { + + private final ElementFinder elementFinder; + + UsersAction(ElementFinder elementFinder) { + this.elementFinder = Objects.requireNonNull(elementFinder); + } + + /** + * Click Vytvorit novou prihlasku on table view + */ + void clickCreateNewUserButton() { + var createUserButton = elementFinder.findByCssSelector("a.btn-info"); + createUserButton.click(); + } + + void search(String textToSearch) { + var searchInput = elementFinder.findByXPath("//input[@type='search']"); + searchInput.clear(); + searchInput.sendKeys(textToSearch); + } +} diff --git a/src/test/java/cz/czechitas/automation/CreateApplicationAsParent.java b/src/test/java/cz/czechitas/automation/CreateApplicationAsParent.java new file mode 100644 index 0000000..4adc831 --- /dev/null +++ b/src/test/java/cz/czechitas/automation/CreateApplicationAsParent.java @@ -0,0 +1,166 @@ +package cz.czechitas.automation; +import org.junit.jupiter.api.Test; + +import java.util.Map; + +final class CreateApplicationAsParent extends TestRunner { + + Map credentials = Map.of( + "masterEmail", "ladymaster@gmail.com", + "masterPassword","Lady123", + "masterName", "Lady Galadriel", + "parentEmail", "john123@email.com", + "parentPassword", "A1sdfg", + "parentName", "John Baggins" + ); + Map application = Map.of( + "termHappy", "02.02. - 06.02.2026" + + ); + + @Test + void smokePageUrlTest() { + browser.headerMenu.goToHomePage(); + asserter.generalSection.checkCurrentUrl("https://team8-2022brno.herokuapp.com/"); + } + @Test + void createApplicationRequiredFieldsHappyTest() { + + var firstName = browser.generateRandomName(6); + var lastName = browser.generateRandomName(8); + Map newApplicationData = Map.of( + "term", "02.02. - 06.02.2026", + "firstName", firstName, + "lastName", lastName, + "birthday", "15.12.2015", + "paymentMethod", "Hotově" + ); + logIn(credentials.get("parentEmail"), credentials.get("parentPassword"), credentials.get("parentName")); + + browser.waitFor(2); + browser.applicationSection.clickCreateNewApplicationButton(); + browser.waitFor(2); + browser.applicationSection.selectProgrammingSection(); + browser.applicationSection.clickCreatePythonApplicationButton(); + + fillOutApplicationForm(newApplicationData); + browser.waitFor(2); + + asserter.applicationDetailSection.checkTerm(newApplicationData.get("term")); + asserter.applicationDetailSection.checkFirstName(newApplicationData.get("firstName")); + asserter.applicationDetailSection.checkLastName(newApplicationData.get("lastName")); + asserter.applicationDetailSection.checkDateOfBirth(newApplicationData.get("birthday")); + asserter.applicationDetailSection.checkPaymentMethod(newApplicationData.get("paymentMethod")); + } + @Test + void createApplicationHappyTest() { + var firstName = browser.generateRandomName(6); + var lastName = browser.generateRandomName(8); + var note = browser.generateRandomName(25); + var healthDisabilityNote = browser.generateRandomName(25); + + Map applicationData = Map.of( + + "term", "02.02. - 06.02.2026", + "firstName", firstName, + "lastName", lastName, + "birthday", "15.12.2015", + "note", note, + "paymentMethod", "Bankovní převod", + "healthDisability", "ano", + "healthDisabilityNote", healthDisabilityNote + ); + logIn(credentials.get("parentEmail"), credentials.get("parentPassword"), credentials.get("parentName")); + + browser.waitFor(2); + browser.applicationSection.clickCreateNewApplicationButton(); + browser.waitFor(2); + browser.applicationSection.selectProgrammingSection(); + browser.applicationSection.clickCreatePythonApplicationButton(); + + fillOutApplicationForm(applicationData); + browser.waitFor(2); + + asserter.applicationDetailSection.checkTerm(applicationData.get("term")); + asserter.applicationDetailSection.checkFirstName(applicationData.get("firstName")); + asserter.applicationDetailSection.checkLastName(applicationData.get("lastName")); + asserter.applicationDetailSection.checkDateOfBirth(applicationData.get("birthday")); + asserter.applicationDetailSection.checkPaymentMethod(applicationData.get("paymentMethod")); + asserter.applicationDetailSection.checkNote(applicationData.get("note")); + asserter.applicationDetailSection.checkHealthDisabilityNote(applicationData.get("healthDisabilityNote")); + + //browser.loginSection.logout(); + } + + @Test + void studentYoungerThan4() { + var firstName = browser.generateRandomName(8); + var lastName = browser.generateRandomName(10); + var note = browser.generateRandomName(35); + var healthDisabilityNote = browser.generateRandomName(42); + + Map applicationData = Map.of( + + "term", "28.11.2025", + "firstName", firstName, + "lastName", lastName, + "birthday", "29.11.2021", + "paymentMethod", "Bankovní převod" + ); + logIn(credentials.get("parentEmail"), credentials.get("parentPassword"), credentials.get("parentName")); + + browser.waitFor(2); + browser.applicationSection.clickCreateNewApplicationButton(); + browser.waitFor(2); + browser.applicationSection.selectProgrammingSection(); + browser.applicationSection.clickCreatePythonApplicationButton(); + + fillOutApplicationForm(applicationData); + browser.waitFor(2); + + asserter.applicationDetailSection.checkErrorMessage("Žák musí dovršit 4 roky nejpozději v den začátku kurzu"); + //browser.loginSection.logout(); + } + + // FUnctions + void logIn(String email, String password, String name) { + browser.loginSection.clickLoginMenuLink(); + browser.loginSection.insertEmail(email); + browser.loginSection.insertPassword(password); + browser.loginSection.clickLoginButton(); + asserter.loginSection.checkUserIsLoggedIn(name); + //asserter.generalSection.checkCurrentUrl("https://team8-2022brno.herokuapp.com/zaki"); + } + + void fillOutApplicationForm(Map applicationData) { + browser.applicationDetailsSection.selectTerm(applicationData.get("term")); + browser.applicationDetailsSection.insertStudentFirstName(applicationData.get("firstName")); + browser.applicationDetailsSection.insertStudentLastName(applicationData.get("lastName")); + browser.applicationDetailsSection.insertBirthdate(applicationData.get("birthday")); + if (applicationData.containsKey("note")) { + browser.applicationDetailsSection.insertNote(applicationData.get("note")); + } + browser.applicationDetailsSection.clickAcceptTermsCheckbox(); + switch (applicationData.get("paymentMethod")) { + case "Hotově": + browser.applicationDetailsSection.selectCashPaymentMethod(); + break; + case "Bankovní převod": + browser.applicationDetailsSection.selectBankTransferPaymentMethod(); + break; + case "FKSP": + browser.applicationDetailsSection.selectFKSPPaymentMethod(); + break; + case "Složenka": + browser.applicationDetailsSection.selectSlipPaymentMethod(); + break; + } + if (applicationData.containsKey("healthDisability")) { + browser.applicationDetailsSection.clickHealthDisabilityCheckbox(); + browser.waitFor(1); + browser.applicationDetailsSection.insertHealthDisabilityNote(applicationData.get("healthDisabilityNote")); + } + browser.applicationDetailsSection.clickCreateApplicationButton(); + } + +} diff --git a/src/test/java/cz/czechitas/automation/CreateOrderAsTeacher.java b/src/test/java/cz/czechitas/automation/CreateOrderAsTeacher.java new file mode 100644 index 0000000..97a0799 --- /dev/null +++ b/src/test/java/cz/czechitas/automation/CreateOrderAsTeacher.java @@ -0,0 +1,220 @@ +package cz.czechitas.automation; + +import org.junit.jupiter.api.Test; + +import java.util.Map; + +final class CreateOrderAsTeacher extends TestRunner { + + Map credentials = Map.of( + "masterEmail", "ladymaster@gmail.com", + "masterPassword","Lady123", + "masterName", "Lady Galadriel", + "adminEmail", "aragorn@email.com", + "adminPassword", "Aragorn1" + ); + + @Test + void smokePageUrlTest() { + browser.headerMenu.goToKindergartenAndSchoolSection(); + asserter.generalSection.checkCurrentUrl("https://team8-2022brno.herokuapp.com/objednavka/pridat"); + } + + @Test + void createOrderAsTeacherCampRequired() { + Map orderClientDetails = Map.of( + "client", "3v1", + "ICO", "12345678",//string <=15// + "address", "60200 Bratislavska 12, Brno", + "substitute", "Bilbo Baggins", + "contact_name", "Frodo", + "contact_surname", "Baggins", + "contact_phone", "123456789", //phone number + "contact_mail", "email@email.com" //email + ); + Map orderDatesDetails = Map.of( + "startDate1", "01.12.2025", + //"startDate2", "date", + //"startDate3", "date", + "endDate1", "05.12.2025" + //"endDate2", "date", + //"endDate3", "date" + ); + Map orderCampDetails = Map.of( + "students", "11", //number + "age", "10", //number + "adults", "1", //number + "datePart", "forenoon" //forenoon, afternoon + ); + //Should create order and check that user is notified + browser.headerMenu.goToKindergartenAndSchoolSection(); + fillOutClientFields(orderClientDetails); + fillOutDatesFields(orderDatesDetails); + fillOutCampFields(orderCampDetails); + browser.orderDetailSection.saveSuburbanCampOrder(); + asserter.orderSection.checkOrderIsCreated(); + + // Should check that Admin can see new created order + browser.headerMenu.goToHomePage(); + logIn(credentials.get("adminEmail"), credentials.get("adminPassword")); + browser.internalMenu.goToOrdersSection(); + browser.orderSection.search(orderClientDetails.get("client")); + asserter.orderSection.checkNumberOfOrders(1); + browser.loginSection.logout(); + + // Should check that Master Admin can see new created order and delete it + browser.headerMenu.goToHomePage(); + logIn(credentials.get("masterEmail"), credentials.get("masterPassword")); + browser.internalMenu.goToOrdersSection(); + browser.orderSection.search(orderClientDetails.get("client")); + asserter.orderSection.checkNumberOfOrders(1); + browser.orderSection.deleteOrder(); + asserter.orderSection.checkOrdersTableIsEmpty(); + browser.headerMenu.goToHomePage(); + browser.loginSection.logout(); + } + + @Test + void createOrderAsTeacherNature() { + Map orderClientDetails = Map.of( + "client", "3v1", + "ICO", "12345678",//string <=15// + "address", "60200 Bratislavska 12, Brno", + "substitute", "Bilbo Baggins", + "contact_name", "Frodo", + "contact_surname", "Baggins", + "contact_phone", "123456789", //phone number + "contact_mail", "email@email.com" + ); + Map orderDatesDetails = Map.of( + "startDate1", "01.12.2025", + "endDate1", "02.12.2025", + "startDate2", "12.12.2025", + "endDate2", "14.12.2025", + "startDate3", "01.01.2026", + "endDate3", "03.01.2026" + ); + Map ordersNatureDetails = Map.of( + "students", "14", + "age", "6", + "adults", "2", + "startTime", "9", + "startFood", "breakfast", + "endTime", "19", + "endFood", "dinner" + ); + //Should create order and check that user is notified + browser.headerMenu.goToKindergartenAndSchoolSection(); + fillOutClientFields(orderClientDetails); + fillOutDatesFields(orderDatesDetails); + fillOutNatureSchoolFields(ordersNatureDetails); + browser.orderDetailSection.saveSchoolInNatureOrder(); + asserter.orderSection.checkOrderIsCreated(); + + // Should check that Admin can see new created order + browser.headerMenu.goToHomePage(); + logIn(credentials.get("adminEmail"), credentials.get("adminPassword")); + browser.internalMenu.goToOrdersSection(); + browser.orderSection.search(orderClientDetails.get("client")); + asserter.orderSection.checkNumberOfOrders(1); + browser.loginSection.logout(); + + // Should check that Master Admin can see new created order and delete it + browser.headerMenu.goToHomePage(); + logIn(credentials.get("masterEmail"), credentials.get("masterPassword")); + browser.internalMenu.goToOrdersSection(); + browser.orderSection.search(orderClientDetails.get("client")); + asserter.orderSection.checkNumberOfOrders(1); + browser.orderSection.deleteOrder(); + asserter.orderSection.checkOrdersTableIsEmpty(); + browser.headerMenu.goToHomePage(); + browser.loginSection.logout(); + } + + @Test + void natureFieldsTesting() { + Map ordersNatureDetails = Map.of( + "students", "14", + "age", "6", + "adults", "2", + "startTime", "25", + "startFood", "breakfast", + "endTime", "-1", + "endFood", "dinner" + ); + browser.headerMenu.goToKindergartenAndSchoolSection(); + fillOutNatureSchoolFields(ordersNatureDetails); + } + + void fillOutClientFields(Map clientDetails) { + browser.orderDetailSection.insertICO(clientDetails.get("ICO")); + browser.waitFor(3); + browser.orderDetailSection.insertClient(clientDetails.get("client")); + browser.orderDetailSection.insertFullAddress(clientDetails.get("address")); + browser.orderDetailSection.insertSubstitute(clientDetails.get("substitute")); + browser.orderDetailSection.insertContactPersonNameAndSurname(clientDetails.get("contact_name"), clientDetails.get("contact_surname")); + browser.orderDetailSection.insertContactPersonTelephone(clientDetails.get("contact_phone")); + browser.orderDetailSection.insertContactPersonEmail(clientDetails.get("contact_mail")); + } + void fillOutDatesFields(Map datesDetails) { + browser.orderDetailSection.insertStartDate(datesDetails.get("startDate1")); + browser.orderDetailSection.insertEndDate(datesDetails.get("endDate1")); + if (datesDetails.containsKey("startDate2")){ + browser.orderDetailSection.insertStartDate2(datesDetails.get("startDate2")); + browser.orderDetailSection.insertEndDate2(datesDetails.get("endDate2")); + } + if (datesDetails.containsKey("startDate3")){ + browser.orderDetailSection.insertStartDate3(datesDetails.get("startDate3")); + browser.orderDetailSection.insertEndDate3(datesDetails.get("endDate3")); + } + } + void fillOutCampFields(Map campFields) { + browser.orderSection.selectSuburbanCampOption(); + browser.orderDetailSection.insertChildrenCountToSuburbanCamp(Integer.parseInt(campFields.get("students")));browser.orderDetailSection.insertInAgeToSuburbanCamp(Integer.parseInt(campFields.get("age"))); + browser.orderDetailSection.insertAdultsCountToSuburbanCamp(Integer.parseInt(campFields.get("adults"))); + switch (campFields.get("datePart")) { + case "afternoon": + browser.orderDetailSection.selectAfternoonSuburbanCampVariant(); + break; + case "forenoon": + browser.orderDetailSection.selectForenoonSuburbanCampVariant(); + } + } + void fillOutNatureSchoolFields (Map natureFields) { + browser.orderSection.selectSchoolInNatureOption(); + browser.waitFor(2); + browser.orderDetailSection.insertChildrenCountToSchoolInNature(Integer.parseInt(natureFields.get("students"))); + browser.orderDetailSection.insertInAgeToSchoolInNature(Integer.parseInt(natureFields.get("age"))); + browser.orderDetailSection.insertAdultsCountToSchoolInNature(Integer.parseInt(natureFields.get("adults"))); + browser.orderDetailSection.insertStartTime(natureFields.get("startTime")); + browser.waitFor(1); + browser.orderDetailSection.insertEndTime(natureFields.get("endTime")); + + switch (natureFields.get("startFood")) { + case "breakfast": + browser.orderDetailSection.selectBreakfastStartToSchoolInNature(); + break; + case "lunch": + browser.orderDetailSection.selectLunchStartToSchoolInNature(); + break; + case "dinner": + browser.orderDetailSection.selectDinnerStartToSchoolInNature(); + } + switch (natureFields.get("endFood")) { + case "breakfast": + browser.orderDetailSection.selectBreakfastEndToSchoolInNature(); + break; + case "lunch": + browser.orderDetailSection.selectLunchEndToSchoolInNature(); + break; + case "dinner": + browser.orderDetailSection.selectDinnerEndToSchoolInNature(); + } + } + void logIn(String email, String password) { + browser.loginSection.clickLoginMenuLink(); + browser.loginSection.insertEmail(email); + browser.loginSection.insertPassword(password); + browser.loginSection.clickLoginButton(); + } +} diff --git a/src/test/java/cz/czechitas/automation/UserRegistrationAndLogin.java b/src/test/java/cz/czechitas/automation/UserRegistrationAndLogin.java new file mode 100644 index 0000000..f6684be --- /dev/null +++ b/src/test/java/cz/czechitas/automation/UserRegistrationAndLogin.java @@ -0,0 +1,123 @@ +package cz.czechitas.automation; + +import org.junit.jupiter.api.Test; + +import java.util.Map; + + +final class UserRegistrationAndLogin extends TestRunner { + + Map credentials = Map.of( + "masterEmail", "ladymaster@gmail.com", + "masterPassword","Lady123", + "masterName", "Lady Galadriel", + "adminEmail", "aragorn@email.com", + "adminPassword", "Aragorn1", + "adminName", "Aragorn Dunedain", + "parentEmail", "john123@email.com", + "parentPassword", "A1sdfg", + "parentName", "John Baggins" + ); + + + @Test + void smokePageUrlTest() { + browser.headerMenu.goToHomePage(); + asserter.generalSection.checkCurrentUrl("https://team8-2022brno.herokuapp.com/"); + } + + //Registration tests + @Test + void newUserRegistrationHappyTest() { + var firstName = browser.generateRandomName(5); + var lastName = browser.generateRandomName(8); + var email = lastName + "@hotmail.com"; + var password = "A" + firstName + "123"; + + //Each new user is automatically signed in + fillOutRegistrationForm(firstName, lastName,email, password, password); + asserter.loginSection.checkUserIsLoggedIn(firstName+" "+lastName); + browser.loginSection.logout(); + + // Each new user is by default in the role parent + logIn(credentials.get("masterEmail"), credentials.get("masterPassword")); + browser.internalMenu.goToUsersSection(); + browser.usersSection.search(firstName+" "+lastName); + browser.waitFor(1); + asserter.usersSection.checkParentRole(); + browser.loginSection.logout(); + + // Each user is available to sign in + logIn(email, password); + asserter.loginSection.checkUserIsLoggedIn(firstName+" "+lastName); + // Each user is allowed to log out + browser.loginSection.logout(); + } + + @Test + void newUserRegistrationTest_empty() { + fillOutRegistrationForm("", "", "", "", ""); + asserter.loginSection.checkUserIsNotLoggedIn(); + } + @Test + void newUserRegistrationTest_256() { + var firstName = browser.generateRandomName(127); + var lastName = browser.generateRandomName(128); + var email = lastName + "@hotmail.com"; + var password = "A" + firstName + "123"; + fillOutRegistrationForm(firstName, lastName, email, password, password); + asserter.loginSection.checkUserIsNotLoggedIn(); + } + + // Logging in tests + @Test + void loginAsParentHappy () { + logIn(credentials.get("parentEmail"), credentials.get("parentPassword")); + browser.waitFor(1); + asserter.loginSection.checkUserIsLoggedIn(credentials.get("parentName")); + asserter.generalSection.checkCurrentUrl("https://team8-2022brno.herokuapp.com/zaci"); + browser.loginSection.logout(); + } + @Test + void loginAsAdminHappy () { + logIn(credentials.get("adminEmail"), credentials.get("adminPassword")); + browser.waitFor(1); + asserter.loginSection.checkUserIsLoggedIn(credentials.get("adminName")); + asserter.generalSection.checkCurrentUrl("https://team8-2022brno.herokuapp.com/"); + browser.loginSection.logout(); + } + @Test + void loginAsMasterHappy() { + logIn(credentials.get("masterEmail"), credentials.get("masterPassword")); + browser.waitFor(1); + asserter.loginSection.checkUserIsLoggedIn(credentials.get("masterName")); + asserter.generalSection.checkCurrentUrl("https://team8-2022brno.herokuapp.com/"); + browser.loginSection.logout(); + } + @Test + void loginAsParentWrongPassword () { + logIn(credentials.get("parentEmail"), credentials.get("parentPassword")+"1"); + browser.waitFor(1); + asserter.loginSection.checkErrorMessage(); + asserter.loginSection.checkUserIsNotLoggedIn(); + } + + +// Functions + void fillOutRegistrationForm(String firstName, String lastName, String email, String password, String confirmPassword) { + browser.loginSection.clickLoginMenuLink(); + browser.loginSection.clickLoginMenuLink(); + browser.loginSection.clickRegisterButton(); + browser.registerSection.insertFirstAndLastName(firstName, lastName); + browser.registerSection.insertEmail(email); + browser.registerSection.insertPassword(password); + browser.registerSection.insertPasswordConfirmation(confirmPassword); + browser.registerSection.clickRegisterButton(); + } + void logIn(String email, String password) { + browser.loginSection.clickLoginMenuLink(); + browser.loginSection.insertEmail(email); + browser.loginSection.insertPassword(password); + browser.loginSection.clickLoginButton(); + } +} diff --git a/src/test/java/cz/czechitas/automation/assertion/ApplicationDetailAssertion.java b/src/test/java/cz/czechitas/automation/assertion/ApplicationDetailAssertion.java index 5c8d176..216c330 100644 --- a/src/test/java/cz/czechitas/automation/assertion/ApplicationDetailAssertion.java +++ b/src/test/java/cz/czechitas/automation/assertion/ApplicationDetailAssertion.java @@ -30,12 +30,15 @@ public void checkPaymentMethod(String paymentMethod) { public void checkFirstName(String firstname) { var firstNameElement = elementFinder.findByXPath("//table/tbody//td[text()='Křestní jméno žáka:']/../td[2]"); - assertThat(firstNameElement.getText()).isEqualTo(firstname); + //var firstNameElement = elementFinder.findByCssSelector("table.border-top > tbody:nth-child(1) > tr:nth-child(4) > td:nth-child(2)"); + //assertThat(firstNameElement.getText()).isEqualTo(firstname); + assertThat(firstNameElement.getText()).isEqualToIgnoringCase(firstname); } public void checkLastName(String lastname) { var lastNameElement = elementFinder.findByXPath("//table/tbody//td[text()='Příjmení žáka:']/../td[2]"); - assertThat(lastNameElement.getText()).isEqualTo(lastname); + //assertThat(lastNameElement.getText()).isEqualTo(lastname); + assertThat(lastNameElement.getText()).isEqualToIgnoringCase(lastname); } public void checkDateOfBirth(String birthdate) { @@ -67,4 +70,8 @@ public void checkHealthDisabilityNote(String healthRestrictionNote) { var healthRestrictionNoteElement = elementFinder.findByXPath("//table/tbody//td[text()='Zdravotní omezení:']/../td[2]"); assertThat(healthRestrictionNoteElement.getText()).isEqualTo(healthRestrictionNote); } + public void checkErrorMessage(String errorMessage) { + var errorTooYoung = elementFinder.findByXPath("/html/body/div/div/div/div/div/form/table/tbody/tr[6]/td[2]/span"); + assertThat(errorTooYoung.getText()).contains(errorMessage); + } } diff --git a/src/test/java/cz/czechitas/automation/assertion/AssertionFacade.java b/src/test/java/cz/czechitas/automation/assertion/AssertionFacade.java index 813b650..aed28d3 100644 --- a/src/test/java/cz/czechitas/automation/assertion/AssertionFacade.java +++ b/src/test/java/cz/czechitas/automation/assertion/AssertionFacade.java @@ -20,6 +20,7 @@ public final class AssertionFacade { public final HomePageAssertion homePageSection; public final GeneralAssertion generalSection; public final OrderAssertion orderSection; + public final UsersAssertation usersSection; public AssertionFacade(WebDriver webDriver) { var elementFinder = new ElementFinder(webDriver); @@ -29,5 +30,6 @@ public AssertionFacade(WebDriver webDriver) { this.homePageSection = new HomePageAssertion(elementFinder); this.generalSection = new GeneralAssertion(elementFinder, webDriver); this.orderSection = new OrderAssertion(elementFinder); + this.usersSection = new UsersAssertation(elementFinder); } } diff --git a/src/test/java/cz/czechitas/automation/assertion/LoginAssertion.java b/src/test/java/cz/czechitas/automation/assertion/LoginAssertion.java index 003e723..4d48156 100644 --- a/src/test/java/cz/czechitas/automation/assertion/LoginAssertion.java +++ b/src/test/java/cz/czechitas/automation/assertion/LoginAssertion.java @@ -39,4 +39,9 @@ public void checkUserIsNotLoggedIn() { var loggedInText = elementFinder.findByXPath("/html/body/div/header/nav/div/div[2]/a"); assertThat(loggedInText.getText()).isEqualTo("Přihlásit"); } + + public void checkErrorMessage() { + var errorMessage = elementFinder.findByCssSelector(".invalid-feedback > strong:nth-child(1)"); + assertThat(errorMessage.getText()).isEqualTo("Tyto přihlašovací údaje neodpovídají žadnému záznamu."); + } } \ No newline at end of file diff --git a/src/test/java/cz/czechitas/automation/assertion/OrderAssertion.java b/src/test/java/cz/czechitas/automation/assertion/OrderAssertion.java index 8f5a7ef..084e532 100644 --- a/src/test/java/cz/czechitas/automation/assertion/OrderAssertion.java +++ b/src/test/java/cz/czechitas/automation/assertion/OrderAssertion.java @@ -43,4 +43,8 @@ public void checkNumberOfOrders(int orderCount) { assertThat(ordersCountElement.getText()).contains("Zobrazeno " + orderCount + " až " + orderCount + " záznamů z " + orderCount); } + public void checkOrderIsCreated () { + var message = elementFinder.findByXPath("/html/body/div/div/div/div/div/div/h3"); + assertThat(message.getText()).contains("Děkujeme za objednávku"); + } } diff --git a/src/test/java/cz/czechitas/automation/assertion/UsersAssertation.java b/src/test/java/cz/czechitas/automation/assertion/UsersAssertation.java new file mode 100644 index 0000000..eb064c3 --- /dev/null +++ b/src/test/java/cz/czechitas/automation/assertion/UsersAssertation.java @@ -0,0 +1,32 @@ +package cz.czechitas.automation.assertion; + +import cz.czechitas.automation.ElementFinder; + +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.Objects; + +import static org.assertj.core.api.Assertions.assertThat; +/** + * Application specific assertions + * + * @author Jiri Koudelka + * @since 1.0.0 + */ +@ParametersAreNonnullByDefault +public final class UsersAssertation { + + private final ElementFinder elementFinder; + + UsersAssertation(ElementFinder elementFinder) { + this.elementFinder = Objects.requireNonNull(elementFinder); + } + + public void checkColumnExists(String columnName) { + var column = elementFinder.findByXPath("//table[@id='DataTables_Table_0']/thead/tr"); + assertThat(column.getText()).contains(columnName); + } + public void checkParentRole() { + var lastNameElement = elementFinder.findByCssSelector("td:nth-child(3)"); + assertThat(lastNameElement.getText()).isEqualTo("Rodič"); + } +}