From 0ea48cdbbd0f621c39631bb50e7c959353ac97ed Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Sun, 12 Nov 2017 18:46:03 +0100 Subject: [PATCH] no-jira: add selenium test for some settings of the lecture module, use the arquillian selenium test suite to make only once the WAR file for all tests... --- pom.xml | 6 + .../lecture/ui/TeacherRollCallController.java | 4 +- .../_content/participant_list_overview.html | 4 +- .../LectureBlockRollCallStatusComponent.java | 8 +- .../org/olat/selenium/AssessmentTest.java | 9 +- .../org/olat/selenium/BusinessGroupTest.java | 10 +- .../org/olat/selenium/CourseElementTest.java | 14 +- .../java/org/olat/selenium/CourseTest.java | 251 +--------- .../java/org/olat/selenium/Deployments.java | 41 ++ .../java/org/olat/selenium/ImsQTI21Test.java | 10 +- .../java/org/olat/selenium/LecturesTest.java | 436 ++++++++++++++++++ .../java/org/olat/selenium/LoginTest.java | 10 +- .../org/olat/selenium/PortfolioV2Test.java | 10 +- src/test/java/org/olat/selenium/UserTest.java | 10 +- .../course/AssessmentCEConfigurationPage.java | 1 + .../page/course/CoursePageFragment.java | 11 + .../selenium/page/course/MembersPage.java | 31 ++ .../lecture/LectureAdminSettingsPage.java | 53 ++- ...va => LectureRepositoryAdminListPage.java} | 6 +- .../lecture/LectureRepositoryAdminPage.java | 25 +- .../LectureRepositoryParticipantsPage.java | 52 +++ .../page/lecture/LecturesRepositoryPage.java | 64 +++ .../selenium/page/repository/FeedPage.java | 2 +- 23 files changed, 734 insertions(+), 334 deletions(-) create mode 100644 src/test/java/org/olat/selenium/Deployments.java create mode 100644 src/test/java/org/olat/selenium/LecturesTest.java rename src/test/java/org/olat/selenium/page/lecture/{LectureListRepositoryPage.java => LectureRepositoryAdminListPage.java} (90%) create mode 100644 src/test/java/org/olat/selenium/page/lecture/LectureRepositoryParticipantsPage.java create mode 100644 src/test/java/org/olat/selenium/page/lecture/LecturesRepositoryPage.java diff --git a/pom.xml b/pom.xml index 110ab748185..49fc034ed45 100644 --- a/pom.xml +++ b/pom.xml @@ -2548,6 +2548,12 @@ <artifactId>arquillian-drone-impl</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.eu.ingwar.tools</groupId> + <artifactId>arquillian-suite-extension</artifactId> + <version>1.1.4</version> + <scope>test</scope> + </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> diff --git a/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallController.java b/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallController.java index 1d2543f165b..21436f3c320 100644 --- a/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallController.java +++ b/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallController.java @@ -572,8 +572,8 @@ public class TeacherRollCallController extends FormBasicController { Integer.toString(index), lectureBlock, rollCall, lectureBlock.getEntry(), row.getIdentity(), getIdentity()); } row.setRollCall(rollCall); - if(authorizedAbsenceEnabled) { - if(rollCall.getAbsenceAuthorized() != null && rollCall.getAbsenceAuthorized().booleanValue()) { + if(authorizedAbsenceEnabled && row.getAuthorizedAbsence() != null) { + if(rollCall.getAbsenceAuthorized().booleanValue()) { row.getAuthorizedAbsence().select(onKeys[0], true); } else { row.getAuthorizedAbsence().uncheckAll(); diff --git a/src/main/java/org/olat/modules/lecture/ui/_content/participant_list_overview.html b/src/main/java/org/olat/modules/lecture/ui/_content/participant_list_overview.html index f6667d070f5..dd40fbc6845 100644 --- a/src/main/java/org/olat/modules/lecture/ui/_content/participant_list_overview.html +++ b/src/main/java/org/olat/modules/lecture/ui/_content/participant_list_overview.html @@ -16,4 +16,6 @@ function print() { $r.contextHelpWithWrapper("Lectures and absences") #end </div> -$r.render("table") \ No newline at end of file +<div class="o_sel_lecture_participants_overview"> +$r.render("table") +</div> \ No newline at end of file diff --git a/src/main/java/org/olat/modules/lecture/ui/component/LectureBlockRollCallStatusComponent.java b/src/main/java/org/olat/modules/lecture/ui/component/LectureBlockRollCallStatusComponent.java index be8445e9e28..5d25b38f571 100644 --- a/src/main/java/org/olat/modules/lecture/ui/component/LectureBlockRollCallStatusComponent.java +++ b/src/main/java/org/olat/modules/lecture/ui/component/LectureBlockRollCallStatusComponent.java @@ -22,6 +22,7 @@ package org.olat.modules.lecture.ui.component; import org.olat.core.gui.components.ComponentRenderer; import org.olat.core.gui.components.form.flexible.impl.FormBaseComponentImpl; import org.olat.core.gui.translator.Translator; +import org.olat.modules.lecture.LectureBlockRollCall; import org.olat.modules.lecture.ui.TeacherRollCallRow; /** @@ -74,7 +75,12 @@ public class LectureBlockRollCallStatusComponent extends FormBaseComponentImpl { } public boolean isLecturesAuthorizedAbsent() { - return rollCall.getAuthorizedAbsence().isAtLeastSelected(1); + if(rollCall.getAuthorizedAbsence() != null) { + rollCall.getAuthorizedAbsence().isAtLeastSelected(1); + } + LectureBlockRollCall call = rollCall.getRollCall(); + return call == null || call.getAbsenceAuthorized() == null + ? false : call.getAbsenceAuthorized().booleanValue(); } public int getLecturesAttendedNumber() { diff --git a/src/test/java/org/olat/selenium/AssessmentTest.java b/src/test/java/org/olat/selenium/AssessmentTest.java index fe5fb84938d..69e21c7f118 100644 --- a/src/test/java/org/olat/selenium/AssessmentTest.java +++ b/src/test/java/org/olat/selenium/AssessmentTest.java @@ -27,14 +27,12 @@ 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; @@ -75,12 +73,7 @@ import org.openqa.selenium.WebElement; * */ @RunWith(Arquillian.class) -public class AssessmentTest { - - @Deployment(testable = false) - public static WebArchive createDeployment() { - return ArquillianDeployments.createDeployment(); - } +public class AssessmentTest extends Deployments { @Drone private WebDriver browser; diff --git a/src/test/java/org/olat/selenium/BusinessGroupTest.java b/src/test/java/org/olat/selenium/BusinessGroupTest.java index 1e1e815b7b8..ca6f172de23 100644 --- a/src/test/java/org/olat/selenium/BusinessGroupTest.java +++ b/src/test/java/org/olat/selenium/BusinessGroupTest.java @@ -26,14 +26,12 @@ import java.util.ArrayList; import java.util.List; 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; @@ -55,7 +53,6 @@ import org.olat.selenium.page.graphene.OOGraphene; import org.olat.selenium.page.group.GroupPage; import org.olat.selenium.page.group.MembersWizardPage; import org.olat.selenium.page.repository.RepositoryAccessPage.UserAccess; -import org.olat.test.ArquillianDeployments; import org.olat.test.rest.UserRestClient; import org.olat.user.restapi.UserVO; import org.openqa.selenium.By; @@ -69,12 +66,7 @@ import org.openqa.selenium.WebElement; * */ @RunWith(Arquillian.class) -public class BusinessGroupTest { - - @Deployment(testable = false) - public static WebArchive createDeployment() { - return ArquillianDeployments.createDeployment(); - } +public class BusinessGroupTest extends Deployments { @Drone private WebDriver browser; diff --git a/src/test/java/org/olat/selenium/CourseElementTest.java b/src/test/java/org/olat/selenium/CourseElementTest.java index e404b946e5e..ebb53d8c0b3 100644 --- a/src/test/java/org/olat/selenium/CourseElementTest.java +++ b/src/test/java/org/olat/selenium/CourseElementTest.java @@ -25,14 +25,12 @@ 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.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -57,13 +55,12 @@ import org.olat.selenium.page.course.ParticipantFolderPage; import org.olat.selenium.page.forum.ForumPage; import org.olat.selenium.page.graphene.OOGraphene; import org.olat.selenium.page.repository.AuthoringEnvPage; +import org.olat.selenium.page.repository.AuthoringEnvPage.ResourceType; import org.olat.selenium.page.repository.FeedPage; +import org.olat.selenium.page.repository.RepositoryAccessPage.UserAccess; import org.olat.selenium.page.repository.RepositoryEditDescriptionPage; import org.olat.selenium.page.repository.ScormPage; -import org.olat.selenium.page.repository.AuthoringEnvPage.ResourceType; -import org.olat.selenium.page.repository.RepositoryAccessPage.UserAccess; import org.olat.selenium.page.user.UserToolsPage; -import org.olat.test.ArquillianDeployments; import org.olat.test.JunitTestHelper; import org.olat.test.rest.UserRestClient; import org.olat.user.restapi.UserVO; @@ -78,12 +75,7 @@ import org.openqa.selenium.WebElement; * */ @RunWith(Arquillian.class) -public class CourseElementTest { - - @Deployment(testable = false) - public static WebArchive createDeployment() { - return ArquillianDeployments.createDeployment(); - } +public class CourseElementTest extends Deployments { @Drone private WebDriver browser; diff --git a/src/test/java/org/olat/selenium/CourseTest.java b/src/test/java/org/olat/selenium/CourseTest.java index b60c7d01717..156140ae182 100644 --- a/src/test/java/org/olat/selenium/CourseTest.java +++ b/src/test/java/org/olat/selenium/CourseTest.java @@ -29,14 +29,12 @@ import java.util.List; import java.util.Locale; 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; @@ -61,18 +59,12 @@ import org.olat.selenium.page.course.MembersPage; import org.olat.selenium.page.course.PublisherPageFragment; import org.olat.selenium.page.course.RemindersPage; import org.olat.selenium.page.graphene.OOGraphene; -import org.olat.selenium.page.lecture.LectureListRepositoryPage; -import org.olat.selenium.page.lecture.LectureRepositoryAdminPage; -import org.olat.selenium.page.lecture.RollCallInterceptorPage; -import org.olat.selenium.page.lecture.TeacherRollCallPage; import org.olat.selenium.page.repository.AuthoringEnvPage; import org.olat.selenium.page.repository.AuthoringEnvPage.ResourceType; import org.olat.selenium.page.repository.CPPage; import org.olat.selenium.page.repository.RepositoryAccessPage; import org.olat.selenium.page.repository.RepositoryAccessPage.UserAccess; import org.olat.selenium.page.repository.RepositoryEditDescriptionPage; -import org.olat.selenium.page.user.UserToolsPage; -import org.olat.test.ArquillianDeployments; import org.olat.test.JunitTestHelper; import org.olat.test.rest.UserRestClient; import org.olat.user.restapi.UserVO; @@ -87,12 +79,7 @@ import org.openqa.selenium.WebElement; * */ @RunWith(Arquillian.class) -public class CourseTest { - - @Deployment(testable = false) - public static WebArchive createDeployment() { - return ArquillianDeployments.createDeployment(); - } +public class CourseTest extends Deployments { @Drone private WebDriver browser; @@ -1478,240 +1465,4 @@ public class CourseTest { .uploadResource(zipTitle, zipFile) .assertOnResourceType(); } - - /** - * An author create a course, enable the absence management, - * create a lecture block, add a coach and two participants.<br> - * The coach login in, see the interceptor to start the roll call. - * It starts the roll call, set an absence and close.<br> - * The participant with an absence log in, use the lectures user's - * tool to see that it has an absence. - * - * @param authorLoginPage - * @throws IOException - * @throws URISyntaxException - */ - @Test - @RunAsClient - public void lecturesRollCall(@InitialPage LoginPage authorLoginPage, - @Drone @User WebDriver coachBrowser, @Drone @Participant WebDriver participantBrowser) - throws IOException, URISyntaxException { - UserVO author = new UserRestClient(deploymentUrl).createAuthor(); - UserVO coach = new UserRestClient(deploymentUrl).createRandomUser("Rei"); - UserVO participant1 = new UserRestClient(deploymentUrl).createRandomUser("Kanu"); - UserVO participant2 = new UserRestClient(deploymentUrl).createRandomUser("Rymou"); - - authorLoginPage.loginAs(author.getLogin(), author.getPassword()); - - //go to authoring - AuthoringEnvPage authoringEnv = navBar - .assertOnNavigationPage() - .openAuthoringEnvironment(); - - String title = "Lecture " + UUID.randomUUID(); - //create course - authoringEnv - .openCreateDropDown() - .clickCreate(ResourceType.course) - .fillCreateForm(title) - .assertOnGeneralTab() - .clickToolbarBack(); - - //set access - CoursePageFragment course = new CoursePageFragment(browser); - course - .accessConfiguration() - .setUserAccess(UserAccess.registred) - .clickToolbarBack(); - - //add a coach - course - .members() - .addMember() - .searchMember(coach, true) - .nextUsers() - .nextOverview() - .selectRepositoryEntryRole(false, true, false) - .nextPermissions() - .finish(); - //add the participants - course - .members() - .importMembers() - .setMembers(participant1, participant2) - .nextUsers() - .nextOverview() - .nextPermissions() - .finish(); - - //enable the lectures - LectureRepositoryAdminPage lecturesAdmin = course - .lecturesAdministration(); - lecturesAdmin - .settings() - .enableLectures() - .overrideDefaultSettings() - .saveSettings(); - - LectureListRepositoryPage lectureList = lecturesAdmin - .lectureList(); - - Calendar cal = Calendar.getInstance(); - int today = cal.get(Calendar.DATE); - int hour = cal.get(Calendar.HOUR_OF_DAY); - String lectureTitle = "1. Lecture"; - lectureList - .newLectureBlock() - .setTitle(lectureTitle) - .setTeacher(coach) - .setDate(today, hour, 0, hour, 59) - .save(); - - //coach at work - LoginPage coachLoginPage = LoginPage.getLoginPage(coachBrowser, deploymentUrl); - coachLoginPage - .loginAs(coach); - new RollCallInterceptorPage(coachBrowser) - .start() - .setAbsence(participant1, "1") - .closeRollCall() - .confirmCloseRollCall() - .assertOnClosedTable(); - - //participant check it roll call - LoginPage participantLoginPage = LoginPage.getLoginPage(participantBrowser, deploymentUrl); - participantLoginPage - .loginAs(participant1) - .resume(); - UserToolsPage participantUserTools = new UserToolsPage(participantBrowser); - participantUserTools - .openUserToolsMenu() - .openLectures() - .assertOnParticipantLecturesList() - .selectCourseAsParticipant(title) - .assertOnParticipantLectureBlocks() - .assertOnParticipantLectureBlockAbsent(coach, lectureTitle, title); - } - - - /** - * An author create a course, enable the absence management, - * create a lecture block, add a coach and two participants.<br> - * The coach login in, see the interceptor to start the roll call - * version mobile.<br> - * It starts the roll call, set an absence and close.<br> - * The participant with an absence log in, use the lectures user's - * tool to see that it has an absence. - * - * @param authorLoginPage - * @throws IOException - * @throws URISyntaxException - */ - @Test - @RunAsClient - public void lectureMobileRollCall(@InitialPage LoginPage authorLoginPage, - @Drone @User WebDriver coachBrowser, @Drone @User WebDriver participantBrowser) - throws IOException, URISyntaxException { - UserVO author = new UserRestClient(deploymentUrl).createAuthor(); - UserVO coach = new UserRestClient(deploymentUrl).createRandomUser("Rei"); - UserVO participant1 = new UserRestClient(deploymentUrl).createRandomUser("Kanu"); - UserVO participant2 = new UserRestClient(deploymentUrl).createRandomUser("Rymou"); - - authorLoginPage.loginAs(author.getLogin(), author.getPassword()); - - //go to authoring - AuthoringEnvPage authoringEnv = navBar - .assertOnNavigationPage() - .openAuthoringEnvironment(); - - String title = "Lecture " + UUID.randomUUID(); - //create course - authoringEnv - .openCreateDropDown() - .clickCreate(ResourceType.course) - .fillCreateForm(title) - .assertOnGeneralTab() - .clickToolbarBack(); - - //set access - CoursePageFragment course = new CoursePageFragment(browser); - course - .accessConfiguration() - .setUserAccess(UserAccess.registred) - .clickToolbarBack(); - - //add a coach - course - .members() - .addMember() - .searchMember(coach, true) - .nextUsers() - .nextOverview() - .selectRepositoryEntryRole(false, true, false) - .nextPermissions() - .finish(); - //add the participants - course - .members() - .importMembers() - .setMembers(participant1, participant2) - .nextUsers() - .nextOverview() - .nextPermissions() - .finish(); - - //enable the lectures - LectureRepositoryAdminPage lecturesAdmin = course - .lecturesAdministration(); - lecturesAdmin - .settings() - .enableLectures() - .overrideDefaultSettings() - .saveSettings(); - - LectureListRepositoryPage lectureList = lecturesAdmin - .lectureList(); - - Calendar cal = Calendar.getInstance(); - int today = cal.get(Calendar.DATE); - int hour = cal.get(Calendar.HOUR_OF_DAY); - String lectureTitle = "2.Lecture"; - lectureList - .newLectureBlock() - .setTitle(lectureTitle) - .setTeacher(coach) - .setDate(today, hour, 0, hour, 59) - .save(); - - //coach at work - LoginPage coachLoginPage = LoginPage.getLoginPage(coachBrowser, deploymentUrl); - coachLoginPage - .loginAs(coach); - new RollCallInterceptorPage(coachBrowser) - .startMobile() - .setAbsence("1") - .saveAndNext() - .setAbsence("1") - .setAbsence("2") - .saveAndNext() - .closeRollCall(); - //check that a roll call at least is closed - new TeacherRollCallPage(coachBrowser) - .assertOnClosedTable(); - - - //participant check it roll call - LoginPage participantLoginPage = LoginPage.getLoginPage(participantBrowser, deploymentUrl); - participantLoginPage - .loginAs(participant1) - .resume(); - UserToolsPage participantUserTools = new UserToolsPage(participantBrowser); - participantUserTools - .openUserToolsMenu() - .openLectures() - .assertOnParticipantLecturesList() - .selectCourseAsParticipant(title) - .assertOnParticipantLectureBlocks() - .assertOnParticipantLectureBlockAbsent(coach, lectureTitle, title); - } } diff --git a/src/test/java/org/olat/selenium/Deployments.java b/src/test/java/org/olat/selenium/Deployments.java new file mode 100644 index 00000000000..a5116a41f67 --- /dev/null +++ b/src/test/java/org/olat/selenium/Deployments.java @@ -0,0 +1,41 @@ +/** + * <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 org.eu.ingwar.tools.arquillian.extension.suite.annotations.ArquillianSuiteDeployment; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.olat.test.ArquillianDeployments; + +/** + * + * Initial date: 12 nov. 2017<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +@ArquillianSuiteDeployment +public class Deployments { + + @Deployment(testable = false) + public static WebArchive createDeployment() { + return ArquillianDeployments.createDeployment(); + } + +} diff --git a/src/test/java/org/olat/selenium/ImsQTI21Test.java b/src/test/java/org/olat/selenium/ImsQTI21Test.java index 5184d1ae6f9..523e5fddde3 100644 --- a/src/test/java/org/olat/selenium/ImsQTI21Test.java +++ b/src/test/java/org/olat/selenium/ImsQTI21Test.java @@ -25,14 +25,12 @@ 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.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -58,7 +56,6 @@ import org.olat.selenium.page.qti.QTI21Page; import org.olat.selenium.page.qti.QTI21SingleChoiceEditorPage; import org.olat.selenium.page.repository.RepositoryAccessPage.UserAccess; import org.olat.selenium.page.user.UserToolsPage; -import org.olat.test.ArquillianDeployments; import org.olat.test.JunitTestHelper; import org.olat.test.rest.UserRestClient; import org.olat.user.restapi.UserVO; @@ -76,12 +73,7 @@ import uk.ac.ed.ph.jqtiplus.value.Cardinality; * */ @RunWith(Arquillian.class) -public class ImsQTI21Test { - - @Deployment(testable = false) - public static WebArchive createDeployment() { - return ArquillianDeployments.createDeployment(); - } +public class ImsQTI21Test extends Deployments { @Drone private WebDriver browser; diff --git a/src/test/java/org/olat/selenium/LecturesTest.java b/src/test/java/org/olat/selenium/LecturesTest.java new file mode 100644 index 00000000000..57ac82b5f4c --- /dev/null +++ b/src/test/java/org/olat/selenium/LecturesTest.java @@ -0,0 +1,436 @@ +/** + * <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.Calendar; +import java.util.UUID; + +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.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.User; +import org.olat.selenium.page.course.CoursePageFragment; +import org.olat.selenium.page.lecture.LectureRepositoryAdminListPage; +import org.olat.selenium.page.lecture.LectureRepositoryAdminPage; +import org.olat.selenium.page.lecture.LecturesRepositoryPage; +import org.olat.selenium.page.lecture.RollCallInterceptorPage; +import org.olat.selenium.page.lecture.TeacherRollCallPage; +import org.olat.selenium.page.repository.AuthoringEnvPage; +import org.olat.selenium.page.repository.AuthoringEnvPage.ResourceType; +import org.olat.selenium.page.repository.RepositoryAccessPage.UserAccess; +import org.olat.selenium.page.user.UserToolsPage; +import org.olat.test.rest.UserRestClient; +import org.olat.user.restapi.UserVO; +import org.openqa.selenium.WebDriver; + +/** + * Test suite for the lectures / absence management feature. + * + * Initial date: 7 nov. 2017<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +@RunWith(Arquillian.class) +public class LecturesTest extends Deployments { + + @Drone + private WebDriver browser; + @ArquillianResource + private URL deploymentUrl; + @Page + private NavigationPage navBar; + + /** + * An author create a course, enable the absence management, + * create a lecture block, add a coach and two participants.<br> + * The coach login in, see the interceptor to start the roll call. + * It starts the roll call, set an absence and close.<br> + * The participant with an absence log in, use the lectures user's + * tool to see that it has an absence. + * + * @param loginPage + * @throws IOException + * @throws URISyntaxException + */ + @Test + @RunAsClient + public void lecturesRollCall_authorizedAbsence(@InitialPage LoginPage loginPage, + @Drone @User WebDriver coachBrowser, @Drone @Participant WebDriver participantBrowser) + throws IOException, URISyntaxException { + + // configure the lectures module + loginPage + .loginAs("administrator", "openolat") + .resume(); + new NavigationPage(browser) + .openAdministration() + .openLecturesSettings() + .configure(true, false) + .save(); + + // start the test with authorized absence on + UserVO author = new UserRestClient(deploymentUrl).createAuthor(); + UserVO coach = new UserRestClient(deploymentUrl).createRandomUser("Rei"); + UserVO participant1 = new UserRestClient(deploymentUrl).createRandomUser("Kanu"); + UserVO participant2 = new UserRestClient(deploymentUrl).createRandomUser("Rymou"); + + LoginPage + .getLoginPage(browser, deploymentUrl) + .loginAs(author.getLogin(), author.getPassword()); + + //go to authoring + AuthoringEnvPage authoringEnv = navBar + .assertOnNavigationPage() + .openAuthoringEnvironment(); + + String title = "Lecture " + UUID.randomUUID(); + //create course + authoringEnv + .openCreateDropDown() + .clickCreate(ResourceType.course) + .fillCreateForm(title) + .assertOnGeneralTab() + .clickToolbarBack(); + + //set access + CoursePageFragment course = new CoursePageFragment(browser); + course + .accessConfiguration() + .setUserAccess(UserAccess.registred) + .clickToolbarBack(); + + //add a coach + course + .members() + .addMember() + .searchMember(coach, true) + .nextUsers() + .nextOverview() + .selectRepositoryEntryRole(false, true, false) + .nextPermissions() + .finish(); + //add the participants + course + .members() + .importMembers() + .setMembers(participant1, participant2) + .nextUsers() + .nextOverview() + .nextPermissions() + .finish(); + + //enable the lectures + LectureRepositoryAdminPage lecturesAdmin = course + .lecturesAdministration(); + lecturesAdmin + .settings() + .enableLectures() + .overrideDefaultSettings() + .saveSettings(); + + LectureRepositoryAdminListPage lectureList = lecturesAdmin + .lectureList(); + + Calendar cal = Calendar.getInstance(); + int today = cal.get(Calendar.DATE); + int hour = cal.get(Calendar.HOUR_OF_DAY); + String lectureTitle = "1. Lecture"; + lectureList + .newLectureBlock() + .setTitle(lectureTitle) + .setTeacher(coach) + .setDate(today, hour, 0, hour, 59) + .save(); + + //coach at work + LoginPage coachLoginPage = LoginPage.getLoginPage(coachBrowser, deploymentUrl); + coachLoginPage + .loginAs(coach); + new RollCallInterceptorPage(coachBrowser) + .start() + .setAbsence(participant1, "1") + .closeRollCall() + .confirmCloseRollCall() + .assertOnClosedTable(); + + //participant check it roll call + LoginPage participantLoginPage = LoginPage.getLoginPage(participantBrowser, deploymentUrl); + participantLoginPage + .loginAs(participant1) + .resume(); + UserToolsPage participantUserTools = new UserToolsPage(participantBrowser); + participantUserTools + .openUserToolsMenu() + .openLectures() + .assertOnParticipantLecturesList() + .selectCourseAsParticipant(title) + .assertOnParticipantLectureBlocks() + .assertOnParticipantLectureBlockAbsent(coach, lectureTitle, title); + } + + + /** + * An author create a course, enable the absence management, + * create a lecture block, add a coach and two participants.<br> + * The coach login in, see the interceptor to start the roll call + * version mobile.<br> + * It starts the roll call, set an absence and close.<br> + * The participant with an absence log in, use the lectures user's + * tool to see that it has an absence. + * + * @param loginPage + * @throws IOException + * @throws URISyntaxException + */ + @Test + @RunAsClient + public void lectureMobileRollCall_authorizedAbsence(@InitialPage LoginPage loginPage, + @Drone @User WebDriver coachBrowser, @Drone @User WebDriver participantBrowser) + throws IOException, URISyntaxException { + + // configure the lectures module + loginPage + .loginAs("administrator", "openolat") + .resume(); + new NavigationPage(browser) + .openAdministration() + .openLecturesSettings() + .configure(true, false) + .save(); + + // start the test with authorized absence on + UserVO author = new UserRestClient(deploymentUrl).createAuthor(); + UserVO coach = new UserRestClient(deploymentUrl).createRandomUser("Rei"); + UserVO participant1 = new UserRestClient(deploymentUrl).createRandomUser("Kanu"); + UserVO participant2 = new UserRestClient(deploymentUrl).createRandomUser("Rymou"); + + LoginPage + .getLoginPage(browser, deploymentUrl) + .loginAs(author.getLogin(), author.getPassword()); + + //go to authoring + AuthoringEnvPage authoringEnv = navBar + .assertOnNavigationPage() + .openAuthoringEnvironment(); + + String title = "Lecture " + UUID.randomUUID(); + //create course + authoringEnv + .openCreateDropDown() + .clickCreate(ResourceType.course) + .fillCreateForm(title) + .assertOnGeneralTab() + .clickToolbarBack(); + + //set access + CoursePageFragment course = new CoursePageFragment(browser); + course + .accessConfiguration() + .setUserAccess(UserAccess.registred) + .clickToolbarBack(); + + //add a coach + course + .members() + .addMember() + .searchMember(coach, true) + .nextUsers() + .nextOverview() + .selectRepositoryEntryRole(false, true, false) + .nextPermissions() + .finish(); + //add the participants + course + .members() + .importMembers() + .setMembers(participant1, participant2) + .nextUsers() + .nextOverview() + .nextPermissions() + .finish(); + + //enable the lectures + LectureRepositoryAdminPage lecturesAdmin = course + .lecturesAdministration(); + lecturesAdmin + .settings() + .enableLectures() + .overrideDefaultSettings() + .saveSettings(); + + LectureRepositoryAdminListPage lectureList = lecturesAdmin + .lectureList(); + + Calendar cal = Calendar.getInstance(); + int today = cal.get(Calendar.DATE); + int hour = cal.get(Calendar.HOUR_OF_DAY); + String lectureTitle = "2.Lecture"; + lectureList + .newLectureBlock() + .setTitle(lectureTitle) + .setTeacher(coach) + .setDate(today, hour, 0, hour, 59) + .save(); + + //coach at work + LoginPage coachLoginPage = LoginPage.getLoginPage(coachBrowser, deploymentUrl); + coachLoginPage + .loginAs(coach); + new RollCallInterceptorPage(coachBrowser) + .startMobile() + .setAbsence("1") + .saveAndNext() + .setAbsence("1") + .setAbsence("2") + .saveAndNext() + .closeRollCall(); + //check that a roll call at least is closed + new TeacherRollCallPage(coachBrowser) + .assertOnClosedTable(); + + //participant check it roll call + LoginPage participantLoginPage = LoginPage.getLoginPage(participantBrowser, deploymentUrl); + participantLoginPage + .loginAs(participant1) + .resume(); + UserToolsPage participantUserTools = new UserToolsPage(participantBrowser); + participantUserTools + .openUserToolsMenu() + .openLectures() + .assertOnParticipantLecturesList() + .selectCourseAsParticipant(title) + .assertOnParticipantLectureBlocks() + .assertOnParticipantLectureBlockAbsent(coach, lectureTitle, title); + } + + /** + * An author create a course to use the absence management + * without authorized absence. + * + * @param loginPage + * @throws IOException + * @throws URISyntaxException + */ + @Test + @RunAsClient + public void lecturesRollCall(@InitialPage LoginPage loginPage) + throws IOException, URISyntaxException { + + // configure the lectures module + loginPage + .loginAs("administrator", "openolat") + .resume(); + new NavigationPage(browser) + .openAdministration() + .openLecturesSettings() + .configure(false, false) + .save(); + + //start + UserVO author = new UserRestClient(deploymentUrl).createAuthor(); + UserVO participant1 = new UserRestClient(deploymentUrl).createRandomUser("Kanu"); + UserVO participant2 = new UserRestClient(deploymentUrl).createRandomUser("Rymou"); + + LoginPage authorLoginPage = LoginPage.getLoginPage(browser, deploymentUrl); + authorLoginPage.loginAs(author.getLogin(), author.getPassword()); + + //go to authoring + AuthoringEnvPage authoringEnv = navBar + .assertOnNavigationPage() + .openAuthoringEnvironment(); + + String title = "Lecture " + UUID.randomUUID(); + //create course + authoringEnv + .openCreateDropDown() + .clickCreate(ResourceType.course) + .fillCreateForm(title) + .assertOnGeneralTab() + .clickToolbarBack(); + + CoursePageFragment course = new CoursePageFragment(browser); + //add a coach + course + .members() + .quickAdd(author, true, true); + //add the participants + course + .members() + .quickImport(participant1, participant2); + + //enable the lectures + LectureRepositoryAdminPage lecturesAdmin = course + .lecturesAdministration(); + lecturesAdmin + .settings() + .enableLectures() + .overrideDefaultSettings() + .saveSettings(); + + //add a lecture + LectureRepositoryAdminListPage lectureList = lecturesAdmin + .lectureList(); + + Calendar cal = Calendar.getInstance(); + int today = cal.get(Calendar.DATE); + int hour = cal.get(Calendar.HOUR_OF_DAY); + String lectureTitle = "2.Lecture"; + lectureList + .newLectureBlock() + .setTitle(lectureTitle) + .setTeacher(author) + .setDate(today, hour, 0, hour, 59) + .save(); + + //go to the lectures list as "teacher" + LecturesRepositoryPage teachersLectures = lecturesAdmin + .clickToolbarRootCrumb() + .lectures(); + teachersLectures + .openRollCall(lectureTitle) + .setAbsence(participant1, "1") + .setAbsence(participant1, "2") + .setAbsence(participant1, "3") + .closeRollCall() + .confirmCloseRollCall() + .assertOnClosedTable(); + + //go to the lecture administration in the course + lecturesAdmin = teachersLectures + .clickToolbarRootCrumb() + .lecturesAdministration(); + lecturesAdmin + .participantList() + .assertOnParticipantLectureBlockAbsent(participant1, 3) + .assertOnParticipantLectureBlockAbsent(participant2, 0); + } + +} diff --git a/src/test/java/org/olat/selenium/LoginTest.java b/src/test/java/org/olat/selenium/LoginTest.java index 99f759c3c50..951a10a4e85 100644 --- a/src/test/java/org/olat/selenium/LoginTest.java +++ b/src/test/java/org/olat/selenium/LoginTest.java @@ -24,13 +24,11 @@ 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.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; @@ -38,7 +36,6 @@ import org.olat.selenium.page.NavigationPage; import org.olat.selenium.page.Participant; import org.olat.selenium.page.Student; import org.olat.selenium.page.core.AdministrationMessagesPage; -import org.olat.test.ArquillianDeployments; import org.olat.test.rest.UserRestClient; import org.olat.user.restapi.UserVO; import org.openqa.selenium.WebDriver; @@ -50,12 +47,7 @@ import org.openqa.selenium.WebDriver; * */ @RunWith(Arquillian.class) -public class LoginTest { - - @Deployment(testable = false) - public static WebArchive createDeployment() { - return ArquillianDeployments.createDeployment(); - } +public class LoginTest extends Deployments { @Drone private WebDriver browser; diff --git a/src/test/java/org/olat/selenium/PortfolioV2Test.java b/src/test/java/org/olat/selenium/PortfolioV2Test.java index f30b9cbee33..22f6f5edf3d 100644 --- a/src/test/java/org/olat/selenium/PortfolioV2Test.java +++ b/src/test/java/org/olat/selenium/PortfolioV2Test.java @@ -25,14 +25,12 @@ 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; @@ -59,7 +57,6 @@ import org.olat.selenium.page.repository.FeedPage; import org.olat.selenium.page.repository.RepositoryAccessPage.UserAccess; import org.olat.selenium.page.user.UserToolsPage; import org.olat.selenium.page.wiki.WikiPage; -import org.olat.test.ArquillianDeployments; import org.olat.test.JunitTestHelper; import org.olat.test.rest.UserRestClient; import org.olat.user.restapi.UserVO; @@ -74,12 +71,7 @@ import org.openqa.selenium.WebDriver; * */ @RunWith(Arquillian.class) -public class PortfolioV2Test { - - @Deployment(testable = false) - public static WebArchive createDeployment() { - return ArquillianDeployments.createDeployment(); - } +public class PortfolioV2Test extends Deployments { @Drone private WebDriver browser; diff --git a/src/test/java/org/olat/selenium/UserTest.java b/src/test/java/org/olat/selenium/UserTest.java index 67533c7dc6b..9369a14091e 100644 --- a/src/test/java/org/olat/selenium/UserTest.java +++ b/src/test/java/org/olat/selenium/UserTest.java @@ -25,14 +25,12 @@ import java.net.URL; import java.util.List; 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; @@ -54,7 +52,6 @@ import org.olat.selenium.page.user.UserPreferencesPageFragment.ResumeOption; import org.olat.selenium.page.user.UserProfilePage; import org.olat.selenium.page.user.UserToolsPage; import org.olat.selenium.page.user.VisitingCardPage; -import org.olat.test.ArquillianDeployments; import org.olat.test.rest.RepositoryRestClient; import org.olat.test.rest.UserRestClient; import org.olat.user.restapi.UserVO; @@ -69,12 +66,7 @@ import org.openqa.selenium.WebElement; * */ @RunWith(Arquillian.class) -public class UserTest { - - @Deployment(testable = false) - public static WebArchive createDeployment() { - return ArquillianDeployments.createDeployment(); - } +public class UserTest extends Deployments { @Drone private WebDriver browser; diff --git a/src/test/java/org/olat/selenium/page/course/AssessmentCEConfigurationPage.java b/src/test/java/org/olat/selenium/page/course/AssessmentCEConfigurationPage.java index ec2605e83bc..4bc628edbe0 100644 --- a/src/test/java/org/olat/selenium/page/course/AssessmentCEConfigurationPage.java +++ b/src/test/java/org/olat/selenium/page/course/AssessmentCEConfigurationPage.java @@ -72,6 +72,7 @@ public class AssessmentCEConfigurationPage { By saveBy = By.cssSelector(".o_sel_course_ms_form button.btn.btn-primary"); OOGraphene.click(saveBy, browser); + OOGraphene.waitBusy(browser); return this; } 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 7bdf574c818..a36d641bcec 100644 --- a/src/test/java/org/olat/selenium/page/course/CoursePageFragment.java +++ b/src/test/java/org/olat/selenium/page/course/CoursePageFragment.java @@ -28,6 +28,7 @@ import org.olat.selenium.page.core.BookingPage; import org.olat.selenium.page.core.MenuTreePageFragment; import org.olat.selenium.page.graphene.OOGraphene; import org.olat.selenium.page.lecture.LectureRepositoryAdminPage; +import org.olat.selenium.page.lecture.LecturesRepositoryPage; import org.olat.selenium.page.repository.RepositoryAccessPage; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; @@ -283,6 +284,16 @@ public class CoursePageFragment { .assertOnAdminPage(); } + public LecturesRepositoryPage lectures() { + By lecturesBy = By.xpath("//li[contains(@class,'o_tool')]/a[contains(@onclick,'command.lectures')]"); + OOGraphene.waitElement(lecturesBy, browser); + browser.findElement(lecturesBy).click(); + + By teacherOverviewBy = By.cssSelector("div.o_lectures_teacher_overview"); + OOGraphene.waitElement(teacherOverviewBy, browser); + return new LecturesRepositoryPage(browser); + } + public BookingPage bookingTool() { if(!browser.findElement(toolsMenu).isDisplayed()) { openToolsMenu(); diff --git a/src/test/java/org/olat/selenium/page/course/MembersPage.java b/src/test/java/org/olat/selenium/page/course/MembersPage.java index 13edd6fe77e..53e4cd595fe 100644 --- a/src/test/java/org/olat/selenium/page/course/MembersPage.java +++ b/src/test/java/org/olat/selenium/page/course/MembersPage.java @@ -137,6 +137,37 @@ public class MembersPage { .finish(); } + /** + * Add a user by username with the specified roles. + * + * @param user The user to add + * @param owner true if the user will be owner + * @param coach true if the user will be coach + */ + public void quickAdd(UserVO user, boolean owner, boolean coach) { + addMember() + .searchMember(user, true) + .nextUsers() + .nextOverview() + .selectRepositoryEntryRole(owner, coach, false) + .nextPermissions() + .finish(); + } + + /** + * Import the specified users as participants. + * + * @param users Users to import + */ + public void quickImport(UserVO... users) { + importMembers() + .setMembers(users) + .nextUsers() + .nextOverview() + .nextPermissions() + .finish(); + } + /** * Check if the user with the specified first name is in the member list. * @param user diff --git a/src/test/java/org/olat/selenium/page/lecture/LectureAdminSettingsPage.java b/src/test/java/org/olat/selenium/page/lecture/LectureAdminSettingsPage.java index 311036c558e..05d931c7bbc 100644 --- a/src/test/java/org/olat/selenium/page/lecture/LectureAdminSettingsPage.java +++ b/src/test/java/org/olat/selenium/page/lecture/LectureAdminSettingsPage.java @@ -39,23 +39,56 @@ public class LectureAdminSettingsPage { } /** - * Set some configurations of the lecture module. + * Set of options. * - * @param authorizedAbsence Enable/disable authorized absence + * @param authorizedAbsence Enable or not the option "Authorized absences" + * @param teacherCanAutorizeAbsence Enable or not the option "Coaches can authorize absences" + * @return + */ + public LectureAdminSettingsPage configure(boolean authorizedAbsence, boolean teacherCanAutorizeAbsence) { + setAuthorizedAbsence(authorizedAbsence); + if(authorizedAbsence) { + setTeacherCanAuthorizeAbsence(teacherCanAutorizeAbsence); + } + return this; + } + + /** + * Set the option "Coaches can authorize absences". Only available + * with the authorized absences enabled. + * + * @param teacherCanAuthorizeAbsence Enable/disable the hability for coaches to excuse absences * @return Itself */ - public LectureAdminSettingsPage set(boolean authorizedAbsence) { - By authorizedAbsenceLabelBy = By.xpath("//label[input[@name='lecture.authorized.absence.enabled' and @value='on']]"); - By authorizedAbsenceCheckBy = By.xpath("//label/input[@name='lecture.authorized.absence.enabled' and @value='on']"); + public LectureAdminSettingsPage setTeacherCanAuthorizeAbsence(boolean teacherCanAuthorizeAbsence) { + String checkName = "lecture.teacher.can.authorize.absence"; + return set(checkName, teacherCanAuthorizeAbsence); + } + + /** + * Set the option "Authorized absences" + * + * @param authorizedAbsence Enable/disable authorized absences + * @return Itself + */ + public LectureAdminSettingsPage setAuthorizedAbsence(boolean authorizedAbsence) { + String checkName = "lecture.authorized.absence.enabled"; + return set(checkName, authorizedAbsence); + } + + private LectureAdminSettingsPage set(String name, boolean enable) { + By enableLabelBy = By.xpath("//label[input[@name='" + name + "' and @value='on']]"); + By enableCheckBy = By.xpath("//label/input[@name='" + name + "' and @value='on']"); - OOGraphene.waitElement(authorizedAbsenceLabelBy, browser); - OOGraphene.scrollTo(authorizedAbsenceLabelBy, browser); + OOGraphene.waitElement(enableLabelBy, browser); + OOGraphene.scrollTo(enableLabelBy, browser); - WebElement authorizedAbsenceLabelEl = browser.findElement(authorizedAbsenceLabelBy); - WebElement authorizedAbsenceCheckEl = browser.findElement(authorizedAbsenceCheckBy); - OOGraphene.check(authorizedAbsenceLabelEl, authorizedAbsenceCheckEl, new Boolean(authorizedAbsence)); + WebElement enableLabelEl = browser.findElement(enableLabelBy); + WebElement enableCheckEl = browser.findElement(enableCheckBy); + OOGraphene.check(enableLabelEl, enableCheckEl, new Boolean(enable)); OOGraphene.waitBusy(browser); return this; + } public LectureAdminSettingsPage save() { diff --git a/src/test/java/org/olat/selenium/page/lecture/LectureListRepositoryPage.java b/src/test/java/org/olat/selenium/page/lecture/LectureRepositoryAdminListPage.java similarity index 90% rename from src/test/java/org/olat/selenium/page/lecture/LectureListRepositoryPage.java rename to src/test/java/org/olat/selenium/page/lecture/LectureRepositoryAdminListPage.java index 8088354b914..ecd7d9c6a7e 100644 --- a/src/test/java/org/olat/selenium/page/lecture/LectureListRepositoryPage.java +++ b/src/test/java/org/olat/selenium/page/lecture/LectureRepositoryAdminListPage.java @@ -29,15 +29,15 @@ import org.openqa.selenium.WebDriver; * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ -public class LectureListRepositoryPage { +public class LectureRepositoryAdminListPage { private WebDriver browser; - public LectureListRepositoryPage(WebDriver browser) { + public LectureRepositoryAdminListPage(WebDriver browser) { this.browser = browser; } - public LectureListRepositoryPage asssertOnLectureList() { + public LectureRepositoryAdminListPage asssertOnLectureList() { By lecturesBy = By.cssSelector("div.o_sel_repo_lectures_list"); OOGraphene.waitElement(lecturesBy, browser); return this; diff --git a/src/test/java/org/olat/selenium/page/lecture/LectureRepositoryAdminPage.java b/src/test/java/org/olat/selenium/page/lecture/LectureRepositoryAdminPage.java index 5663601c753..9f64841517c 100644 --- a/src/test/java/org/olat/selenium/page/lecture/LectureRepositoryAdminPage.java +++ b/src/test/java/org/olat/selenium/page/lecture/LectureRepositoryAdminPage.java @@ -21,6 +21,7 @@ package org.olat.selenium.page.lecture; import java.util.List; +import org.olat.selenium.page.course.CoursePageFragment; import org.olat.selenium.page.graphene.OOGraphene; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; @@ -58,13 +59,33 @@ public class LectureRepositoryAdminPage { return new LectureRepositorySettingsPage(browser); } - public LectureListRepositoryPage lectureList() { + public LectureRepositoryAdminListPage lectureList() { By lecturesBy = By.xpath("//div[contains(@class,'o_sel_repo_lectures_admin')]//a[contains(@onclick,'repo.lectures.block')]"); browser.findElement(lecturesBy).click(); OOGraphene.waitBusy(browser); - return new LectureListRepositoryPage(browser) + return new LectureRepositoryAdminListPage(browser) .asssertOnLectureList(); } + + public LectureRepositoryParticipantsPage participantList() { + By lecturesBy = By.xpath("//div[contains(@class,'o_sel_repo_lectures_admin')]//a[contains(@onclick,'repo.participants')]"); + browser.findElement(lecturesBy).click(); + OOGraphene.waitBusy(browser); + return new LectureRepositoryParticipantsPage(browser) + .assertOnParticipantLectureBlocks(); + } + /** + * Click back to the course + * + * @return + */ + public CoursePageFragment clickToolbarRootCrumb() { + OOGraphene.closeBlueMessageWindow(browser); + By toolbarBackBy = By.xpath("//li[contains(@class,'o_breadcrumb_back')]/following-sibling::li/a"); + browser.findElement(toolbarBackBy).click(); + OOGraphene.waitBusy(browser); + return new CoursePageFragment(browser); + } } diff --git a/src/test/java/org/olat/selenium/page/lecture/LectureRepositoryParticipantsPage.java b/src/test/java/org/olat/selenium/page/lecture/LectureRepositoryParticipantsPage.java new file mode 100644 index 00000000000..f6f1e7f486f --- /dev/null +++ b/src/test/java/org/olat/selenium/page/lecture/LectureRepositoryParticipantsPage.java @@ -0,0 +1,52 @@ +/** + * <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.lecture; + +import org.olat.selenium.page.graphene.OOGraphene; +import org.olat.user.restapi.UserVO; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; + +/** + * + * Initial date: 7 nov. 2017<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class LectureRepositoryParticipantsPage { + + private WebDriver browser; + + public LectureRepositoryParticipantsPage(WebDriver browser) { + this.browser = browser; + } + + public LectureRepositoryParticipantsPage assertOnParticipantLectureBlocks() { + By blocks = By.cssSelector("div.o_sel_repo_lectures_admin table"); + OOGraphene.waitElement(blocks, browser); + return this; + } + + public LectureRepositoryParticipantsPage assertOnParticipantLectureBlockAbsent(UserVO participant, int absence) { + By blocks = By.xpath("//div[contains(@class,'o_sel_lecture_participants_overview')]//table//tr[td[contains(text(),'" + participant.getFirstName() + "')]][td[contains(text(),'" + absence + "')]]"); + OOGraphene.waitElement(blocks, browser); + return this; + } +} diff --git a/src/test/java/org/olat/selenium/page/lecture/LecturesRepositoryPage.java b/src/test/java/org/olat/selenium/page/lecture/LecturesRepositoryPage.java new file mode 100644 index 00000000000..c52158fb4e8 --- /dev/null +++ b/src/test/java/org/olat/selenium/page/lecture/LecturesRepositoryPage.java @@ -0,0 +1,64 @@ +/** + * <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.lecture; + +import org.olat.selenium.page.course.CoursePageFragment; +import org.olat.selenium.page.graphene.OOGraphene; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; + +/** + * + * The tool in course for teachers. + * + * Initial date: 7 nov. 2017<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class LecturesRepositoryPage { + + private final WebDriver browser; + + public LecturesRepositoryPage(WebDriver browser) { + this.browser = browser; + } + + public TeacherRollCallPage openRollCall(String lectureBlockTitle) { + By selectBy = By.xpath("//table//tr[td[contains(text(),'" + lectureBlockTitle + "')]]/td/a[contains(@href,'details')]"); + browser.findElement(selectBy).click(); + return new TeacherRollCallPage(browser) + .assertOnRollCall(); + } + + /** + * Click back to the course + * + * @return + */ + public CoursePageFragment clickToolbarRootCrumb() { + OOGraphene.closeBlueMessageWindow(browser); + By toolbarBackBy = By.xpath("//li[contains(@class,'o_breadcrumb_back')]/following-sibling::li/a"); + browser.findElement(toolbarBackBy).click(); + OOGraphene.waitBusy(browser); + return new CoursePageFragment(browser); + } + + +} diff --git a/src/test/java/org/olat/selenium/page/repository/FeedPage.java b/src/test/java/org/olat/selenium/page/repository/FeedPage.java index 66a706b403d..286e277ed65 100644 --- a/src/test/java/org/olat/selenium/page/repository/FeedPage.java +++ b/src/test/java/org/olat/selenium/page/repository/FeedPage.java @@ -125,7 +125,7 @@ public class FeedPage { //click the button to create a feed By feedButton = By.xpath("//div[contains(@class,'o_blog_no_posts')]//a[contains(@href,'feed.make.internal')]"); browser.findElement(feedButton).click(); - OOGraphene.waitBusy(browser); + OOGraphene.waitModalDialog(browser); return this; } -- GitLab