Skip to content

Commit f237e35

Browse files
committed
MDL-65883 mod_quiz: change attemptlib_test to use data generators
1 parent bee606d commit f237e35

File tree

1 file changed

+96
-110
lines changed

1 file changed

+96
-110
lines changed

mod/quiz/tests/attempt_test.php

Lines changed: 96 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -28,96 +28,79 @@
2828
global $CFG;
2929
require_once($CFG->dirroot . '/mod/quiz/locallib.php');
3030

31-
3231
/**
33-
* Subclass of quiz_attempt to allow faking of the page layout.
32+
* Tests for the quiz_attempt class.
3433
*
3534
* @copyright 2014 Tim Hunt
3635
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
3736
*/
38-
class mod_quiz_attempt_testable extends quiz_attempt {
39-
/** @var array list of slots to treat as if they contain descriptions in the fake layout. */
40-
protected $infos = array();
37+
class mod_quiz_attempt_testcase extends advanced_testcase {
4138

4239
/**
43-
* Set a fake page layout. Used when we test URL generation.
44-
* @param int $id assumed attempt id.
40+
* Create quiz and attempt data with layout.
41+
*
4542
* @param string $layout layout to set. Like quiz attempt.layout. E.g. '1,2,0,3,4,0,'.
46-
* @param array $infos slot numbers which contain 'descriptions', or other non-questions.
47-
* @return quiz_attempt attempt object for use in unit tests.
43+
* @return quiz_attempt the new quiz_attempt object
4844
*/
49-
public static function setup_fake_attempt_layout($id, $layout, $infos = array()) {
50-
$attempt = new stdClass();
51-
$attempt->id = $id;
52-
$attempt->layout = $layout;
45+
protected function create_quiz_and_attempt_with_layout($layout) {
46+
$this->resetAfterTest(true);
47+
48+
// Make a user to do the quiz.
49+
$user = $this->getDataGenerator()->create_user();
50+
$course = $this->getDataGenerator()->create_course();
51+
// Make a quiz.
52+
$quizgenerator = $this->getDataGenerator()->get_plugin_generator('mod_quiz');
53+
$quiz = $quizgenerator->create_instance(['course' => $course->id,
54+
'grade' => 100.0, 'sumgrades' => 2, 'layout' => $layout]);
5355

54-
$course = new stdClass();
55-
$quiz = new stdClass();
56-
$cm = new stdClass();
57-
$cm->id = 0;
56+
$quizobj = quiz::create($quiz->id, $user->id);
5857

59-
$attemptobj = new self($attempt, $quiz, $cm, $course, false);
6058

61-
$attemptobj->slots = array();
59+
$quba = question_engine::make_questions_usage_by_activity('mod_quiz', $quizobj->get_context());
60+
$quba->set_preferred_behaviour($quizobj->get_quiz()->preferredbehaviour);
61+
62+
$questiongenerator = $this->getDataGenerator()->get_plugin_generator('core_question');
63+
$cat = $questiongenerator->create_question_category();
64+
65+
$page = 1;
6266
foreach (explode(',', $layout) as $slot) {
6367
if ($slot == 0) {
68+
$page += 1;
6469
continue;
6570
}
66-
$attemptobj->slots[$slot] = new stdClass();
67-
$attemptobj->slots[$slot]->slot = $slot;
68-
$attemptobj->slots[$slot]->requireprevious = 0;
69-
$attemptobj->slots[$slot]->questionid = 0;
70-
}
71-
72-
$attemptobj->sections = array();
73-
$attemptobj->sections[0] = new stdClass();
74-
$attemptobj->sections[0]->heading = '';
75-
$attemptobj->sections[0]->firstslot = 1;
76-
$attemptobj->sections[0]->shufflequestions = 0;
7771

78-
$attemptobj->infos = $infos;
79-
$attemptobj->link_sections_and_slots();
80-
$attemptobj->determine_layout();
81-
$attemptobj->number_questions();
72+
$question = $questiongenerator->create_question('shortanswer', null, ['category' => $cat->id]);
73+
quiz_add_quiz_question($question->id, $quiz, $page);
74+
}
8275

83-
return $attemptobj;
84-
}
76+
$timenow = time();
77+
$attempt = quiz_create_attempt($quizobj, 1, false, $timenow, false, $user->id);
78+
quiz_start_new_attempt($quizobj, $quba, $attempt, 1, $timenow);
79+
quiz_attempt_save_started($quizobj, $quba, $attempt);
8580

86-
public function is_real_question($slot) {
87-
return !in_array($slot, $this->infos);
81+
return quiz_attempt::create($attempt->id);
8882
}
89-
}
9083

91-
92-
/**
93-
* Tests for the quiz_attempt class.
94-
*
95-
* @copyright 2014 Tim Hunt
96-
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
97-
*/
98-
class mod_quiz_attempt_testcase extends advanced_testcase {
9984
/**
10085
* Test the functions quiz_update_open_attempts() and get_list_of_overdue_attempts()
10186
*/
10287
public function test_attempt_url() {
103-
$attempt = mod_quiz_attempt_testable::setup_fake_attempt_layout(
104-
123, '1,2,0,3,4,0,5,6,0');
88+
$attempt = $this->create_quiz_and_attempt_with_layout('1,2,0,3,4,0,5,6,0');
89+
$attemptid = $attempt->get_attempt()->id;
90+
$cmid = $attempt->get_cmid();
10591

106-
// Attempt pages.
10792
$this->assertEquals(new moodle_url(
108-
'/mod/quiz/attempt.php?attempt=123&cmid=0'),
109-
$attempt->attempt_url());
110-
111-
$this->assertEquals(new moodle_url(
112-
'/mod/quiz/attempt.php?attempt=123&page=2&cmid=0'),
93+
'/mod/quiz/attempt.php?attempt=' . $attemptid . '&page=2&cmid=' . $cmid),
11394
$attempt->attempt_url(null, 2));
11495

11596
$this->assertEquals(new moodle_url(
116-
'/mod/quiz/attempt.php?attempt=123&page=1&cmid=0#'),
97+
'/mod/quiz/attempt.php?attempt=' . $attemptid . '&page=1&cmid=' . $cmid . '#'),
11798
$attempt->attempt_url(3));
11899

100+
$questionattempt = $attempt->get_question_attempt(4);
101+
$expecteanchor = '#' . $questionattempt->get_outer_question_div_unique_id();
119102
$this->assertEquals(new moodle_url(
120-
'/mod/quiz/attempt.php?attempt=123&page=1&cmid=0#q4'),
103+
'/mod/quiz/attempt.php?attempt=' . $attemptid . '&page=1&cmid=' . $cmid . $expecteanchor),
121104
$attempt->attempt_url(4));
122105

