View source
<?php
class CourseObjectAccessTestCase extends CourseTestCase {
public static function getInfo() {
return array(
'name' => 'Course object access',
'description' => 'Ensure that Course object access functions properly.',
'group' => 'Course',
);
}
function testCourseObjectLinearWorkflow() {
$courseNode = $this
->createCourseNode();
for ($i = 1; $i <= 4; $i++) {
$temp = $this
->createCourseObject($courseNode);
$temp
->setOption('weight', $i)
->save();
}
$user = $this->student_user;
$course = course_get_course($courseNode);
$co = array_values($course
->getObjects());
$this
->assertFalse($co[0]
->access('take', $user), 'Check that object 1 is not accessible.');
$this
->assertFalse($co[1]
->access('take', $user), 'Check that object 2 is not accessible.');
$this
->assertFalse($co[2]
->access('take', $user), 'Check that object 3 is not accessible.');
$this
->assertFalse($co[3]
->access('take', $user), 'Check that object 4 is not accessible.');
course_enroll($courseNode, $user);
$this
->assertTrue($co[0]
->access('take', $user), 'Check that object 1 is accessible after enrollment.');
$this
->assertFalse($co[1]
->access('take', $user), 'Check that object 2 is not accessible.');
$this
->assertFalse($co[2]
->access('take', $user), 'Check that object 3 is not accessible.');
$this
->assertFalse($co[3]
->access('take', $user), 'Check that object 4 is not accessible.');
$co[0]
->getFulfillment($user)
->setComplete(1)
->save();
$this
->assertTrue($co[1]
->access('take', $user), 'Check that object 2 is accessible after object 1 is complete.');
$this
->assertFalse($co[2]
->access('take', $user), 'Check that object 3 is not accessible after object 1 is complete.');
$this
->assertFalse($co[3]
->access('take', $user), 'Check that object 4 is not accessible after object 1 is complete.');
$co[1]
->getFulfillment($user)
->setComplete(1)
->save();
$co[2]
->getFulfillment($user)
->setComplete(1)
->save();
$co[3]
->getFulfillment($user)
->setComplete(1)
->save();
$this
->assertTrue($course
->getTracker($user)
->getOption('complete'), 'Check that course is complete.');
}
function testCourseObjectOptionalWorkflow() {
$courseNode = $this
->createCourseNode();
for ($i = 1; $i <= 4; $i++) {
$temp = $this
->createCourseObject($courseNode);
$temp
->setOption('weight', $i)
->save();
}
$user = $this->student_user;
$course = course_get_course($courseNode);
$co = array_values($course
->getObjects());
course_enroll($courseNode, $user);
$co[0]
->setOption('required', 0);
$co[1]
->setOption('required', 1);
$co[2]
->setOption('required', 0);
$co[3]
->setOption('required', 0);
$this
->assertFalse($co[2]
->access('take', $user) || $co[3]
->access('take', $user), 'User is blocked by second required object to get to fourth optional object.');
$this
->assertTrue($co[0]
->access('take', $user), 'User has access to first optional object.');
$this
->assertTrue($co[1]
->access('take', $user), 'User has access to second required object.');
$co[1]
->getFulfillment($user)
->setComplete(1)
->save();
$this
->assertTrue($co[2]
->access('take', $user) && $co[3]
->access('take', $user), 'User granted access to remaining optional objects.');
}
function testCourseSkippableRequiredObjectsWorkflow() {
$courseNode = $this
->createCourseNode();
for ($i = 1; $i <= 4; $i++) {
$temp = $this
->createCourseObject($courseNode);
$temp
->setOption('weight', $i)
->save();
}
$user = $this->student_user;
$course = course_get_course($courseNode);
$co = array_values($course
->getObjects());
course_enroll($courseNode, $user);
$co[0]
->setOption('required', 1);
$co[1]
->setOption('required', 1);
$co[1]
->setOption('skippable', 1)
->save();
$co[2]
->setOption('required', 1);
$co[3]
->setOption('required', 1);
$this
->assertTrue($co[0]
->access('take', $user), 'User can access first object.');
$this
->assertFalse($co[1]
->access('take', $user), 'User is blocked from second object.');
$co[0]
->getFulfillment($user)
->setComplete(1)
->save();
$this
->assertTrue($co[1]
->access('take', $user), 'User can access second object.');
$this
->assertTrue($co[2]
->access('take', $user), 'User can access third object.');
$this
->assertFalse($co[3]
->access('take', $user), 'User is blocked from fourth object.');
$co[2]
->getFulfillment($user)
->setComplete(1)
->save();
$co[3]
->getFulfillment($user)
->setComplete(1)
->save();
$this
->assertFalse($course
->getTracker($user)
->getOption('complete'), 'Check that course is not complete.');
$co[1]
->getFulfillment($user)
->setComplete(1)
->save();
$this
->assertTrue($course
->getTracker($user)
->getOption('complete'), 'Check that course is complete.');
}
function testHiddenCourseObjects() {
$courseNode = $this
->createCourseNode();
$user = $this->student_user;
$this
->drupalLogin($user);
$o_optional = $this
->createCourseObject($courseNode);
$o_optional
->setOption('required', FALSE)
->save();
$o1 = $this
->createCourseObject($courseNode);
$o1
->setOption('required', TRUE)
->save();
$this
->assertTrue($o1
->access('see', $user));
$o1
->setOption('hidden', 1)
->save();
$this
->assertFalse($o1
->access('see', $user));
$this
->assertFalse($o1
->access('take', $user));
$this
->assertFalse($o1
->access('view', $user));
$this
->drupalGet("node/{$courseNode->nid}/takecourse");
$this
->drupalGet("node/{$courseNode->nid}/course-object/{$o_optional->coid}");
$this
->assertNoLink(t('Next'));
$this
->drupalGet("node/{$courseNode->nid}/course-object/{$o1->coid}");
$this
->assertResponse(403, t('Hidden object is not accessible.'));
$report = course_report_load($courseNode, $user);
$this
->assertFalse($report->complete);
}
function testDisabledCourseObjects() {
$courseNode = $this
->createCourseNode();
$user = $this->student_user;
$this
->drupalLogin($user);
$o_optional = $this
->createCourseObject($courseNode);
$o_optional
->setOption('required', FALSE)
->save();
$o1 = $this
->createCourseObject($courseNode);
$o1
->setOption('required', TRUE)
->save();
$this
->assertTrue($o1
->access('see', $user));
$o1
->setOption('enabled', 0)
->save();
$this
->assertFalse($o1
->access('see', $user));
$this
->assertFalse($o1
->access('view', $user));
$this
->assertFalse($o1
->access('take', $user));
$this
->drupalGet("node/{$courseNode->nid}/takecourse");
$this
->clickLink(t('Next'));
$this
->assertNoResponse(403, t('Did not get access denied.'));
$this
->drupalGet("node/{$courseNode->nid}/course-object/{$o1->coid}");
$this
->assertResponse(403, t('Disabled object is not accessible.'));
$report = course_report_load($courseNode, $user);
$this
->assertTrue($report->complete);
$o1
->setOption('weight', -100)
->save();
$this->student_user = $this
->drupalCreateUser(array(
'access content',
));
$this
->drupalLogin($this->student_user);
$this
->drupalGet("node/{$courseNode->nid}/takecourse");
$this
->drupalGet("node/{$courseNode->nid}/course-object/{$o1->coid}");
$this
->assertResponse(403, t('Disabled first object is not accessible.'));
$this
->drupalGet("node/{$courseNode->nid}/course-object/{$o_optional->coid}");
$this
->assertResponse(200, t('Second object is accessible.'));
}
}