From c6768e816e9dc0436cf13fa7e71fb2ddae3ef9b0 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Wed, 31 Aug 2016 20:34:26 +0200
Subject: [PATCH] OO-2057: fix horrible rs, add selenium test

---
 .../ui/AssignmentEditController.java          |   5 +
 .../portfolio/ui/BinderController.java        |   4 +-
 .../ui/BinderPageListController.java          |   4 +-
 .../org/olat/selenium/PortfolioV2Test.java    | 163 ++++++++++++++++++
 .../page/course/CourseEditorPageFragment.java |  10 ++
 .../page/course/PortfolioElementPage.java     |  54 ++++++
 .../page/portfolio/PortfolioV2Page.java       |  50 ++++++
 .../page/repository/AuthoringEnvPage.java     |  10 +-
 8 files changed, 295 insertions(+), 5 deletions(-)
 create mode 100644 src/test/java/org/olat/selenium/PortfolioV2Test.java
 create mode 100644 src/test/java/org/olat/selenium/page/course/PortfolioElementPage.java

diff --git a/src/main/java/org/olat/modules/portfolio/ui/AssignmentEditController.java b/src/main/java/org/olat/modules/portfolio/ui/AssignmentEditController.java
index b959fb1a364..abe68b1a20e 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/AssignmentEditController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/AssignmentEditController.java
@@ -108,12 +108,16 @@ public class AssignmentEditController extends FormBasicController {
 
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
+		formLayout.setElementCssClass("o_sel_pf_edit_assignment_form");
+		
 		String title = assignment == null ? null : assignment.getTitle();
 		titleEl = uifactory.addTextElement("title", "assignment.title", 255, title, formLayout);
+		titleEl.setElementCssClass("o_sel_pf_edit_assignment_title");
 		titleEl.setMandatory(true);
 		
 		String summary = assignment == null ? null : assignment.getSummary();
 		summaryEl = uifactory.addTextAreaElement("summary", "summary", 4096, 6, 60, false, summary, formLayout);
+		summaryEl.setElementCssClass("o_sel_pf_edit_assignment_summary");
 		summaryEl.setPlaceholderKey("summary.placeholder", null);
 		
 		String content = assignment == null ? null : assignment.getContent();
@@ -124,6 +128,7 @@ public class AssignmentEditController extends FormBasicController {
 		
 		String[] typeValues = new String[]{ translate("assignment.type.essay"), translate("assignment.type.document") };
 		typeEl = uifactory.addDropdownSingleselect("type", "assignment.type", formLayout, typeKeys, typeValues, null);
+		typeEl.setElementCssClass("o_sel_pf_edit_assignment_type");
 		typeEl.addActionListener(FormEvent.ONCHANGE);
 		String selectedType = assignment == null ? typeKeys[0] : assignment.getAssignmentType().name();
 		typeEl.select(selectedType, true);
diff --git a/src/main/java/org/olat/modules/portfolio/ui/BinderController.java b/src/main/java/org/olat/modules/portfolio/ui/BinderController.java
index 0a8029c2a28..f95f4933891 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/BinderController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/BinderController.java
@@ -105,12 +105,12 @@ public class BinderController extends BasicController implements TooledControlle
 		}
 		if(config.isAssessable()) {
 			assessmentLink = LinkFactory.createLink("portfolio.assessment", getTranslator(), this);
-			publishLink.setElementCssClass("o_sel_pf_assessment");
+			assessmentLink.setElementCssClass("o_sel_pf_assessment");
 			segmentButtonsCmp.addButton(assessmentLink, false);
 		}
 		if(config.isOptions()) {
 			optionsLink = LinkFactory.createLink("portfolio.template.options", getTranslator(), this);
-			publishLink.setElementCssClass("o_sel_pf_options");
+			optionsLink.setElementCssClass("o_sel_pf_options");
 			segmentButtonsCmp.addButton(optionsLink, false);
 		}
 		
diff --git a/src/main/java/org/olat/modules/portfolio/ui/BinderPageListController.java b/src/main/java/org/olat/modules/portfolio/ui/BinderPageListController.java
index e2ce2a58d66..a86402e4e81 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/BinderPageListController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/BinderPageListController.java
@@ -232,7 +232,7 @@ public class BinderPageListController extends AbstractPageListController {
 			
 			if(secCallback.canNewAssignment() && section != null) {
 				FormLink newAssignmentButton = uifactory.addFormLink("new.assignment." + (++counter), "new.assignment", "create.new.assignment", null, flc, Link.BUTTON);
-				newAssignmentButton.setCustomEnabledLinkCSS("btn btn-primary");
+				newAssignmentButton.setCustomEnabledLinkCSS("btn btn-primary o_sel_pf_new_assignment");
 				newAssignmentButton.setUserObject(pageRow);
 				pageRow.setNewAssignmentLink(newAssignmentButton);
 			}
@@ -271,7 +271,7 @@ public class BinderPageListController extends AbstractPageListController {
 				
 				if(secCallback.canNewAssignment() && section != null) {
 					FormLink newAssignmentButton = uifactory.addFormLink("new.assignment." + (++counter), "new.assignment", "create.new.assignment", null, flc, Link.BUTTON);
-					newAssignmentButton.setCustomEnabledLinkCSS("btn btn-primary");
+					newAssignmentButton.setCustomEnabledLinkCSS("btn btn-primary o_sel_pf_new_assignment");
 					newAssignmentButton.setUserObject(sectionRow);
 					sectionRow.setNewAssignmentLink(newAssignmentButton);
 				}
diff --git a/src/test/java/org/olat/selenium/PortfolioV2Test.java b/src/test/java/org/olat/selenium/PortfolioV2Test.java
new file mode 100644
index 00000000000..96933669cb9
--- /dev/null
+++ b/src/test/java/org/olat/selenium/PortfolioV2Test.java
@@ -0,0 +1,163 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.selenium;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.UUID;
+
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.container.test.api.RunAsClient;
+import org.jboss.arquillian.drone.api.annotation.Drone;
+import org.jboss.arquillian.graphene.page.InitialPage;
+import org.jboss.arquillian.graphene.page.Page;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.arquillian.test.api.ArquillianResource;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.olat.selenium.page.LoginPage;
+import org.olat.selenium.page.NavigationPage;
+import org.olat.selenium.page.User;
+import org.olat.selenium.page.course.CourseEditorPageFragment;
+import org.olat.selenium.page.course.CoursePageFragment;
+import org.olat.selenium.page.course.MembersPage;
+import org.olat.selenium.page.course.PortfolioElementPage;
+import org.olat.selenium.page.course.PublisherPageFragment.Access;
+import org.olat.selenium.page.portfolio.PortfolioV2Page;
+import org.olat.test.ArquillianDeployments;
+import org.olat.test.rest.UserRestClient;
+import org.olat.user.restapi.UserVO;
+import org.openqa.selenium.WebDriver;
+
+/**
+ * 
+ * Suite of test for the e-Portfolio version 2.0
+ * 
+ * Initial date: 20.06.2016<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+@RunWith(Arquillian.class)
+public class PortfolioV2Test {
+	
+	@Deployment(testable = false)
+	public static WebArchive createDeployment() {
+		return ArquillianDeployments.createDeployment();
+	}
+
+	@Drone
+	private WebDriver browser;
+	@ArquillianResource
+	private URL deploymentUrl;
+	@Page
+	private NavigationPage navBar;
+	
+	/**
+	 * Create a portfolio, a course with a portoflio course element,
+	 * publish it, ad a participant. The participant log in, search
+	 * the course and pick the portfolio.
+	 * 
+	 * @param loginPage
+	 * @throws IOException
+	 * @throws URISyntaxException
+	 */
+	@Test
+	@RunAsClient
+	public void createTemplate(@InitialPage LoginPage loginPage,
+			@Drone @User WebDriver ryomouBrowser)
+	throws IOException, URISyntaxException {
+		UserVO author = new UserRestClient(deploymentUrl).createAuthor();
+		UserVO ryomou = new UserRestClient(deploymentUrl).createRandomUser("ryomou");
+		
+		loginPage
+			.loginAs(author.getLogin(), author.getPassword())
+			.resume();
+		
+		String binderTitle = "PF-Binder-" + UUID.randomUUID();
+		navBar
+			.openAuthoringEnvironment()
+			.createPortfolioBinder(binderTitle)
+			.clickToolbarBack();
+		
+		String sectionTitle = "Section 1 " + UUID.randomUUID();
+		String assignmentTitle = "Assignment 1 " + UUID.randomUUID();
+		
+		PortfolioV2Page portfolio = new PortfolioV2Page(browser);
+		portfolio
+			.assertOnBinder()
+			.selectEntries()
+			.createSectionInEntries(sectionTitle)
+			.createAssignmentForSection(sectionTitle, assignmentTitle, "Write a small text")
+			.assertOnAssignmentInEntries(assignmentTitle);
+		
+		String courseTitle = "PF Course " + UUID.randomUUID();
+		navBar
+			.openAuthoringEnvironment()
+			.createCourse(courseTitle)
+			.clickToolbarBack();
+		
+		String portfolioNodeTitle = "Template-EP-v2";
+	
+		//create a course element of type portfolio and choose the one we created above
+		CourseEditorPageFragment courseEditor = CoursePageFragment.getCourse(browser)
+			.edit();
+		courseEditor
+			.createNode("ep")
+			.nodeTitle(portfolioNodeTitle)
+			.selectTabLearnContent()
+			.choosePortfolio(binderTitle)
+			.publish()
+			.quickPublish(Access.membersOnly);
+	
+		MembersPage membersPage = courseEditor
+			.clickToolbarBack()
+			.members();
+	
+		membersPage
+			.importMembers()
+			.setMembers(ryomou)
+			.next().next().next().finish();
+		
+		//Participant log in
+		LoginPage ryomouLoginPage = LoginPage.getLoginPage(ryomouBrowser, deploymentUrl);
+		ryomouLoginPage
+			.loginAs(ryomou)
+			.resume();
+		
+		//open the course
+		NavigationPage ryomouNavBar = new NavigationPage(ryomouBrowser);
+		ryomouNavBar
+			.openMyCourses()
+			.select(courseTitle);
+		
+		//go to the portfolio course element
+		CoursePageFragment ryomouTestCourse = new CoursePageFragment(ryomouBrowser);
+		ryomouTestCourse
+			.clickTree()
+			.selectWithTitle(portfolioNodeTitle);
+		PortfolioElementPage portfolioCourseEl = new PortfolioElementPage(ryomouBrowser);
+		portfolioCourseEl
+			.pickPortfolio()
+			.goToPortfolioV2();
+	}
+
+}
diff --git a/src/test/java/org/olat/selenium/page/course/CourseEditorPageFragment.java b/src/test/java/org/olat/selenium/page/course/CourseEditorPageFragment.java
index e7bc5f51a52..5996a1b9ff0 100644
--- a/src/test/java/org/olat/selenium/page/course/CourseEditorPageFragment.java
+++ b/src/test/java/org/olat/selenium/page/course/CourseEditorPageFragment.java
@@ -381,6 +381,16 @@ public class CourseEditorPageFragment {
 		return chooseResource(chooseScormButton, resourceTitle);
 	}
 	
+	/**
+	 * Choose a portfolio, v1.0 or v2.0
+	 * 
+	 * @param resourceTitle The name of the binder / portfolio
+	 * @return
+	 */
+	public CourseEditorPageFragment choosePortfolio(String resourceTitle) {
+		return chooseResource(choosePortfolioButton, resourceTitle);
+	}
+	
 	/**
 	 * Click the choose button, which open the resource chooser. Select
 	 * the "My entries" segment, search the rows for the resource title,
diff --git a/src/test/java/org/olat/selenium/page/course/PortfolioElementPage.java b/src/test/java/org/olat/selenium/page/course/PortfolioElementPage.java
new file mode 100644
index 00000000000..ae084066649
--- /dev/null
+++ b/src/test/java/org/olat/selenium/page/course/PortfolioElementPage.java
@@ -0,0 +1,54 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.selenium.page.course;
+
+import org.olat.selenium.page.graphene.OOGraphene;
+import org.olat.selenium.page.portfolio.PortfolioV2Page;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+/**
+ * 
+ * Initial date: 31.08.2016<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class PortfolioElementPage {
+	
+	private WebDriver browser;
+	
+	public PortfolioElementPage(WebDriver browser) {
+		this.browser = browser;
+	}
+	
+	public PortfolioElementPage pickPortfolio() {
+		By pickBy = By.cssSelector("a.btn.o_sel_ep_new_map_template");
+		OOGraphene.waitElement(pickBy, 5, browser);
+		browser.findElement(pickBy).click();
+		OOGraphene.waitBusy(browser);
+		OOGraphene.waitAndCloseBlueMessageWindow(browser);
+		return this;
+	}
+	
+	public PortfolioV2Page goToPortfolioV2() {
+		return new PortfolioV2Page(browser);
+	}
+
+}
diff --git a/src/test/java/org/olat/selenium/page/portfolio/PortfolioV2Page.java b/src/test/java/org/olat/selenium/page/portfolio/PortfolioV2Page.java
index 1df427485f1..d47c941117b 100644
--- a/src/test/java/org/olat/selenium/page/portfolio/PortfolioV2Page.java
+++ b/src/test/java/org/olat/selenium/page/portfolio/PortfolioV2Page.java
@@ -19,6 +19,8 @@
  */
 package org.olat.selenium.page.portfolio;
 
+import java.util.List;
+
 import org.junit.Assert;
 import org.olat.selenium.page.graphene.OOGraphene;
 import org.openqa.selenium.By;
@@ -67,6 +69,13 @@ public class PortfolioV2Page {
 		return this;
 	}
 	
+	public PortfolioV2Page assertOnAssignmentInEntries(String title) {
+		By assignmentTitleBy = By.xpath("//h4[i[contains(@class,'o_icon_assignment')]][contains(text(),'" + title + "')]");
+		OOGraphene.waitElement(assignmentTitleBy, 5, browser);
+		return this;
+	}
+	
+	
 	public PortfolioV2Page selectTableOfContent() {
 		By tocBy = By.cssSelector("li.o_tool .o_sel_pf_binder_navigation .o_sel_pf_toc");
 		browser.findElement(tocBy).click();
@@ -81,6 +90,20 @@ public class PortfolioV2Page {
 		return this;
 	}
 	
+	
+	/**
+	 * Create a section in the tab entries (this is one must
+	 * be selected).
+	 * 
+	 * @param title
+	 * @return
+	 */
+	public PortfolioV2Page createSectionInEntries(String title) {
+		createSection(title);
+		assertOnSectionTitleInEntries(title);
+		return this;
+	}
+	
 	public PortfolioV2Page createSection(String title) {
 		//click create button
 		By createBy = By.className("o_sel_pf_new_section");
@@ -127,5 +150,32 @@ public class PortfolioV2Page {
 		return this;
 	}
 	
+	public PortfolioV2Page createAssignmentForSection(String sectionTitle, String title, String summary) {
+		By newAssignmentBy = By.xpath("//div[contains(@class,'o_portfolio_section')][h3[contains(text(),'" + sectionTitle + "')]]//a[contains(@class,'o_sel_pf_new_assignment')]");
+		List<WebElement> newAssignmentButtons = browser.findElements(newAssignmentBy);
+		Assert.assertEquals(1, newAssignmentButtons.size());
+		newAssignmentButtons.get(0).click();
+		
+		OOGraphene.waitBusy(browser);
+		OOGraphene.waitModalDialog(browser);
+		By popupBy = By.cssSelector("div.modal-content fieldset.o_sel_pf_edit_assignment_form");
+		OOGraphene.waitElement(popupBy, 5, browser);
+		
+		//fill the form
+		By nameBy = By.cssSelector(".o_sel_pf_edit_assignment_title input[type='text']");
+		WebElement nameEl = browser.findElement(nameBy);
+		nameEl.sendKeys(title);
+		By summaryBy = By.cssSelector(".o_sel_pf_edit_assignment_summary textarea");
+		WebElement summaryEl = browser.findElement(summaryBy);
+		summaryEl.sendKeys(summary);
+		
+		//save
+		By submitBy = By.cssSelector(".o_sel_pf_edit_assignment_form button.btn-primary");
+		WebElement submitButton = browser.findElement(submitBy);
+		submitButton.click();
+		OOGraphene.waitBusy(browser);
+		return this;
+	} 
+	
 
 }
diff --git a/src/test/java/org/olat/selenium/page/repository/AuthoringEnvPage.java b/src/test/java/org/olat/selenium/page/repository/AuthoringEnvPage.java
index 4d108fc6c2b..253c195742c 100644
--- a/src/test/java/org/olat/selenium/page/repository/AuthoringEnvPage.java
+++ b/src/test/java/org/olat/selenium/page/repository/AuthoringEnvPage.java
@@ -81,6 +81,13 @@ public class AuthoringEnvPage {
 			.assertOnGeneralTab();
 	}
 	
+	public RepositoryEditDescriptionPage createPortfolioBinder(String title) {
+		return openCreateDropDown()
+			.clickCreate(ResourceType.portfolio)
+			.fillCreateForm(title)
+			.assertOnGeneralTab();
+	}
+	
 	/**
 	 * Open the drop-down to create a new resource.
 	 * @return
@@ -192,7 +199,8 @@ public class AuthoringEnvPage {
 	public enum ResourceType {
 		course("CourseModule"),
 		cp("FileResource.IMSCP"),
-		wiki("FileResource.WIKI");
+		wiki("FileResource.WIKI"),
+		portfolio("BinderTemplate");
 		
 		private final String type;
 		
-- 
GitLab