diff --git a/README.md b/README.md index 0f67074..c240f3c 100644 --- a/README.md +++ b/README.md @@ -164,18 +164,18 @@ Called on `asserter.applicationSection`: | `asserter.applicationSection.checkNumberOfApplications(5)` | Ensure the application list has exactly 5 applications | ## 🔍 Application detail view -Called on `asserter.applicationDetailSection`: +Called on `asserter.applicationDetailsSection`: | Method | Description | |---|---| -| `asserter.applicationDetailSection.checkPaymentMethod("Bankovní převod")` | Ensure the application is paid via bank transfer | -| `asserter.applicationDetailSection.checkFirstName("Jan")` | Check that the student first name is _Jan_ | -| `asserter.applicationDetailSection.checkLastName("Novak")` | Check that the student last name is _Novak_ | -| `asserter.applicationDetailSection.checkDateOfBirth("01.01.2010")` | Check that the student date of birth is _01.01.2010_ | -| `asserter.applicationDetailSection.checkNote("myPrivateNote")` | Check that the note is _myPrivateNote_ | -- `asserter.applicationDetailSection.checkRemainingAmountToPay("100.00")` - check that remaining amount to pay is _100.00_ Kč -- `asserter.applicationDetailSection.checkTerm("05.02. - 09.02.2024")` - check that the term is _05.02. - 09.02.2024_ -- `asserter.applicationDetailSection.checkMessageContainsStudentLastName("Novak")` - ensure that _Zpráva pro příjemce_ contains student last name _Novak_ +| `asserter.applicationDetailsSection.checkPaymentMethod("Bankovní převod")` | Ensure the application is paid via bank transfer | +| `asserter.applicationDetailsSection.checkFirstName("Jan")` | Check that the student first name is _Jan_ | +| `asserter.applicationDetailsSection.checkLastName("Novak")` | Check that the student last name is _Novak_ | +| `asserter.applicationDetailsSection.checkDateOfBirth("01.01.2010")` | Check that the student date of birth is _01.01.2010_ | +| `asserter.applicationDetailsSection.checkNote("myPrivateNote")` | Check that the note is _myPrivateNote_ | +- `asserter.applicationDetailsSection.checkRemainingAmountToPay("100.00")` - check that remaining amount to pay is _100.00_ Kč +- `asserter.applicationDetailsSection.checkTerm("05.02. - 09.02.2024")` - check that the term is _05.02. - 09.02.2024_ +- `asserter.applicationDetailsSection.checkMessageContainsStudentLastName("Novak")` - ensure that _Zpráva pro příjemce_ contains student last name _Novak_ # 🔧 Utilities diff --git a/pom.xml b/pom.xml index 54583ec..2ac2203 100644 --- a/pom.xml +++ b/pom.xml @@ -22,13 +22,7 @@ org.junit.jupiter - junit-jupiter-api - 5.9.3 - test - - - org.junit.jupiter - junit-jupiter-params + junit-jupiter 5.9.3 test diff --git a/src/main/java/cz/czechitas/automation/PublicMenuAction.java b/src/main/java/cz/czechitas/automation/PublicMenuAction.java index 2000da8..5d20515 100644 --- a/src/main/java/cz/czechitas/automation/PublicMenuAction.java +++ b/src/main/java/cz/czechitas/automation/PublicMenuAction.java @@ -1,5 +1,7 @@ package cz.czechitas.automation; +import org.openqa.selenium.NoSuchElementException; + import javax.annotation.ParametersAreNonnullByDefault; import java.util.Objects; @@ -54,8 +56,14 @@ void goToHomePage() { } void goToApplicationsSection() { - var applicationsMenuItem = elementFinder.findByXPath("//*[@id='navbarSupportedContent']//a[contains(text(), 'Přihlášky')]"); - applicationsMenuItem.click(); + try { + var publicApplicationsMenuItem = elementFinder.findByXPath("//*[@id='navbarSupportedContent']//a[contains(text(), 'Přihlášky')]"); + publicApplicationsMenuItem.click(); + } + catch (NoSuchElementException ignored) { + var internalApplicationsMenuItem = elementFinder.findByXPath("//*[@id='adminNavbar']//a[contains(text(), 'Přihlášky')]"); + internalApplicationsMenuItem.click(); + } } private void clickForTeacherMenuItem() { diff --git a/src/main/java/cz/czechitas/automation/SeleniumActionFacade.java b/src/main/java/cz/czechitas/automation/SeleniumActionFacade.java index f66758e..7b6b8a1 100644 --- a/src/main/java/cz/czechitas/automation/SeleniumActionFacade.java +++ b/src/main/java/cz/czechitas/automation/SeleniumActionFacade.java @@ -51,9 +51,9 @@ String generateRandomName(int nameLength) { var leftLimit = 97; var rightLimit = 122; - return random.ints(leftLimit, rightLimit + 1) + return Objects.requireNonNull(random.ints(leftLimit, rightLimit + 1) .limit(nameLength) .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) - .toString(); + .toString()); } } diff --git a/src/test/java/cz/czechitas/automation/ExampleTest.java b/src/test/java/cz/czechitas/automation/ExampleTest.java index 2a5f4d9..503ff34 100644 --- a/src/test/java/cz/czechitas/automation/ExampleTest.java +++ b/src/test/java/cz/czechitas/automation/ExampleTest.java @@ -15,7 +15,7 @@ final class ExampleTest extends TestRunner { @Test void contactsPageUrlTest() { browser.headerMenu.goToContactsSection(); - asserter.checkPageUrl("www.czechitas.cz"); + asserter.generalSection.checkPageUrl("www.czechitas.cz"); } @Test @@ -24,7 +24,7 @@ void successfulLoginTest() { browser.loginSection.insertEmail("da-app.admin@czechitas.cz"); browser.loginSection.insertPassword("Czechitas123"); browser.loginSection.clickLoginButton(); - asserter.checkIsLoggedIn(); + asserter.applicationSection.checkIsLoggedIn(); } // parametrized test - find out what is wrong with this test @@ -34,4 +34,44 @@ void icoFieldTest(String icoValue) { browser.headerMenu.goToKindergartenAndSchoolSection(); browser.orderSection.insertICO(icoValue); } + + @Test + void navigation1() + { + browser.headerMenu.goToInstructionsAndFormsForParentSection(); + } + + @Test + void navigation2() { + browser.headerMenu.goToKindergartenAndSchoolSection(); + browser.orderSection.selectSchoolInNatureOption(); + } + + @Test + void navigation3() { + browser.headerMenu.goToCreateApplicationSection(); + browser.headerMenu.goToKindergartenAndSchoolSection(); + browser.headerMenu.goToContactsSection(); + browser.headerMenu.goToHomePage(); + browser.headerMenu.goToInstructionsAndFormsForParentSection(); + browser.headerMenu.goToInstructionsAndFormsForTeacherSection(); + } + + @Test + void navigation4() { + browser.headerMenu.goToKindergartenAndSchoolSection(); + browser.orderSection.insertICO("1234566"); + } + + @Test + void navigation6() { + browser.loginSection.clickLoginMenuLink(); + browser.loginSection.insertEmail("ptestak@test.cz"); + browser.loginSection.insertPassword("PTester123"); + browser.loginSection.clickLoginButton(); + + browser.applicationSection.clickCreateNewApplicationButton(); + browser.applicationSection.selectProgrammingSection(); + browser.applicationSection.clickCreatePythonApplicationButton(); + } } diff --git a/src/test/java/cz/czechitas/automation/LowCodePracticeSolutionTest.java b/src/test/java/cz/czechitas/automation/LowCodePracticeSolutionTest.java index 0db4160..682bef1 100644 --- a/src/test/java/cz/czechitas/automation/LowCodePracticeSolutionTest.java +++ b/src/test/java/cz/czechitas/automation/LowCodePracticeSolutionTest.java @@ -41,7 +41,7 @@ void navigation4() { @Test void navigation6() { browser.loginSection.clickLoginMenuLink(); - browser.loginSection.insertEmail("muj@tester.cz"); + browser.loginSection.insertEmail("muj2@tester.cz"); browser.loginSection.insertPassword("JTester123"); browser.loginSection.clickLoginButton(); @@ -64,17 +64,17 @@ void asserts2() { @Test void asserts3() { browser.loginSection.clickLoginMenuLink(); - browser.loginSection.insertEmail("muj@tester.cz"); + browser.loginSection.insertEmail("muj2@tester.cz"); browser.loginSection.insertPassword("JTester123"); browser.loginSection.clickLoginButton(); browser.headerMenu.goToApplicationsSection(); browser.applicationSection.openFirstApplicationDetailsPage(); - asserter.applicationDetailSection.checkTerm("20.07. - 24.07.2026"); - asserter.applicationDetailSection.checkFirstName("Henry"); - asserter.applicationDetailSection.checkLastName("Proper"); - asserter.applicationDetailSection.checkDateOfBirth("01.01.1990"); - asserter.applicationDetailSection.checkPaymentMethod("Hotově"); + asserter.applicationDetailsSection.checkTerm("20.07. - 24.07.2026"); + asserter.applicationDetailsSection.checkFirstName("Henry"); + asserter.applicationDetailsSection.checkLastName("Proper"); + asserter.applicationDetailsSection.checkDateOfBirth("01.01.1990"); + asserter.applicationDetailsSection.checkPaymentMethod("Hotově"); } } diff --git a/src/test/java/cz/czechitas/automation/LowCodePracticeTwoSolutionTest.java b/src/test/java/cz/czechitas/automation/LowCodePracticeTwoSolutionTest.java new file mode 100644 index 0000000..9ed1e61 --- /dev/null +++ b/src/test/java/cz/czechitas/automation/LowCodePracticeTwoSolutionTest.java @@ -0,0 +1,134 @@ +package cz.czechitas.automation; + +import org.junit.jupiter.api.Test; + +/** + * Class with example solutions of tasks from the Low-code_automation_practice_II.pdf file + * + * @author Jiri Koudelka & Barbora Blozonova + * @since 1.0.0 + */ +final class LowCodePracticeTwoSolutionTest extends TestRunner { + + @Test + void contactsPageUrlTest() { + browser.headerMenu.goToContactsSection(); + asserter.generalSection.checkPageUrl("www.czechitas.cz"); + } + + @Test + void navigationTaskOne() { + browser.headerMenu.goToKindergartenAndSchoolSection(); + browser.orderSection.insertICO("22834958"); + browser.orderSection.selectSchoolInNatureOption(); + browser.orderSection.insertChildrenCount(5); + } + + @Test + void assertionTaskOne() { + browser.loginSection.clickLoginMenuLink(); + browser.loginSection.insertEmail("muj2@tester.cz"); + browser.loginSection.insertPassword("JTester123"); + browser.loginSection.clickLoginButton(); + browser.headerMenu.goToApplicationsSection(); + asserter.applicationSection.checkColumnExists("Jméno"); + asserter.applicationSection.checkColumnExists("Kategorie"); + } + + @Test + void complexTaskOne() { + browser.loginSection.clickLoginMenuLink(); + browser.loginSection.insertEmail("muj2@tester.cz"); + browser.loginSection.insertPassword("JTester123"); + browser.loginSection.clickLoginButton(); + browser.headerMenu.goToApplicationsSection(); + browser.applicationSection.clickCreateNewApplicationButton(); + browser.applicationSection.selectProgrammingSection(); + browser.applicationSection.clickCreatePythonApplicationButton(); + browser.applicationDetailsSection.selectTerm("20.07. - 24.07.2026"); + browser.applicationDetailsSection.insertStudentFirstName("Herold"); + browser.applicationDetailsSection.insertStudentLastName("Proper"); + browser.applicationDetailsSection.insertBirthdate("29.01.2000"); + browser.applicationDetailsSection.clickAcceptTermsCheckbox(); + browser.applicationDetailsSection.insertNote("Moje super poznamka"); + browser.applicationDetailsSection.selectCashPaymentMethod(); + browser.applicationDetailsSection.clickCreateApplicationButton(); + asserter.applicationDetailsSection.checkPaymentMethod("Hotově"); + asserter.applicationDetailsSection.checkFirstName("Herold"); + //asserter.applicationDetailsSection.checkLastName("Proper"); + asserter.applicationDetailsSection.checkDateOfBirth("29.01.2000"); + asserter.applicationDetailsSection.checkNote("Moje super poznamka"); + } + + @Test + void complexTaskThree() { + browser.loginSection.clickLoginMenuLink(); + browser.loginSection.insertEmail("muj2@tester.cz"); + browser.loginSection.insertPassword("JTester123"); + browser.loginSection.clickLoginButton(); + browser.headerMenu.goToApplicationsSection(); + browser.applicationSection.search("Herold"); + browser.applicationSection.clickEditFirstApplicationButton(); + browser.applicationDetailsSection.selectBankTransferPaymentMethod(); + browser.applicationDetailsSection.clickEditApplicationButton(); + browser.applicationSection.openFirstApplicationDetailsPage(); + asserter.applicationDetailsSection.checkPaymentMethod("Bankovní převod"); + asserter.applicationDetailsSection.checkRemainingAmountToPay("1 800 Kč"); + asserter.applicationDetailsSection.checkMessageContainsStudentLastName("Proper"); + } + + @Test + void complexTaskSix() { + browser.loginSection.clickLoginMenuLink(); + browser.loginSection.insertEmail("muj2@tester.cz"); + browser.loginSection.insertPassword("JTester123"); + browser.loginSection.clickLoginButton(); + browser.headerMenu.goToApplicationsSection(); + browser.applicationSection.clickCreateNewApplicationButton(); + browser.applicationSection.selectProgrammingSection(); + browser.applicationSection.clickCreatePythonApplicationButton(); + browser.applicationDetailsSection.selectTerm("20.07. - 24.07.2026"); + browser.applicationDetailsSection.insertStudentFirstName("Herold"); + var generated = browser.generateRandomName(15); + browser.applicationDetailsSection.insertStudentLastName(generated); + browser.applicationDetailsSection.insertBirthdate("29.01.2000"); + browser.applicationDetailsSection.selectCashPaymentMethod(); + browser.applicationDetailsSection.clickAcceptTermsCheckbox(); + browser.applicationDetailsSection.clickCreateApplicationButton(); + browser.headerMenu.goToApplicationsSection(); + browser.applicationSection.search(generated); + asserter.applicationSection.checkNumberOfApplications(1); + browser.loginSection.logout(); + browser.loginSection.clickLoginMenuLink(); + browser.loginSection.insertEmail("muj2@tester.cz"); + browser.loginSection.insertPassword("JTester123"); + browser.loginSection.clickLoginButton(); + browser.headerMenu.goToApplicationsSection(); + browser.applicationSection.search(generated); + asserter.applicationSection.checkApplicationsTableIsEmpty(); + } + + @Test + void complexTaskSeven() { + browser.loginSection.clickLoginMenuLink(); + browser.loginSection.insertEmail("muj2@tester.cz"); + browser.loginSection.insertPassword("JTester123"); + browser.loginSection.clickLoginButton(); + browser.headerMenu.goToApplicationsSection(); + browser.profileSection.goToProfilePage(); + browser.profileSection.insertPassword("Aaabbb123"); + browser.profileSection.insertPasswordVerification("Aaabbb123"); + browser.profileSection.clickChangeButton(); + browser.waitFor(10); + browser.loginSection.logout(); + browser.loginSection.clickLoginMenuLink(); + browser.loginSection.insertEmail("muj2@tester.cz"); + browser.loginSection.insertPassword("Aaabbb123"); + browser.loginSection.clickLoginButton(); + asserter.applicationSection.checkIsLoggedIn(); + browser.profileSection.goToProfilePage(); + browser.profileSection.insertPassword("JTester123"); + browser.profileSection.insertPasswordVerification("JTester123"); + browser.profileSection.clickChangeButton(); + } +} diff --git a/src/test/java/cz/czechitas/automation/assertion/ApplicationAssertion.java b/src/test/java/cz/czechitas/automation/assertion/ApplicationAssertion.java index 155392c..58ff86c 100644 --- a/src/test/java/cz/czechitas/automation/assertion/ApplicationAssertion.java +++ b/src/test/java/cz/czechitas/automation/assertion/ApplicationAssertion.java @@ -61,4 +61,9 @@ public void checkNumberOfApplications(int applicationsNumber) { assertThat(applicationsCountElement.getText()).contains("Zobrazeno " + applicationsNumber + " až " + applicationsNumber + " záznamů z " + applicationsNumber); } + + public void checkIsLoggedIn() { + var loggedInText = elementFinder.findByCssSelector(".navbar-right span"); + assertThat(loggedInText.getText()).isEqualTo("Přihlášen"); + } } diff --git a/src/test/java/cz/czechitas/automation/assertion/AssertionFacade.java b/src/test/java/cz/czechitas/automation/assertion/AssertionFacade.java index 64c02ab..9754aea 100644 --- a/src/test/java/cz/czechitas/automation/assertion/AssertionFacade.java +++ b/src/test/java/cz/czechitas/automation/assertion/AssertionFacade.java @@ -19,13 +19,19 @@ public final class AssertionFacade { private final ElementFinderInterface elementFinder; public final ApplicationAssertion applicationSection; - public final ApplicationDetailAssertion applicationDetailSection; - - public AssertionFacade(WebDriver webDriver) - { - this.elementFinder = new ElementFinder(webDriver); + public final ApplicationDetailAssertion applicationDetailsSection; + public final LoginAssertion loginSection; + public final HomePageAssertion homePageSection; + public final GeneralAssertion generalSection; + + public AssertionFacade(WebDriver webDriver) { + var elementFinder = new ElementFinder(webDriver); + this.elementFinder = elementFinder; this.applicationSection = new ApplicationAssertion(elementFinder); - this.applicationDetailSection = new ApplicationDetailAssertion(elementFinder); + this.applicationDetailsSection = new ApplicationDetailAssertion(elementFinder); + this.loginSection = new LoginAssertion(elementFinder); + this.homePageSection = new HomePageAssertion(elementFinder); + this.generalSection = new GeneralAssertion(elementFinder); } public void checkPageUrl(String url) { diff --git a/src/test/java/cz/czechitas/automation/assertion/GeneralAssertion.java b/src/test/java/cz/czechitas/automation/assertion/GeneralAssertion.java new file mode 100644 index 0000000..f9ac2c3 --- /dev/null +++ b/src/test/java/cz/czechitas/automation/assertion/GeneralAssertion.java @@ -0,0 +1,29 @@ +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 Adam Abbod + * @since 1.0.0 + */ +@ParametersAreNonnullByDefault +public final class GeneralAssertion { + + private final ElementFinder elementFinder; + + public GeneralAssertion(ElementFinder elementFinder) { + this.elementFinder = Objects.requireNonNull(elementFinder); + } + + public void checkPageUrl(String url) { + var urlElement = elementFinder.findByXPath("//a[text()='www.czechitas.cz']"); + assertThat(urlElement.getText()).isEqualTo(url); + } +} \ No newline at end of file diff --git a/src/test/java/cz/czechitas/automation/assertion/HomePageAssertion.java b/src/test/java/cz/czechitas/automation/assertion/HomePageAssertion.java new file mode 100644 index 0000000..b4538f6 --- /dev/null +++ b/src/test/java/cz/czechitas/automation/assertion/HomePageAssertion.java @@ -0,0 +1,29 @@ +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 Adam Abbod + * @since 1.0.0 + */ +@ParametersAreNonnullByDefault +public final class HomePageAssertion { + + private final ElementFinder elementFinder; + + public HomePageAssertion(ElementFinder elementFinder) { + this.elementFinder = Objects.requireNonNull(elementFinder); + } + + public void checkProgrammingSectionPresence() { + var programmingText = elementFinder.findByCssSelector(".main_content .card-img-overlay"); + assertThat(programmingText.getText().trim()).isEqualTo("Programování"); + } +} \ No newline at end of file diff --git a/src/test/java/cz/czechitas/automation/assertion/LoginAssertion.java b/src/test/java/cz/czechitas/automation/assertion/LoginAssertion.java new file mode 100644 index 0000000..f11b878 --- /dev/null +++ b/src/test/java/cz/czechitas/automation/assertion/LoginAssertion.java @@ -0,0 +1,29 @@ +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 Adam Abbod + * @since 1.0.0 + */ +@ParametersAreNonnullByDefault +public final class LoginAssertion { + + private final ElementFinder elementFinder; + + public LoginAssertion(ElementFinder elementFinder) { + this.elementFinder = Objects.requireNonNull(elementFinder); + } + + public void checkRegistrationButtonPresence() { + var registerButton = elementFinder.findByCssSelector(".btn-secondary"); + assertThat(registerButton.getText().trim()).isEqualTo("Zaregistrujte se"); + } +} \ No newline at end of file