/** * Helper function that runs the user import for a sample enrolment * * @param array $data Import data to use */ private function run_enrolment_import($data) { global $CFG; $file = get_plugin_directory('dhimport', 'version1elis') . '/version1elis.class.php'; require_once $file; $provider = new rlipimport_version1elis_importprovider_mockenrolment($data); $importplugin = new rlip_importplugin_version1elis($provider); $importplugin->run(); }
/** * Validate that the new date format works as expected * @param string $instr input date/time * @param bool $oldformats whether it supports old formats * @param bool $inctime whether it supports additional time info * @param int $minyear the minimum year allowed * @param int $maxyear the maximum year allowed * @param mixed $expected the expected output from parse_date() method given the above parameters * @dataProvider pddataprovider */ public function test_version1elisparsedate($instr, $oldformats, $inctime, $minyear, $maxyear, $expected) { if (is_array($expected)) { $expected = call_user_func_array('rlip_timestamp', $expected); } $plugin = new rlip_importplugin_version1elis(); $timestamp = $plugin->parse_date($instr, $oldformats, $inctime, $minyear, $maxyear); $this->assertEquals($expected, $timestamp); }
/** * Helper function that runs the userset import for a sample userset * * @param array $extradata Extra fields to set for the new userset * @param boolean $usedefaultdata If true, use the default userset data, * along with any data specifically provided */ private function run_core_userset_import($extradata, $usedefaultdata = true) { global $CFG; $file = get_plugin_directory('dhimport', 'version1elis') . '/version1elis.class.php'; require_once $file; if ($usedefaultdata) { $data = $this->get_core_userset_data(); } else { $data = array(); } foreach ($extradata as $key => $value) { $data[$key] = $value; } $provider = new rlipimport_version1elis_importprovider_mockuserset($data); $importplugin = new rlip_importplugin_version1elis($provider); $importplugin->run(); }
/** * Helper function that runs the user import for a sample user * * @param array $data Import data to use */ private function run_user_import($data, $usedefaultdata = true) { global $CFG; $file = get_plugin_directory('dhimport', 'version1elis') . '/version1elis.class.php'; require_once $file; $provider = new rlipimport_version1elis_importprovider_mockuser($data); $importplugin = new rlip_importplugin_version1elis($provider); $importplugin->run(); }
/** * User import test cases * * @uses $DB * @dataProvider dataproviderfortests */ public function test_elis_user_import($action, $userdata, $setupindex, $elisexists, $mdlexists) { global $CFG, $DB; $file = get_plugin_directory('dhimport', 'version1elis') . '/version1elis.class.php'; require_once $file; $CFG->siteguest = ''; $importdata = array('action' => $action); foreach ($userdata as $key => $value) { $importdata[$key] = $value; } try { if ($setupindex != NO_TEST_SETUP) { $provider = new rlipimport_version1elis_importprovider_mockuser($this->testsetupdata[$setupindex]); $importplugin = new rlip_importplugin_version1elis($provider); @$importplugin->run(); } $mdluserdata = $this->map_moodle_user($userdata); ob_start(); var_dump($mdluserdata); $mdluserdatadump = ob_get_contents(); ob_end_clean(); $mdluserid = $DB->get_field('user', 'id', $mdluserdata); $provider = new rlipimport_version1elis_importprovider_mockuser($importdata); $importplugin = new rlip_importplugin_version1elis($provider); @$importplugin->run(); } catch (Exception $e) { mtrace("\nException in test_elis_user_import(): " . $e->getMessage() . "\n"); } $elisuserdata = $this->map_elis_user($userdata, $elisexists); ob_start(); var_dump($elisuserdata); $tmp = ob_get_contents(); ob_end_clean(); ob_start(); var_dump($DB->get_records(user::TABLE)); $crlmuser = ob_get_contents(); ob_end_clean(); ob_start(); var_dump($DB->get_records('user')); $mdluser = ob_get_contents(); ob_end_clean(); $this->assertEquals($elisexists, $DB->record_exists(user::TABLE, $elisuserdata), "ELIS user assertion: elis_user_data; " . user::TABLE . " = {$tmp} ; {$crlmuser}"); if ($mdlexists === true) { $mdluserdata['deleted'] = 0; } else { if ($mdlexists === MDL_USER_DELETED) { $mdlexists = true; $mdluserdata = array('id' => $mdluserid, 'deleted' => 1); } } $this->assertEquals($mdlexists, $DB->record_exists('user', $mdluserdata), "Moodle user assertion: mdl_user_data; mdl_user = {$mdluserdatadump} ; {$mdluser}"); }
function general_validation_message($record, $message, $type) { //need the plugin class for some utility functions $file = get_plugin_directory('dhimport', 'version1elis') . '/version1elis.class.php'; require_once $file; $msg = ""; if ($type == "enrolment") { if ($record->action != 'create' && $record->action != 'delete') { //invalid action return "Enrolment in \"{$record->context}\" could not be processed. " . $message; } if (!$this->track_role_actions && !$this->track_enrolment_actions) { //error without sufficient information to properly provide details if ($record->action == 'create') { return 'Enrolment could not be created. ' . $message; } else { if ($record->action == 'delete') { return 'Enrolment could not be deleted. ' . $message; } } } //collect role assignment and enrolment messages $lines = array(); if ($this->track_role_actions) { //determine if a user identifier was set $user_identifier_set = !empty($record->username) || !empty($record->email) || !empty($record->idnumber); //determine if all required fields were set $required_fields_set = !empty($record->role) && $user_identifier_set && !empty($record->context); //descriptive string for user and context $user_descriptor = rlip_importplugin_version1elis::get_user_descriptor($record); $context_descriptor = rlip_importplugin_version1elis::get_context_descriptor($record); switch ($record->action) { case "create": if ($required_fields_set && in_array($record->context, $valid_contexts) && !empty($record->instance)) { //assignment on a specific context $lines[] = "User with {$user_descriptor} could not be assigned role " . "with shortname \"{$record->role}\" on {$context_descriptor}."; } else { if ($required_fields_set && $record->context == 'system') { //assignment on the system context $lines[] = "User with {$user_descriptor} could not be assigned role " . "with shortname \"{$record->role}\" on the system context."; } else { //not valid $lines[] = "Role assignment could not be created."; } } break; case "delete": if ($required_fields_set && in_array($record->context, $valid_contexts) && !empty($record->instance)) { //unassignment from a specific context $lines[] = "User with {$user_descriptor} could not be unassigned role " . "with shortname \"{$record->role}\" on {$context_descriptor}."; } else { if ($required_fields_set && $record->context == 'system') { //unassignment from the system context $lines[] = "User with {$user_descriptor} could not be unassigned role " . "with shortname \"{$record->role}\" on the system context."; } else { //not valid $lines[] = "Role assignment could not be deleted. "; } } break; } } if ($this->track_enrolment_actions) { //determine if a user identifier was set $user_identifier_set = !empty($record->username) || !empty($record->email) || !empty($record->idnumber); //determine if some required field is missing $missing_required_field = !$user_identifier_set || empty($record->instance); //descriptive string for user $user_descriptor = rlip_importplugin_version1elis::get_user_descriptor($record); switch ($record->action) { case "create": if ($missing_required_field) { //required field missing, so use generic failure message $lines[] = "Enrolment could not be created."; } else { //more accurate failure message $lines[] = "User with {$user_descriptor} could not be enrolled in " . "course with shortname \"{$record->instance}\"."; } break; case "delete": if ($missing_required_field) { //required field missing, so use generic failure message $lines[] = "Enrolment could not be deleted."; } else { //more accurate failure message $lines[] = "User with {$user_descriptor} could not be unenrolled " . "from course with shortname \"{$record->instance}\"."; } break; } } //create combined message, potentially containing role assignment and //enrolment components $msg = implode(' ', $lines) . ' ' . $message; } if (isset($record->context) && $record->context == "course") { $type = ucfirst($type); switch ($record->action) { case "create": if (empty($record->context) || empty($record->idnumber)) { $msg = "Course description could not be created. " . $message; } else { $msg = "{$type} description with idnumber \"{$record->idnumber}\" could not be created. " . $message; } break; case "update": if (empty($record->context) || empty($record->idnumber)) { $msg = "Course description could not be updated. " . $message; } else { $msg = "{$type} description with idnumber \"{$record->idnumber}\" could not be updated. " . $message; } break; case "delete": if (empty($record->context) || empty($record->idnumber)) { $msg = "Course description could not be deleted. " . $message; } else { $msg = "{$type} description with idnumber \"{$record->idnumber}\" could not be deleted. " . $message; } break; default: //invalid action $msg = 'Course could not be processed. ' . $message; break; } } if ($type == "user") { $type = ucfirst($type); switch ($record->action) { case "create": //make sure all required fields are specified if (empty($record->username) && empty($record->email) && empty($record->idnumber)) { $msg = "User could not be created. " . $message; } else { $user_descriptor = rlip_importplugin_version1elis::get_user_descriptor($record); $msg = "{$type} with {$user_descriptor} could not be created. " . $message; } break; case "update": //make sure all required fields are specified if (empty($record->username) && empty($record->email) && empty($record->idnumber)) { $msg = "User could not be updated. " . $message; } else { $user_descriptor = rlip_importplugin_version1elis::get_user_descriptor($record); $msg = "{$type} with {$user_descriptor} could not be updated. " . $message; } break; case "delete": //make sure all required fields are specified if (empty($record->username) && empty($record->email) && empty($record->idnumber)) { $msg = "User could not be deleted. " . $message; } else { $user_descriptor = rlip_importplugin_version1elis::get_user_descriptor($record); $msg = "{$type} with {$user_descriptor} could not be deleted. " . $message; } break; default: //invalid action $msg = 'User could not be processed. ' . $message; break; } } if (isset($record->context) && $record->context == "track") { $type = ucfirst($type); switch ($record->action) { case "create": //make sure all required fields are specified if (empty($record->idnumber)) { $msg = "Track could not be created. " . $message; } else { $msg = "{$type} with idnumber \"{$record->idnumber}\" could not be created. " . $message; } break; case "update": //make sure all required fields are specified if (empty($record->idnumber)) { $msg = "Track could not be updated. " . $message; } else { $msg = "{$type} with idnumber \"{$record->idnumber}\" could not be updated. " . $message; } break; case "delete": //make sure all required fields are specified if (empty($record->idnumber)) { $msg = "Track could not be deleted. " . $message; } else { $msg = "{$type} with idnumber \"{$record->idnumber}\" could not be deleted. " . $message; } break; default: //invalid action $msg = 'Track could not be processed. ' . $message; break; } } if (isset($record->context) && $record->context == "cluster") { $type = ucfirst($type); switch ($record->action) { case "create": //make sure all required fields are specified if (empty($record->name)) { $msg = "User set could not be created. " . $message; } else { $msg = "User set with name \"{$record->name}\" could not be created. " . $message; } break; case "update": //make sure all required fields are specified if (empty($record->name)) { $msg = "User set could not be updated. " . $message; } else { $msg = "User set with name \"{$record->name}\" could not be updated. " . $message; } break; case "delete": //make sure all required fields are specified if (empty($record->name)) { $msg = "User set could not be deleted. " . $message; } else { $msg = "User set with name \"{$record->name}\" could not be deleted. " . $message; } break; default: //invalid action $msg = 'User set could not be processed. ' . $message; break; } } if (isset($record->context) && $record->context == "curriculum") { $type = ucfirst($type); switch ($record->action) { case "create": //make sure all required fields are specified if (empty($record->idnumber)) { $msg = "Program could not be created. " . $message; } else { $msg = "Program with idnumber \"{$record->idnumber}\" could not be created. " . $message; } break; case "update": //make sure all required fields are specified if (empty($record->idnumber)) { $msg = "Program could not be updated. " . $message; } else { $msg = "Program with idnumber \"{$record->idnumber}\" could not be updated. " . $message; } break; case "delete": //make sure all required fields are specified if (empty($record->idnumber)) { $msg = "Program could not be deleted. " . $message; } else { $msg = "Program with idnumber \"{$record->idnumber}\" could not be deleted. " . $message; } break; default: //invalid action $msg = 'Program could not be processed. ' . $message; break; } } if (isset($record->context) && $record->context == "class") { $type = ucfirst($type); switch ($record->action) { case "create": //make sure all required fields are specified if (empty($record->idnumber)) { $msg = "Class instance could not be created. " . $message; } else { $msg = "Class instance with idnumber \"{$record->idnumber}\" could not be created. " . $message; } break; case "update": //make sure all required fields are specified if (empty($record->idnumber)) { $msg = "Class instance could not be updated. " . $message; } else { $msg = "Class instance with idnumber \"{$record->idnumber}\" could not be updated. " . $message; } break; case "delete": //make sure all required fields are specified if (empty($record->idnumber)) { $msg = "Class instance could not be deleted. " . $message; } else { $msg = "Class instance with idnumber \"{$record->idnumber}\" could not be deleted. " . $message; } break; default: //invalid action $msg = 'Class instance could not be processed. ' . $message; break; } } return $msg; }
$context = context_system::instance(); require_capability('moodle/site:config', $context); $pluginwwwroot = str_replace($CFG->dirroot, $CFG->wwwroot, $plugindir); $baseurl = $pluginwwwroot . '/config_fields.php'; $tab = optional_param('tab', 'user', PARAM_CLEAN); //page header rlipimport_version1elis_page_setup($baseurl); echo $OUTPUT->header(); //tabs $tabs = rlipimport_version1elis_get_tabs($baseurl); print_tabs(array($tabs), $tab); //TODO: implement all necessary calls, etc, to make the rest of this code work //data from db $mappingdata = rlipimport_version1elis_get_mapping($tab); //options $plugin = new rlip_importplugin_version1elis(NULL, false); $options = $plugin->get_available_fields($tab); //body $form = new rlip_importfield_form(null, $options); //handle data submission if ($data = $form->get_data()) { if (isset($data->submitbutton)) { rlipimport_version1elis_save_mapping($tab, $options, $data); //notify to the user that settings were saved echo $OUTPUT->heading(get_string('mappingssaved', 'dhimport_version1elis')); } else { if (isset($data->reset)) { rlipimport_version1elis_reset_mappings($tab); redirect($baseurl . "?tab={$tab}&resetmessage=1", '', 0); } }
/** * User import test cases * * @uses $DB * @dataProvider dataproviderfortests */ public function test_elis_entity_import($action, $context, $entitydata, $setuparray, $entityexists) { global $CFG, $DB; if (empty($context)) { $this->markTestSkipped("\nPHPunit test coding error, 'context' NOT set - skipping!\n"); return; } $file = get_plugin_directory('dhimport', 'version1elis') . '/version1elis.class.php'; require_once $file; set_config('enable_curriculum_expiration', true, 'local_elisprogram'); $importdata = array('action' => $action, 'context' => $context); foreach ($entitydata as $key => $value) { $importdata[$key] = $value; } try { foreach ($setuparray as $index) { $provider = new rlipimport_version1elis_importprovider_mockcourse($this->testsetupdata[$index]); $importplugin = new rlip_importplugin_version1elis($provider); @$importplugin->run(); } $provider = new rlipimport_version1elis_importprovider_mockcourse($importdata); $importplugin = new rlip_importplugin_version1elis($provider); $importplugin->run(); } catch (Exception $e) { mtrace("\nException in test_elis_entity_import(): " . $e->getMessage() . "\n"); } // Call any mapping functions to transform IP column to DB field. $mapfcn = 'map_' . $context; if (method_exists($this, $mapfcn)) { $entitydata = $this->{$mapfcn}($entitydata, $entityexists); } ob_start(); var_dump($entitydata); $tmp = ob_get_contents(); ob_end_clean(); $crlmtable = $this->contexttotable[$context]; ob_start(); var_dump($DB->get_records($crlmtable)); $crlmtabledata = ob_get_contents(); ob_end_clean(); $this->assertEquals($entityexists, $DB->record_exists($crlmtable, $entitydata), "ELIS entity assertion: [mapped]entity_data ; {$crlmtable} = {$tmp} ; {$crlmtabledata}"); }
/** * Test custom mapping summaries. * * @dataProvider custommappinganddataprovider * @param string $entity The entity type for import ('user', 'course', 'enrolment') * @param array $mapping The custom field mapping * @param array $data */ public function test_custom_mapping_summaries($entity, $mapping, $data) { global $DB; // Setup the custom mapping values. rlipimport_version1elis_save_mapping($entity, array_keys($mapping), $mapping); // Setup the class name fo the mock import provider we need. $mockprovider = 'rlipimport_version1elis_importprovider_mock' . $entity; $provider = new $mockprovider($data); $importplugin = new rlip_importplugin_version1elis($provider); $importplugin->run(); // Attempt to handle all of the specific messages in as general a way as possible. $requiredfields = array(); $messageend = 'Please fix the import file and re-upload it.'; // Testing a custom action mapping value. if (isset($mapping['action'])) { $message = 'Import file memoryfile was not processed because it is missing the following required column: ' . $mapping['action'] . '.'; } else { if ($entity == 'user' && $data['action'] == 'create') { // echo "\n", 'user create', "\n"; // User create is only a subset of the required fields. $message = 'Import file memoryfile was not processed because one of the following columns is required but all are unspecified: '; $possiblefields = array('username', 'email', 'idnumber', 'user_username', 'user_email', 'user_idnumber'); foreach ($possiblefields as $possiblefield) { $requiredfields[] = !empty($mapping[$possiblefield]) ? $mapping[$possiblefield] : $possiblefield; } } else { if ($entity == 'course') { // Course actions will only initially display a message if the context field is missing. $message = 'Import file memoryfile was not processed because it is missing the following required column: ' . $mapping['context'] . '.'; } else { if ($entity == 'enrolment') { // Enrolment actions will only initially display a message if one of the three required fields is missing. // (at least one of the three is required). $message = 'Import file memoryfile was not processed because one of the following columns is required but all are unspecified: '; $possiblefields = array('user_username', 'user_email', 'user_idnumber'); foreach ($possiblefields as $possiblefield) { $requiredfields[] = !empty($mapping[$possiblefield]) ? $mapping[$possiblefield] : $possiblefield; } } else { // Handle generic cases below. if (count($mapping) > 1) { // echo 'Generic: count($mapping) > 1', "\n"; $message = 'Import file memoryfile was not processed because one of the following columns is required but all are unspecified: '; $requiredfields = $mappings; // TBD } else { // We're importing data where some fields are requires in an OR condition, so we just need to replace that. // Single field value with it's custom mapped representation. $message = 'Import file memoryfile was not processed because one of the following columns is required but all are unspecified: '; $possiblefields = array('user_username', 'user_email', 'user_idnumber', 'username', 'email', 'idnumber'); foreach ($possiblefields as $possiblefield) { $requiredfields[] = !empty($mapping[$possiblefield]) ? $mapping[$possiblefield] : $possiblefield; } } } } } } $logs = $DB->get_records(RLIP_LOG_TABLE); // var_dump($logs); $log = end($logs); // echo 'Required: '; // var_dump($requiredfields); $realmessage = $log->statusmessage; $this->assertEquals(0, strpos($realmessage, $message)); $fieldstart = strlen($message); $fieldend = strpos($realmessage, $messageend); $this->assertGreaterThanOrEqual($fieldstart, $fieldend); $fieldsection = substr($realmessage, $fieldstart - 1, $fieldend - $fieldstart); $fieldspresent = explode(', ', trim($fieldsection, ' .')); // echo 'Present: '; // var_dump($fieldspresent); foreach ($requiredfields as $requiredfield) { $this->assertTrue(in_array($requiredfield, $fieldspresent)); } }
/** * Validate that MANUAL import obeys maxruntime * @dataProvider fileprovider */ public function test_manualimportobeysmaxruntime($filename, $entity) { global $CFG, $DB; require_once $CFG->dirroot . '/local/datahub/tests/other/csv_delay.class.php'; $file = get_plugin_directory('dhimport', 'version1elis') . '/version1elis.class.php'; require_once $file; // Set the log file name to a fixed value. $filepath = $CFG->dataroot; // MUST copy file to temp area 'cause it'll be deleted after import. $testfile = dirname(__FILE__) . '/fixtures/' . $filename; $tempdir = $CFG->dataroot . '/local_datahub_phpunit/'; $file = $tempdir . $filename; @mkdir($tempdir, 0777, true); @copy($testfile, $file); $provider = new rlipimport_version1elis_importprovider_manual_delay($file, $entity); // Run the import. $importplugin = new rlip_importplugin_version1elis($provider, true); ob_start(); $result = $importplugin->run(0, 0, 1); // Maxruntime 1 sec. ob_end_clean(); $this->assertNotNull($result); // Get most recent record. $records = $DB->get_records(RLIP_LOG_TABLE, null, 'starttime DESC'); foreach ($records as $record) { $ui = $record->statusmessage; break; } $expectedui = "/.*Failed importing all lines from import file.*due to time limit exceeded.*/"; $this->assertRegExp($expectedui, $ui); // Test that the filename is also included in the error message. // The mock provider returns 'filename' as the filename. $expectedui = "/.*filename*/"; $this->assertRegExp($expectedui, $ui); // Clean-up data file & tempdir. @unlink($file); @rmdir($tempdir); }
/** * Validate restoring default field mappings */ public function testrestoredefaultmappingupdatesrecords() { global $CFG, $DB; $file = get_plugin_directory('dhimport', 'version1elis') . '/lib.php'; require_once $file; // Obtain available fields. $plugin = new rlip_importplugin_version1elis(null, false); $options = $plugin->get_available_fields('user'); // Persist default field. rlipimport_version1elis_save_mapping('user', $options, array()); // Setup validation. $select = 'standardfieldname = customfieldname'; $count = $DB->count_records_select(RLIPIMPORT_VERSION1ELIS_MAPPING_TABLE, $select); $this->assertEquals($count, count($options)); // Update all mapping values. $data = array(); foreach ($options as $option) { $data[$option] = $option . 'updated'; } // Persist updated values and validate. rlipimport_version1elis_save_mapping('user', $options, $data); $select = 'standardfieldname != customfieldname'; $count = $DB->count_records_select(RLIPIMPORT_VERSION1ELIS_MAPPING_TABLE, $select); $this->assertEquals($count, count($options)); // Reset and validate state. rlipimport_version1elis_reset_mappings('user'); $select = 'standardfieldname = customfieldname'; $count = $DB->count_records_select(RLIPIMPORT_VERSION1ELIS_MAPPING_TABLE, $select); $this->assertEquals($count, count($options)); }