/** * <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.File; import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; import java.util.Calendar; import java.util.Date; 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.Assert; 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.Participant; import org.olat.selenium.page.Student; import org.olat.selenium.page.User; import org.olat.selenium.page.course.AssessmentCEConfigurationPage; import org.olat.selenium.page.course.AssessmentModePage; import org.olat.selenium.page.course.AssessmentToolPage; import org.olat.selenium.page.course.BulkAssessmentPage.BulkAssessmentData; import org.olat.selenium.page.course.CourseEditorPageFragment; import org.olat.selenium.page.course.CoursePageFragment; import org.olat.selenium.page.course.GroupTaskConfigurationPage; import org.olat.selenium.page.course.GroupTaskPage; import org.olat.selenium.page.course.GroupTaskToCoachPage; import org.olat.selenium.page.course.MembersPage; import org.olat.selenium.page.course.PublisherPageFragment.Access; import org.olat.selenium.page.graphene.OOGraphene; import org.olat.selenium.page.group.GroupPage; import org.olat.selenium.page.qti.QTI12Page; import org.olat.selenium.page.repository.RepositoryAccessPage.UserAccess; import org.olat.selenium.page.repository.ScormPage; import org.olat.selenium.page.user.UserToolsPage; import org.olat.test.ArquillianDeployments; import org.olat.test.JunitTestHelper; import org.olat.test.rest.RepositoryRestClient; import org.olat.test.rest.UserRestClient; import org.olat.user.restapi.UserVO; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; /** * * Initial date: 11.02.2015<br> * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ @RunWith(Arquillian.class) public class AssessmentTest { @Deployment(testable = false) public static WebArchive createDeployment() { return ArquillianDeployments.createDeployment(); } @Drone private WebDriver browser; @ArquillianResource private URL deploymentUrl; @Page private NavigationPage navBar; /** * An author upload a test, create a course with a test course * element, publish the course and do and pass the test. * * @param authorLoginPage * @throws IOException * @throws URISyntaxException */ @Test @RunAsClient public void qti12Test(@InitialPage LoginPage authorLoginPage) throws IOException, URISyntaxException { UserVO author = new UserRestClient(deploymentUrl).createAuthor(); authorLoginPage.loginAs(author.getLogin(), author.getPassword()); //upload a test String qtiTestTitle = "QTI-Test-1.2-" + UUID.randomUUID(); URL qtiTestUrl = JunitTestHelper.class.getResource("file_resources/e4_test.zip"); File qtiTestFile = new File(qtiTestUrl.toURI()); navBar .openAuthoringEnvironment() .uploadResource(qtiTestTitle, qtiTestFile); //create a course String courseTitle = "Course-With-QTI-Test-1.2-" + UUID.randomUUID(); navBar .openAuthoringEnvironment() .createCourse(courseTitle) .clickToolbarBack(); //create a course element of type Test with the test that we create above String testNodeTitle = "Test-QTI-1.2"; CourseEditorPageFragment courseEditor = CoursePageFragment.getCourse(browser) .edit(); courseEditor .createNode("iqtest") .nodeTitle(testNodeTitle) .selectTabLearnContent() .chooseTest(qtiTestTitle); //publish the course courseEditor .publish() .quickPublish(); //open the course and see the test start page courseEditor .clickToolbarBack() .clickTree() .selectWithTitle(testNodeTitle); //check that the title of the start page of test is correct WebElement testH2 = browser.findElement(By.cssSelector("div.o_course_run h2")); Assert.assertEquals(testNodeTitle, testH2.getText().trim()); //start the test QTI12Page testPage = QTI12Page.getQTI12Page(browser); testPage .start() .selectItem("Single choice") .answerSingleChoice("Correct answer") .saveAnswer() .selectItem("Multiple choice") .answerMultipleChoice("Correct answer", "The answer is correct") .saveAnswer() .selectItem("Kprim") .answerKPrim(true, false, true, false) .saveAnswer() .selectItem("Fill-in") .answerFillin("not") .saveAnswer(); testPage .endTest(); //check results page By resultsBy = By.id("o_qti_results"); OOGraphene.waitElement(resultsBy, browser); WebElement resultsEl = browser.findElement(resultsBy); Assert.assertTrue(resultsEl.getText().contains(author.getFirstName())); //close the test testPage .closeTest(); //all answers are correct -> passed WebElement passedEl = browser.findElement(By.cssSelector("tr.o_state.o_passed")); Assert.assertTrue(passedEl.isDisplayed()); } /** * An author upload a test, create a course with a test course * element, publish the course, assign the course to a student. * The student come to pass the test, logout after passing it. * The author check if the test of the student is passed in the * assessment tool. * * @param authorLoginPage * @throws IOException * @throws URISyntaxException */ @Test @RunAsClient public void qti12CourseWithAssessment(@InitialPage LoginPage authorLoginPage, @Drone @User WebDriver ryomouBrowser) throws IOException, URISyntaxException { UserVO author = new UserRestClient(deploymentUrl).createAuthor(); authorLoginPage.loginAs(author.getLogin(), author.getPassword()); UserVO ryomou = new UserRestClient(deploymentUrl).createRandomUser("Ryomou"); //upload a test String qtiTestTitle = "QTI-Test-1.2-" + UUID.randomUUID(); URL qtiTestUrl = JunitTestHelper.class.getResource("file_resources/e4_test.zip"); File qtiTestFile = new File(qtiTestUrl.toURI()); navBar .openAuthoringEnvironment() .uploadResource(qtiTestTitle, qtiTestFile); //create a course String courseTitle = "Course-With-QTI-Test-1.2-" + UUID.randomUUID(); navBar .openAuthoringEnvironment() .createCourse(courseTitle) .clickToolbarBack(); //create a course element of type CP with the CP that we create above String testNodeTitle = "Test-QTI-1.2"; CourseEditorPageFragment courseEditor = CoursePageFragment.getCourse(browser) .edit(); courseEditor .createNode("iqtest") .nodeTitle(testNodeTitle) .selectTabLearnContent() .chooseTest(qtiTestTitle); //publish the course courseEditor .publish() .quickPublish(Access.membersOnly); //open the course and see the test start page CoursePageFragment courseRuntime = courseEditor .clickToolbarBack(); courseRuntime .clickTree() .selectWithTitle(testNodeTitle); //check that the title of the start page of test is correct WebElement testH2 = browser.findElement(By.cssSelector("div.o_course_run h2")); Assert.assertEquals(testNodeTitle, testH2.getText().trim()); //add Ryomou as a course member courseRuntime .members() .addMember() .searchMember(ryomou, true) .next().next().next().finish(); //Ryomou open the course LoginPage ryomouLoginPage = LoginPage.getLoginPage(ryomouBrowser, deploymentUrl); ryomouLoginPage .loginAs(ryomou.getLogin(), ryomou.getPassword()) .resume(); //open the course NavigationPage ryomouNavBar = new NavigationPage(ryomouBrowser); ryomouNavBar .openMyCourses() .select(courseTitle); //go to the test CoursePageFragment ryomouTestCourse = new CoursePageFragment(ryomouBrowser); ryomouTestCourse .clickTree() .selectWithTitle(testNodeTitle); //start the test QTI12Page testPage = QTI12Page.getQTI12Page(ryomouBrowser); testPage .start() .selectItem("Single choice") .answerSingleChoice("Correct answer") .saveAnswer() .selectItem("Multiple choice") .answerMultipleChoice("Correct answer", "The answer is correct") .saveAnswer() .selectItem("Kprim") .answerKPrim(true, false, true, false) .saveAnswer() .selectItem("Fill-in") .answerFillin("not") .saveAnswer(); testPage .endTest(); //check results page By resultsBy = By.id("o_qti_results"); OOGraphene.waitElement(resultsBy, ryomouBrowser); WebElement resultsEl = ryomouBrowser.findElement(resultsBy); Assert.assertTrue(resultsEl.getText().contains(ryomou.getFirstName())); //close the test testPage .closeTest(); //all answers are correct -> passed WebElement passedEl = ryomouBrowser.findElement(By.cssSelector("tr.o_state.o_passed")); Assert.assertTrue(passedEl.isDisplayed()); //log out UserToolsPage roymouUserTools = new UserToolsPage(ryomouBrowser); roymouUserTools.logout(); //author take the lead and check the assessment tool navBar .openMyCourses() .select(courseTitle); //open the assessment tool AssessmentToolPage assessmentTool = new CoursePageFragment(browser) .assessmentTool(); assessmentTool .users() //check that ryomou has passed the test .assertOnUsers(ryomou) .selectUser(ryomou) .assertPassed(ryomou); } /** * An author upload a SCORM resource, create a course and use the * SCORM within. It publish the course, add a participant to the * course. The participant log in, select the course above, run * the SCORM and finish it.<br> * At the end, the author go to the assessment tool and chec that * the participant has successfully passed the test. * * @param authorLoginPage * @param ryomouBrowser * @throws IOException * @throws URISyntaxException */ @Test @RunAsClient public void scormCourseWithAssessment(@InitialPage LoginPage authorLoginPage, @Drone @User WebDriver ryomouBrowser) throws IOException, URISyntaxException { UserVO author = new UserRestClient(deploymentUrl).createAuthor(); authorLoginPage.loginAs(author.getLogin(), author.getPassword()); UserVO ryomou = new UserRestClient(deploymentUrl).createRandomUser("Ryomou"); //upload a test String scormTitle = "SCORM - " + UUID.randomUUID(); URL scormUrl = JunitTestHelper.class.getResource("file_resources/very_simple_scorm.zip"); File scormFile = new File(scormUrl.toURI()); navBar .openAuthoringEnvironment() .uploadResource(scormTitle, scormFile); //create a course String courseTitle = "Course-With-SCORM-" + UUID.randomUUID(); navBar .openAuthoringEnvironment() .createCourse(courseTitle) .clickToolbarBack(); //create a course element of type Scorm with the scorm that we create above String scormNodeTitle = "SCORM"; CourseEditorPageFragment courseEditor = CoursePageFragment.getCourse(browser) .edit(); courseEditor .createNode("scorm") .nodeTitle(scormNodeTitle) .selectTabLearnContent() .chooseScorm(scormTitle); //publish the course courseEditor .autoPublish() .accessConfiguration() .setUserAccess(UserAccess.registred) .clickToolbarBack(); CoursePageFragment courseRuntime = new CoursePageFragment(browser); //add Ryomou as a course member courseRuntime .members() .addMember() .searchMember(ryomou, true) .next().next().next().finish(); //Ryomou open the course LoginPage ryomouLoginPage = LoginPage.getLoginPage(ryomouBrowser, deploymentUrl); ryomouLoginPage .loginAs(ryomou.getLogin(), ryomou.getPassword()) .resume(); //open the course NavigationPage ryomouNavBar = new NavigationPage(ryomouBrowser); ryomouNavBar .openMyCourses() .select(courseTitle); //open the course and see the test start page CoursePageFragment ryomouCourse = new CoursePageFragment(ryomouBrowser); ryomouCourse .clickTree() .selectWithTitle(scormNodeTitle); By scormH2By = By.cssSelector("div.o_course_run h2"); WebElement scormH2 = ryomouBrowser.findElement(scormH2By); Assert.assertEquals(scormNodeTitle, scormH2.getText().trim()); //scorm ScormPage scorm = ScormPage.getScormPage(ryomouBrowser); scorm .start() .passVerySimpleScorm() .back(); WebElement scormH2Back = ryomouBrowser.findElement(scormH2By); Assert.assertEquals(scormNodeTitle, scormH2Back.getText().trim()); //log out UserToolsPage roymouUserTools = new UserToolsPage(ryomouBrowser); roymouUserTools.logout(); //author take the lead and check the assessment tool navBar .openMyCourses() .select(courseTitle); //open the assessment tool AssessmentToolPage assessmentTool = new CoursePageFragment(browser) .assessmentTool(); assessmentTool .users() //check that ryomou has passed the test .assertOnUsers(ryomou) .selectUser(ryomou) .assertPassed(ryomou); } /** * An author upload a test, create a course with a test course * element, publish the course, add 2 students (Ryomou and Kanu) * to the course, configure an assessment.<br /> * A first student log in before the assessment is started by the * author, the second log-in after the begin of the assessment. * Both pass the test. The Author ends the assessment. The two * students wait the end of the assessment and go back to normal * activities. The author checks the students pass the test in the * assessment tool. * * @param authorLoginPage * @throws IOException * @throws URISyntaxException */ @Test @RunAsClient public void assessmentMode_manual(@InitialPage LoginPage authorLoginPage, @Drone @Student WebDriver ryomouBrowser, @Drone @Participant WebDriver kanuBrowser) throws IOException, URISyntaxException { UserVO author = new UserRestClient(deploymentUrl).createAuthor(); authorLoginPage.loginAs(author.getLogin(), author.getPassword()); UserVO ryomou = new UserRestClient(deploymentUrl).createRandomUser("Ryomou"); UserVO kanu = new UserRestClient(deploymentUrl).createRandomUser("Kanu"); //upload a test String qtiTestTitle = "QTI-Test-1.2-" + UUID.randomUUID(); URL qtiTestUrl = JunitTestHelper.class.getResource("file_resources/e4_test.zip"); File qtiTestFile = new File(qtiTestUrl.toURI()); navBar .openAuthoringEnvironment() .uploadResource(qtiTestTitle, qtiTestFile); //create a course String courseTitle = "Course-With-QTI-Test-1.2-" + UUID.randomUUID(); navBar .openAuthoringEnvironment() .createCourse(courseTitle) .clickToolbarBack(); //create a course element of type CP with the CP that we create above String testNodeTitle = "Test-QTI-1.2"; CourseEditorPageFragment courseEditor = CoursePageFragment.getCourse(browser) .edit(); courseEditor .createNode("iqtest") .nodeTitle(testNodeTitle) .selectTabLearnContent() .chooseTest(qtiTestTitle); //publish the course courseEditor .publish() .quickPublish(); //open the course and see the test start page CoursePageFragment courseRuntime = courseEditor .clickToolbarBack(); courseRuntime .clickTree() .selectWithTitle(testNodeTitle); OOGraphene.closeBlueMessageWindow(browser); //check that the title of the start page of test is correct WebElement testH2 = browser.findElement(By.cssSelector("div.o_course_run h2")); Assert.assertEquals(testNodeTitle, testH2.getText().trim()); //add Ryomou and Kanu as a course member courseRuntime.members().quickAdd(ryomou); courseRuntime.members().quickAdd(kanu); //Kanu log in LoginPage kanuLoginPage = LoginPage.getLoginPage(kanuBrowser, deploymentUrl); kanuLoginPage .loginAs(kanu.getLogin(), kanu.getPassword()) .resume(); // prepare and start an assessment Calendar cal = Calendar.getInstance(); Date begin = cal.getTime(); cal.add(Calendar.MINUTE, 5); Date end = cal.getTime(); String assessmentName = "Assessment-" + UUID.randomUUID(); courseRuntime .assessmentConfiguration() .createAssessmentMode() .editAssessment(assessmentName, begin, end, true) .save() .start(assessmentName) .confirmStart(); //Ryomou opens the course LoginPage ryomouLoginPage = LoginPage.getLoginPage(ryomouBrowser, deploymentUrl); ryomouLoginPage .loginAs(ryomou.getLogin(), ryomou.getPassword()); //start the assessment AssessmentModePage ryomouAssessment = new AssessmentModePage(ryomouBrowser) .startAssessment(false); //go to the test CoursePageFragment ryomouTestCourse = new CoursePageFragment(ryomouBrowser); ryomouTestCourse .clickTree() .selectWithTitle(testNodeTitle); //pass the test QTI12Page.getQTI12Page(ryomouBrowser).passE4(ryomou); //Kanu makes the test AssessmentModePage kanuAssessment = new AssessmentModePage(kanuBrowser) .startAssessment(true); //go to the test CoursePageFragment kanuTestCourse = new CoursePageFragment(kanuBrowser); kanuTestCourse .clickTree() .selectWithTitle(testNodeTitle); //pass the test QTI12Page.getQTI12Page(kanuBrowser).passE4(kanu); //Author ends the test courseRuntime .assessmentConfiguration() .stop(assessmentName) .confirmStop(); By continueBy = By.className("o_sel_assessment_continue"); OOGraphene.waitElement(continueBy, 10, ryomouBrowser); OOGraphene.waitElement(continueBy, 10, kanuBrowser); kanuAssessment.backToOpenOLAT(); ryomouAssessment.backToOpenOLAT(); //Author check if they pass the test navBar .openMyCourses() .select(courseTitle); //open the assessment tool AssessmentToolPage assessmentTool = new CoursePageFragment(browser) .assessmentTool(); assessmentTool .users() //check that ryomou has passed the test .assertOnUsers(ryomou) .assertOnUsers(kanu) .selectUser(ryomou) .assertPassed(ryomou); } /** * An author create a course, publish it and add a participant. * It set the certificate, create one for the participant.<br> * The participant logs in and look at its wonderful certificate. * * @param authorLoginPage * @param reiBrowser * @throws IOException * @throws URISyntaxException */ @Test @RunAsClient public void certificatesManuallyGenerated(@InitialPage LoginPage authorLoginPage, @Drone @User WebDriver reiBrowser) throws IOException, URISyntaxException { UserVO author = new UserRestClient(deploymentUrl).createAuthor(); authorLoginPage.loginAs(author.getLogin(), author.getPassword()); UserVO rei = new UserRestClient(deploymentUrl).createRandomUser("Rei"); //create a course String courseTitle = "Course-With-Certificates-" + UUID.randomUUID(); navBar .openAuthoringEnvironment() .createCourse(courseTitle) .clickToolbarBack(); //create a course element of type CP with the CP that we create above CoursePageFragment courseRuntime = CoursePageFragment.getCourse(browser) .edit() .createNode("info") .autoPublish(); //add a participant to the course MembersPage members = courseRuntime .members(); members .addMember() .searchMember(rei, true) .next().next().next().finish(); // return to course courseRuntime = members .clickToolbarBack() .efficiencyStatementConfiguration() .clickToolbarBack() .efficiencyStatementConfiguration() .enableCertificates(false) .enableRecertification() .save() .clickToolbarBack(); //create a certificate courseRuntime .assessmentTool() .users() .selectUser(rei) .generateCertificate(); //Participant log in LoginPage reiLoginPage = LoginPage.getLoginPage(reiBrowser, deploymentUrl); reiLoginPage .loginAs(rei.getLogin(), rei.getPassword()) .resume(); //open the efficiency statements UserToolsPage reiUserTools = new UserToolsPage(reiBrowser); reiUserTools .openUserToolsMenu() .openMyEfficiencyStatement() .assertOnEfficiencyStatmentPage() .assertOnCertificate(courseTitle); } /** * An author create a course, set up the root node to make efficiency statement, * add a test, publish it and add a participant. It set the certificate.<br> * * The participant logs in, make the test and look at its wonderful certificate * and the details of its performance. * * @param authorLoginPage * @param reiBrowser * @throws IOException * @throws URISyntaxException */ @Test @RunAsClient public void certificatesGeneratedByTest(@InitialPage LoginPage authorLoginPage, @Drone @User WebDriver reiBrowser) throws IOException, URISyntaxException { //create an author and a participant UserVO author = new UserRestClient(deploymentUrl).createAuthor(); UserVO rei = new UserRestClient(deploymentUrl).createRandomUser("Rei"); //deploy the test URL testUrl = ArquillianDeployments.class.getResource("file_resources/e4_test.zip"); String testTitle = "E4Test-" + UUID.randomUUID(); new RepositoryRestClient(deploymentUrl, author).deployResource(new File(testUrl.toURI()), "-", testTitle); authorLoginPage.loginAs(author.getLogin(), author.getPassword()); //create a course String courseTitle = "Certif-" + UUID.randomUUID(); navBar .openAuthoringEnvironment() .createCourse(courseTitle) .clickToolbarBack(); //create a course element of type CP with the CP that we create above String testNodeTitle = "Test-QTI-1.2"; CoursePageFragment courseRuntime = CoursePageFragment.getCourse(browser); courseRuntime .edit() .createNode("iqtest") .nodeTitle(testNodeTitle) .selectTabLearnContent() .chooseTest(testTitle) .selectRoot() .selectTabScore() .enableRootScoreByNodes() .autoPublish() .accessConfiguration() .setUserAccess(UserAccess.registred) .clickToolbarBack(); //add a participant to the course MembersPage members = courseRuntime .members(); members .addMember() .searchMember(rei, true) .next().next().next().finish(); // return to course courseRuntime = members .clickToolbarBack() .efficiencyStatementConfiguration() .enableCertificates(true) .enableRecertification() .save() .clickToolbarBack(); //Participant log in LoginPage reiLoginPage = LoginPage.getLoginPage(reiBrowser, deploymentUrl); reiLoginPage .loginAs(rei.getLogin(), rei.getPassword()) .resume(); //open the course NavigationPage reiNavBar = new NavigationPage(reiBrowser); reiNavBar .openMyCourses() .select(courseTitle); //go to the test CoursePageFragment reiTestCourse = new CoursePageFragment(reiBrowser); reiTestCourse .clickTree() .selectWithTitle(testNodeTitle); //pass the test QTI12Page.getQTI12Page(reiBrowser).passE4(rei); //open the efficiency statements UserToolsPage reiUserTools = new UserToolsPage(reiBrowser); reiUserTools .openUserToolsMenu() .openMyEfficiencyStatement() .assertOnEfficiencyStatmentPage() .assertOnCertificateAndStatements(courseTitle) .selectStatement(courseTitle) .selectStatementSegment() .assertOnCourseDetails(testNodeTitle, true); } /** * An author create a course with an assessment course element with * min., max., cut value and so on. It add an user to the course, * go to the assessment tool and set a score to the assessed user.<br> * * The user log in, go to the efficiency statements list and check * it become its statement. * * @param authorLoginPage * @param ryomouBrowser * @throws IOException * @throws URISyntaxException */ @Test @RunAsClient public void assessmentCourseElement(@InitialPage LoginPage authorLoginPage, @Drone @User WebDriver ryomouBrowser) throws IOException, URISyntaxException { UserVO author = new UserRestClient(deploymentUrl).createAuthor(); UserVO ryomou = new UserRestClient(deploymentUrl).createRandomUser("Ryomou"); authorLoginPage.loginAs(author.getLogin(), author.getPassword()); //create a course String courseTitle = "Course-Assessment-" + UUID.randomUUID(); navBar .openAuthoringEnvironment() .createCourse(courseTitle) .clickToolbarBack(); //create a course element of type Test with the test that we create above String assessmentNodeTitle = "Assessment CE"; CourseEditorPageFragment courseEditor = CoursePageFragment.getCourse(browser) .edit() .createNode("ms") .nodeTitle(assessmentNodeTitle); //configure assessment AssessmentCEConfigurationPage assessmentConfig = new AssessmentCEConfigurationPage(browser); assessmentConfig .selectConfiguration() .setScoreAuto(0.1f, 10.0f, 5.0f); //set the score / passed calculation in root node and publish courseEditor .selectRoot() .selectTabScore() .enableRootScoreByNodes() .autoPublish() .accessConfiguration() .setUserAccess(UserAccess.registred); //go to members management CoursePageFragment courseRuntime = courseEditor.clickToolbarBack(); MembersPage members = courseRuntime .members(); members .addMember() .searchMember(ryomou, true) .next().next().next().finish(); //efficiency statement is default on //go to the assessment to to set the points members .clickToolbarBack() .assessmentTool() .users() .assertOnUsers(ryomou) .selectUser(ryomou) .selectCourseNode(assessmentNodeTitle) .setAssessmentScore(8.0f) .assertUserPassedCourseNode(assessmentNodeTitle); //Ryomou login LoginPage ryomouLoginPage = LoginPage.getLoginPage(ryomouBrowser, deploymentUrl); ryomouLoginPage .loginAs(ryomou.getLogin(), ryomou.getPassword()) .resume(); //see its beautiful efficiency statement UserToolsPage ryomouUserTools = new UserToolsPage(ryomouBrowser); ryomouUserTools .openUserToolsMenu() .openMyEfficiencyStatement() .assertOnEfficiencyStatmentPage() .assertOnStatement(courseTitle, true) .selectStatement(courseTitle) .assertOnCourseDetails(assessmentNodeTitle, true); } /** * An author create a course for a group task with the default * settings, all steps are selected, grading with only passed, * 3 groups, 2 tasks, 1 solution...</br> * A group has 2 participants, the first select a task, the * second submit 2 documents, one with the embedded editor, * one with the upload mechanism.</br> * The author reviews the documents, use the assessment tool * for group within the course element to set passed to the * group.</br> * The 2 participants check if they successfully passed the task. * * * @param authorLoginPage * @param ryomouBrowser * @param kanuBrowser * @throws IOException * @throws URISyntaxException */ @Test @RunAsClient public void taskWithGroupsAndStandardSettings(@InitialPage LoginPage authorLoginPage, @Drone @User WebDriver ryomouBrowser, @Drone @Participant WebDriver kanuBrowser) throws IOException, URISyntaxException { UserVO author = new UserRestClient(deploymentUrl).createAuthor(); UserVO kanu = new UserRestClient(deploymentUrl).createRandomUser("Kanu"); UserVO ryomou = new UserRestClient(deploymentUrl).createRandomUser("Ryomou"); authorLoginPage.loginAs(author.getLogin(), author.getPassword()); //create a course String courseTitle = "Course-with-group-task-" + UUID.randomUUID(); navBar .openAuthoringEnvironment() .createCourse(courseTitle) .clickToolbarBack(); //create a course element of type Test with the test that we create above String gtaNodeTitle = "Group task 1"; CourseEditorPageFragment courseEditor = CoursePageFragment.getCourse(browser) .edit(); courseEditor .createNode("gta") .nodeTitle(gtaNodeTitle); GroupTaskConfigurationPage gtaConfig = new GroupTaskConfigurationPage(browser); gtaConfig .selectWorkflow() .openBusinessGroupChooser() .createBusinessGroup("Group to task - 1") .createBusinessGroup("Group to task - 2") .createBusinessGroup("Group to task - 3") .confirmBusinessGroupsSelection() .saveWorkflow() .selectAssignment(); URL task1Url = JunitTestHelper.class.getResource("file_resources/task_1_a.txt"); File task1File = new File(task1Url.toURI()); gtaConfig.uploadTask("Task 1", task1File); URL task2Url = JunitTestHelper.class.getResource("file_resources/task_1_b.txt"); File task2File = new File(task2Url.toURI()); gtaConfig .uploadTask("Task 2 B", task2File) .saveTasks() .selectSolution(); URL solutionUrl = JunitTestHelper.class.getResource("file_resources/solution_1.txt"); File solutionFile = new File(solutionUrl.toURI()); gtaConfig.uploadSolution("The Best Solution", solutionFile); courseEditor .publish() .quickPublish(Access.guests); MembersPage membersPage = courseEditor .clickToolbarBack() .members(); GroupPage groupPage = membersPage .selectBusinessGroups() .selectBusinessGroup("Group to task - 1") .openAdministration() .openAdminMembers(); groupPage .addMember() .searchMember(kanu, true) .next().next().next() .finish(); groupPage .addMember() .searchMember(ryomou, true) .next().next().next() .finish(); groupPage.close(); //go to the course CoursePageFragment coursePage = membersPage .clickToolbarBack(); coursePage .clickTree() .selectWithTitle(gtaNodeTitle); //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 group task CoursePageFragment ryomouTestCourse = new CoursePageFragment(ryomouBrowser); ryomouTestCourse .clickTree() .selectWithTitle(gtaNodeTitle); GroupTaskPage ryomouTask = new GroupTaskPage(ryomouBrowser); ryomouTask .assertAssignmentAvailable() .selectTask(1) .assertSubmissionAvailable(); //Participant 2 log in LoginPage kanuLoginPage = LoginPage.getLoginPage(kanuBrowser, deploymentUrl); kanuLoginPage .loginAs(kanu) .resume(); //open the course NavigationPage kanuNavBar = new NavigationPage(kanuBrowser); kanuNavBar .openMyCourses() .select(courseTitle); //go to the group task CoursePageFragment kanuTestCourse = new CoursePageFragment(kanuBrowser); kanuTestCourse .clickTree() .selectWithTitle(gtaNodeTitle); URL submit1Url = JunitTestHelper.class.getResource("file_resources/submit_1.txt"); File submit1File = new File(submit1Url.toURI()); String submittedFilename = "my_solution.html"; String submittedText = "This is my solution"; GroupTaskPage kanuTask = new GroupTaskPage(kanuBrowser); kanuTask .assertTask("Task 2 B") .assertSubmissionAvailable() .submitFile(submit1File) .submitText(submittedFilename, submittedText) .submitDocuments(); //back to author coursePage .clickTree() .selectWithTitle(gtaNodeTitle); GroupTaskToCoachPage groupToCoach = new GroupTaskToCoachPage(browser); groupToCoach .selectBusinessGroupToCoach("Group to task - 1") .assertSubmittedDocument("my_solution.html") .assertSubmittedDocument("submit_1.txt") .reviewed() .openGroupAssessment() .groupAssessment(Boolean.TRUE, null); //participant check if they passed kanuTestCourse .clickTree() .selectWithTitle(gtaNodeTitle); kanuTask.assertPassed(); ryomouTestCourse .clickTree() .selectWithTitle(gtaNodeTitle); ryomouTask.assertPassed(); } /** * An author create a course for a task with the some custom * settings, all steps are selected, grading with score and * passed automatically calculated, 2 tasks, 1 solution...</br> * It had 2 participants. One of them goes through the workflow, * selects a task, submits 2 documents, one with the embedded editor, * one with the upload mechanism.</br> * The author reviews the documents, uploads a correction and * want a revision.</br> * The assessed participant upload a revised document.</br> * The author sees it and close the revisions process, use * the assessment tool to set the score.</br> * The participant checks if she successfully passed the task. * * @param authorLoginPage * @param ryomouBrowser * @throws IOException * @throws URISyntaxException */ @Test @RunAsClient public void taskWithIndividuScoreAndRevision(@InitialPage LoginPage authorLoginPage, @Drone @User WebDriver ryomouBrowser) throws IOException, URISyntaxException { UserVO author = new UserRestClient(deploymentUrl).createAuthor(); UserVO kanu = new UserRestClient(deploymentUrl).createRandomUser("kanu"); UserVO ryomou = new UserRestClient(deploymentUrl).createRandomUser("ryomou"); authorLoginPage.loginAs(author.getLogin(), author.getPassword()); //create a course String courseTitle = "Course-with-individual-task-" + UUID.randomUUID(); navBar .openAuthoringEnvironment() .createCourse(courseTitle) .clickToolbarBack(); //create a course element of type Test with the test that we create above String gtaNodeTitle = "Individual task 1"; CourseEditorPageFragment courseEditor = CoursePageFragment.getCourse(browser) .edit(); courseEditor .createNode("ita") .nodeTitle(gtaNodeTitle); GroupTaskConfigurationPage gtaConfig = new GroupTaskConfigurationPage(browser); gtaConfig .selectAssignment(); URL task1Url = JunitTestHelper.class.getResource("file_resources/task_1_a.txt"); File task1File = new File(task1Url.toURI()); gtaConfig.uploadTask("Individual Task 1 alpha", task1File); URL task2Url = JunitTestHelper.class.getResource("file_resources/task_1_b.txt"); File task2File = new File(task2Url.toURI()); gtaConfig .uploadTask("Individual Task 2 beta", task2File) .saveTasks() .selectSolution(); URL solutionUrl = JunitTestHelper.class.getResource("file_resources/solution_1.txt"); File solutionFile = new File(solutionUrl.toURI()); gtaConfig.uploadSolution("The Best Solution", solutionFile); gtaConfig .selectAssessment() .setAssessmentOptions(0.0f, 6.0f, 4.0f) .saveAssessmentOptions(); courseEditor .publish() .quickPublish(Access.membersOnly); MembersPage membersPage = courseEditor .clickToolbarBack() .members(); membersPage .importMembers() .setMembers(kanu, ryomou) .next().next().next().finish(); //go to the course CoursePageFragment coursePage = membersPage .clickToolbarBack(); coursePage .clickTree() .selectWithTitle(gtaNodeTitle); //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 group task CoursePageFragment ryomouTestCourse = new CoursePageFragment(ryomouBrowser); ryomouTestCourse .clickTree() .selectWithTitle(gtaNodeTitle); GroupTaskPage ryomouTask = new GroupTaskPage(ryomouBrowser); ryomouTask .assertAssignmentAvailable() .selectTask(1) .assertTask("Individual Task 2 beta") .assertSubmissionAvailable(); URL submit1Url = JunitTestHelper.class.getResource("file_resources/submit_2.txt"); File submit1File = new File(submit1Url.toURI()); String submittedFilename = "personal_solution.html"; String submittedText = "This is my solution"; ryomouTask .submitFile(submit1File) .submitText(submittedFilename, submittedText) .submitDocuments(); //back to author coursePage .clickTree() .selectWithTitle(gtaNodeTitle); GroupTaskToCoachPage participantToCoach = new GroupTaskToCoachPage(browser); URL correctionUrl = JunitTestHelper.class.getResource("file_resources/correction_1.txt"); File correctionFile = new File(correctionUrl.toURI()); participantToCoach .selectIdentityToCoach(ryomou) .assertSubmittedDocument("personal_solution.html") .assertSubmittedDocument("submit_2.txt") .uploadCorrection(correctionFile) .needRevision(); //participant add a revised document URL revisionUrl = JunitTestHelper.class.getResource("file_resources/submit_3.txt"); File revisionFile = new File(revisionUrl.toURI()); ryomouTestCourse .clickTree() .selectWithTitle(gtaNodeTitle); ryomouTask .submitRevisedFile(revisionFile) .submitRevision(); //back to author coursePage .clickTree() .selectWithTitle(gtaNodeTitle); participantToCoach .selectIdentityToCoach(ryomou) .assertRevision("submit_3.txt") .closeRevisions() .openIndividualAssessment() .individualAssessment(null, 5.5f) .assertPassed(); //participant checks she passed the task ryomouTestCourse .clickTree() .selectWithTitle(gtaNodeTitle); ryomouTask .assertPassed(); } /** * Create an assessment course element, add two users to the course * and assesses them with the bulk assessment tool. The 2 users * log in and check their results. * * @param loginPage * @param kanuBrowser * @param reiBrowser * @throws IOException * @throws URISyntaxException */ @Test @RunAsClient public void bulkAssessment(@InitialPage LoginPage loginPage, @Drone @User WebDriver ryomouBrowser, @Drone @Participant WebDriver kanuBrowser) throws IOException, URISyntaxException { UserVO author = new UserRestClient(deploymentUrl).createAuthor(); UserVO ryomou = new UserRestClient(deploymentUrl).createRandomUser("Ryomou"); UserVO kanu = new UserRestClient(deploymentUrl).createRandomUser("Kanu"); loginPage.loginAs(author.getLogin(), author.getPassword()); //create a course String courseTitle = "Course-Assessment-" + UUID.randomUUID(); navBar .openAuthoringEnvironment() .createCourse(courseTitle) .clickToolbarBack(); //create a course element of type Test with the test that we create above String assessmentNodeTitle = "Assessment CE"; CourseEditorPageFragment courseEditor = CoursePageFragment.getCourse(browser) .edit() .createNode("ms") .nodeTitle(assessmentNodeTitle); //configure assessment AssessmentCEConfigurationPage assessmentConfig = new AssessmentCEConfigurationPage(browser); assessmentConfig .selectConfiguration() .setScoreAuto(0.1f, 10.0f, 5.0f); //set the score / passed calculation in root node and publish courseEditor .selectRoot() .selectTabScore() .enableRootScoreByNodes() .autoPublish() .accessConfiguration() .setUserAccess(UserAccess.registred); //go to members management CoursePageFragment courseRuntime = courseEditor.clickToolbarBack(); MembersPage members = courseRuntime .members(); members .importMembers() .setMembers(ryomou, kanu) .next().next().next().finish(); BulkAssessmentData[] data = new BulkAssessmentData[] { new BulkAssessmentData(ryomou, 8.0f, null, "Well done"), new BulkAssessmentData(kanu, 4.0f, null, "Need more work") }; members .clickToolbarBack() .assessmentTool() .bulk() .data(data) .next() .next() .next() .finish(); //Ryomou login LoginPage ryomouLoginPage = LoginPage.getLoginPage(ryomouBrowser, deploymentUrl); ryomouLoginPage .loginAs(ryomou) .resume(); NavigationPage ryomouNavBar = new NavigationPage(ryomouBrowser); ryomouNavBar .openMyCourses() .select(courseTitle); //go to the group task CoursePageFragment ryomouCourse = new CoursePageFragment(ryomouBrowser); ryomouCourse .clickTree() .selectWithTitle(assessmentNodeTitle); //Second login LoginPage kanuLoginPage = LoginPage.getLoginPage(kanuBrowser, deploymentUrl); kanuLoginPage .loginAs(kanu) .resume(); NavigationPage kanuNavBar = new NavigationPage(kanuBrowser); kanuNavBar .openMyCourses() .select(courseTitle); //go to the group task CoursePageFragment kanuCourse = new CoursePageFragment(kanuBrowser); kanuCourse .clickTree() .selectWithTitle(assessmentNodeTitle); //Ryomou -> passed WebElement passedEl = ryomouBrowser.findElement(By.cssSelector("tr.o_state.o_passed")); Assert.assertTrue(passedEl.isDisplayed()); //Kanu -> failed WebElement failedEl = kanuBrowser.findElement(By.cssSelector("tr.o_state.o_failed")); Assert.assertTrue(failedEl.isDisplayed()); } }