/**
* <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.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.ims.qti21.QTI21AssessmentResultsOptions;
import org.olat.ims.qti21.model.xml.interactions.SimpleChoiceAssessmentItemBuilder.ScoreEvaluation;
import org.olat.selenium.page.LoginPage;
import org.olat.selenium.page.NavigationPage;
import org.olat.selenium.page.User;
import org.olat.selenium.page.course.CourseEditorPageFragment;
import org.olat.selenium.page.course.CoursePageFragment;
import org.olat.selenium.page.qti.QTI21ConfigurationCEPage;
import org.olat.selenium.page.qti.QTI21EditorPage;
import org.olat.selenium.page.qti.QTI21KprimEditorPage;
import org.olat.selenium.page.qti.QTI21LobEditorPage;
import org.olat.selenium.page.qti.QTI21MatchEditorPage;
import org.olat.selenium.page.qti.QTI21MultipleChoiceEditorPage;
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;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
/**
*
* Initial date: 03.05.2016<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
@RunWith(Arquillian.class)
public class ImsQTI21Test {
@Deployment(testable = false)
public static WebArchive createDeployment() {
return ArquillianDeployments.createDeployment();
}
@Drone
private WebDriver browser;
@ArquillianResource
private URL deploymentUrl;
@Page
private NavigationPage navBar;
/**
* Test the flow of the simplest possible test with our
* optimization (jump automatically to the next question,
* jump automatically the close test). The test has one
* part and 2 questions, no feedbacks, no review allowed...
*
* @param authorLoginPage
* @throws IOException
* @throws URISyntaxException
*/
@Test
@RunAsClient
public void qti21TestFlow_noParts_noFeedbacks(@InitialPage LoginPage authorLoginPage)
throws IOException, URISyntaxException {
UserVO author = new UserRestClient(deploymentUrl).createAuthor();
authorLoginPage.loginAs(author.getLogin(), author.getPassword());
//upload a test
String qtiTestTitle = "With parts QTI 2.1 " + UUID.randomUUID();
URL qtiTestUrl = JunitTestHelper.class.getResource("file_resources/qti21/test_without_feedbacks.zip");
File qtiTestFile = new File(qtiTestUrl.toURI());
navBar
.openAuthoringEnvironment()
.uploadResource(qtiTestTitle, qtiTestFile)
.clickToolbarRootCrumb();
QTI21Page qtiPage = QTI21Page
.getQTI12Page(browser);
qtiPage
.assertOnAssessmentItem()
.answerSingleChoice("Incorrect response")
.saveAnswer()
.assertOnAssessmentItem("Second question")
.selectItem("First question")
.assertOnAssessmentItem("First question")
.answerSingleChoice("Correct response")
.saveAnswer()
.answerMultipleChoice("Correct response")
.saveAnswer()
.endTest()//auto close because 1 part, no feedbacks
.assertOnAssessmentTestTerminated();
}
/**
* Test the flow of a test with questions feedbacks and test
* feedback.
*
* @param authorLoginPage
* @throws IOException
* @throws URISyntaxException
*/
@Test
@RunAsClient
public void qti21TestFlow_noParts_withFeedbacks(@InitialPage LoginPage authorLoginPage)
throws IOException, URISyntaxException {
UserVO author = new UserRestClient(deploymentUrl).createAuthor();
authorLoginPage.loginAs(author.getLogin(), author.getPassword());
//upload a test
String qtiTestTitle = "With parts QTI 2.1 " + UUID.randomUUID();
URL qtiTestUrl = JunitTestHelper.class.getResource("file_resources/qti21/test_with_feedbacks.zip");
File qtiTestFile = new File(qtiTestUrl.toURI());
navBar
.openAuthoringEnvironment()
.uploadResource(qtiTestTitle, qtiTestFile)
.clickToolbarRootCrumb();
QTI21Page qtiPage = QTI21Page
.getQTI12Page(browser);
qtiPage
.assertOnAssessmentItem()
.answerSingleChoice("Wrong answer")
.saveAnswer()
.assertFeedback("Oooops")
.answerSingleChoice("Correct answer")
.saveAnswer()
.assertFeedback("Well done")
.nextAnswer()
.assertOnAssessmentItem("Numerical entry")
.answerGapText("69", "_RESPONSE_1")
.saveAnswer()
.assertFeedback("Not really")
.answerGapText("42", "_RESPONSE_1")
.saveAnswer()
.assertFeedback("Ok")
.endTest()
.assertOnAssessmentTestFeedback("All right")
.closeTest()
.assertOnAssessmentTestTerminated();
}
/**
* A test with a single part, feedback for questions and
* tests and the resource options "show results at the end
* of the test".
*
* @param authorLoginPage
* @throws IOException
* @throws URISyntaxException
*/
@Test
@RunAsClient
public void qti21TestFlow_noParts_feedbacksAndResults(@InitialPage LoginPage authorLoginPage)
throws IOException, URISyntaxException {
UserVO author = new UserRestClient(deploymentUrl).createAuthor();
authorLoginPage.loginAs(author.getLogin(), author.getPassword());
//upload a test
String qtiTestTitle = "With parts QTI 2.1 " + UUID.randomUUID();
URL qtiTestUrl = JunitTestHelper.class.getResource("file_resources/qti21/test_with_feedbacks.zip");
File qtiTestFile = new File(qtiTestUrl.toURI());
navBar
.openAuthoringEnvironment()
.uploadResource(qtiTestTitle, qtiTestFile);
QTI21Page qtiPage = QTI21Page
.getQTI12Page(browser);
qtiPage
.clickToolbarBack()
.options()
.showResults(Boolean.TRUE, QTI21AssessmentResultsOptions.allOptions())
.save();
qtiPage
.clickToolbarBack()
.assertOnAssessmentItem()
.answerSingleChoice("Wrong answer")
.saveAnswer()
.assertFeedback("Oooops")
.nextAnswer()
.assertOnAssessmentItem("Numerical entry")
.answerGapText("42", "_RESPONSE_1")
.saveAnswer()
.assertFeedback("Ok")
.endTest()
.assertOnAssessmentTestFeedback("Not for the best")
.closeTest()
.assertOnAssessmentTestMaxScore(2)
.assertOnAssessmentTestScore(1)
.assertOnAssessmentTestNotPassed();
}
/**
* A test with a single part, feedback for questions and
* tests and the resource options "show results at the end
* of the test".
*
* @param authorLoginPage
* @throws IOException
* @throws URISyntaxException
*/
@Test
@RunAsClient
public void qti21TestFlow_parts_noFeedbacksButResults(@InitialPage LoginPage authorLoginPage)
throws IOException, URISyntaxException {
UserVO author = new UserRestClient(deploymentUrl).createAuthor();
authorLoginPage.loginAs(author.getLogin(), author.getPassword());
//upload a test
String qtiTestTitle = "With parts QTI 2.1 " + UUID.randomUUID();
URL qtiTestUrl = JunitTestHelper.class.getResource("file_resources/qti21/test_parts_without_feedbacks.zip");
File qtiTestFile = new File(qtiTestUrl.toURI());
navBar
.openAuthoringEnvironment()
.uploadResource(qtiTestTitle, qtiTestFile);
QTI21Page qtiPage = QTI21Page
.getQTI12Page(browser);
qtiPage
.clickToolbarBack()
.options()
.showResults(Boolean.TRUE, QTI21AssessmentResultsOptions.allOptions())
.save();
qtiPage
.clickToolbarBack()
.startTestPart()
.selectItem("First question")
.assertOnAssessmentItem("First question")
.answerSingleChoice("Correct")
.saveAnswer()
.assertOnAssessmentItem("Second question")
.answerMultipleChoice("True")
.saveAnswer()
.endTestPart()
.selectItem("Third question")
.assertOnAssessmentItem("Third question")
.answerMultipleChoice("Correct")
.saveAnswer()
.answerCorrectKPrim("True", "Right")
.answerIncorrectKPrim("Wrong", "False")
.saveAnswer()
.endTestPart()
.assertOnAssessmentTestMaxScore(4)
.assertOnAssessmentTestScore(4)
.assertOnAssessmentTestPassed();
}
/**
* Test with 2 parts and test feedbacks.
*
* @param authorLoginPage
* @throws IOException
* @throws URISyntaxException
*/
@Test
@RunAsClient
public void qti21TestFlow_parts_feedbacks(@InitialPage LoginPage authorLoginPage)
throws IOException, URISyntaxException {
UserVO author = new UserRestClient(deploymentUrl).createAuthor();
authorLoginPage.loginAs(author.getLogin(), author.getPassword());
//upload a test
String qtiTestTitle = "With parts QTI 2.1 " + UUID.randomUUID();
URL qtiTestUrl = JunitTestHelper.class.getResource("file_resources/qti21/test_with_parts_and_test_feedbacks.zip");
File qtiTestFile = new File(qtiTestUrl.toURI());
navBar
.openAuthoringEnvironment()
.uploadResource(qtiTestTitle, qtiTestFile)
.clickToolbarRootCrumb();
QTI21Page qtiPage = QTI21Page
.getQTI12Page(browser);
qtiPage
.startTestPart()
.selectItem("First question")
.assertOnAssessmentItem("First question")
.answerSingleChoice("Correct answer")
.saveAnswer()
.assertOnAssessmentItem("Second question")
.answerMultipleChoice("Valid answer")
.saveAnswer()
.endTestPart()
.selectItem("Third question")
.assertOnAssessmentItem("Third question")
.answerSingleChoice("Right")
.saveAnswer()
.answerSingleChoice("Good")
.saveAnswer()
.endTestPart()
.assertOnAssessmentTestFeedback("Well done")
.closeTest()
.assertOnAssessmentTestTerminated();
}
/**
* Test with time limit.
*
* @param authorLoginPage
* @throws IOException
* @throws URISyntaxException
*/
@Test
@RunAsClient
public void qti21TestFlow_timeLimits(@InitialPage LoginPage authorLoginPage)
throws IOException, URISyntaxException {
UserVO author = new UserRestClient(deploymentUrl).createAuthor();
authorLoginPage.loginAs(author.getLogin(), author.getPassword());
//upload a test
String qtiTestTitle = "Timed QTI 2.1 " + UUID.randomUUID();
URL qtiTestUrl = JunitTestHelper.class.getResource("file_resources/qti21/test_time_limits.zip");
File qtiTestFile = new File(qtiTestUrl.toURI());
navBar
.openAuthoringEnvironment()
.uploadResource(qtiTestTitle, qtiTestFile)
.clickToolbarRootCrumb();
QTI21Page qtiPage = QTI21Page
.getQTI12Page(browser);
//check simple time limit
qtiPage
.assertOnAssessmentItem("Single choice")
.answerSingleChoice("Correct answer")
.saveAnswer()
.assertOnAssessmentItem("Last choice")
.answerSingleChoice("True")
.saveAnswer()
.assertOnAssessmentTestTerminated(15);
}
/**
* Test with time limit and wait for the results at the end.
*
* @param authorLoginPage
* @throws IOException
* @throws URISyntaxException
*/
@Test
@RunAsClient
public void qti21TestFlow_timeLimits_results(@InitialPage LoginPage authorLoginPage)
throws IOException, URISyntaxException {
UserVO author = new UserRestClient(deploymentUrl).createAuthor();
authorLoginPage.loginAs(author.getLogin(), author.getPassword());
//upload a test
String qtiTestTitle = "Timed QTI 2.1 " + UUID.randomUUID();
URL qtiTestUrl = JunitTestHelper.class.getResource("file_resources/qti21/test_time_limits.zip");
File qtiTestFile = new File(qtiTestUrl.toURI());
navBar
.openAuthoringEnvironment()
.uploadResource(qtiTestTitle, qtiTestFile)
.clickToolbarRootCrumb();
QTI21Page qtiPage = QTI21Page
.getQTI12Page(browser);
qtiPage
.options()
.showResults(Boolean.TRUE, new QTI21AssessmentResultsOptions(true, true, false, false, false, false))
.save();
//check simple time limit
qtiPage
.clickToolbarBack()
.assertOnAssessmentItem("Single choice")
.answerSingleChoice("Correct answer")
.saveAnswer()
.assertOnAssessmentItem("Last choice")
.answerSingleChoice("True")
.saveAnswer()
.assertOnAssessmentResults(15)
.assertOnAssessmentTestPassed()
.assertOnAssessmentTestMaxScore(2)
.assertOnAssessmentTestScore(2);
}
/**
* Test suspend. An author upload a test, set "enable suspend"
* and make the test visible to registered users. A second user
* open the test, does nothing, suspends and log out (check a possible red
* screen in the next step), log in, answer 3 questions, suspends
* and log out. It log in a last time and finish the test successfully.
*
* @param authorLoginPage
* @throws IOException
* @throws URISyntaxException
*/
@Test
@RunAsClient
public void qti21TestFlow_suspend(@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());
//upload a test
String qtiTestTitle = "Suspend QTI 2.1 " + UUID.randomUUID();
URL qtiTestUrl = JunitTestHelper.class.getResource("file_resources/qti21/test_4_no_skipping.zip");
File qtiTestFile = new File(qtiTestUrl.toURI());
navBar
.openAuthoringEnvironment()
.uploadResource(qtiTestTitle, qtiTestFile)
.clickToolbarRootCrumb();
QTI21Page qtiPage = QTI21Page
.getQTI12Page(browser);
qtiPage
.options()
.showResults(Boolean.TRUE, QTI21AssessmentResultsOptions.allOptions())
.enableSuspend()
.save();
qtiPage
.accessConfiguration()
.setUserAccess(UserAccess.registred)
.clickToolbarBack();
//check simple time limit
qtiPage
.assertOnAssessmentItem("Single choice");
//a user search the content package
LoginPage userLoginPage = LoginPage.getLoginPage(ryomouBrowser, deploymentUrl);
userLoginPage
.loginAs(ryomou.getLogin(), ryomou.getPassword())
.resume();
NavigationPage userNavBar = new NavigationPage(ryomouBrowser);
userNavBar
.openMyCourses()
.openSearch()
.extendedSearch(qtiTestTitle)
.select(qtiTestTitle)
.start();
QTI21Page userQtiPage = QTI21Page
.getQTI12Page(ryomouBrowser);
userQtiPage
.assertOnAssessmentItem("Single choice")
.suspendTest();
//log out
new UserToolsPage(ryomouBrowser)
.logout();
//log in and resume test
userLoginPage
.loginAs(ryomou.getLogin(), ryomou.getPassword())
.resume();
userQtiPage = QTI21Page
.getQTI12Page(ryomouBrowser);
userQtiPage
.assertOnAssessmentItem("Single choice")
.answerSingleChoice("Correct")
.saveAnswer()
.answerMultipleChoice("Correct")
.saveAnswer()
.assertOnAssessmentItem("Kprim")
.answerCorrectKPrim("True", "Right")
.answerIncorrectKPrim("False", "Wrong")
.saveAnswer()
.suspendTest();
//second log out
new UserToolsPage(ryomouBrowser)
.logout();
//log in and resume test
userLoginPage
.loginAs(ryomou.getLogin(), ryomou.getPassword())
.resume();
userQtiPage = QTI21Page
.getQTI12Page(ryomouBrowser);
userQtiPage
.assertOnAssessmentItem("Numerical input")
.answerGapText("42", "_RESPONSE_1")
.saveAnswer()
.endTest()
.assertOnAssessmentResults()
.assertOnAssessmentTestMaxScore(4)
.assertOnAssessmentTestScore(4)
.assertOnAssessmentTestPassed();
}
/**
* Upload a test in QTI 2.1 format, create a course, bind
* the test in a course element, run it and check if
* the attempt go up.
*
* @param authorLoginPage
* @throws IOException
* @throws URISyntaxException
*/
@Test
@RunAsClient
public void qti21Course(@InitialPage LoginPage authorLoginPage)
throws IOException, URISyntaxException {
UserVO author = new UserRestClient(deploymentUrl).createAuthor();
authorLoginPage.loginAs(author.getLogin(), author.getPassword());
//upload a test
String qtiTestTitle = "Simple QTI 2.1 " + UUID.randomUUID();
URL qtiTestUrl = JunitTestHelper.class.getResource("file_resources/qti21/simple_QTI_21_test.zip");
File qtiTestFile = new File(qtiTestUrl.toURI());
navBar
.openAuthoringEnvironment()
.uploadResource(qtiTestTitle, qtiTestFile);
//create a course
String courseTitle = "Course QTI 2.1 " + UUID.randomUUID();
navBar
.openAuthoringEnvironment()
.createCourse(courseTitle)
.clickToolbarBack();
String testNodeTitle = "QTI21Test-1";
//create a course element of type CP with the CP that we create above
CourseEditorPageFragment courseEditor = CoursePageFragment.getCourse(browser)
.edit();
courseEditor
.createNode("iqtest")
.nodeTitle(testNodeTitle)
.selectTabLearnContent()
.chooseTest(qtiTestTitle);
QTI21ConfigurationCEPage configPage = new QTI21ConfigurationCEPage(browser);
configPage
.selectConfiguration()
.showScoreOnHomepage(true)
.saveConfiguration();
//publish the course
courseEditor
.publish()
.quickPublish();
//open the course and see the CP
CoursePageFragment course = courseEditor
.clickToolbarBack();
course
.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());
QTI21Page qtiPage = QTI21Page
.getQTI12Page(browser);
qtiPage
.start()
.answerSingleChoice("Right")
.saveAnswer()
.endTest()
.assertOnCourseAttempts(1)
.assertOnCourseAssessmentTestScore(1);
}
/**
* Upload a test in QTI 2.1 format, create a course, bind
* the test in a course element, customize the options
* with full window mode, show scores and assessment results.
* Then run it and check if the assessment results appears after
* closing the test and on the start page of the test course element.
*
* @param authorLoginPage
* @throws IOException
* @throws URISyntaxException
*/
@Test
@RunAsClient
public void qti21Course_lmsHidden_results(@InitialPage LoginPage authorLoginPage)
throws IOException, URISyntaxException {
UserVO author = new UserRestClient(deploymentUrl).createAuthor();
authorLoginPage.loginAs(author.getLogin(), author.getPassword());
//upload a test
String qtiTestTitle = "Simple QTI 2.1 " + UUID.randomUUID();
URL qtiTestUrl = JunitTestHelper.class.getResource("file_resources/qti21/simple_QTI_21_test.zip");
File qtiTestFile = new File(qtiTestUrl.toURI());
navBar
.openAuthoringEnvironment()
.uploadResource(qtiTestTitle, qtiTestFile);
//create a course
String courseTitle = "Course QTI 2.1 " + UUID.randomUUID();
navBar
.openAuthoringEnvironment()
.createCourse(courseTitle)
.clickToolbarBack();
String testNodeTitle = "QTI21Test-1";
//create a course element of type CP with the CP that we create above
CourseEditorPageFragment courseEditor = CoursePageFragment.getCourse(browser)
.edit();
courseEditor
.createNode("iqtest")
.nodeTitle(testNodeTitle)
.selectTabLearnContent()
.chooseTest(qtiTestTitle);
QTI21ConfigurationCEPage configPage = new QTI21ConfigurationCEPage(browser);
configPage
.selectLayoutConfiguration()
.overrideConfiguration()
.fullWindow()
.saveLayoutConfiguration();
configPage
.selectConfiguration()
.showScoreOnHomepage(true)
.showResultsOnHomepage(Boolean.TRUE, QTI21AssessmentResultsOptions.allOptions())
.saveConfiguration();
//publish the course
courseEditor
.publish()
.quickPublish();
//open the course and see the CP
CoursePageFragment course = courseEditor
.clickToolbarBack();
course
.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());
QTI21Page qtiPage = QTI21Page
.getQTI12Page(browser);
qtiPage
.start()
.answerSingleChoice("Right")
.saveAnswer()
.endTest()
.assertOnAssessmentResults()
.closeAssessmentResults()
.assertOnCourseAttempts(1)
.assertOnCourseAssessmentTestScore(1)
.showAssessmentResults()
.assertOnAssessmentResults();
}
/**
* Check if the hotspot interaction send a "correct" feedback.
*
* @param authorLoginPage
* @throws IOException
* @throws URISyntaxException
*/
@Test
@RunAsClient
public void qti21GraphicInteraction(@InitialPage LoginPage authorLoginPage)
throws IOException, URISyntaxException {
UserVO author = new UserRestClient(deploymentUrl).createAuthor();
authorLoginPage.loginAs(author.getLogin(), author.getPassword());
//upload a test
String qtiTestTitle = "Simple QTI 2.1 " + UUID.randomUUID();
URL qtiTestUrl = JunitTestHelper.class.getResource("file_resources/qti21/simple_QTI_21_hotspot.zip");
File qtiTestFile = new File(qtiTestUrl.toURI());
navBar
.openAuthoringEnvironment()
.uploadResource(qtiTestTitle, qtiTestFile)
.clickToolbarRootCrumb();
QTI21Page qtiPage = QTI21Page
.getQTI12Page(browser);
qtiPage
.options()
.showResults(Boolean.TRUE, QTI21AssessmentResultsOptions.allOptions())
.save();
// to the test and spot it
qtiPage
.clickToolbarBack()
.assertOnAssessmentItem()
.answerHotspot("circle")
.saveAnswer()
.assertFeedback("Correct!")
.endTest();
//check the results
qtiPage
.assertOnAssessmentResults()
.assertOnAssessmentTestScore(1)
.assertOnAssessmentTestMaxScore(1);
}
/**
* Create a test, import the CSV example, remove the
* first single choice which come if someone create a
* test. Change the delivery settings of the test to
* show the detailled results.<br>
* Run the test and check the results.
*
* @param loginPage
* @throws IOException
* @throws URISyntaxException
*/
@Test
@RunAsClient
public void importQuestionsCSV(@InitialPage LoginPage authorLoginPage)
throws IOException, URISyntaxException {
UserVO author = new UserRestClient(deploymentUrl).createAuthor();
authorLoginPage.loginAs(author.getLogin(), author.getPassword());
//upload a test
String qtiTestTitle = "Excel QTI 2.1 " + UUID.randomUUID();
navBar
.openAuthoringEnvironment()
.createQTI21Test(qtiTestTitle)
.clickToolbarBack();
QTI21Page qtiPage = QTI21Page
.getQTI12Page(browser);
QTI21EditorPage qtiEditor = qtiPage
.edit();
// import a single choice, a multiple and 2 gap texts
qtiEditor
.importTable()
.importFile("qti21/import_qti21_excel.txt")
.next()
.assertOnNumberOfQuestions(5)
.finish();
//remove the single choice which come from the creation
// of the test
qtiEditor
.selectNode("Single choice")
.deleteNode();
// go to options and show the results
qtiPage
.clickToolbarBack()
.options()
.showResults(Boolean.TRUE, QTI21AssessmentResultsOptions.allOptions())
.save();
//go to the test
qtiPage
.clickToolbarBack()
.assertOnAssessmentItem()
.answerGapText("verbannen", "_RESPONSE_1")
.saveAnswer()
.nextAnswer()
.answerGapText(",", "_RESPONSE_1")
.answerGapText("", "_RESPONSE_2")
.answerGapText("", "_RESPONSE_3")
.saveAnswer()
.answerMultipleChoice("Deutschland", "Brasilien", "S\u00FCdafrika")
.saveAnswer()
.answerSingleChoice("Italien")
.saveAnswer()
.answerCorrectKPrim("Deutschland", "Uruguay")
.answerIncorrectKPrim("Frankreich", "Spanien")
.saveAnswer()
.endTest();
//check the results
qtiPage
.assertOnAssessmentResults()
.assertOnAssessmentTestScore(9)
.assertOnAssessmentTestMaxScore(9);
}
/**
* Upload a test in QTI 2.1 format, create a course, bind
* the test in a course element, customize the options
* with full window mode, allow suspending the test,
* show scores and assessment results.<br>
* Then run it and at the middle of the test, suspend it, log out.
* Return with resume to the course and resume the test, finish it
* and check if the assessment results appears after
* closing the test and on the start page of the test course element.
*
* @param authorLoginPage
* @throws IOException
* @throws URISyntaxException
*/
@Test
@RunAsClient
public void qti21Course_suspend(@InitialPage LoginPage authorLoginPage)
throws IOException, URISyntaxException {
UserVO author = new UserRestClient(deploymentUrl).createAuthor();
authorLoginPage.loginAs(author.getLogin(), author.getPassword());
//upload a test
String qtiTestTitle = "No skipping QTI 2.1 " + UUID.randomUUID();
URL qtiTestUrl = JunitTestHelper.class.getResource("file_resources/qti21/test_4_no_skipping.zip");
File qtiTestFile = new File(qtiTestUrl.toURI());
navBar
.openAuthoringEnvironment()
.uploadResource(qtiTestTitle, qtiTestFile);
//create a course
String courseTitle = "Course QTI 2.1 " + UUID.randomUUID();
navBar
.openAuthoringEnvironment()
.createCourse(courseTitle)
.clickToolbarBack();
String testNodeTitle = "QTI21Test-1";
//create a course element of type CP with the CP that we create above
CourseEditorPageFragment courseEditor = CoursePageFragment.getCourse(browser)
.edit();
courseEditor
.createNode("iqtest")
.nodeTitle(testNodeTitle)
.selectTabLearnContent()
.chooseTest(qtiTestTitle);
QTI21ConfigurationCEPage configPage = new QTI21ConfigurationCEPage(browser);
configPage
.selectLayoutConfiguration()
.overrideConfiguration()
.fullWindow()
.saveLayoutConfiguration();
configPage
.selectConfiguration()
.showScoreOnHomepage(true)
.showResultsOnHomepage(Boolean.TRUE, QTI21AssessmentResultsOptions.allOptions())
.saveConfiguration()
.selectLayoutConfiguration()
.overrideConfiguration()
.enableSuspend()
.saveLayoutConfiguration();
//publish the course
courseEditor
.publish()
.quickPublish();
//open the course and see the CP
CoursePageFragment course = courseEditor
.clickToolbarBack();
course
.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());
QTI21Page qtiPage = QTI21Page
.getQTI12Page(browser);
qtiPage
.start()
.answerSingleChoice("Correct")
.saveAnswer()
.answerMultipleChoice("Correct")
.saveAnswer()
.suspendTest();
//log out
new UserToolsPage(browser)
.logout();
// return
authorLoginPage
.loginAs(author.getLogin(), author.getPassword())
.resume();
//resume the course, resume the test
qtiPage = QTI21Page
.getQTI12Page(browser);
qtiPage
.start()
.assertOnAssessmentItem("Kprim")
.answerCorrectKPrim("True", "Right")
.answerIncorrectKPrim("False", "Wrong")
.saveAnswer()
.answerGapText("43", "_RESPONSE_1")
.saveAnswer()
.endTest()
.assertOnAssessmentResults()
.assertOnAssessmentTestMaxScore(4)
.assertOnAssessmentTestScore(4)
.assertOnAssessmentTestPassed()
.closeAssessmentResults();
//check the result on the start page
qtiPage
.assertOnCourseAssessmentTestScore(4)
.assertOnCourseAttempts(1);
}
/**
* Test different settings in the single choice editor. An author
* make a test with 2 single choices, one with score all answer correct,
* the second with score per answer and feedbacks.<br>
* A second user make the test and check the score at the end of
* the test.
*
* @param authorLoginPage
* @throws IOException
* @throws URISyntaxException
*/
@Test
@RunAsClient
public void qti21EditorSingleChoices(@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());
String qtiTestTitle = "Choices QTI 2.1 " + UUID.randomUUID();
navBar
.openAuthoringEnvironment()
.createQTI21Test(qtiTestTitle)
.clickToolbarBack();
QTI21Page qtiPage = QTI21Page
.getQTI12Page(browser);
QTI21EditorPage qtiEditor = qtiPage
.edit();
//start a blank test
qtiEditor
.selectNode("Single choice")
.deleteNode();
//add a single choice: all answers score
QTI21SingleChoiceEditorPage scEditor = qtiEditor
.addSingleChoice();
scEditor
.setAnswer(0, "Wrong")
.addChoice(1)
.setCorrect(1)
.setAnswer(1, "Correct")
.addChoice(2)
.setAnswer(2, "Faux")
.addChoice(3)
.setAnswer(3, "Falsch")
.save();
// change max score
scEditor
.selectScores()
.setMaxScore("3")
.save();
// set some feedbacks
scEditor
.selectFeedbacks()
.setHint("Hint", "This is only an hint")
.setCorrectSolution("Correct solution", "This is the correct solution")
.setCorrectFeedback("Correct feedback", "This is correct")
.setIncorrectFeedback("Incorrect", "Your answer is not correct")
.save();
//score per answers
scEditor = qtiEditor
.addSingleChoice()
.setAnswer(0, "AlmostRight")
.addChoice(1)
.setAnswer(1, "NotRight")
.addChoice(2)
.setCorrect(2)
.setAnswer(2, "RightAnswer")
.addChoice(3)
.setAnswer(3, "TheWrongOne")
.save();
scEditor
.selectScores()
.setMaxScore("2")
.selectAssessmentMode(ScoreEvaluation.perAnswer)
.setScore("Almost", "1")
.setScore("NotRight", "0")
.setScore("RightAnswer", "2")
.setScore("TheWrongOne", "0")
.save();
scEditor
.selectFeedbacks()
.setHint("Hint", "The hint")
.setCorrectSolution("Correct solution", "This is the correct solution")
.setCorrectFeedback("Correct feedback", "This is correct")
.setIncorrectFeedback("Incorrect", "Your answer is not correct")
.save();
qtiPage
.clickToolbarBack();
// access to all
qtiPage
.accessConfiguration()
.setUserAccess(UserAccess.guest)
.clickToolbarBack();
// show results
qtiPage
.options()
.showResults(Boolean.TRUE, QTI21AssessmentResultsOptions.allOptions())
.save();
//a user search the content package
LoginPage userLoginPage = LoginPage.getLoginPage(ryomouBrowser, deploymentUrl);
userLoginPage
.loginAs(ryomou.getLogin(), ryomou.getPassword())
.resume();
NavigationPage userNavBar = new NavigationPage(ryomouBrowser);
userNavBar
.openMyCourses()
.openSearch()
.extendedSearch(qtiTestTitle)
.select(qtiTestTitle)
.start();
// make the test
QTI21Page ryomouQtiPage = QTI21Page
.getQTI12Page(ryomouBrowser);
ryomouQtiPage
.assertOnAssessmentItem()
.answerSingleChoice("Falsch")
.saveAnswer()
.assertFeedback("Incorrect")
.assertCorrectSolution("Correct solution")
.hint()
.assertFeedback("Hint")
.answerSingleChoice("Correct")
.saveAnswer()
.assertFeedback("Correct feedback")
.nextAnswer()
.answerSingleChoice("Almost")
.saveAnswer()
.assertCorrectSolution("Correct solution")
.assertFeedback("Incorrect")
.endTest()
.assertOnAssessmentResults()
.assertOnAssessmentTestScore(4);// 3 points from the first question, 1 from the second
}
/**
* An author make a test with 2 multiple choices, the first
* with the score set if all answers are correct, the second
* with scoring per answers.<br>
* A first user make the test, but doesn't answer all questions
* correctly, log out and a second user make the perfect test.
*
* @param authorLoginPage
* @param participantBrowser
* @throws IOException
* @throws URISyntaxException
*/
@Test
@RunAsClient
public void qti21EditorMultipleChoices(@InitialPage LoginPage authorLoginPage,
@Drone @User WebDriver participantBrowser)
throws IOException, URISyntaxException {
UserVO author = new UserRestClient(deploymentUrl).createAuthor();
UserVO ryomou = new UserRestClient(deploymentUrl).createRandomUser("Ryomou");
UserVO eric = new UserRestClient(deploymentUrl).createRandomUser("Eric");
authorLoginPage.loginAs(author.getLogin(), author.getPassword());
String qtiTestTitle = "Choices QTI 2.1 " + UUID.randomUUID();
navBar
.openAuthoringEnvironment()
.createQTI21Test(qtiTestTitle)
.clickToolbarBack();
QTI21Page qtiPage = QTI21Page
.getQTI12Page(browser);
QTI21EditorPage qtiEditor = qtiPage
.edit();
//start a blank test
qtiEditor
.selectNode("Single choice")
.deleteNode();
//add a single choice: all answers score
QTI21MultipleChoiceEditorPage mcEditor = qtiEditor
.addMultipleChoice();
mcEditor
.setAnswer(0, "Correct")
.setCorrect(0)
.addChoice(1)
.setCorrect(1)
.setAnswer(1, "OkToo")
.addChoice(2)
.setAnswer(2, "Faux")
.addChoice(3)
.setAnswer(3, "Falsch")
.save();
// change max score
mcEditor
.selectScores()
.setMaxScore("3")
.save();
// set some feedbacks
mcEditor
.selectFeedbacks()
.setHint("Hint", "This is only an hint")
.setCorrectSolution("Correct solution", "This is the correct solution")
.setCorrectFeedback("Correct feedback", "This is correct")
.setIncorrectFeedback("Incorrect", "Your answer is not correct")
.save();
//score per answers
mcEditor = qtiEditor
.addMultipleChoice()
.setCorrect(0)
.setAnswer(0, "AlmostRight")
.addChoice(1)
.setAnswer(1, "NotRight")
.addChoice(2)
.setCorrect(2)
.setAnswer(2, "RightAnswer")
.addChoice(3)
.setAnswer(3, "TheWrongOne")
.save();
mcEditor
.selectScores()
.setMaxScore("3")
.selectAssessmentMode(ScoreEvaluation.perAnswer)
.setScore("AlmostRight", "1")
.setScore("NotRight", "0")
.setScore("RightAnswer", "2")
.setScore("TheWrongOne", "0")
.save();
mcEditor
.selectFeedbacks()
.setHint("Hint", "The hint")
.setCorrectSolution("Correct solution", "This is the correct solution")
.setCorrectFeedback("Correct feedback", "This is correct")
.setIncorrectFeedback("Incorrect", "Your answer is not correct")
.save();
qtiPage
.clickToolbarBack();
// access to all
qtiPage
.accessConfiguration()
.setUserAccess(UserAccess.guest)
.clickToolbarBack();
// show results
qtiPage
.options()
.showResults(Boolean.TRUE, QTI21AssessmentResultsOptions.allOptions())
.save();
//a user search the content package
LoginPage userLoginPage = LoginPage.getLoginPage(participantBrowser, deploymentUrl);
userLoginPage
.loginAs(ryomou.getLogin(), ryomou.getPassword())
.resume();
NavigationPage userNavBar = new NavigationPage(participantBrowser);
userNavBar
.openMyCourses()
.openSearch()
.extendedSearch(qtiTestTitle)
.select(qtiTestTitle)
.start();
// make the test
QTI21Page ryomouQtiPage = QTI21Page
.getQTI12Page(participantBrowser);
ryomouQtiPage
.assertOnAssessmentItem()
.answerMultipleChoice("Falsch")
.answerMultipleChoice("OkToo")
.saveAnswer()
.assertFeedback("Incorrect")
.assertCorrectSolution("Correct solution")
.hint()
.assertFeedback("Hint")
.answerMultipleChoice("Falsch")
.answerMultipleChoice("Correct")
.saveAnswer()
.assertFeedback("Correct feedback")
.nextAnswer()
.answerMultipleChoice("AlmostRight")
.saveAnswer()
.assertCorrectSolution("Correct solution")
.assertFeedback("Incorrect")
.endTest()
.assertOnAssessmentResults()
.assertOnAssessmentTestScore(4);// 3 points from the first question, 1 from the second
//a second user search the content package
LoginPage ericLoginPage = LoginPage.getLoginPage(participantBrowser, deploymentUrl);
ericLoginPage
.loginAs(eric.getLogin(), eric.getPassword())
.resume();
NavigationPage ericNavBar = new NavigationPage(participantBrowser);
ericNavBar
.openMyCourses()
.openSearch()
.extendedSearch(qtiTestTitle)
.select(qtiTestTitle)
.start();
// make the test
QTI21Page
.getQTI12Page(participantBrowser)
.assertOnAssessmentItem()
.answerMultipleChoice("Correct", "OkToo")
.saveAnswer()
.assertFeedback("Correct feedback")
.nextAnswer()
.answerMultipleChoice("AlmostRight", "RightAnswer")
.saveAnswer()
.endTest()
.assertOnAssessmentResults()
.assertOnAssessmentTestScore(6);// 3 points from the first question, 3 from the second
}
/**
* An author make a test with 2 kprims.<br>
* A first user make the test, but doesn't answer all questions
* correctly, log out and a second user make the perfect test.
*
* @param authorLoginPage
* @param participantBrowser
* @throws IOException
* @throws URISyntaxException
*/
@Test
@RunAsClient
public void qti21EditorKprim(@InitialPage LoginPage authorLoginPage,
@Drone @User WebDriver participantBrowser)
throws IOException, URISyntaxException {
UserVO author = new UserRestClient(deploymentUrl).createAuthor();
UserVO rei = new UserRestClient(deploymentUrl).createRandomUser("Rei");
UserVO melissa = new UserRestClient(deploymentUrl).createRandomUser("Melissa");
authorLoginPage.loginAs(author.getLogin(), author.getPassword());
String qtiTestTitle = "Kprim QTI 2.1 " + UUID.randomUUID();
navBar
.openAuthoringEnvironment()
.createQTI21Test(qtiTestTitle)
.clickToolbarBack();
QTI21Page qtiPage = QTI21Page
.getQTI12Page(browser);
QTI21EditorPage qtiEditor = qtiPage
.edit();
//start a blank test
qtiEditor
.selectNode("Single choice")
.deleteNode();
//add a kprim
QTI21KprimEditorPage kprimEditor = qtiEditor
.addKprim();
kprimEditor
.setAnswer(0, "Correct")
.setCorrect(0, true)
.setAnswer(1, "OkToo")
.setCorrect(1, true)
.setAnswer(2, "Faux")
.setCorrect(2, false)
.setAnswer(3, "Falsch")
.setCorrect(3, false)
.save();
// change max score
kprimEditor
.selectScores()
.setMaxScore("4")
.save();
// set some feedbacks
kprimEditor
.selectFeedbacks()
.setHint("Hint", "This is only an hint")
.setCorrectSolution("Correct solution", "This is the correct solution")
.setCorrectFeedback("Correct feedback", "This is correct")
.setIncorrectFeedback("Incorrect", "Your answer is not correct")
.save();
// second kprim
kprimEditor = qtiEditor
.addKprim()
.setAnswer(0, "OnlyRight")
.setCorrect(0, true)
.setAnswer(1, "NotRight")
.setCorrect(1, false)
.setAnswer(2, "NotAnswer")
.setCorrect(2, false)
.setAnswer(3, "TheWrongOne")
.setCorrect(3, false)
.save();
kprimEditor
.selectScores()
.setMaxScore("2")
.save();
kprimEditor
.selectFeedbacks()
.setHint("Hint", "The hint")
.setCorrectSolution("Correct solution", "This is the correct solution")
.setCorrectFeedback("Correct feedback", "This is correct")
.setIncorrectFeedback("Incorrect", "Your answer is not correct")
.save();
qtiPage
.clickToolbarBack();
// access to all
qtiPage
.accessConfiguration()
.setUserAccess(UserAccess.guest)
.clickToolbarBack();
// show results
qtiPage
.options()
.showResults(Boolean.TRUE, QTI21AssessmentResultsOptions.allOptions())
.save();
//a user search the content package
LoginPage reiLoginPage = LoginPage.getLoginPage(participantBrowser, deploymentUrl);
reiLoginPage
.loginAs(rei.getLogin(), rei.getPassword())
.resume();
NavigationPage reiNavBar = new NavigationPage(participantBrowser);
reiNavBar
.openMyCourses()
.openSearch()
.extendedSearch(qtiTestTitle)
.select(qtiTestTitle)
.start();
// make the test
QTI21Page reiQtiPage = QTI21Page
.getQTI12Page(participantBrowser);
reiQtiPage
.assertOnAssessmentItem()
.answerCorrectKPrim("Correct", "OkToo", "Faux")
.answerIncorrectKPrim("Falsch")
.saveAnswer()
.assertFeedback("Incorrect")
.assertCorrectSolution("Correct solution")
.hint()
.assertFeedback("Hint")
.answerCorrectKPrim("Correct", "OkToo")
.answerIncorrectKPrim("Falsch", "Faux")
.saveAnswer()
.assertFeedback("Correct feedback")
.nextAnswer()
.answerIncorrectKPrim("OnlyRight", "NotRight", "NotAnswer", "TheWrongOne")
.saveAnswer()
.assertCorrectSolution("Correct solution")
.assertFeedback("Incorrect")
.endTest()
.assertOnAssessmentResults()
.assertOnAssessmentTestScore(5);// 4 points from the first question, 1 from the second
//a second user search the content package
LoginPage melLoginPage = LoginPage.getLoginPage(participantBrowser, deploymentUrl);
melLoginPage
.loginAs(melissa.getLogin(), melissa.getPassword())
.resume();
NavigationPage melNavBar = new NavigationPage(participantBrowser);
melNavBar
.openMyCourses()
.openSearch()
.extendedSearch(qtiTestTitle)
.select(qtiTestTitle)
.start();
// make the test
QTI21Page
.getQTI12Page(participantBrowser)
.assertOnAssessmentItem()
.answerCorrectKPrim("Correct", "OkToo")
.answerIncorrectKPrim("Faux", "Falsch")
.saveAnswer()
.assertFeedback("Correct feedback")
.nextAnswer()
.answerCorrectKPrim("OnlyRight")
.answerIncorrectKPrim("NotRight", "NotAnswer", "TheWrongOne")
.saveAnswer()
.endTest()
.assertOnAssessmentResults()
.assertOnAssessmentTestScore(6);// 3 points from the first question, 3 from the second
}
/**
* An author make a test with 2 matches. A match with "multiple selection"
* and score "all answers", a second with "single selection" and score
* "per answers".<br>
* A first user make the test, but doesn't answer all questions
* correctly, log out and a second user make the perfect test.
*
* @param authorLoginPage
* @param participantBrowser
* @throws IOException
* @throws URISyntaxException
*/
@Test
@RunAsClient
public void qti21EditorMatch(@InitialPage LoginPage authorLoginPage,
@Drone @User WebDriver participantBrowser)
throws IOException, URISyntaxException {
UserVO author = new UserRestClient(deploymentUrl).createAuthor();
UserVO rei = new UserRestClient(deploymentUrl).createRandomUser("Rei");
UserVO melissa = new UserRestClient(deploymentUrl).createRandomUser("Melissa");
authorLoginPage.loginAs(author.getLogin(), author.getPassword());
String qtiTestTitle = "Match QTI 2.1 " + UUID.randomUUID();
navBar
.openAuthoringEnvironment()
.createQTI21Test(qtiTestTitle)
.clickToolbarBack();
QTI21Page qtiPage = QTI21Page
.getQTI12Page(browser);
QTI21EditorPage qtiEditor = qtiPage
.edit();
//start a blank test
qtiEditor
.selectNode("Single choice")
.deleteNode();
//add a match, multiple selection
QTI21MatchEditorPage matchEditor = qtiEditor
.addMatch();
matchEditor
.setSource(0, "Eclipse")
.setSource(1, "vim")
.setTarget(0, "IDE")
.setTarget(1, "TextProcessor")
.addColumn()
.setTarget(2, "TextEditor")
.setMatch(0, 0, true)
.setMatch(1, 2, true)
.save();
// change max score
matchEditor
.selectScores()
.setMaxScore("4")
.save();
// set some feedbacks
matchEditor
.selectFeedbacks()
.setHint("Hint", "This is only an hint")
.setCorrectSolution("Correct solution", "This is the correct solution")
.setCorrectFeedback("Correct feedback", "This is correct")
.setIncorrectFeedback("Incorrect", "Your answer is not correct")
.save();
// second match
matchEditor = qtiEditor
.addMatch()
.setSingleChoices()
.setSource(0, "Java")
.setSource(1, "C")
.addRow()
.setSource(2, "PHP")
.setTarget(0, "CodeIgniter")
.setTarget(1, "VisualStudio")
.addColumn()
.setTarget(2, "Eclipse")
.setMatch(0, 2, true)
.setMatch(1, 1, true)
.setMatch(2, 0, true)
.save();
// select score "per answer" and set the scores
matchEditor
.selectScores()
.selectAssessmentMode(ScoreEvaluation.perAnswer)
.setMaxScore("6")
.setScore(0, 0, "0.0")
.setScore(0, 1, "0.0")
.setScore(0, 2, "2.0")
.setScore(1, 0, "0.0")
.setScore(1, 1, "3.0")
.setScore(1, 2, "0.0")
.setScore(2, 0, "1.0")
.setScore(2, 1, "0.0")
.setScore(2, 2, "0.0")
.save();
matchEditor
.selectFeedbacks()
.setHint("Hint", "The hint")
.setCorrectSolution("Correct solution", "This is the correct solution")
.setCorrectFeedback("Correct feedback", "This is correct")
.setIncorrectFeedback("Incorrect", "Your answer is not correct")
.save();
qtiPage
.clickToolbarBack();
// access to all
qtiPage
.accessConfiguration()
.setUserAccess(UserAccess.guest)
.clickToolbarBack();
// show results
qtiPage
.options()
.showResults(Boolean.TRUE, QTI21AssessmentResultsOptions.allOptions())
.save();
//a user search the content package
LoginPage reiLoginPage = LoginPage.getLoginPage(participantBrowser, deploymentUrl);
reiLoginPage
.loginAs(rei.getLogin(), rei.getPassword())
.resume();
NavigationPage reiNavBar = new NavigationPage(participantBrowser);
reiNavBar
.openMyCourses()
.openSearch()
.extendedSearch(qtiTestTitle)
.select(qtiTestTitle)
.start();
// make the test
QTI21Page reiQtiPage = QTI21Page
.getQTI12Page(participantBrowser);
reiQtiPage
.assertOnAssessmentItem()
.answerMatch("Eclipse", "IDE", true)
.answerMatch("vim", "IDE", true)
.saveAnswer()
.assertFeedback("Incorrect")
.assertCorrectSolution("Correct solution")
.hint()
.assertFeedback("Hint")
.answerMatch("vim", "IDE", false)
.answerMatch("vim", "TextEditor", true)
.saveAnswer()
.assertFeedback("Correct feedback")
.nextAnswer()
.answerMatch("Java", "Eclipse", true)
.answerMatch("C", "CodeIgniter", true)
.answerMatch("PHP", "VisualStudio", true)
.saveAnswer()
.assertCorrectSolution("Correct solution")
.assertFeedback("Incorrect")
.endTest()
.assertOnAssessmentResults()
.assertOnAssessmentTestScore(6);// 4 points from the first question, 2 from the second
//a second user search the content package
LoginPage melLoginPage = LoginPage.getLoginPage(participantBrowser, deploymentUrl);
melLoginPage
.loginAs(melissa.getLogin(), melissa.getPassword())
.resume();
NavigationPage melNavBar = new NavigationPage(participantBrowser);
melNavBar
.openMyCourses()
.openSearch()
.extendedSearch(qtiTestTitle)
.select(qtiTestTitle)
.start();
// make the test
QTI21Page
.getQTI12Page(participantBrowser)
.assertOnAssessmentItem()
.answerMatch("Eclipse", "IDE", true)
.answerMatch("vim", "TextEditor", true)
.saveAnswer()
.assertFeedback("Correct feedback")
.nextAnswer()
.answerMatch("Java", "Eclipse", true)
.answerMatch("C", "CodeIgniter", true)
.answerMatch("PHP", "VisualStudio", true)
.saveAnswer()
.answerMatch("C", "CodeIgniter", false)
.answerMatch("PHP", "VisualStudio", false)
.answerMatch("C", "VisualStudio", true)
.answerMatch("PHP", "CodeIgniter", true)
.saveAnswer()
.endTest()
.assertOnAssessmentResults()
.assertOnAssessmentTestScore(10);// 4 points from the first question, 6 from the second
}
/**
* An author make a test with 1 upload and feedbacks.<br>
* A user make the test, test hint and upload the file.
*
* @param authorLoginPage
* @param participantBrowser
* @throws IOException
* @throws URISyntaxException
*/
@Test
@RunAsClient
public void qti21EditorUpload(@InitialPage LoginPage authorLoginPage,
@Drone @User WebDriver participantBrowser)
throws IOException, URISyntaxException {
UserVO author = new UserRestClient(deploymentUrl).createAuthor();
UserVO rei = new UserRestClient(deploymentUrl).createRandomUser("Rei");
authorLoginPage.loginAs(author.getLogin(), author.getPassword());
//make a test
String qtiTestTitle = "Upload QTI 2.1 " + UUID.randomUUID();
navBar
.openAuthoringEnvironment()
.createQTI21Test(qtiTestTitle)
.clickToolbarBack();
QTI21Page qtiPage = QTI21Page
.getQTI12Page(browser);
QTI21EditorPage qtiEditor = qtiPage
.edit();
//start a blank test
qtiEditor
.selectNode("Single choice")
.deleteNode();
//add an upload interaction
QTI21LobEditorPage uploadEditor = qtiEditor
.addUpload();
uploadEditor
.setQuestion("Upload a file")
.save()
.selectScores()
.setMaxScore("2.0")
.save();
uploadEditor
.selectFeedbacks()
.setHint("Hint", "Need a little help.")
.setCorrectSolution("Correct solution", "Only for Word")
.setAnsweredFeedback("Full", "You upload something")
.setEmpytFeedback("Empty", "You do not upload anything")
.save();
qtiPage
.clickToolbarBack();
// access to all
qtiPage
.accessConfiguration()
.setUserAccess(UserAccess.guest)
.clickToolbarBack();
// show results
qtiPage
.options()
.showResults(Boolean.TRUE, QTI21AssessmentResultsOptions.allOptions())
.save();
//a user search the content package
LoginPage reiLoginPage = LoginPage.getLoginPage(participantBrowser, deploymentUrl);
reiLoginPage
.loginAs(rei.getLogin(), rei.getPassword())
.resume();
NavigationPage reiNavBar = new NavigationPage(participantBrowser);
reiNavBar
.openMyCourses()
.openSearch()
.extendedSearch(qtiTestTitle)
.select(qtiTestTitle)
.start();
// make the test
QTI21Page reiQtiPage = QTI21Page
.getQTI12Page(participantBrowser);
reiQtiPage
.assertOnAssessmentItem()
.saveAnswer()
.assertFeedback("Empty")
.hint()
.assertFeedback("Hint");
URL imageUrl = JunitTestHelper.class.getResource("file_resources/IMG_1482.JPG");
File imageFile = new File(imageUrl.toURI());
reiQtiPage
.answerUpload(imageFile)
.saveAnswer()
.assertFeedback("Full")
.endTest()
.assertOnAssessmentResults()
.assertOnAssessmentResultUpload("IMG_1482");
}
/**
* An author make a test with an essai and its special feedback.<br>
* A user make the test and check the feedback.
*
* @param authorLoginPage
* @param participantBrowser
* @throws IOException
* @throws URISyntaxException
*/
@Test
@RunAsClient
public void qti21EditorEssay(@InitialPage LoginPage authorLoginPage,
@Drone @User WebDriver participantBrowser)
throws IOException, URISyntaxException {
UserVO author = new UserRestClient(deploymentUrl).createAuthor();
UserVO rei = new UserRestClient(deploymentUrl).createRandomUser("Rei");
authorLoginPage.loginAs(author.getLogin(), author.getPassword());
//make a test
String qtiTestTitle = "Essai QTI 2.1 " + UUID.randomUUID();
navBar
.openAuthoringEnvironment()
.createQTI21Test(qtiTestTitle)
.clickToolbarBack();
QTI21Page qtiPage = QTI21Page
.getQTI12Page(browser);
QTI21EditorPage qtiEditor = qtiPage
.edit();
//start a blank test
qtiEditor
.selectNode("Single choice")
.deleteNode();
//add an essay interaction
QTI21LobEditorPage essayEditor = qtiEditor
.addEssay();
essayEditor
.setQuestion("Write a small story")
.save()
.selectScores()
.setMaxScore("3.0")
.save();
essayEditor
.selectFeedbacks()
.setHint("Hint", "Did you search inspiration?")
.setCorrectSolution("Correct solution", "It is very personal.")
.setAnsweredFeedback("Full", "Well done")
.setEmpytFeedback("Empty", "Please, a little effort.")
.save();
qtiPage
.clickToolbarBack();
// access to all
qtiPage
.accessConfiguration()
.setUserAccess(UserAccess.guest)
.clickToolbarBack();
// show results
qtiPage
.options()
.showResults(Boolean.TRUE, QTI21AssessmentResultsOptions.allOptions())
.save();
//a user search the content package
LoginPage reiLoginPage = LoginPage.getLoginPage(participantBrowser, deploymentUrl);
reiLoginPage
.loginAs(rei.getLogin(), rei.getPassword())
.resume();
NavigationPage reiNavBar = new NavigationPage(participantBrowser);
reiNavBar
.openMyCourses()
.openSearch()
.extendedSearch(qtiTestTitle)
.select(qtiTestTitle)
.start();
// make the test
QTI21Page reiQtiPage = QTI21Page
.getQTI12Page(participantBrowser);
reiQtiPage
.assertOnAssessmentItem()
.saveAnswer()
.assertFeedback("Empty")
.hint()
.assertFeedback("Hint");
reiQtiPage
.answerEssay("What can I write?")
.saveAnswer()
.assertFeedback("Full")
.endTest()
.assertOnAssessmentResults()
.assertOnAssessmentResultEssay("What");
}
/**
* An author make a test with a drawing and its special feedback.<br>
* A user make the test and check the feedback.
*
* @param authorLoginPage
* @param participantBrowser
* @throws IOException
* @throws URISyntaxException
*/
@Test
@RunAsClient
public void qti21EditorDrawing(@InitialPage LoginPage authorLoginPage,
@Drone @User WebDriver participantBrowser)
throws IOException, URISyntaxException {
UserVO author = new UserRestClient(deploymentUrl).createAuthor();
UserVO rei = new UserRestClient(deploymentUrl).createRandomUser("Rei");
authorLoginPage.loginAs(author.getLogin(), author.getPassword());
//make a test
String qtiTestTitle = "Drawing QTI 2.1 " + UUID.randomUUID();
navBar
.openAuthoringEnvironment()
.createQTI21Test(qtiTestTitle)
.clickToolbarBack();
QTI21Page qtiPage = QTI21Page
.getQTI12Page(browser);
QTI21EditorPage qtiEditor = qtiPage
.edit();
//start a blank test
qtiEditor
.selectNode("Single choice")
.deleteNode();
//add an essay interaction
QTI21LobEditorPage essayEditor = qtiEditor
.addDrawing();
URL backgroundImageUrl = JunitTestHelper.class.getResource("file_resources/house.jpg");
File backgroundImageFile = new File(backgroundImageUrl.toURI());
essayEditor
.setQuestion("Draw an house")
.updloadDrawingBackground(backgroundImageFile)
.save()
.selectScores()
.setMaxScore("3.0")
.save();
essayEditor
.selectFeedbacks()
.setHint("Hint", "Did you search inspiration?")
.setCorrectSolution("Correct solution", "It is very personal.")
.setAnsweredFeedback("Full", "Well done")
.setEmpytFeedback("Empty", "Please, a little effort.")
.save();
qtiPage
.clickToolbarBack();
// access to all
qtiPage
.accessConfiguration()
.setUserAccess(UserAccess.guest)
.clickToolbarBack();
// show results
qtiPage
.options()
.showResults(Boolean.TRUE, QTI21AssessmentResultsOptions.allOptions())
.save();
//a user search the content package
LoginPage reiLoginPage = LoginPage.getLoginPage(participantBrowser, deploymentUrl);
reiLoginPage
.loginAs(rei.getLogin(), rei.getPassword())
.resume();
NavigationPage reiNavBar = new NavigationPage(participantBrowser);
reiNavBar
.openMyCourses()
.openSearch()
.extendedSearch(qtiTestTitle)
.select(qtiTestTitle)
.start();
// make the test
QTI21Page reiQtiPage = QTI21Page
.getQTI12Page(participantBrowser);
reiQtiPage
.assertOnAssessmentItem()
.saveAnswer()
.assertFeedback("Empty")
.hint()
.assertFeedback("Hint");
reiQtiPage
.answerDrawing()
.saveAnswer()
.assertFeedback("Full")
.endTest()
.assertOnAssessmentResults()
.assertOnDrawing();
}
}