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