From cc863b37ee41e2e69954fbd70cab80b5533cfa84 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Thu, 28 May 2015 20:05:49 +0200
Subject: [PATCH] OO-991: selenium test for the group task ( individual task )
 with score and automatic passed/failed, all steps made with a correction /
 revision step

---
 .../course/assessment/AssessmentForm.java     |   1 +
 ...CoachRevisionAndCorrectionsController.java |   2 +
 ...TACoachedParticipantGradingController.java |   1 +
 ...ipantRevisionAndCorrectionsController.java |   1 +
 .../org/olat/selenium/AssessmentTest.java     | 171 ++++++++++++++++++
 .../course/GroupTaskConfigurationPage.java    |  17 ++
 .../selenium/page/course/GroupTaskPage.java   |  18 +-
 .../page/course/GroupTaskToCoachPage.java     |  84 +++++++--
 8 files changed, 278 insertions(+), 17 deletions(-)

diff --git a/src/main/java/org/olat/course/assessment/AssessmentForm.java b/src/main/java/org/olat/course/assessment/AssessmentForm.java
index 76f1d35cc19..d7558aaed8e 100644
--- a/src/main/java/org/olat/course/assessment/AssessmentForm.java
+++ b/src/main/java/org/olat/course/assessment/AssessmentForm.java
@@ -346,6 +346,7 @@ public class AssessmentForm extends FormBasicController {
 		uifactory.addFormSubmitButton("save", buttonGroupLayout);
 		if(saveAndClose) {
 			saveAndCloseLink = uifactory.addFormLink("save.close", buttonGroupLayout, Link.BUTTON);
+			saveAndCloseLink.setElementCssClass("o_sel_assessment_form_save_and_close");
 		}
 		uifactory.addFormCancelButton("cancel", buttonGroupLayout, ureq, getWindowControl());
 	}
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachRevisionAndCorrectionsController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachRevisionAndCorrectionsController.java
index 78893b5b612..7e09cc27aa0 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachRevisionAndCorrectionsController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachRevisionAndCorrectionsController.java
@@ -184,10 +184,12 @@ public class GTACoachRevisionAndCorrectionsController extends BasicController {
 		returnToRevisionsButton = LinkFactory.createCustomLink("coach.submit.corrections.to.revision.button", "submit", "coach.submit.corrections.to.revision.button", Link.BUTTON, mainVC, this);
 		returnToRevisionsButton.setCustomEnabledLinkCSS("btn btn-primary");
 		returnToRevisionsButton.setIconLeftCSS("o_icon o_icon o_icon_submit");
+		returnToRevisionsButton.setElementCssClass("o_sel_course_gta_return_revision");
 		
 		closeRevisionsButton = LinkFactory.createCustomLink("coach.close.revision.button", "close", "coach.close.revision.button", Link.BUTTON, mainVC, this);
 		closeRevisionsButton.setCustomEnabledLinkCSS("btn btn-primary");
 		closeRevisionsButton.setIconLeftCSS("o_icon o_icon o_icon_submit");
+		closeRevisionsButton.setElementCssClass("o_sel_course_gta_close_revision");
 	}
 	
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedParticipantGradingController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedParticipantGradingController.java
index 9566773e8eb..75e71c6eb76 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedParticipantGradingController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedParticipantGradingController.java
@@ -80,6 +80,7 @@ public class GTACoachedParticipantGradingController extends BasicController {
 		
 		assessmentFormButton = LinkFactory.createCustomLink("coach.assessment", "assessment", "coach.assessment", Link.BUTTON, mainVC, this);
 		assessmentFormButton.setCustomEnabledLinkCSS("btn btn-primary");
+		assessmentFormButton.setElementCssClass("o_sel_course_gta_assessment_button");
 
 		putInitialPanel(mainVC);
 		setAssessmentDatas(ureq);
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantRevisionAndCorrectionsController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantRevisionAndCorrectionsController.java
index 9afa45141e8..dd5388f838c 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantRevisionAndCorrectionsController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantRevisionAndCorrectionsController.java
@@ -159,6 +159,7 @@ public class GTAParticipantRevisionAndCorrectionsController extends BasicControl
 		submitRevisionButton  = LinkFactory.createCustomLink("run.submit.revision.button", "submit", "run.submit.revision.button", Link.BUTTON, mainVC, this);
 		submitRevisionButton.setCustomEnabledLinkCSS("btn btn-primary");
 		submitRevisionButton.setIconLeftCSS("o_icon o_icon o_icon_submit");
+		submitRevisionButton.setElementCssClass("o_sel_course_gta_submit_revisions");
 	}
 	
 	private boolean setRevision(UserRequest ureq, String cmpName, int iteration) {
diff --git a/src/test/java/org/olat/selenium/AssessmentTest.java b/src/test/java/org/olat/selenium/AssessmentTest.java
index aeff622af3d..845ace72281 100644
--- a/src/test/java/org/olat/selenium/AssessmentTest.java
+++ b/src/test/java/org/olat/selenium/AssessmentTest.java
@@ -1036,4 +1036,175 @@ public class AssessmentTest {
 			.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 {
+		//File upload only work with Firefox
+		Assume.assumeTrue(browser instanceof FirefoxDriver);
+						
+		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();
+	}
 }
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 cfe3a03cf1a..bb5f34a009c 100644
--- a/src/test/java/org/olat/selenium/page/course/GroupTaskConfigurationPage.java
+++ b/src/test/java/org/olat/selenium/page/course/GroupTaskConfigurationPage.java
@@ -57,6 +57,11 @@ public class GroupTaskConfigurationPage {
 		return this;
 	}
 	
+	public GroupTaskConfigurationPage selectAssessment() {
+		By configBy = By.className("o_sel_course_ms_form");
+		return selectTab(configBy);
+	}
+	
 	public GroupTaskConfigurationPage selectAssignment() {
 		By configBy = By.className("o_sel_course_gta_tasks");
 		return selectTab(configBy);
@@ -110,6 +115,18 @@ public class GroupTaskConfigurationPage {
 		return this;
 	}
 	
+	public GroupTaskConfigurationPage setAssessmentOptions(Float minVal, Float maxVal, Float cutVal) {
+		new AssessmentCEConfigurationPage(browser).setScoreAuto(minVal, maxVal, cutVal);
+		return this;
+	}
+	
+	public GroupTaskConfigurationPage saveAssessmentOptions() {
+		By saveBy = By.cssSelector(".o_sel_course_ms_form button.btn-primary");
+		browser.findElement(saveBy).click();
+		OOGraphene.waitBusy(browser);
+		return this;
+	}
+	
 	private GroupTaskConfigurationPage selectTab(By tabBy) {
 		List<WebElement> tabLinks = browser.findElements(CourseEditorPageFragment.navBarNodeConfiguration);
 
diff --git a/src/test/java/org/olat/selenium/page/course/GroupTaskPage.java b/src/test/java/org/olat/selenium/page/course/GroupTaskPage.java
index fac8e2f4c75..bb99b87498a 100644
--- a/src/test/java/org/olat/selenium/page/course/GroupTaskPage.java
+++ b/src/test/java/org/olat/selenium/page/course/GroupTaskPage.java
@@ -80,7 +80,15 @@ public class GroupTaskPage {
 	}
 	
 	public GroupTaskPage submitFile(File file) {
-		By uploadButtonBy = By.cssSelector("#o_step_submit_content .o_sel_course_gta_submit_file");
+		return uploadFile("o_step_submit_content", file);
+	}
+	
+	public GroupTaskPage submitRevisedFile(File file) {
+		return uploadFile("o_step_revision_content", file);
+	}
+	
+	private GroupTaskPage uploadFile(String stepId, File file) {
+		By uploadButtonBy = By.cssSelector("#" + stepId + " .o_sel_course_gta_submit_file");
 		browser.findElement(uploadButtonBy).click();
 		OOGraphene.waitBusy(browser);
 		
@@ -90,7 +98,6 @@ public class GroupTaskPage {
 		By saveButtonBy = By.cssSelector(".o_sel_course_gta_upload_form button.btn-primary");
 		browser.findElement(saveButtonBy).click();
 		OOGraphene.waitBusy(browser);
-		
 		return this;
 	}
 	
@@ -125,6 +132,13 @@ public class GroupTaskPage {
 		return this;
 	}
 	
+	public GroupTaskPage submitRevision() {
+		By submitBy = By.cssSelector("#o_step_revision_content .o_sel_course_gta_submit_revisions");
+		browser.findElement(submitBy).click();
+		OOGraphene.waitBusy(browser);
+		return this;
+	}
+	
 	public GroupTaskPage assertPassed() {
 		By passedBy = By.cssSelector("#o_step_grading_content table tr.o_state.o_passed");
 		List<WebElement> passedEls = browser.findElements(passedBy);
diff --git a/src/test/java/org/olat/selenium/page/course/GroupTaskToCoachPage.java b/src/test/java/org/olat/selenium/page/course/GroupTaskToCoachPage.java
index 7bcee7107a2..6ed575a6329 100644
--- a/src/test/java/org/olat/selenium/page/course/GroupTaskToCoachPage.java
+++ b/src/test/java/org/olat/selenium/page/course/GroupTaskToCoachPage.java
@@ -1,5 +1,6 @@
 package org.olat.selenium.page.course;
 
+import java.io.File;
 import java.util.List;
 
 import org.jboss.arquillian.drone.api.annotation.Drone;
@@ -47,20 +48,8 @@ public class GroupTaskToCoachPage {
 	}
 	
 	public GroupTaskToCoachPage selectIdentityToCoach(UserVO user) {
-		By tableRowBy = By.cssSelector(".table tr");
-		By selectLinkBy = By.xpath("//td//a[contains(@href,'sel3ect')]");
-		
-		List<WebElement> rows = browser.findElements(tableRowBy);
-		WebElement selectLinkEl = null;
-		for(WebElement row:rows) {
-			String firstName = user.getFirstName();
-			String text = row.getText();
-			if(row.getText().contains(user.getFirstName())) {
-				selectLinkEl = row.findElement(selectLinkBy);
-			}
-		}
-		Assert.assertNotNull(selectLinkEl);
-		selectLinkEl.click();
+		By selectLinkBy = By.xpath("//table[contains(@class,'table')]//td//a[contains(@href,'firstName')][contains(text(),'" + user.getFirstName() + "')]");
+		browser.findElement(selectLinkBy).click();
 		OOGraphene.waitBusy(browser);
 		return this;
 	}
@@ -72,6 +61,13 @@ public class GroupTaskToCoachPage {
 		return this;
 	}
 	
+	public GroupTaskToCoachPage assertRevision(String title) {
+		By selectLinkBy = By.xpath("//div[@id='o_step_revision_content']//ul//a//span[contains(text(),'" + title + "')]");
+		List<WebElement> documentLinkEls = browser.findElements(selectLinkBy);
+		Assert.assertFalse(documentLinkEls.isEmpty());
+		return this;
+	}
+	
 	public GroupTaskToCoachPage reviewed() {
 		By reviewBy = By.cssSelector("#o_step_review_content .o_sel_course_gta_reviewed");
 		browser.findElement(reviewBy).click();
@@ -79,11 +75,62 @@ public class GroupTaskToCoachPage {
 		return this;
 	}
 	
-	public GroupTaskToCoachPage openGroupAssessment() {
+	public GroupTaskToCoachPage needRevision() {
+		By reviewBy = By.cssSelector("#o_step_review_content .o_sel_course_gta_need_revision");
+		browser.findElement(reviewBy).click();
+		OOGraphene.waitBusy(browser);
+		return this;
+	}
+	
+	public GroupTaskToCoachPage closeRevisions() {
+		By closeRevisionBy = By.cssSelector("#o_step_revision_content .o_sel_course_gta_close_revision");
+		browser.findElement(closeRevisionBy).click();
+		OOGraphene.waitBusy(browser);
+		return this;
+	}
+	
+	public GroupTaskToCoachPage uploadCorrection(File correctionFile) {
+		By uploadButtonBy = By.cssSelector("#o_step_review_content .o_sel_course_gta_submit_file");
+		browser.findElement(uploadButtonBy).click();
+		OOGraphene.waitBusy(browser);
+		
+		By inputBy = By.cssSelector(".o_fileinput input[type='file']");
+		OOGraphene.uploadFile(inputBy, correctionFile, browser);
+		
+		By saveButtonBy = By.cssSelector(".o_sel_course_gta_upload_form button.btn-primary");
+		browser.findElement(saveButtonBy).click();
+		OOGraphene.waitBusy(browser);
+		return this;
+	}
+	
+	public GroupTaskToCoachPage openIndividualAssessment() {
 		By assessmentButtonBy = By.cssSelector("#o_step_grading_content .o_sel_course_gta_assessment_button");
 		browser.findElement(assessmentButtonBy).click();
 		OOGraphene.waitBusy(browser);
+		return this;
+	}
+	
+	public GroupTaskToCoachPage individualAssessment(Boolean passed, Float score) {
+		if(passed != null) {
+			By passedBy = By.cssSelector(".o_sel_assessment_form_passed input[type='radio'][value='true']");
+			browser.findElement(passedBy).click();
+		}
 		
+		if(score != null) {
+			By scoreBy = By.cssSelector(".o_sel_assessment_form_score input[type='text']");
+			browser.findElement(scoreBy).sendKeys(Float.toString(score));
+		}
+		
+		By saveAndCloseBy = By.cssSelector(".o_sel_assessment_form a.o_sel_assessment_form_save_and_close");
+		browser.findElement(saveAndCloseBy).click();
+		OOGraphene.waitBusy(browser);
+		return this;
+	}
+	
+	public GroupTaskToCoachPage openGroupAssessment() {
+		By assessmentButtonBy = By.cssSelector("#o_step_grading_content .o_sel_course_gta_assessment_button");
+		browser.findElement(assessmentButtonBy).click();
+		OOGraphene.waitBusy(browser);
 		return this;
 	}
 	
@@ -119,5 +166,12 @@ public class GroupTaskToCoachPage {
 		OOGraphene.waitBusy(browser);
 		return this;
 	}
+	
+	public GroupTaskToCoachPage assertPassed() {
+		By passedBy = By.cssSelector("#o_step_grading_content table tr.o_state.o_passed");
+		List<WebElement> passedEls = browser.findElements(passedBy);
+		Assert.assertFalse(passedEls.isEmpty());
+		return this;
+	}
 
 }
-- 
GitLab