/** * Test get_syncable_users method. */ public function test_get_syncable_users() { global $DB, $CFG; $timenow = time(); $edatagenerator = new \elis_program_datagenerator($DB); $mcourses = array('linked1' => $this->getDataGenerator()->create_course(), 'linked2' => $this->getDataGenerator()->create_course(), 'linkedmultiple1' => $this->getDataGenerator()->create_course(), 'notlinked1' => $this->getDataGenerator()->create_course(), 'notlinked2' => $this->getDataGenerator()->create_course()); $ecourses = array(0 => $edatagenerator->create_course(array('completion_grade' => 50, 'credits' => 12)), 'linkedmultiple1_2' => $edatagenerator->create_course(array('completion_grade' => 51, 'credits' => 13)), 'linkedmultiple3' => $edatagenerator->create_course(array('completion_grade' => 52, 'credits' => 14))); $eclasses = array('linked1' => $edatagenerator->create_pmclass(array('courseid' => $ecourses[0]->id)), 'linked2' => $edatagenerator->create_pmclass(array('courseid' => $ecourses[0]->id)), 'linkedmultiple1' => $edatagenerator->create_pmclass(array('courseid' => $ecourses['linkedmultiple1_2']->id)), 'linkedmultiple2' => $edatagenerator->create_pmclass(array('courseid' => $ecourses['linkedmultiple1_2']->id)), 'linkedmultiple3' => $edatagenerator->create_pmclass(array('courseid' => $ecourses['linkedmultiple3']->id))); $classmoodlecourses = array($edatagenerator->assign_pmclass_to_moodlecourse($eclasses['linked1']->id, $mcourses['linked1']->id), $edatagenerator->assign_pmclass_to_moodlecourse($eclasses['linked2']->id, $mcourses['linked2']->id), $edatagenerator->assign_pmclass_to_moodlecourse($eclasses['linkedmultiple1']->id, $mcourses['linkedmultiple1']->id), $edatagenerator->assign_pmclass_to_moodlecourse($eclasses['linkedmultiple2']->id, $mcourses['linkedmultiple1']->id), $edatagenerator->assign_pmclass_to_moodlecourse($eclasses['linkedmultiple3']->id, $mcourses['linkedmultiple1']->id)); // Create users in different setups. $cases = array(); for ($i = 0; $i <= 7; $i++) { // Holds data for each case so we can use it later for assertions. $case = array(); $case['muser'] = $this->getDataGenerator()->create_user(array('username' => 'testuser' . $i, 'idnumber' => 'testuser' . $i)); switch ($i) { case 0: // User w/ no student entry. // We should get one entry for this user that does not include the ELIS student information. $case['cuser'] = $edatagenerator->create_user((array) $case['muser']); $case['usermoodle'] = $edatagenerator->assign_euser_to_muser($case['cuser']->id, $case['muser']->id, $case['cuser']->idnumber); $case['mcourse'][] = $mcourses['linked1']; $case['pmcourse'] = $ecourses[0]; $case['pmclass'][] = $eclasses['linked1']; $mcrsctx = \context_course::instance($case['mcourse'][0]->id); $gbookroles = explode(',', $CFG->gradebookroles); $case['roleassignment'] = $DB->insert_record('role_assignments', array('roleid' => $gbookroles[0], 'contextid' => $mcrsctx->id, 'userid' => $case['muser']->id)); break; case 1: // User w/ student entry. // We should get one entry for this user that includes the ELIS student information. $case['cuser'] = $edatagenerator->create_user((array) $case['muser']); $case['usermoodle'] = $edatagenerator->assign_euser_to_muser($case['cuser']->id, $case['muser']->id, $case['cuser']->idnumber); $case['mcourse'][] = $mcourses['linked1']; $case['pmcourse'] = $ecourses[0]; $case['pmclass'][] = $eclasses['linked1']; $mcrsctx = \context_course::instance($case['mcourse'][0]->id); $gbookroles = explode(',', $CFG->gradebookroles); $case['roleassignment'] = $DB->insert_record('role_assignments', array('roleid' => $gbookroles[0], 'contextid' => $mcrsctx->id, 'userid' => $case['muser']->id)); $case['student'] = new \student(array('classid' => $case['pmclass'][0]->id, 'userid' => $case['cuser']->id, 'enrolmenttime' => $timenow, 'completetime' => 0, 'endtime' => 0, 'completestatusid' => STUSTATUS_NOTCOMPLETE, 'grade' => 0, 'credits' => 12, 'locked' => 0)); $case['student']->save(); $case['student'] = $case['student']->to_object(); break; case 2: // User with multiple enrolments. // We should get two entries for this user. $case['cuser'] = $edatagenerator->create_user((array) $case['muser']); $case['usermoodle'] = $edatagenerator->assign_euser_to_muser($case['cuser']->id, $case['muser']->id, $case['cuser']->idnumber); $case['mcourse'][] = $mcourses['linked1']; $case['pmcourse'] = $ecourses[0]; $case['pmclass'][] = $eclasses['linked1']; $mcrsctx = \context_course::instance($case['mcourse'][0]->id); $gbookroles = explode(',', $CFG->gradebookroles); $case['roleassignment'] = $DB->insert_record('role_assignments', array('roleid' => $gbookroles[0], 'contextid' => $mcrsctx->id, 'userid' => $case['muser']->id)); $case['mcourse'][] = $mcourses['linked2']; $case['pmcourse'] = $ecourses[0]; $case['pmclass'][] = $eclasses['linked2']; $mcrsctx = \context_course::instance($case['mcourse'][1]->id); $gbookroles = explode(',', $CFG->gradebookroles); $case['roleassignment'] = $DB->insert_record('role_assignments', array('roleid' => $gbookroles[0], 'contextid' => $mcrsctx->id, 'userid' => $case['muser']->id)); break; case 3: // User with multiple enrolments (one with a student entry). // We should get two entries for this user, one with ELIS student information. $case['cuser'] = $edatagenerator->create_user((array) $case['muser']); $case['usermoodle'] = $edatagenerator->assign_euser_to_muser($case['cuser']->id, $case['muser']->id, $case['cuser']->idnumber); $case['mcourse'][] = $mcourses['linked1']; $case['pmcourse'] = $ecourses[0]; $case['pmclass'][] = $eclasses['linked1']; $mcrsctx = \context_course::instance($case['mcourse'][0]->id); $gbookroles = explode(',', $CFG->gradebookroles); $case['roleassignment'] = $DB->insert_record('role_assignments', array('roleid' => $gbookroles[0], 'contextid' => $mcrsctx->id, 'userid' => $case['muser']->id)); $case['mcourse'][] = $mcourses['linked2']; $case['pmcourse'] = $ecourses[0]; $case['pmclass'][] = $eclasses['linked2']; $mcrsctx = \context_course::instance($case['mcourse'][1]->id); $gbookroles = explode(',', $CFG->gradebookroles); $case['roleassignment'] = $DB->insert_record('role_assignments', array('roleid' => $gbookroles[0], 'contextid' => $mcrsctx->id, 'userid' => $case['muser']->id)); $case['student'] = new \student(array('classid' => $case['pmclass'][1]->id, 'userid' => $case['cuser']->id, 'enrolmenttime' => $timenow, 'completetime' => 0, 'endtime' => 0, 'completestatusid' => STUSTATUS_NOTCOMPLETE, 'grade' => 0, 'credits' => 5, 'locked' => 0)); $case['student']->save(); $case['student'] = $case['student']->to_object(); break; case 4: // User enroled in a moodle class that is linked to multiple elis classes. // The course this user is enroled in is linked to two ELIS classes that are part of one course, and another // elis class that is part of another course. // We should get three entries for this user (one for each linked ELIS class). $case['cuser'] = $edatagenerator->create_user((array) $case['muser']); $case['usermoodle'] = $edatagenerator->assign_euser_to_muser($case['cuser']->id, $case['muser']->id, $case['cuser']->idnumber); $case['mcourse'][] = $mcourses['linkedmultiple1']; $case['pmcourse'][] = $ecourses['linkedmultiple1_2']; $case['pmcourse'][] = $ecourses['linkedmultiple3']; $case['pmclass'][] = $eclasses['linkedmultiple1']; $case['pmclass'][] = $eclasses['linkedmultiple2']; $case['pmclass'][] = $eclasses['linkedmultiple3']; $mcrsctx = \context_course::instance($case['mcourse'][0]->id); $gbookroles = explode(',', $CFG->gradebookroles); $case['roleassignment'] = $DB->insert_record('role_assignments', array('roleid' => $gbookroles[0], 'contextid' => $mcrsctx->id, 'userid' => $case['muser']->id)); break; case 5: // Enroled in moodle course in non-gradebook role. // We should not get an entry for this user. $case['cuser'] = $edatagenerator->create_user((array) $case['muser']); $case['usermoodle'] = $edatagenerator->assign_euser_to_muser($case['cuser']->id, $case['muser']->id, $case['cuser']->idnumber); $case['mcourse'][] = $mcourses['linked1']; $case['pmcourse'] = $ecourses[0]; $case['pmclass'][] = $eclasses['linked1']; $mcrsctx = \context_course::instance($case['mcourse'][0]->id); $gbookroles = explode(',', $CFG->gradebookroles); $nongbookrole = max($gbookroles) + 1; $case['roleassignment'] = $DB->insert_record('role_assignments', array('roleid' => $nongbookrole, 'contextid' => $mcrsctx->id, 'userid' => $case['muser']->id)); break; case 6: // No connected ELIS user. // We should not get an entry for this user. $case['cuser'] = null; $case['usermoodle'] = null; $case['mcourse'][] = $mcourses['linked1']; $case['pmcourse'] = $ecourses[0]; $case['pmclass'][] = $eclasses['linked1']; $mcrsctx = \context_course::instance($case['mcourse'][0]->id); $gbookroles = explode(',', $CFG->gradebookroles); $case['roleassignment'] = $DB->insert_record('role_assignments', array('roleid' => $gbookroles[0], 'contextid' => $mcrsctx->id, 'userid' => $case['muser']->id)); break; case 7: // Course not connected to ELIS class. // We should not get an entry for this user. $case['cuser'] = $edatagenerator->create_user((array) $case['muser']); $case['usermoodle'] = $edatagenerator->assign_euser_to_muser($case['cuser']->id, $case['muser']->id, $case['cuser']->idnumber); $case['mcourse'][] = $mcourses['notlinked1']; $case['pmcourse'] = null; $case['pmclass'] = array(); $mcrsctx = \context_course::instance($case['mcourse'][0]->id); $gbookroles = explode(',', $CFG->gradebookroles); $case['roleassignment'] = $DB->insert_record('role_assignments', array('roleid' => $gbookroles[0], 'contextid' => $mcrsctx->id, 'userid' => $case['muser']->id)); break; } $cases[$i] = $case; } $sync = new \local_elisprogram\moodle\synchronize(); $rs = $sync->get_syncable_users(); // Convert rs to array to better assert results. $syncableusers = array(); foreach ($rs as $i => $rec) { $syncableusers[$rec->muid . '_' . $rec->moodlecourseid . '_' . $rec->pmclassid] = $rec; } ksort($syncableusers); $expectedresult = array($cases[0]['muser']->id . '_' . $cases[0]['mcourse'][0]->id . '_' . $cases[0]['pmclass'][0]->id => (object) array('muid' => (string) $cases[0]['muser']->id, 'username' => (string) $cases[0]['muser']->username, 'cmid' => (string) $cases[0]['cuser']->id, 'moodlecourseid' => (string) $cases[0]['mcourse'][0]->id, 'pmclassid' => (string) $cases[0]['pmclass'][0]->id, 'pmcourseid' => (string) $cases[0]['pmcourse']->id, 'pmcoursecompletiongrade' => (string) $cases[0]['pmcourse']->completion_grade, 'pmcoursecredits' => (string) $cases[0]['pmcourse']->credits, 'id' => null, 'classid' => null, 'userid' => null, 'enrolmenttime' => null, 'completetime' => null, 'endtime' => null, 'completestatusid' => null, 'grade' => null, 'credits' => null, 'locked' => null), $cases[1]['muser']->id . '_' . $cases[1]['mcourse'][0]->id . '_' . $cases[1]['pmclass'][0]->id => (object) array('muid' => (string) $cases[1]['muser']->id, 'username' => (string) $cases[1]['muser']->username, 'cmid' => (string) $cases[1]['cuser']->id, 'moodlecourseid' => (string) $cases[1]['mcourse'][0]->id, 'pmclassid' => (string) $cases[1]['pmclass'][0]->id, 'pmcourseid' => (string) $cases[1]['pmcourse']->id, 'pmcoursecompletiongrade' => (string) $cases[1]['pmcourse']->completion_grade, 'pmcoursecredits' => (string) $cases[1]['pmcourse']->credits, 'id' => (string) $cases[1]['student']->id, 'classid' => (string) $cases[1]['student']->classid, 'userid' => (string) $cases[1]['student']->userid, 'enrolmenttime' => (string) $cases[1]['student']->enrolmenttime, 'completetime' => (string) $cases[1]['student']->completetime, 'endtime' => (string) $cases[1]['student']->endtime, 'completestatusid' => (string) $cases[1]['student']->completestatusid, 'grade' => (string) $cases[1]['student']->grade, 'credits' => (string) $cases[1]['student']->credits, 'locked' => (string) $cases[1]['student']->locked), $cases[2]['muser']->id . '_' . $cases[2]['mcourse'][0]->id . '_' . $cases[2]['pmclass'][0]->id => (object) array('muid' => (string) $cases[2]['muser']->id, 'username' => (string) $cases[2]['muser']->username, 'cmid' => (string) $cases[2]['cuser']->id, 'moodlecourseid' => (string) $cases[2]['mcourse'][0]->id, 'pmclassid' => (string) $cases[2]['pmclass'][0]->id, 'pmcourseid' => (string) $cases[2]['pmcourse']->id, 'pmcoursecompletiongrade' => (string) $cases[2]['pmcourse']->completion_grade, 'pmcoursecredits' => (string) $cases[2]['pmcourse']->credits, 'id' => null, 'classid' => null, 'userid' => null, 'enrolmenttime' => null, 'completetime' => null, 'endtime' => null, 'completestatusid' => null, 'grade' => null, 'credits' => null, 'locked' => null), $cases[2]['muser']->id . '_' . $cases[2]['mcourse'][1]->id . '_' . $cases[2]['pmclass'][1]->id => (object) array('muid' => (string) $cases[2]['muser']->id, 'username' => (string) $cases[2]['muser']->username, 'cmid' => (string) $cases[2]['cuser']->id, 'moodlecourseid' => (string) $cases[2]['mcourse'][1]->id, 'pmclassid' => (string) $cases[2]['pmclass'][1]->id, 'pmcourseid' => (string) $cases[2]['pmcourse']->id, 'pmcoursecompletiongrade' => (string) $cases[2]['pmcourse']->completion_grade, 'pmcoursecredits' => (string) $cases[2]['pmcourse']->credits, 'id' => null, 'classid' => null, 'userid' => null, 'enrolmenttime' => null, 'completetime' => null, 'endtime' => null, 'completestatusid' => null, 'grade' => null, 'credits' => null, 'locked' => null), $cases[3]['muser']->id . '_' . $cases[3]['mcourse'][0]->id . '_' . $cases[3]['pmclass'][0]->id => (object) array('muid' => (string) $cases[3]['muser']->id, 'username' => (string) $cases[3]['muser']->username, 'cmid' => (string) $cases[3]['cuser']->id, 'moodlecourseid' => (string) $cases[3]['mcourse'][0]->id, 'pmclassid' => (string) $cases[3]['pmclass'][0]->id, 'pmcourseid' => (string) $cases[3]['pmcourse']->id, 'pmcoursecompletiongrade' => (string) $cases[3]['pmcourse']->completion_grade, 'pmcoursecredits' => (string) $cases[3]['pmcourse']->credits, 'id' => null, 'classid' => null, 'userid' => null, 'enrolmenttime' => null, 'completetime' => null, 'endtime' => null, 'completestatusid' => null, 'grade' => null, 'credits' => null, 'locked' => null), $cases[3]['muser']->id . '_' . $cases[3]['mcourse'][1]->id . '_' . $cases[3]['pmclass'][1]->id => (object) array('muid' => (string) $cases[3]['muser']->id, 'username' => (string) $cases[3]['muser']->username, 'cmid' => (string) $cases[3]['cuser']->id, 'moodlecourseid' => (string) $cases[3]['mcourse'][1]->id, 'pmclassid' => (string) $cases[3]['pmclass'][1]->id, 'pmcourseid' => (string) $cases[3]['pmcourse']->id, 'pmcoursecompletiongrade' => (string) $cases[3]['pmcourse']->completion_grade, 'pmcoursecredits' => (string) $cases[3]['pmcourse']->credits, 'id' => (string) $cases[3]['student']->id, 'classid' => (string) $cases[3]['student']->classid, 'userid' => (string) $cases[3]['student']->userid, 'enrolmenttime' => (string) $cases[3]['student']->enrolmenttime, 'completetime' => (string) $cases[3]['student']->completetime, 'endtime' => (string) $cases[3]['student']->endtime, 'completestatusid' => (string) $cases[3]['student']->completestatusid, 'grade' => (string) $cases[3]['student']->grade, 'credits' => (string) $cases[3]['student']->credits, 'locked' => (string) $cases[3]['student']->locked), $cases[4]['muser']->id . '_' . $cases[4]['mcourse'][0]->id . '_' . $cases[4]['pmclass'][0]->id => (object) array('muid' => (string) $cases[4]['muser']->id, 'username' => (string) $cases[4]['muser']->username, 'cmid' => (string) $cases[4]['cuser']->id, 'moodlecourseid' => (string) $cases[4]['mcourse'][0]->id, 'pmclassid' => (string) $cases[4]['pmclass'][0]->id, 'pmcourseid' => (string) $cases[4]['pmcourse'][0]->id, 'pmcoursecompletiongrade' => (string) $cases[4]['pmcourse'][0]->completion_grade, 'pmcoursecredits' => (string) $cases[4]['pmcourse'][0]->credits, 'id' => null, 'classid' => null, 'userid' => null, 'enrolmenttime' => null, 'completetime' => null, 'endtime' => null, 'completestatusid' => null, 'grade' => null, 'credits' => null, 'locked' => null), $cases[4]['muser']->id . '_' . $cases[4]['mcourse'][0]->id . '_' . $cases[4]['pmclass'][1]->id => (object) array('muid' => (string) $cases[4]['muser']->id, 'username' => (string) $cases[4]['muser']->username, 'cmid' => (string) $cases[4]['cuser']->id, 'moodlecourseid' => (string) $cases[4]['mcourse'][0]->id, 'pmclassid' => (string) $cases[4]['pmclass'][1]->id, 'pmcourseid' => (string) $cases[4]['pmcourse'][0]->id, 'pmcoursecompletiongrade' => (string) $cases[4]['pmcourse'][0]->completion_grade, 'pmcoursecredits' => (string) $cases[4]['pmcourse'][0]->credits, 'id' => null, 'classid' => null, 'userid' => null, 'enrolmenttime' => null, 'completetime' => null, 'endtime' => null, 'completestatusid' => null, 'grade' => null, 'credits' => null, 'locked' => null), $cases[4]['muser']->id . '_' . $cases[4]['mcourse'][0]->id . '_' . $cases[4]['pmclass'][2]->id => (object) array('muid' => (string) $cases[4]['muser']->id, 'username' => (string) $cases[4]['muser']->username, 'cmid' => (string) $cases[4]['cuser']->id, 'moodlecourseid' => (string) $cases[4]['mcourse'][0]->id, 'pmclassid' => (string) $cases[4]['pmclass'][2]->id, 'pmcourseid' => (string) $cases[4]['pmcourse'][1]->id, 'pmcoursecompletiongrade' => (string) $cases[4]['pmcourse'][1]->completion_grade, 'pmcoursecredits' => (string) $cases[4]['pmcourse'][1]->credits, 'id' => null, 'classid' => null, 'userid' => null, 'enrolmenttime' => null, 'completetime' => null, 'endtime' => null, 'completestatusid' => null, 'grade' => null, 'credits' => null, 'locked' => null)); $this->assertNotEmpty($syncableusers); $this->assertEquals(count($syncableusers), count($expectedresult)); $this->assertEquals(array_keys($syncableusers), array_keys($expectedresult)); foreach ($expectedresult as $k => $v) { $this->assertArrayHasKey($k, $syncableusers); $this->assertEquals($v, $syncableusers[$k], $k . ' not equal'); } // Test individual user fetching. foreach ($cases as $i => $case) { $sync = new \local_elisprogram\moodle\synchronize(); $rs = $sync->get_syncable_users($case['muser']->id); if ($i <= 4) { // These users must return something. $this->assertTrue($rs->valid()); foreach ($rs as $i => $rec) { $k = $rec->muid . '_' . $rec->moodlecourseid . '_' . $rec->pmclassid; $this->assertArrayHasKey($k, $expectedresult); $this->assertEquals($expectedresult[$k], $rec); } } else { // These users must not return anything. $this->assertEmpty($rs); } } }