123106
$this->assertEquals(new moodle_url(
@@ -128,82 +111,80 @@ public function test_attempt_url() {
128111
'#'),
129112
$attempt->attempt_url(3, -1, 1));
130113

131-
$this->assertEquals(new moodle_url(
132-
'#q4'),
133-
$attempt->attempt_url(4, -1, 1));
114+
$questionattempt = $attempt->get_question_attempt(4);
115+
$expecteanchor = '#' . $questionattempt->get_outer_question_div_unique_id();
116+
$this->assertEquals(new moodle_url($expecteanchor), $attempt->attempt_url(4, -1, 1));
134117

135118
// Summary page.
136119
$this->assertEquals(new moodle_url(
137-
'/mod/quiz/summary.php?attempt=123&cmid=0'),
120+
'/mod/quiz/summary.php?attempt=' . $attemptid . '&cmid=' . $cmid),
138121
$attempt->summary_url());
139122

140123
// Review page.
141124
$this->assertEquals(new moodle_url(
142-
'/mod/quiz/review.php?attempt=123&cmid=0'),
125+
'/mod/quiz/review.php?attempt=' . $attemptid . '&cmid=' . $cmid),
143126
$attempt->review_url());
144127

145128
$this->assertEquals(new moodle_url(
146-
'/mod/quiz/review.php?attempt=123&page=2&cmid=0'),
129+
'/mod/quiz/review.php?attempt=' . $attemptid . '&page=2&cmid=' . $cmid),
147130
$attempt->review_url(null, 2));
148131

