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 b959fb1a364523c17a56b2c4f3b628747e45847a..abe68b1a20ea9f8dbdfac033a1f07924dfbc8039 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 0a8029c2a2885022c7a66b1bf18843c3220f5960..f95f49338911eae71fc0d423e542b8fd29280677 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 e2ce2a58d66e69951ce6acfa517e402c30faa674..a86402e4e81258a5bf780a80a3c4e3f773d767c1 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 0000000000000000000000000000000000000000..96933669cb9404acc863cdbc8f44f63cfc109d68 --- /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 e7bc5f51a52837306d8170548170f8d411cc7f25..5996a1b9ff0f0800e7906f69240868cf2147cb09 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 0000000000000000000000000000000000000000..ae084066649744e865ad9f3b1e64f886f4767f0c --- /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 1df427485f1bdebd89a53e0860f35b66d790fcd7..d47c941117bbca7716b89f05fd5cf07f1c4b4874 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 4d108fc6c2bba24a0a1ccf3f6070d6e8582aeeec..253c195742c59c78842963d319a587595c8c0b72 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;