diff --git a/src/main/java/org/olat/course/learningpath/ui/LearningPathNodeConfigController.java b/src/main/java/org/olat/course/learningpath/ui/LearningPathNodeConfigController.java index 3b38afead51e021ba1b6a30232edd8400935fa98..3fc488564f82f5f86a9d82410c8c1e7927fa7c7d 100644 --- a/src/main/java/org/olat/course/learningpath/ui/LearningPathNodeConfigController.java +++ b/src/main/java/org/olat/course/learningpath/ui/LearningPathNodeConfigController.java @@ -92,6 +92,7 @@ public class LearningPathNodeConfigController extends FormBasicController { protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { setFormTitle("config.title"); setFormContextHelp("Learning path element"); + formLayout.setElementCssClass("o_sel_learnpath_element"); KeyValues obligationKV = new KeyValues(); obligationKV.add(entry(AssessmentObligation.mandatory.name(), translate("config.obligation.mandatory"))); obligationKV.add(entry(AssessmentObligation.optional.name(), translate("config.obligation.optional"))); diff --git a/src/test/java/org/olat/selenium/AssessmentTest.java b/src/test/java/org/olat/selenium/AssessmentTest.java index 1509492ca410b39692b8c163d6d9e23b11a6a2e1..8ba2b269c9e0e56bc8f23ef9771f713a31eab17f 100644 --- a/src/test/java/org/olat/selenium/AssessmentTest.java +++ b/src/test/java/org/olat/selenium/AssessmentTest.java @@ -34,6 +34,7 @@ import org.jboss.arquillian.test.api.ArquillianResource; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; +import org.olat.course.learningpath.FullyAssessedTrigger; import org.olat.repository.model.SingleRoleRepositoryEntrySecurity.Role; import org.olat.selenium.page.LoginPage; import org.olat.selenium.page.NavigationPage; @@ -1871,7 +1872,7 @@ public class AssessmentTest extends Deployments { /** * An author create a course with an heavy customized task - * coure element. Assignment and submission are disabled. + * course element. Assignment and submission are disabled. * The participant doesn't to interact with the course, the * author / coach upload a correction and marks the task as * reviewed and uses the assessment tool to set the score.<br> @@ -2113,4 +2114,107 @@ public class AssessmentTest extends Deployments { .openSolutions() .assertSolution("solution_1.txt"); } + + /** + * This is a degenerated form of task but the case exists. + * An author creates a course (learn path) with a task course + * element. The task is configured to only show the solution, + * and the course element to be passed if the task is done. In + * this case, the participant only need to see the solution to + * get the node done. + * + * @param participantBrowser Browser of the participant + * @throws IOException + * @throws URISyntaxException + */ + @Test + @RunAsClient + public void taskLearnPathSolutionsOnly(@Drone @User WebDriver participantBrowser) + throws IOException, URISyntaxException { + + UserVO author = new UserRestClient(deploymentUrl).createRandomAuthor(); + UserVO participant = new UserRestClient(deploymentUrl).createRandomUser("kanu"); + + LoginPage authorLoginPage = LoginPage.load(browser, deploymentUrl); + authorLoginPage.loginAs(author.getLogin(), author.getPassword()); + + //create a course + String courseTitle = "Course-with-auto-task-" + UUID.randomUUID(); + NavigationPage navBar = NavigationPage.load(browser); + navBar + .openAuthoringEnvironment() + .createCourse(courseTitle, true) + .clickToolbarBack(); + + //create a course element of type Test with the test that we create above + String gtaNodeTitle = "Solution 1"; + CourseEditorPageFragment courseEditor = CoursePageFragment.getCourse(browser) + .edit(); + courseEditor + .createNode("ita") + .nodeTitle(gtaNodeTitle); + + courseEditor + .selectTabLearnPath() + .setCompletionCriterion(FullyAssessedTrigger.statusDone) + .save(); + + GroupTaskConfigurationPage gtaConfig = new GroupTaskConfigurationPage(browser); + gtaConfig + .selectWorkflow() + .enableAssignment(false) + .enableSubmission(false) + .enableReview(false) + .enableGrading(false) + .saveWorkflow(); + + URL solutionUrl = JunitTestHelper.class.getResource("file_resources/solution_1.txt"); + File solutionFile = new File(solutionUrl.toURI()); + gtaConfig + .selectSolution() + .uploadSolution("A possible solution", solutionFile); + + courseEditor + .publish() + .quickPublish(UserAccess.membersOnly); + + + MembersPage membersPage = courseEditor + .clickToolbarBack() + .members(); + + membersPage + .importMembers() + .setMembers(participant) + .nextUsers() + .nextOverview() + .nextPermissions() + .finish(); + + //Participant log in + LoginPage participantLoginPage = LoginPage.load(participantBrowser, deploymentUrl); + participantLoginPage + .loginAs(participant) + .resume(); + + //open the course + NavigationPage participantNavBar = NavigationPage.load(participantBrowser); + participantNavBar + .openMyCourses() + .select(courseTitle); + + //go to the group task + CoursePageFragment participantCourse = new CoursePageFragment(participantBrowser); + participantCourse + .clickTree() + .selectWithTitle(gtaNodeTitle); + + GroupTaskPage participantTask = new GroupTaskPage(participantBrowser); + participantTask + .openSolutions() + .assertSolution("solution_1.txt"); + // seeing the solution got the job done + participantCourse + .assertOnLearnPathNodeDone(gtaNodeTitle); + } } 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 232a5ad921045debcb35b862897ba5f9876f2ebb..aa0e31ae491a878175b90b35fba53e8f2d6d4a49 100644 --- a/src/test/java/org/olat/selenium/page/course/CourseEditorPageFragment.java +++ b/src/test/java/org/olat/selenium/page/course/CourseEditorPageFragment.java @@ -146,6 +146,12 @@ public class CourseEditorPageFragment { return selectTab(scoreTabBy); } + public LearnPathCourseElementEditorPage selectTabLearnPath() { + By learnPathTabBy = By.cssSelector("fieldset.o_sel_learnpath_element"); + selectTab(learnPathTabBy); + return new LearnPathCourseElementEditorPage(browser); + } + private CourseEditorPageFragment selectTab(By tabBy) { //make sure the tab bar is loaded OOGraphene.selectTab("o_node_config", tabBy, browser); diff --git a/src/test/java/org/olat/selenium/page/course/CoursePageFragment.java b/src/test/java/org/olat/selenium/page/course/CoursePageFragment.java index 235f4ce98760963f18cf16e8e8da8d1f0b793d58..5700988b382a4be8202b1b59eb77b7d0f1c2c0fb 100644 --- a/src/test/java/org/olat/selenium/page/course/CoursePageFragment.java +++ b/src/test/java/org/olat/selenium/page/course/CoursePageFragment.java @@ -92,6 +92,12 @@ public class CoursePageFragment { return this; } + public CoursePageFragment assertOnLearnPathNodeDone(String nodeTitle) { + By nodeDoneBy = By.xpath("//div[contains(@class,'o_lp_tree')]//span[contains(@class,'o_tree_l1')]/a[i[contains(@class,'o_lp_done')]][span[text()[contains(.,'" + nodeTitle + "')]]]"); + OOGraphene.waitElement(nodeDoneBy, browser); + return this; + } + /** * Assert if the password field is displayed. * @return diff --git a/src/test/java/org/olat/selenium/page/course/GroupTaskConfigurationPage.java b/src/test/java/org/olat/selenium/page/course/GroupTaskConfigurationPage.java index d69d2deb9530595f8570ac847f716cddb86c0c75..3b5ccdec131283a7e9eab421615de9038cb1f9da 100644 --- a/src/test/java/org/olat/selenium/page/course/GroupTaskConfigurationPage.java +++ b/src/test/java/org/olat/selenium/page/course/GroupTaskConfigurationPage.java @@ -79,6 +79,10 @@ public class GroupTaskConfigurationPage { return enableStep("sample", enable); } + public GroupTaskConfigurationPage enableGrading(boolean enable) { + return enableStep("grading", enable); + } + private GroupTaskConfigurationPage enableStep(String name, boolean enable) { By checkboxStepBy = By.xpath("//fieldset[contains(@class,'o_sel_course_gta_steps')]//label/input[@name='" + name + "']"); WebElement checkboxEl = browser.findElement(checkboxStepBy); diff --git a/src/test/java/org/olat/selenium/page/course/LearnPathCourseElementEditorPage.java b/src/test/java/org/olat/selenium/page/course/LearnPathCourseElementEditorPage.java new file mode 100644 index 0000000000000000000000000000000000000000..6afc5dbd2c7255c6e44532228b4901d52dde1f53 --- /dev/null +++ b/src/test/java/org/olat/selenium/page/course/LearnPathCourseElementEditorPage.java @@ -0,0 +1,56 @@ +/** + * <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.course.learningpath.FullyAssessedTrigger; +import org.olat.selenium.page.graphene.OOGraphene; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; + +/** + * + * Initial date: 27 mai 2020<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class LearnPathCourseElementEditorPage { + + private final WebDriver browser; + + public LearnPathCourseElementEditorPage(WebDriver browser) { + this.browser = browser; + } + + public LearnPathCourseElementEditorPage setCompletionCriterion(FullyAssessedTrigger trigger) { + By triggerBy = By.xpath("//fieldset[contains(@class,'o_sel_learnpath_element')]//div[@id='o_coconfig_trigger']//input[@name='config.trigger'][@value='" + trigger.name() + "']"); + OOGraphene.waitElement(triggerBy, browser); + browser.findElement(triggerBy).click(); + OOGraphene.waitBusy(browser); + return this; + } + + public LearnPathCourseElementEditorPage save() { + By saveBy = By.cssSelector("fieldset.o_sel_learnpath_element button.btn.btn-primary"); + browser.findElement(saveBy).click(); + OOGraphene.waitBusy(browser); + return this; + } + +}