149132
$this->assertEquals(new moodle_url(
150-
'/mod/quiz/review.php?attempt=123&page=1&cmid=0'),
133+
'/mod/quiz/review.php?attempt=' . $attemptid . '&page=1&cmid=' . $cmid),
151134
$attempt->review_url(3, -1, false));
152135

153136
$this->assertEquals(new moodle_url(
154-
'/mod/quiz/review.php?attempt=123&page=1&cmid=0#q4'),
137+
'/mod/quiz/review.php?attempt=' . $attemptid . '&page=1&cmid=' . $cmid . $expecteanchor),
155138
$attempt->review_url(4, -1, false));
156139

157140
$this->assertEquals(new moodle_url(
158-
'/mod/quiz/review.php?attempt=123&cmid=0'),
141+
'/mod/quiz/review.php?attempt=' . $attemptid . '&cmid=' . $cmid),
159142
$attempt->review_url(null, 2, true));
160143

161144
$this->assertEquals(new moodle_url(
162-
'/mod/quiz/review.php?attempt=123&cmid=0'),
145+
'/mod/quiz/review.php?attempt=' . $attemptid . '&cmid=' . $cmid),
163146
$attempt->review_url(1, -1, true));
164147

165148
$this->assertEquals(new moodle_url(
166-
'/mod/quiz/review.php?attempt=123&page=2&cmid=0'),
149+
'/mod/quiz/review.php?attempt=' . $attemptid . '&page=2&cmid=' . $cmid),
167150
$attempt->review_url(null, 2, false));
168151

169152
$this->assertEquals(new moodle_url(
170-
'/mod/quiz/review.php?attempt=123&showall=0&cmid=0'),
153+
'/mod/quiz/review.php?attempt=' . $attemptid . '&showall=0&cmid=' . $cmid),
171154
$attempt->review_url(null, 0, false));
172155

173156
$this->assertEquals(new moodle_url(
174-
'/mod/quiz/review.php?attempt=123&showall=0&cmid=0'),
157+
'/mod/quiz/review.php?attempt=' . $attemptid . '&showall=0&cmid=' . $cmid),
175158
$attempt->review_url(1, -1, false));
176159

177160
$this->assertEquals(new moodle_url(
178-
'/mod/quiz/review.php?attempt=123&page=1&cmid=0'),
161+
'/mod/quiz/review.php?attempt=' . $attemptid . '&page=1&cmid=' . $cmid),
179162
$attempt->review_url(3, -1, false));
180163

181164
$this->assertEquals(new moodle_url(
182-
'/mod/quiz/review.php?attempt=123&page=2&cmid=0'),
165+
'/mod/quiz/review.php?attempt=' . $attemptid . '&page=2&cmid=' . $cmid),
183166
$attempt->review_url(null, 2));
184167

185-
$this->assertEquals(new moodle_url(
186-
'#'),
187-
$attempt->review_url(null, -1, null, 0));
168+
$this->assertEquals(new moodle_url('#'), $attempt->review_url(null, -1, null, 0));
188169

189-
$this->assertEquals(new moodle_url(
190-
'#q3'),
191-
$attempt->review_url(3, -1, null, 0));
192170

193-
$this->assertEquals(new moodle_url(
194-
'#q4'),
195-
$attempt->review_url(4, -1, null, 0));
171+
$questionattempt = $attempt->get_question_attempt(3);
172+
$expecteanchor = '#' . $questionattempt->get_outer_question_div_unique_id();
173+
$this->assertEquals(new moodle_url($expecteanchor), $attempt->review_url(3, -1, null, 0));
196174

