ÿØÿà JFIF    ÿÛ „  ( %"1!%)+...383,7(-.+  -+++--++++---+-+-----+---------------+---+-++7-----ÿÀ  ß â" ÿÄ     ÿÄ H    !1AQaq"‘¡2B±ÁÑð#R“Ò Tbr‚²á3csƒ’ÂñDS¢³$CÿÄ   ÿÄ %  !1AQa"23‘ÿÚ   ? ôÿ ¨pŸªáÿ —åYõõ\?àÒü©ŠÄï¨pŸªáÿ —åYõõ\?àÓü©ŠÄá 0Ÿªáÿ Ÿå[úƒ ú®ði~TÁbqÐ8OÕpÿ ƒOò¤Oè`–RÂáœá™êi€ßÉ< FtŸI“öÌ8úDf´°å}“¾œ6  öFá°y¥jñÇh†ˆ¢ã/ÃÐ:ªcÈ "Y¡ðÑl>ÿ ”ÏËte:qž\oäŠe÷󲍷˜HT4&ÿ ÓÐü6ö®¿øþßèô Ÿ•7Ñi’•j|“ñì>b…þS?*Óôÿ ÓÐü*h¥£ír¶ü UãS炟[AÐaè[ûª•õ&õj?†Éö+EzP—WeÒírJFt ‘BŒ†Ï‡%#tE Øz ¥OÛ«!1›üä±Í™%ºÍãö]°î(–:@<‹ŒÊö×òÆt¦ãº+‡¦%ÌÁ²h´OƒJŒtMÜ>ÀÜÊw3Y´•牋4ǍýʏTì>œú=Íwhyë,¾Ôò×õ¿ßÊa»«þˆѪQ|%6ž™A õ%:øj<>É—ÿ Å_ˆCbõ¥š±ý¯Ýƒï…¶|RëócÍf溪“t.СøTÿ *Ä¿-{†çàczůŽ_–^XþŒ±miB[X±d 1,é”zEù»& î9gœf™9Ð'.;—™i}!ôšåîqêÛ٤ёý£½ÆA–àôe"A$˝Úsäÿ ÷Û #°xŸëí(l »ý3—¥5m! rt`†0~'j2(]S¦¦kv,ÚÇ l¦øJA£Šƒ J3E8ÙiŽ:cÉžúeZ°€¯\®kÖ(79«Ž:¯X”¾³Š&¡* ….‰Ž(ÜíŸ2¥ª‡×Hi²TF¤ò[¨íÈRëÉ䢍mgÑ.Ÿ<öäS0í„ǹÁU´f#Vß;Õ–…P@3ío<ä-±»Ž.L|kªÀê›fÂ6@»eu‚|ÓaÞÆŸ…¨ááå>åŠ?cKü6ùTÍÆ”†sĤÚ;H2RÚ†õ\Ö·Ÿn'¾ ñ#ºI¤Å´%çÁ­‚â7›‹qT3Iï¨ÖÚ5I7Ë!ÅOóŸ¶øÝñØôת¦$Tcö‘[«Ö³šÒ';Aþ ¸èíg A2Z"i¸vdÄ÷.iõ®§)¿]¤À†–‡É&ä{V¶iŽ”.Ó×Õÿ û?h¬Mt–íª[ÿ Ñÿ ÌV(í}=ibÔ¡›¥¢±b Lô¥‡piη_Z<‡z§èŒ)iÖwiÇ 2hÙ3·=’d÷8éŽ1¦¸c¤µ€7›7Ø ð\á)} ¹fËí›pAÃL%âc2 í§æQz¿;T8sæ°qø)QFMð‰XŒÂ±N¢aF¨…8¯!U  Z©RÊ ÖPVÄÀÍin™Ì-GˆªÅËŠ›•zË}º±ŽÍFò¹}Uw×#ä5B¤{î}Ð<ÙD é©¤&‡ïDbàÁôMÁ.. /** * Unit Tests for the abstract contextlist Class * * @package core_privacy * @category test * @copyright 2018 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); global $CFG; use \core_privacy\local\request\contextlist_base; /** * Tests for the \core_privacy API's contextlist base functionality. * * @copyright 2018 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @coversDefaultClass \core_privacy\local\request\contextlist_base */ class contextlist_base_test extends advanced_testcase { /** * Ensure that get_contextids returns the list of unique contextids. * * @dataProvider get_contextids_provider * @param array $input List of context IDs * @param array $expected list of contextids * @param int $count Expected count * @covers ::get_contextids */ public function test_get_contextids($input, $expected, $count) { $uit = new test_contextlist_base(); $uit->set_contextids($input); $result = $uit->get_contextids(); $this->assertCount($count, $result); // Note: Array order is not guaranteed and should not matter. foreach ($expected as $contextid) { $this->assertNotFalse(array_search($contextid, $result)); } } /** * Provider for the list of contextids. * * @return array */ public function get_contextids_provider() { return [ 'basic' => [ [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], 5, ], 'duplicates' => [ [1, 1, 2, 2, 3, 4, 5], [1, 2, 3, 4, 5], 5, ], 'Mixed order with duplicates' => [ [5, 4, 2, 5, 4, 1, 3, 4, 1, 5, 5, 5, 2, 4, 1, 2], [1, 2, 3, 4, 5], 5, ], ]; } /** * Ensure that get_contexts returns the correct list of contexts. * * @covers ::get_contexts */ public function test_get_contexts() { global $DB; $contexts = []; $contexts[] = \context_system::instance(); $contexts[] = \context_user::instance(\core_user::get_user_by_username('admin')->id); $ids = []; foreach ($contexts as $context) { $ids[] = $context->id; } $uit = new test_contextlist_base(); $uit->set_contextids($ids); $result = $uit->get_contexts(); $this->assertCount(count($contexts), $result); foreach ($contexts as $context) { $this->assertNotFalse(array_search($context, $result)); } } /** * Ensure that the contextlist_base is countable. * * @dataProvider get_contextids_provider * @param array $input List of context IDs * @param array $expected list of contextids * @param int $count Expected count * @covers ::count */ public function test_countable($input, $expected, $count) { $uit = new test_contextlist_base(); $uit->set_contextids($input); $this->assertCount($count, $uit); } /** * Ensure that the contextlist_base iterates over the set of contexts. * * @covers ::current * @covers ::key * @covers ::next * @covers ::rewind * @covers ::valid */ public function test_context_iteration() { global $DB; $allcontexts = $DB->get_records('context'); $contexts = []; foreach ($allcontexts as $context) { $contexts[] = \context::instance_by_id($context->id); } $uit = new test_contextlist_base(); $uit->set_contextids(array_keys($allcontexts)); foreach ($uit as $key => $context) { $this->assertNotFalse(array_search($context, $contexts)); } } /** * Test that deleting a context results in current returning nothing. * * @covers ::current */ public function test_current_context_one_context() { global $DB; $this->resetAfterTest(); $data = (object) [ 'contextlevel' => CONTEXT_BLOCK, 'instanceid' => 45, 'path' => '1/5/67/107', 'depth' => 4 ]; $contextid = $DB->insert_record('context', $data); $contextbase = new test_contextlist_base(); $contextbase->set_contextids([$contextid]); $this->assertCount(1, $contextbase); $currentcontext = $contextbase->current(); $this->assertEquals($contextid, $currentcontext->id); $DB->delete_records('context', ['id' => $contextid]); context_helper::reset_caches(); $this->assertEmpty($contextbase->current()); } /** * Test that deleting a context results in the next record being returned. * * @covers ::current */ public function test_current_context_two_contexts() { global $DB; $this->resetAfterTest(); $data = (object) [ 'contextlevel' => CONTEXT_BLOCK, 'instanceid' => 45, 'path' => '1/5/67/107', 'depth' => 4 ]; $contextid1 = $DB->insert_record('context', $data); $data = (object) [ 'contextlevel' => CONTEXT_BLOCK, 'instanceid' => 47, 'path' => '1/5/54/213', 'depth' => 4 ]; $contextid2 = $DB->insert_record('context', $data); $contextbase = new test_contextlist_base(); $contextbase->set_contextids([$contextid1, $contextid2]); $this->assertCount(2, $contextbase); $DB->delete_records('context', ['id' => $contextid1]); context_helper::reset_caches(); // Current should return context 2. $this->assertEquals($contextid2, $contextbase->current()->id); } /** * Test that if there are no non-deleted contexts that nothing is returned. * * @covers ::get_contexts */ public function test_get_contexts_all_deleted() { global $DB; $this->resetAfterTest(); $data = (object) [ 'contextlevel' => CONTEXT_BLOCK, 'instanceid' => 45, 'path' => '1/5/67/107', 'depth' => 4 ]; $contextid = $DB->insert_record('context', $data); $contextbase = new test_contextlist_base(); $contextbase->set_contextids([$contextid]); $this->assertCount(1, $contextbase); $DB->delete_records('context', ['id' => $contextid]); context_helper::reset_caches(); $this->assertEmpty($contextbase->get_contexts()); } /** * Test that get_contexts() returns only active contexts. * * @covers ::get_contexts */ public function test_get_contexts_one_deleted() { global $DB; $this->resetAfterTest(); $data = (object) [ 'contextlevel' => CONTEXT_BLOCK, 'instanceid' => 45, 'path' => '1/5/67/107', 'depth' => 4 ]; $contextid1 = $DB->insert_record('context', $data); $data = (object) [ 'contextlevel' => CONTEXT_BLOCK, 'instanceid' => 47, 'path' => '1/5/54/213', 'depth' => 4 ]; $contextid2 = $DB->insert_record('context', $data); $contextbase = new test_contextlist_base(); $contextbase->set_contextids([$contextid1, $contextid2]); $this->assertCount(2, $contextbase); $DB->delete_records('context', ['id' => $contextid1]); context_helper::reset_caches(); $contexts = $contextbase->get_contexts(); $this->assertCount(1, $contexts); $context = array_shift($contexts); $this->assertEquals($contextid2, $context->id); } } /** * A test class extending the contextlist_base allowing setting of the * contextids. * * @copyright 2018 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class test_contextlist_base extends contextlist_base { /** * Set the contextids for the test class. * * @param int[] $contexids The list of contextids to use. */ public function set_contextids(array $contextids) { parent::set_contextids($contextids); } }