. /** * Unit tests for workshop api class defined in mod/workshop/locallib.php * * @package mod * @subpackage workshop * @copyright 2009 David Mudrak * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); require_once($CFG->dirroot . '/mod/workshop/locallib.php'); // Include the code to test global $DB; Mock::generate(get_class($DB), 'mockDB'); /** * Test subclass that makes all the protected methods we want to test public. */ class testable_workshop extends workshop { public function __construct() { $this->id = 16; $this->cm = new stdclass(); $this->course = new stdclass(); $this->context = new stdclass(); } public function aggregate_submission_grades_process(array $assessments) { parent::aggregate_submission_grades_process($assessments); } public function aggregate_grading_grades_process(array $assessments, $timegraded = null) { parent::aggregate_grading_grades_process($assessments, $timegraded); } } /** * Test cases for the internal workshop api */ class workshop_internal_api_test extends UnitTestCase { /** workshop instance emulation */ protected $workshop; /** setup testing environment */ public function setUp() { global $DB; $this->realDB = $DB; $DB = new mockDB(); $this->workshop = new testable_workshop(); } public function tearDown() { global $DB; $DB = $this->realDB; $this->workshop = null; } public function test_aggregate_submission_grades_process_notgraded() { global $DB; // fixture set-up $batch = array(); // batch of a submission's assessments $batch[] = (object)array('submissionid' => 12, 'submissiongrade' => null, 'weight' => 1, 'grade' => null); $DB->expectNever('update_record'); // exercise SUT $this->workshop->aggregate_submission_grades_process($batch); } public function test_aggregate_submission_grades_process_single() { global $DB; // fixture set-up $batch = array(); // batch of a submission's assessments $batch[] = (object)array('submissionid' => 12, 'submissiongrade' => null, 'weight' => 1, 'grade' => 10.12345); $expected = 10.12345; $DB->expectOnce('update_record'); // exercise SUT $this->workshop->aggregate_submission_grades_process($batch); } public function test_aggregate_submission_grades_process_null_doesnt_influence() { global $DB; // fixture set-up $batch = array(); // batch of a submission's assessments $batch[] = (object)array('submissionid' => 12, 'submissiongrade' => null, 'weight' => 1, 'grade' => 45.54321); $batch[] = (object)array('submissionid' => 12, 'submissiongrade' => null, 'weight' => 1, 'grade' => null); $expected = 45.54321; $DB->expectOnce('update_record'); // exercise SUT $this->workshop->aggregate_submission_grades_process($batch); } public function test_aggregate_submission_grades_process_weighted_single() { global $DB; // fixture set-up $batch = array(); // batch of a submission's assessments $batch[] = (object)array('submissionid' => 12, 'submissiongrade' => null, 'weight' => 4, 'grade' => 14.00012); $expected = 14.00012; $DB->expectOnce('update_record'); // exercise SUT $this->workshop->aggregate_submission_grades_process($batch); } public function test_aggregate_submission_grades_process_mean() { global $DB; // fixture set-up $batch = array(); // batch of a submission's assessments $batch[] = (object)array('submissionid' => 45, 'submissiongrade' => null, 'weight' => 1, 'grade' => 56.12000); $batch[] = (object)array('submissionid' => 45, 'submissiongrade' => null, 'weight' => 1, 'grade' => 12.59000); $batch[] = (object)array('submissionid' => 45, 'submissiongrade' => null, 'weight' => 1, 'grade' => 10.00000); $batch[] = (object)array('submissionid' => 45, 'submissiongrade' => null, 'weight' => 1, 'grade' => 0.00000); $expected = 19.67750; $DB->expectOnce('update_record'); // exercise SUT $this->workshop->aggregate_submission_grades_process($batch); } public function test_aggregate_submission_grades_process_mean_changed() { global $DB; // fixture set-up $batch = array(); // batch of a submission's assessments $batch[] = (object)array('submissionid' => 45, 'submissiongrade' => 12.57750, 'weight' => 1, 'grade' => 56.12000); $batch[] = (object)array('submissionid' => 45, 'submissiongrade' => 12.57750, 'weight' => 1, 'grade' => 12.59000); $batch[] = (object)array('submissionid' => 45, 'submissiongrade' => 12.57750, 'weight' => 1, 'grade' => 10.00000); $batch[] = (object)array('submissionid' => 45, 'submissiongrade' => 12.57750, 'weight' => 1, 'grade' => 0.00000); $expected = 19.67750; $DB->expectOnce('update_record'); // exercise SUT $this->workshop->aggregate_submission_grades_process($batch); } public function test_aggregate_submission_grades_process_mean_nochange() { global $DB; // fixture set-up $batch = array(); // batch of a submission's assessments $batch[] = (object)array('submissionid' => 45, 'submissiongrade' => 19.67750, 'weight' => 1, 'grade' => 56.12000); $batch[] = (object)array('submissionid' => 45, 'submissiongrade' => 19.67750, 'weight' => 1, 'grade' => 12.59000); $batch[] = (object)array('submissionid' => 45, 'submissiongrade' => 19.67750, 'weight' => 1, 'grade' => 10.00000); $batch[] = (object)array('submissionid' => 45, 'submissiongrade' => 19.67750, 'weight' => 1, 'grade' => 0.00000); $DB->expectNever('update_record'); // exercise SUT $this->workshop->aggregate_submission_grades_process($batch); } public function test_aggregate_submission_grades_process_rounding() { global $DB; // fixture set-up $batch = array(); // batch of a submission's assessments $batch[] = (object)array('submissionid' => 45, 'submissiongrade' => null, 'weight' => 1, 'grade' => 4.00000); $batch[] = (object)array('submissionid' => 45, 'submissiongrade' => null, 'weight' => 1, 'grade' => 2.00000); $batch[] = (object)array('submissionid' => 45, 'submissiongrade' => null, 'weight' => 1, 'grade' => 1.00000); $expected = 2.33333; $DB->expectOnce('update_record'); // exercise SUT $this->workshop->aggregate_submission_grades_process($batch); } public function test_aggregate_submission_grades_process_weighted_mean() { global $DB; // fixture set-up $batch = array(); // batch of a submission's assessments $batch[] = (object)array('submissionid' => 45, 'submissiongrade' => null, 'weight' => 3, 'grade' => 12.00000); $batch[] = (object)array('submissionid' => 45, 'submissiongrade' => null, 'weight' => 2, 'grade' => 30.00000); $batch[] = (object)array('submissionid' => 45, 'submissiongrade' => null, 'weight' => 1, 'grade' => 10.00000); $batch[] = (object)array('submissionid' => 45, 'submissiongrade' => null, 'weight' => 0, 'grade' => 1000.00000); $expected = 17.66667; $DB->expectOnce('update_record'); // exercise SUT $this->workshop->aggregate_submission_grades_process($batch); } public function test_aggregate_grading_grades_process_nograding() { global $DB; // fixture set-up $batch = array(); $batch[] = (object)array('reviewerid'=>2, 'gradinggrade'=>null, 'gradinggradeover'=>null, 'aggregationid'=>null, 'aggregatedgrade'=>null); // expectation $DB->expectNever('update_record'); // excersise SUT $this->workshop->aggregate_grading_grades_process($batch); } public function test_aggregate_grading_grades_process_single_grade_new() { global $DB; // fixture set-up $batch = array(); $batch[] = (object)array('reviewerid'=>3, 'gradinggrade'=>82.87670, 'gradinggradeover'=>null, 'aggregationid'=>null, 'aggregatedgrade'=>null); // expectation $now = time(); $expected = new stdclass(); $expected->workshopid = $this->workshop->id; $expected->userid = 3; $expected->gradinggrade = 82.87670; $expected->timegraded = $now; $DB->expectOnce('insert_record', array('workshop_aggregations', $expected)); // excersise SUT $this->workshop->aggregate_grading_grades_process($batch, $now); } public function test_aggregate_grading_grades_process_single_grade_update() { global $DB; // fixture set-up $batch = array(); $batch[] = (object)array('reviewerid'=>3, 'gradinggrade'=>90.00000, 'gradinggradeover'=>null, 'aggregationid'=>1, 'aggregatedgrade'=>82.87670); // expectation $DB->expectOnce('update_record'); // excersise SUT $this->workshop->aggregate_grading_grades_process($batch); } public function test_aggregate_grading_grades_process_single_grade_uptodate() { global $DB; // fixture set-up $batch = array(); $batch[] = (object)array('reviewerid'=>3, 'gradinggrade'=>90.00000, 'gradinggradeover'=>null, 'aggregationid'=>1, 'aggregatedgrade'=>90.00000); // expectation $DB->expectNever('update_record'); // excersise SUT $this->workshop->aggregate_grading_grades_process($batch); } public function test_aggregate_grading_grades_process_single_grade_overridden() { global $DB; // fixture set-up $batch = array(); $batch[] = (object)array('reviewerid'=>4, 'gradinggrade'=>91.56700, 'gradinggradeover'=>82.32105, 'aggregationid'=>2, 'aggregatedgrade'=>91.56700); // expectation $DB->expectOnce('update_record'); // excersise SUT $this->workshop->aggregate_grading_grades_process($batch); } public function test_aggregate_grading_grades_process_multiple_grades_new() { global $DB; // fixture set-up $batch = array(); $batch[] = (object)array('reviewerid'=>5, 'gradinggrade'=>99.45670, 'gradinggradeover'=>null, 'aggregationid'=>null, 'aggregatedgrade'=>null); $batch[] = (object)array('reviewerid'=>5, 'gradinggrade'=>87.34311, 'gradinggradeover'=>null, 'aggregationid'=>null, 'aggregatedgrade'=>null); $batch[] = (object)array('reviewerid'=>5, 'gradinggrade'=>51.12000, 'gradinggradeover'=>null, 'aggregationid'=>null, 'aggregatedgrade'=>null); // expectation $now = time(); $expected = new stdclass(); $expected->workshopid = $this->workshop->id; $expected->userid = 5; $expected->gradinggrade = 79.3066; $expected->timegraded = $now; $DB->expectOnce('insert_record', array('workshop_aggregations', $expected)); // excersise SUT $this->workshop->aggregate_grading_grades_process($batch, $now); } public function test_aggregate_grading_grades_process_multiple_grades_update() { global $DB; // fixture set-up $batch = array(); $batch[] = (object)array('reviewerid'=>5, 'gradinggrade'=>56.23400, 'gradinggradeover'=>null, 'aggregationid'=>2, 'aggregatedgrade'=>79.30660); $batch[] = (object)array('reviewerid'=>5, 'gradinggrade'=>87.34311, 'gradinggradeover'=>null, 'aggregationid'=>2, 'aggregatedgrade'=>79.30660); $batch[] = (object)array('reviewerid'=>5, 'gradinggrade'=>51.12000, 'gradinggradeover'=>null, 'aggregationid'=>2, 'aggregatedgrade'=>79.30660); // expectation $DB->expectOnce('update_record'); // excersise SUT $this->workshop->aggregate_grading_grades_process($batch); } public function test_aggregate_grading_grades_process_multiple_grades_overriden() { global $DB; // fixture set-up $batch = array(); $batch[] = (object)array('reviewerid'=>5, 'gradinggrade'=>56.23400, 'gradinggradeover'=>99.45670, 'aggregationid'=>2, 'aggregatedgrade'=>64.89904); $batch[] = (object)array('reviewerid'=>5, 'gradinggrade'=>87.34311, 'gradinggradeover'=>null, 'aggregationid'=>2, 'aggregatedgrade'=>64.89904); $batch[] = (object)array('reviewerid'=>5, 'gradinggrade'=>51.12000, 'gradinggradeover'=>null, 'aggregationid'=>2, 'aggregatedgrade'=>64.89904); // expectation $DB->expectOnce('update_record'); // excersise SUT $this->workshop->aggregate_grading_grades_process($batch); } public function test_aggregate_grading_grades_process_multiple_grades_one_missing() { global $DB; // fixture set-up $batch = array(); $batch[] = (object)array('reviewerid'=>6, 'gradinggrade'=>50.00000, 'gradinggradeover'=>null, 'aggregationid'=>3, 'aggregatedgrade'=>100.00000); $batch[] = (object)array('reviewerid'=>6, 'gradinggrade'=>null, 'gradinggradeover'=>null, 'aggregationid'=>3, 'aggregatedgrade'=>100.00000); $batch[] = (object)array('reviewerid'=>6, 'gradinggrade'=>52.20000, 'gradinggradeover'=>null, 'aggregationid'=>3, 'aggregatedgrade'=>100.00000); // expectation $DB->expectOnce('update_record'); // excersise SUT $this->workshop->aggregate_grading_grades_process($batch); } public function test_aggregate_grading_grades_process_multiple_grades_missing_overridden() { global $DB; // fixture set-up $batch = array(); $batch[] = (object)array('reviewerid'=>6, 'gradinggrade'=>50.00000, 'gradinggradeover'=>null, 'aggregationid'=>3, 'aggregatedgrade'=>100.00000); $batch[] = (object)array('reviewerid'=>6, 'gradinggrade'=>null, 'gradinggradeover'=>69.00000, 'aggregationid'=>3, 'aggregatedgrade'=>100.00000); $batch[] = (object)array('reviewerid'=>6, 'gradinggrade'=>52.20000, 'gradinggradeover'=>null, 'aggregationid'=>3, 'aggregatedgrade'=>100.00000); // expectation $DB->expectOnce('update_record'); // excersise SUT $this->workshop->aggregate_grading_grades_process($batch); } public function test_percent_to_value() { // fixture setup $total = 185; $percent = 56.6543; // exercise SUT $part = workshop::percent_to_value($percent, $total); // verify $this->assertEqual($part, $total * $percent / 100); } public function test_percent_to_value_negative() { // fixture setup $total = 185; $percent = -7.098; // set expectation $this->expectException('coding_exception'); // exercise SUT $part = workshop::percent_to_value($percent, $total); } public function test_percent_to_value_over_hundred() { // fixture setup $total = 185; $percent = 121.08; // set expectation $this->expectException('coding_exception'); // exercise SUT $part = workshop::percent_to_value($percent, $total); } public function test_lcm() { // fixture setup + exercise SUT + verify in one step $this->assertEqual(workshop::lcm(1,4), 4); $this->assertEqual(workshop::lcm(2,4), 4); $this->assertEqual(workshop::lcm(4,2), 4); $this->assertEqual(workshop::lcm(2,3), 6); $this->assertEqual(workshop::lcm(6,4), 12); } public function test_lcm_array() { // fixture setup $numbers = array(5,3,15); // excersise SUT $lcm = array_reduce($numbers, 'workshop::lcm', 1); // verify $this->assertEqual($lcm, 15); } public function test_prepare_example_assessment() { // fixture setup $fakerawrecord = (object)array( 'id' => 42, 'submissionid' => 56, 'weight' => 0, 'timecreated' => time() - 10, 'timemodified' => time() - 5, 'grade' => null, 'gradinggrade' => null, 'gradinggradeover' => null, ); // excersise SUT $a = $this->workshop->prepare_example_assessment($fakerawrecord); // verify $this->assertTrue($a instanceof workshop_example_assessment); $this->assertTrue($a->url instanceof moodle_url); // modify setup $fakerawrecord->weight = 1; $this->expectException('coding_exception'); // excersise SUT $a = $this->workshop->prepare_example_assessment($fakerawrecord); } public function test_prepare_example_reference_assessment() { global $USER; // fixture setup $fakerawrecord = (object)array( 'id' => 38, 'submissionid' => 56, 'weight' => 1, 'timecreated' => time() - 100, 'timemodified' => time() - 50, 'grade' => 0.75000, 'gradinggrade' => 1.00000, 'gradinggradeover' => null, ); // excersise SUT $a = $this->workshop->prepare_example_reference_assessment($fakerawrecord); // verify $this->assertTrue($a instanceof workshop_example_reference_assessment); // modify setup $fakerawrecord->weight = 0; $this->expectException('coding_exception'); // excersise SUT $a = $this->workshop->prepare_example_reference_assessment($fakerawrecord); } }