197-
$this->assertEquals(new moodle_url(
198-
'#'),
175+
$questionattempt = $attempt->get_question_attempt(4);
176+
$expecteanchor = '#' . $questionattempt->get_outer_question_div_unique_id();
177+
$this->assertEquals(new moodle_url( $expecteanchor), $attempt->review_url(4, -1, null, 0));
178+
179+
$this->assertEquals(new moodle_url('#'),
199180
$attempt->review_url(null, 2, true, 0));
200181

201182
$this->assertEquals(new moodle_url(
202183
'#'),
203184
$attempt->review_url(1, -1, true, 0));
204185

205186
$this->assertEquals(new moodle_url(
206-
'/mod/quiz/review.php?attempt=123&page=2&cmid=0'),
187+
'/mod/quiz/review.php?attempt=' . $attemptid . '&page=2&cmid=' . $cmid),
207188
$attempt->review_url(null, 2, false, 0));
208189

209190
$this->assertEquals(new moodle_url(
@@ -215,70 +196,75 @@ public function test_attempt_url() {
215196
$attempt->review_url(1, -1, false, 0));
216197

217198
$this->assertEquals(new moodle_url(
218-
'/mod/quiz/review.php?attempt=123&page=1&cmid=0#'),
199+
'/mod/quiz/review.php?attempt=' . $attemptid . '&page=1&cmid=' . $cmid),
219200
$attempt->review_url(3, -1, false, 0));
220201

221-
// Review with more than 50 questions in the quiz.
222-
$attempt = mod_quiz_attempt_testable::setup_fake_attempt_layout(
223-
124, '1,2,3,4,5,6,7,8,9,10,0,11,12,13,14,15,16,17,18,19,20,0,' .
224-
'21,22,23,24,25,26,27,28,29,30,0,31,32,33,34,35,36,37,38,39,40,0,' .
225-
'41,42,43,44,45,46,47,48,49,50,0,51,52,53,54,55,56,57,58,59,60,0');
202+
// Setup another attempt.
203+
$attempt = $this->create_quiz_and_attempt_with_layout(
204+
'1,2,3,4,5,6,7,8,9,10,0,11,12,13,14,15,16,17,18,19,20,0,' .
205+
'21,22,23,24,25,26,27,28,29,30,0,31,32,33,34,35,36,37,38,39,40,0,' .
206+
'41,42,43,44,45,46,47,48,49,50,0,51,52,53,54,55,56,57,58,59,60,0');
207+
$attemptid = $attempt->get_attempt()->id;
208+
$cmid = $attempt->get_cmid();
226209

227210
$this->assertEquals(new moodle_url(
228-
'/mod/quiz/review.php?attempt=124&cmid=0'),
211+
'/mod/quiz/review.php?attempt=' . $attemptid . '&cmid=' . $cmid),
229212
$attempt->review_url());
230213

231214
$this->assertEquals(new moodle_url(
232-
'/mod/quiz/review.php?attempt=124&page=2&cmid=0'),
215+
'/mod/quiz/review.php?attempt=' . $attemptid . '&page=2&cmid=' . $cmid),
233216
$attempt->review_url(null, 2));
234217

235218
$this->assertEquals(new moodle_url(
236-
'/mod/quiz/review.php?attempt=124&page=1&cmid=0'),
219+
'/mod/quiz/review.php?attempt=' . $attemptid . '&page=1&cmid=' . $cmid . '#'),
237220
$attempt->review_url(11, -1, false));
238221

222+
223+
$questionattempt = $attempt->get_question_attempt(12);
224+
$expecteanchor = '#' . $questionattempt->get_outer_question_div_unique_id();
239225
$this->assertEquals(new moodle_url(
240-
'/mod/quiz/review.php?attempt=124&page=1&cmid=0#q12'),
226+
'/mod/quiz/review.php?attempt=' . $attemptid . '&page=1&cmid=' . $cmid . $expecteanchor),
241227
$attempt->review_url(12, -1, false));
242228

243229
$this->assertEquals(new moodle_url(
244-
'/mod/quiz/review.php?attempt=124&showall=1&cmid=0'),
230+
'/mod/quiz/review.php?attempt=' . $attemptid . '&showall=1&cmid=' . $cmid),
245231
$attempt->review_url(null, 2, true));
246232

