From 32b8c4f88c2ea2a8ab6141377a2ff4fd33bf6678 Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Sun, 22 Apr 2018 21:29:57 +0200 Subject: [PATCH] no-jira: selenium test for free booking without user interaction --- .../ui/FreeAccessConfigurationController.java | 4 + .../java/org/olat/selenium/CourseTest.java | 85 +++++++++++++++++++ .../olat/selenium/page/core/BookingPage.java | 34 +++++++- .../selenium/page/graphene/OOGraphene.java | 9 ++ 4 files changed, 128 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/olat/resource/accesscontrol/provider/free/ui/FreeAccessConfigurationController.java b/src/main/java/org/olat/resource/accesscontrol/provider/free/ui/FreeAccessConfigurationController.java index ad3238f3167..2d6737c5c04 100644 --- a/src/main/java/org/olat/resource/accesscontrol/provider/free/ui/FreeAccessConfigurationController.java +++ b/src/main/java/org/olat/resource/accesscontrol/provider/free/ui/FreeAccessConfigurationController.java @@ -61,14 +61,18 @@ public class FreeAccessConfigurationController extends AbstractConfigurationMeth @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + formLayout.setElementCssClass("o_sel_accesscontrol_free_form"); + String desc = null; if(link.getOffer() != null) { desc = link.getOffer().getDescription(); } descEl = uifactory.addTextAreaElement("offer-desc", "offer.description", 2000, 6, 80, false, desc, formLayout); + descEl.setElementCssClass("o_sel_accesscontrol_description"); String[] autoValues = new String[]{ translate("auto.booking.value") }; autoEl = uifactory.addCheckboxesHorizontal("auto.booking", "auto.booking", formLayout, autoKeys, autoValues); + autoEl.setElementCssClass("o_sel_accesscontrol_auto_booking"); if(link.getOffer() != null && link.getOffer().getKey() != null) { autoEl.select(autoKeys[0], link.getOffer().isAutoBooking()); } else { diff --git a/src/test/java/org/olat/selenium/CourseTest.java b/src/test/java/org/olat/selenium/CourseTest.java index e71458f1cca..ae9b91914b0 100644 --- a/src/test/java/org/olat/selenium/CourseTest.java +++ b/src/test/java/org/olat/selenium/CourseTest.java @@ -871,6 +871,91 @@ public class CourseTest extends Deployments { .assertFirstNameInList(ryomou); } + + /** + * An author creates a course, make it visible for + * members and add an access control by free booking + * with the auto booking enabled.<br/> + * The user search for the course and enters it.<br/> + * The author checks in the list of orders if the booking + * of the user is there and after it checks if the user is + * in the member list too. + * + * @param loginPage + * @param userBrowser + * @throws IOException + * @throws URISyntaxException + */ + @Test + @RunAsClient + public void courseFreeBooking(@InitialPage LoginPage loginPage, + @Drone @User WebDriver userBrowser) + throws IOException, URISyntaxException { + + UserVO author = new UserRestClient(deploymentUrl).createAuthor(); + loginPage.loginAs(author.getLogin(), author.getPassword()); + UserVO user = new UserRestClient(deploymentUrl).createRandomUser("Kanu"); + + //go to authoring + AuthoringEnvPage authoringEnv = navBar + .assertOnNavigationPage() + .openAuthoringEnvironment(); + + String title = "AutoBooking-" + UUID.randomUUID(); + //create course + authoringEnv + .openCreateDropDown() + .clickCreate(ResourceType.course) + .fillCreateForm(title) + .assertOnGeneralTab(); + + //open course editor + CoursePageFragment course = new CoursePageFragment(browser); + RepositoryAccessPage courseAccess = course + .openToolsMenu() + .edit() + .createNode("info") + .autoPublish() + .accessConfiguration() + .setUserAccess(UserAccess.registred); + //add booking by secret token + courseAccess + .boooking() + .openAddDropMenu() + .addFreeBooking() + .configureFreeBooking("It's free"); + courseAccess + .clickToolbarBack(); + + //a user search the course + LoginPage userLoginPage = LoginPage.getLoginPage(userBrowser, deploymentUrl); + userLoginPage + .loginAs(user.getLogin(), user.getPassword()) + .resume(); + NavigationPage userNavBar = new NavigationPage(userBrowser); + userNavBar + .openMyCourses() + .openSearch() + .extendedSearch(title) + .book(title);//book the course + //check the course + CoursePageFragment bookedCourse = CoursePageFragment.getCourse(userBrowser); + bookedCourse + .assertOnTitle(title); + + //Author go in the list of bookings of the course + BookingPage bookingList = course + .openToolsMenu() + .bookingTool(); + bookingList + .assertFirstNameInListIsOk(user); + + //Author go to members list + course + .members() + .assertFirstNameInList(user); + } + /** * An author create a course, set a start and end date for life-cycle. * It add a participant to the course. It creates a reminder diff --git a/src/test/java/org/olat/selenium/page/core/BookingPage.java b/src/test/java/org/olat/selenium/page/core/BookingPage.java index 3f95b8be244..fce48e8a4c7 100644 --- a/src/test/java/org/olat/selenium/page/core/BookingPage.java +++ b/src/test/java/org/olat/selenium/page/core/BookingPage.java @@ -71,10 +71,9 @@ public class BookingPage { private BookingPage addMethod(String iconClassname) { //wait menu By addMenuBy = By.cssSelector("fieldset.o_ac_configuration ul.dropdown-menu"); - OOGraphene.waitElement(addMenuBy, 5, browser); - By addMethodBy = By.xpath("//fieldset[contains(@class,'o_ac_configuration')]//ul[contains(@class,'dropdown-menu')]//a[//i[contains(@class,'" + iconClassname + "')]]"); - WebElement methodLink = browser.findElement(addMethodBy); - methodLink.click(); + OOGraphene.waitElement(addMenuBy, browser); + By addMethodBy = By.xpath("//fieldset[contains(@class,'o_ac_configuration')]//ul[contains(@class,'dropdown-menu')]//a[i[contains(@class,'" + iconClassname + "')]]"); + browser.findElement(addMethodBy).click(); OOGraphene.waitBusy(browser); return this; } @@ -113,6 +112,33 @@ public class BookingPage { OOGraphene.waitBusy(browser); } + /** + * Select the free booking option + * + * @return Itself + */ + public BookingPage addFreeBooking() { + addMethod("o_ac_free_icon"); + OOGraphene.waitModalDialog(browser); + return this; + } + + /** + * Save the free booking. + * + * @param description The description of the booking. + * @return Itself + */ + public BookingPage configureFreeBooking(String description) { + By descriptionBy = By.cssSelector(".o_sel_accesscontrol_free_form .o_sel_accesscontrol_description textarea"); + browser.findElement(descriptionBy).sendKeys(description); + + By submitBy = By.cssSelector(".o_sel_accesscontrol_free_form button.btn-primary"); + browser.findElement(submitBy).click(); + OOGraphene.waitBusy(browser); + return this; + } + public void save() { By saveButtonBy = By.cssSelector("form button.btn-primary"); browser.findElement(saveButtonBy).click(); diff --git a/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java b/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java index 4a058b65bcb..5a016a79268 100644 --- a/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java +++ b/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java @@ -435,6 +435,15 @@ public class OOGraphene { waitModalDialogDisappears(browser); } + public static final void closeWarningBox(WebDriver browser) { + By errorBoxBy = By.cssSelector(".modal-body.alert.alert-warning"); + waitElement(errorBoxBy, 5, browser); + By closeButtonBy = By.xpath("//div[not(@id='o_form_dirty_message')]/div[contains(@class,'modal-dialog')]//button[@class='close']"); + waitElement(closeButtonBy, 5, browser); + browser.findElement(closeButtonBy).click(); + waitModalDialogDisappears(browser); + } + public static final void waitAndCloseBlueMessageWindow(WebDriver browser) { try { Graphene.waitModel(browser).withTimeout(5, TimeUnit.SECONDS) -- GitLab