From 71b0f61cb6e96d455a294be8c135ee073257d508 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Fri, 17 Apr 2020 16:47:28 +0200
Subject: [PATCH] no-jira: hardened upload of files in selenium tests

---
 .../form/flexible/impl/elements/FileElementRenderer.java  | 8 ++++++--
 src/test/java/org/olat/selenium/AssessmentTest.java       | 2 +-
 src/test/java/org/olat/selenium/page/core/FolderPage.java | 2 ++
 .../selenium/page/course/DialogConfigurationPage.java     | 2 ++
 .../java/org/olat/selenium/page/course/DialogPage.java    | 2 ++
 .../selenium/page/course/GroupTaskConfigurationPage.java  | 4 ++++
 .../java/org/olat/selenium/page/course/GroupTaskPage.java | 2 ++
 .../olat/selenium/page/course/GroupTaskToCoachPage.java   | 2 ++
 .../selenium/page/course/SinglePageConfigurationPage.java | 2 ++
 .../java/org/olat/selenium/page/portfolio/EntryPage.java  | 5 ++++-
 .../org/olat/selenium/page/repository/CPEditorPage.java   | 6 ++++--
 11 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FileElementRenderer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FileElementRenderer.java
index 6e0855cbc3a..c56cc950e81 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FileElementRenderer.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FileElementRenderer.java
@@ -93,7 +93,9 @@ public class FileElementRenderer extends DefaultComponentRenderer {
 			boolean showDeleteButton = fileElem.isDeleteEnabled()
 					&& (fileElem.getInitialFile() != null || fileElem.getUploadFile() != null);
 			
-			sb.append("<div class='o_fileinput'>");	
+			sb.append("<div class='o_fileinput")
+			  .append(" o_sel_file_uploaded", fileElem.getUploadFile() != null)
+			  .append("'>");
 			// input.Browse is the real filebrowser, but set to be transparent. 
 			// the div.o_fakechooser is layered below the input.Browse and represents the visual GUI. 
 			// Since input.Browse is layered above div.o_fakechooser, all click events to go input.Browse
@@ -106,7 +108,9 @@ public class FileElementRenderer extends DefaultComponentRenderer {
 				 if (fileElem.getMaxUploadSizeKB() != FileElement.UPLOAD_UNLIMITED) {
 					 sb.append("\" data-max-size=\"").append(fileElem.getMaxUploadSizeKB() * 1024l);
 				 }
-				 sb.append("\" class='form-control o_realchooser ").append(" o_chooser_with_delete", showDeleteButton).append("' ");
+				 sb.append("\" class='form-control o_realchooser ")
+				   .append(" o_chooser_with_delete", showDeleteButton)
+				   .append("' ");
 				 // Add on* event handlers
 				 StringBuilder eventHandlers = FormJSHelper.getRawJSFor(fileElem.getRootForm(), id, fileElem.getAction());
 				 int onChangePos = eventHandlers.indexOf("onchange=");
diff --git a/src/test/java/org/olat/selenium/AssessmentTest.java b/src/test/java/org/olat/selenium/AssessmentTest.java
index 1450da951bf..ae80bd0213f 100644
--- a/src/test/java/org/olat/selenium/AssessmentTest.java
+++ b/src/test/java/org/olat/selenium/AssessmentTest.java
@@ -902,7 +902,7 @@ public class AssessmentTest extends Deployments {
 			@Drone @Participant WebDriver kanuBrowser)
 	throws IOException, URISyntaxException {
 			
-		UserVO author = new UserRestClient(deploymentUrl).createAuthor();
+		UserVO author = new UserRestClient(deploymentUrl).createRandomAuthor();
 		UserVO kanu = new UserRestClient(deploymentUrl).createRandomUser("Kanu");
 		UserVO ryomou = new UserRestClient(deploymentUrl).createRandomUser("Ryomou");
 
diff --git a/src/test/java/org/olat/selenium/page/core/FolderPage.java b/src/test/java/org/olat/selenium/page/core/FolderPage.java
index c438a65fdad..6755552ddc7 100644
--- a/src/test/java/org/olat/selenium/page/core/FolderPage.java
+++ b/src/test/java/org/olat/selenium/page/core/FolderPage.java
@@ -126,6 +126,8 @@ public class FolderPage {
 		By inputBy = By.cssSelector("div.modal-dialog div.o_fileinput input[type='file']");
 		OOGraphene.uploadFile(inputBy, file, browser);
 		OOGraphene.waitBusy(browser);
+		By uploadedBy = By.cssSelector("div.modal-dialog div.o_sel_file_uploaded");
+		OOGraphene.waitElement(uploadedBy, browser);
 		
 		By saveButtonBy = By.cssSelector("div.o_sel_upload_buttons button.btn-primary");
 		browser.findElement(saveButtonBy).click();
diff --git a/src/test/java/org/olat/selenium/page/course/DialogConfigurationPage.java b/src/test/java/org/olat/selenium/page/course/DialogConfigurationPage.java
index ea25e1ef0db..36ba7b6f38b 100644
--- a/src/test/java/org/olat/selenium/page/course/DialogConfigurationPage.java
+++ b/src/test/java/org/olat/selenium/page/course/DialogConfigurationPage.java
@@ -53,6 +53,8 @@ public class DialogConfigurationPage {
 		By inputBy = By.xpath("//div[contains(@class,'modal-body')]//div[@class='o_fileinput']/input[@type='file']");
 		OOGraphene.uploadFile(inputBy, file, browser);
 		OOGraphene.waitBusy(browser);
+		By uploadedBy = By.cssSelector("div.modal-body .o_sel_file_uploaded");
+		OOGraphene.waitElement(uploadedBy, browser);
 		
 		By uploadButtonBy = By.cssSelector("div.modal-body div.o_sel_upload_buttons button.btn-primary");
 		OOGraphene.waitElement(uploadButtonBy, browser);
diff --git a/src/test/java/org/olat/selenium/page/course/DialogPage.java b/src/test/java/org/olat/selenium/page/course/DialogPage.java
index 08400db37a9..b6803845c47 100644
--- a/src/test/java/org/olat/selenium/page/course/DialogPage.java
+++ b/src/test/java/org/olat/selenium/page/course/DialogPage.java
@@ -49,6 +49,8 @@ public class DialogPage {
 		By inputBy = By.cssSelector("div.modal-dialog div.o_fileinput input[type='file']");
 		OOGraphene.uploadFile(inputBy, file, browser);
 		OOGraphene.waitBusy(browser);
+		By uploadedBy = By.cssSelector("div.modal-dialog .o_sel_file_uploaded");
+		OOGraphene.waitElement(uploadedBy, browser);
 		
 		By saveButtonBy = By.cssSelector("div.o_sel_upload_buttons button.btn-primary");
 		browser.findElement(saveButtonBy).click();
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 24c67de2975..d69d2deb953 100644
--- a/src/test/java/org/olat/selenium/page/course/GroupTaskConfigurationPage.java
+++ b/src/test/java/org/olat/selenium/page/course/GroupTaskConfigurationPage.java
@@ -166,6 +166,8 @@ public class GroupTaskConfigurationPage {
 		By inputBy = By.cssSelector(".o_fileinput input[type='file']");
 		OOGraphene.uploadFile(inputBy, file, browser);
 		OOGraphene.waitBusy(browser);
+		By uploadedBy = By.cssSelector(".o_sel_course_gta_upload_task_form .o_sel_file_uploaded");
+		OOGraphene.waitElement(uploadedBy, browser);
 		
 		//save
 		By saveBy = By.cssSelector(".o_sel_course_gta_upload_task_form button.btn-primary");
@@ -203,6 +205,8 @@ public class GroupTaskConfigurationPage {
 		By inputBy = By.cssSelector(".o_fileinput input[type='file']");
 		OOGraphene.uploadFile(inputBy, file, browser);
 		OOGraphene.waitBusy(browser);
+		By uploadedBy = By.cssSelector(".o_sel_course_gta_upload_solution_form .o_sel_file_uploaded");
+		OOGraphene.waitElement(uploadedBy, browser);
 		
 		//save
 		By saveBy = By.cssSelector(".o_sel_course_gta_upload_solution_form button.btn-primary");
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 8de53820d48..e6b7d86c5dc 100644
--- a/src/test/java/org/olat/selenium/page/course/GroupTaskPage.java
+++ b/src/test/java/org/olat/selenium/page/course/GroupTaskPage.java
@@ -127,6 +127,8 @@ public class GroupTaskPage {
 		By inputBy = By.cssSelector(".o_fileinput input[type='file']");
 		OOGraphene.uploadFile(inputBy, file, browser);
 		OOGraphene.waitBusy(browser);
+		By uploadedBy = By.cssSelector(".o_sel_course_gta_upload_form .o_sel_file_uploaded");
+		OOGraphene.waitElement(uploadedBy, browser);
 		
 		By saveButtonBy = By.cssSelector(".o_sel_course_gta_upload_form button.btn-primary");
 		browser.findElement(saveButtonBy).click();
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 a74ebae757a..bb236a23ef9 100644
--- a/src/test/java/org/olat/selenium/page/course/GroupTaskToCoachPage.java
+++ b/src/test/java/org/olat/selenium/page/course/GroupTaskToCoachPage.java
@@ -137,6 +137,8 @@ public class GroupTaskToCoachPage {
 		By inputBy = By.cssSelector(".o_fileinput input[type='file']");
 		OOGraphene.uploadFile(inputBy, correctionFile, browser);
 		OOGraphene.waitBusy(browser);
+		By uploadedBy = By.cssSelector(".o_sel_course_gta_upload_form .o_sel_file_uploaded");
+		OOGraphene.waitElement(uploadedBy, browser);
 		
 		By saveButtonBy = By.cssSelector(".o_sel_course_gta_upload_form button.btn-primary");
 		browser.findElement(saveButtonBy).click();
diff --git a/src/test/java/org/olat/selenium/page/course/SinglePageConfigurationPage.java b/src/test/java/org/olat/selenium/page/course/SinglePageConfigurationPage.java
index 771054695b9..dbe48dc2629 100644
--- a/src/test/java/org/olat/selenium/page/course/SinglePageConfigurationPage.java
+++ b/src/test/java/org/olat/selenium/page/course/SinglePageConfigurationPage.java
@@ -79,6 +79,8 @@ public class SinglePageConfigurationPage {
 		By inputBy = By.cssSelector(".modal-body .o_fileinput input[type='file']");
 		OOGraphene.uploadFile(inputBy, file, browser);
 		OOGraphene.waitBusy(browser);
+		By uploadedBy = By.cssSelector(".modal-body .o_sel_file_uploaded");
+		OOGraphene.waitElement(uploadedBy, browser);
 		
 		By uploadBy = By.cssSelector(".modal-body .o_sel_upload_buttons button.btn-primary");
 		OOGraphene.waitElement(uploadBy, browser);
diff --git a/src/test/java/org/olat/selenium/page/portfolio/EntryPage.java b/src/test/java/org/olat/selenium/page/portfolio/EntryPage.java
index dfb8bbbf050..464e64a2b58 100644
--- a/src/test/java/org/olat/selenium/page/portfolio/EntryPage.java
+++ b/src/test/java/org/olat/selenium/page/portfolio/EntryPage.java
@@ -130,7 +130,9 @@ public class EntryPage {
 		
 		By inputBy = By.cssSelector("fieldset.o_sel_pf_collect_document_form .o_fileinput input[type='file']");
 		OOGraphene.uploadFile(inputBy, document, browser);
-		OOGraphene.waitingALittleLonger();//wait event
+		OOGraphene.waitBusy(browser);
+		By uploadedBy = By.cssSelector("fieldset.o_sel_pf_collect_document_form .o_sel_file_uploaded");
+		OOGraphene.waitElement(uploadedBy, browser);
 		
 		By titleBy = By.cssSelector("fieldset.o_sel_pf_collect_document_form .o_sel_pf_collect_title input[type='text']");
 		browser.findElement(titleBy).sendKeys(title);
@@ -139,6 +141,7 @@ public class EntryPage {
 		By saveBy = By.cssSelector("fieldset.o_sel_pf_collect_document_form button.btn-primary");
 		browser.findElement(saveBy).click();
 		OOGraphene.waitBusy(browser);
+		OOGraphene.waitModalDialogDisappears(browser);
 		return this;
 	}
 	
diff --git a/src/test/java/org/olat/selenium/page/repository/CPEditorPage.java b/src/test/java/org/olat/selenium/page/repository/CPEditorPage.java
index e29da679bf0..5c96343b5e0 100644
--- a/src/test/java/org/olat/selenium/page/repository/CPEditorPage.java
+++ b/src/test/java/org/olat/selenium/page/repository/CPEditorPage.java
@@ -92,11 +92,13 @@ public class CPEditorPage {
 		
 		//wait popup
 		By metadataPopupBy = By.cssSelector("fieldset.o_sel_cp_import");
-		OOGraphene.waitElement(metadataPopupBy, 2, browser);
+		OOGraphene.waitElement(metadataPopupBy, browser);
 		
 		By inputBy = By.cssSelector("fieldset.o_sel_cp_import .o_fileinput input[type='file']");
 		OOGraphene.uploadFile(inputBy, page, browser);
-		OOGraphene.waitingALittleLonger();//wait event
+		OOGraphene.waitBusy(browser);
+		By uploadedBy = By.cssSelector("fieldset.o_sel_cp_import .o_sel_file_uploaded");
+		OOGraphene.waitElement(uploadedBy, browser);
 		
 		//ok save
 		By saveBy = By.cssSelector("fieldset.o_sel_cp_import button.btn-primary");
-- 
GitLab