247233
$this->assertEquals(new moodle_url(
248-
'/mod/quiz/review.php?attempt=124&showall=1&cmid=0'),
234+
'/mod/quiz/review.php?attempt=' . $attemptid . '&showall=1&cmid=' . $cmid),
249235
$attempt->review_url(1, -1, true));
250236

251237
$this->assertEquals(new moodle_url(
252-
'/mod/quiz/review.php?attempt=124&page=2&cmid=0'),
238+
'/mod/quiz/review.php?attempt=' . $attemptid . '&page=2&cmid=' . $cmid),
253239
$attempt->review_url(null, 2, false));
254240

255241
$this->assertEquals(new moodle_url(
256-
'/mod/quiz/review.php?attempt=124&cmid=0'),
242+
'/mod/quiz/review.php?attempt=' . $attemptid . '&cmid=' . $cmid),
257243
$attempt->review_url(null, 0, false));
258244

259245
$this->assertEquals(new moodle_url(
260-
'/mod/quiz/review.php?attempt=124&page=1&cmid=0'),
246+
'/mod/quiz/review.php?attempt=' . $attemptid . '&page=1&cmid=' . $cmid),
261247
$attempt->review_url(11, -1, false));
262248

263249
$this->assertEquals(new moodle_url(
264-
'/mod/quiz/review.php?attempt=124&page=1&cmid=0#q12'),
250+
'/mod/quiz/review.php?attempt=' . $attemptid . '&page=1&cmid=' . $cmid . $expecteanchor),
265251
$attempt->review_url(12, -1, false));
266252

267253
$this->assertEquals(new moodle_url(
268-
'/mod/quiz/review.php?attempt=124&page=2&cmid=0'),
254+
'/mod/quiz/review.php?attempt=' . $attemptid . '&page=2&cmid=' . $cmid),
269255
$attempt->review_url(null, 2));
270256

271257
$this->assertEquals(new moodle_url(
272258
'#'),
273259
$attempt->review_url(null, -1, null, 0));
274260

275-
$this->assertEquals(new moodle_url(
276-
'#q3'),
277-
$attempt->review_url(3, -1, null, 0));
261+
$questionattempt = $attempt->get_question_attempt(3);
262+
$expecteanchor = '#' . $questionattempt->get_outer_question_div_unique_id();
263+
$this->assertEquals(new moodle_url($expecteanchor), $attempt->review_url(3, -1, null, 0));
278264

279-
$this->assertEquals(new moodle_url(
280-
'#q4'),
281-
$attempt->review_url(4, -1, null, 0));
265+
$questionattempt = $attempt->get_question_attempt(4);
266+
$expecteanchor = '#' . $questionattempt->get_outer_question_div_unique_id();
267+
$this->assertEquals(new moodle_url($expecteanchor), $attempt->review_url(4, -1, null, 0));
282268

283269
$this->assertEquals(new moodle_url(
284270
'#'),
@@ -289,7 +275,7 @@ public function test_attempt_url() {
289275
$attempt->review_url(1, -1, true, 0));
290276

291277
$this->assertEquals(new moodle_url(
292-
'/mod/quiz/review.php?attempt=124&page=2&cmid=0'),
278+
'/mod/quiz/review.php?attempt=' . $attemptid . '&page=2&cmid=' . $cmid),
293279
$attempt->review_url(null, 2, false, 0));
294280

295281
$this->assertEquals(new moodle_url(
@@ -301,7 +287,7 @@ public function test_attempt_url() {
301287
$attempt->review_url(1, -1, false, 0));
302288

303289
$this->assertEquals(new moodle_url(
304-
'/mod/quiz/review.php?attempt=124&page=1&cmid=0#'),
290+
'/mod/quiz/review.php?attempt=' . $attemptid . '&page=1&cmid=' . $cmid . '#'),
305291
$attempt->review_url(11, -1, false, 0));
306292
}
307293

@@ -339,4 +325,4 @@ public function test_is_participant() {
339325
$this->assertEquals(true, $quizobj->is_participant($USER->id),
340326
'Admin is enrolled, suspended and can participate');
341327
}
342-
}
328+
}

0 commit comments

Comments
 (0)