Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
<?php// This file is part of Moodle - http://moodle.org///// Moodle is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.//// Moodle is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with Moodle. If not, see <http://www.gnu.org/licenses/>.namespace core_calendar;defined('MOODLE_INTERNAL') || die();require_once(__DIR__ . '/helpers.php');/*** Unit tests for calendar_information.** @package core_calendar* @copyright 2017 Andrew Nicols <andrew@nicols.co.uk>* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/class calendar_information_test extends \advanced_testcase {/*** Helper to mock a course and category structure.** @return array*/protected function mock_structure() {$this->resetAfterTest();$generator = $this->getDataGenerator();$categories = [];$courses = [];$categories['A'] = $generator->create_category(['name' => 'A']);$courses['A.1'] = $generator->create_course(['category' => $categories['A']->id]);$courses['A.2'] = $generator->create_course(['category' => $categories['A']->id]);$categories['A1'] = $generator->create_category(['name' => 'A1', 'parent' => $categories['A']->id]);$courses['A1.1'] = $generator->create_course(['category' => $categories['A1']->id]);$courses['A1.2'] = $generator->create_course(['category' => $categories['A1']->id]);$categories['A1i'] = $generator->create_category(['name' => 'A1i', 'parent' => $categories['A1']->id]);$categories['A1ii'] = $generator->create_category(['name' => 'A1ii', 'parent' => $categories['A1']->id]);$categories['A2'] = $generator->create_category(['name' => 'A2', 'parent' => $categories['A']->id]);$courses['A2.1'] = $generator->create_course(['category' => $categories['A2']->id]);$courses['A2.2'] = $generator->create_course(['category' => $categories['A2']->id]);$categories['A2i'] = $generator->create_category(['name' => 'A2i', 'parent' => $categories['A2']->id]);$categories['A2ii'] = $generator->create_category(['name' => 'A2ii', 'parent' => $categories['A2']->id]);$categories['B'] = $generator->create_category(['name' => 'B']);$courses['B.1'] = $generator->create_course(['category' => $categories['B']->id]);$courses['B.2'] = $generator->create_course(['category' => $categories['B']->id]);$categories['B1'] = $generator->create_category(['name' => 'B1', 'parent' => $categories['B']->id]);$categories['B1i'] = $generator->create_category(['name' => 'B1i', 'parent' => $categories['B1']->id]);$categories['B1ii'] = $generator->create_category(['name' => 'B1ii', 'parent' => $categories['B1']->id]);$categories['B2'] = $generator->create_category(['name' => 'B2', 'parent' => $categories['B']->id]);$categories['B2i'] = $generator->create_category(['name' => 'B2i', 'parent' => $categories['B2']->id]);$categories['B2ii'] = $generator->create_category(['name' => 'B2ii', 'parent' => $categories['B2']->id]);$categories['C'] = $generator->create_category(['name' => 'C']);return [$courses, $categories];}/*** Given a user has no enrolments.* And I ask for the site information.* Then I should see the site.* And I should see no other courses.* And I should see no categories.*/public function test_site_visibility_no_enrolment() {$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$user = $generator->create_user();$this->setUser($user);$calendar = \calendar_information::create(time(), SITEID, null);$this->assertCount(1, $calendar->courses);$this->assertCount(0, $calendar->categories);$this->assertEquals(SITEID, $calendar->courseid);$this->assertEquals(SITEID, reset($calendar->courses));$this->assertEquals(\context_system::instance(), $calendar->context);}/*** Given a user has no enrolments.* And I ask for a category.* Then I should see the category.* And I should see the category parents.* And I should see the category descendants.* And I should see the site course.* And I should see no other courses.*/public function test_site_visibility_no_enrolment_category() {$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$user = $generator->create_user();$this->setUser($user);$category = $categories['A1'];$calendar = \calendar_information::create(time(), SITEID, $category->id);$this->assertCount(1, $calendar->courses);$this->assertCount(4, $calendar->categories);$this->assertEquals(SITEID, $calendar->courseid);$this->assertEquals(SITEID, reset($calendar->courses));$this->assertArrayHasKey($categories['A']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1i']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1ii']->id, array_flip($calendar->categories));$this->assertEquals(\context_coursecat::instance($category->id), $calendar->context);}/*** Given a user has a role assignment to manage a category.* And I ask for the site information.* Then I should see that category.* And I should see the category parents.* And I should see the category descendants.* And I should see the site course.* And I should see no other courses.*/public function test_site_visibility_category_manager_site() {global $DB;$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$user = $generator->create_user();$category = $categories['A1'];$roles = $DB->get_records('role', [], '', 'shortname, id');$generator->role_assign($roles['manager']->id, $user->id, \context_coursecat::instance($category->id));$this->setUser($user);$calendar = \calendar_information::create(time(), SITEID, null);$this->assertCount(1, $calendar->courses);$this->assertCount(4, $calendar->categories);$this->assertEquals(SITEID, $calendar->courseid);$this->assertEquals(SITEID, reset($calendar->courses));$this->assertArrayHasKey($categories['A']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1i']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1ii']->id, array_flip($calendar->categories));$this->assertEquals(\context_system::instance(), $calendar->context);}/*** Given a user has a role assignment to manage a category.* And I ask for that category.* Then I should see that category.* And I should see the category parents.* And I should see the category descendants.* And I should see the site course.* And I should see no other courses.*/public function test_site_visibility_category_manager_own_category() {global $DB;$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$user = $generator->create_user();$category = $categories['A1'];$roles = $DB->get_records('role', [], '', 'shortname, id');$generator->role_assign($roles['manager']->id, $user->id, \context_coursecat::instance($category->id));$this->setUser($user);$calendar = \calendar_information::create(time(), SITEID, $category->id);$this->assertCount(1, $calendar->courses);$this->assertCount(4, $calendar->categories);$this->assertEquals(SITEID, $calendar->courseid);$this->assertEquals(SITEID, reset($calendar->courses));$this->assertArrayHasKey($categories['A']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1i']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1ii']->id, array_flip($calendar->categories));$this->assertEquals(\context_coursecat::instance($category->id), $calendar->context);}/*** Given a user has a role assignment to manage a category.* And I ask for the parent of that category.* Then I should see that category.* And I should see the category parents.* And I should see the category descendants.* And I should see the site course.* And I should see no other courses.*/public function test_site_visibility_category_manager_parent_category() {global $DB;$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$user = $generator->create_user();$category = $categories['A1'];$roles = $DB->get_records('role', [], '', 'shortname, id');$generator->role_assign($roles['manager']->id, $user->id, \context_coursecat::instance($category->id));$this->setUser($user);$calendar = \calendar_information::create(time(), SITEID, $category->parent);$this->assertCount(1, $calendar->courses);$this->assertCount(7, $calendar->categories);$this->assertEquals(SITEID, $calendar->courseid);$this->assertEquals(SITEID, reset($calendar->courses));$this->assertArrayHasKey($categories['A']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1i']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1ii']->id, array_flip($calendar->categories));$this->assertEquals(\context_coursecat::instance($category->parent), $calendar->context);}/*** Given a user has a role assignment to manage a category.* And I ask for a child of that category.* Then I should see that category.* And I should see the category parents.* And I should see the category descendants.* And I should see the site course.* And I should see no other courses.*/public function test_site_visibility_category_manager_child_category() {global $DB;$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$user = $generator->create_user();$enrolledcategory = $categories['A1'];$category = $categories['A1i'];$roles = $DB->get_records('role', [], '', 'shortname, id');$generator->role_assign($roles['manager']->id, $user->id, \context_coursecat::instance($enrolledcategory->id));$this->setUser($user);$calendar = \calendar_information::create(time(), SITEID, $category->id);$this->assertCount(1, $calendar->courses);$this->assertCount(3, $calendar->categories);$this->assertEquals(SITEID, $calendar->courseid);$this->assertEquals(SITEID, reset($calendar->courses));$this->assertArrayHasKey($categories['A']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1i']->id, array_flip($calendar->categories));$this->assertEquals(\context_coursecat::instance($category->id), $calendar->context);}/*** Given a user has an enrolment in a single course.* And I ask for the site information.* Then I should see the site.* And I should see the course I am enrolled in.* And I should see the category that my enrolled course is in.* And I should see the parents of the category that my enrolled course is in.*/public function test_site_visibility_single_course_site() {$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$user = $generator->create_user();$course = $courses['A1.1'];$category = \core_course_category::get($course->category);$wrongcategory = $categories['B1'];$generator->enrol_user($user->id, $course->id);$this->setUser($user);// Viewing the site as a whole.// Should see all courses that this user is enrolled in, and their// categories, and those categories parents.$calendar = \calendar_information::create(time(), SITEID, null);$this->assertCount(2, $calendar->courses);$this->assertCount(2, $calendar->categories);$this->assertEquals(SITEID, $calendar->courseid);$this->assertArrayHasKey($course->id, array_flip($calendar->courses));$this->assertArrayHasKey(SITEID, array_flip($calendar->courses));$this->assertArrayHasKey($categories['A']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1']->id, array_flip($calendar->categories));$this->assertEquals(\context_system::instance(), $calendar->context);}/*** Given a user has an enrolment in a single course.* And I ask for the course information.* Then I should see the site.* And I should see that course.* And I should see the category of that course.* And I should see the parents of that course category.*/public function test_site_visibility_single_course_course_course() {$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$user = $generator->create_user();$course = $courses['A1.1'];$category = \core_course_category::get($course->category);$wrongcategory = $categories['B1'];$generator->enrol_user($user->id, $course->id);$this->setUser($user);$time = time();// Viewing the course calendar.// Should see just this course, and all parent categories.$calendar = \calendar_information::create($time, $course->id, null);$this->assertCount(2, $calendar->courses);$this->assertCount(2, $calendar->categories);$this->assertEquals($course->id, $calendar->courseid);$this->assertArrayHasKey($course->id, array_flip($calendar->courses));$this->assertArrayHasKey(SITEID, array_flip($calendar->courses));$this->assertArrayHasKey($categories['A']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1']->id, array_flip($calendar->categories));$this->assertEquals(\context_course::instance($course->id), $calendar->context);// Viewing the course calendar while specifying the category too.// The category is essentially ignored. No change expected.$calendarwithcategory = \calendar_information::create($time, $course->id, $category->id);$this->assertEquals($calendar, $calendarwithcategory);// Viewing the course calendar while specifying the wrong category.// The category is essentially ignored. No change expected.$calendarwithwrongcategory = \calendar_information::create($time, $course->id, $wrongcategory->id);$this->assertEquals($calendar, $calendarwithwrongcategory);}/*** Given a user has an enrolment in a single course.* And I ask for the category information for the category my course is in.* Then I should see that category.* And I should see the category parents.* And I should see the category descendants.* And I should see the site.* And I should see my course.* And I should see no other courses.* And I should see no categories.*/public function test_site_visibility_single_course_category() {$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$user = $generator->create_user();$course = $courses['A1.1'];$category = \core_course_category::get($course->category);$generator->enrol_user($user->id, $course->id);$this->setUser($user);// Viewing the category calendar.// Should see all courses that this user is enrolled in within this// category, plus the site course, plus the category that course is// in and it's parents, and it's children.$calendar = \calendar_information::create(time(), SITEID, $category->id);$this->assertCount(2, $calendar->courses);$this->assertCount(4, $calendar->categories);$this->assertEquals(SITEID, $calendar->courseid);$this->assertArrayHasKey($course->id, array_flip($calendar->courses));$this->assertArrayHasKey(SITEID, array_flip($calendar->courses));$this->assertArrayHasKey($categories['A']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1i']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1ii']->id, array_flip($calendar->categories));$this->assertEquals(\context_coursecat::instance($category->id), $calendar->context);}/*** Given a user has an enrolment in a single course.* And I ask for the category information for the parent of the category my course is in.* Then I should see that category.* And I should see the category parents.* And I should see the category descendants.* And I should see the site.* And I should see my course.* And I should see no other courses.* And I should see no categories.*/public function test_site_visibility_single_course_parent_category() {$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$user = $generator->create_user();$course = $courses['A1.1'];$category = \core_course_category::get($course->category);$generator->enrol_user($user->id, $course->id);$this->setUser($user);// Viewing the category calendar.// Should see all courses that this user is enrolled in within this// category, plus the site course, plus the category that course is// in and it's parents, and it's children.$calendar = \calendar_information::create(time(), SITEID, $category->parent);$this->assertCount(2, $calendar->courses);$this->assertCount(7, $calendar->categories);$this->assertEquals(SITEID, $calendar->courseid);$this->assertArrayHasKey($course->id, array_flip($calendar->courses));$this->assertArrayHasKey(SITEID, array_flip($calendar->courses));$this->assertArrayHasKey($categories['A']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1i']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1ii']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A2']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A2i']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A2ii']->id, array_flip($calendar->categories));$this->assertEquals(\context_coursecat::instance($category->parent), $calendar->context);}/*** Given a user has an enrolment in a single course.* And I ask for the category information for the sibling of the category my course is in.* Then I should see that category.* And I should see the category parents.* And I should see the category descendants.* And I should see the site.* And I should see my course.* And I should see no other courses.* And I should see no categories.*/public function test_site_visibility_single_course_sibling_category() {$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$user = $generator->create_user();$course = $courses['A1.1'];$category = $categories['A2'];$generator->enrol_user($user->id, $course->id);$this->setUser($user);// Viewing the category calendar.// Should see all courses that this user is enrolled in within this// category, plus the site course, plus the category that course is// in and it's parents, and it's children.$calendar = \calendar_information::create(time(), SITEID, $category->id);$this->assertCount(1, $calendar->courses);$this->assertCount(4, $calendar->categories);$this->assertEquals(SITEID, $calendar->courseid);$this->assertArrayHasKey(SITEID, array_flip($calendar->courses));$this->assertArrayHasKey($categories['A']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A2']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A2i']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A2ii']->id, array_flip($calendar->categories));$this->assertEquals(\context_coursecat::instance($category->id), $calendar->context);}/*** Given a user has an enrolment in a single course.* And I ask for the category information for a different category to the one my course is in.* Then I should see that category.* And I should see the category parents.* And I should see the category descendants.* And I should see the site.* And I should see not see my course.* And I should see no other courses.* And I should see no categories.*/public function test_site_visibility_single_course_different_category() {$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$user = $generator->create_user();$course = $courses['A1.1'];$category = \core_course_category::get($course->category);$wrongcategory = $categories['B1'];$generator->enrol_user($user->id, $course->id);$this->setUser($user);// Viewing the category calendar for a category the user doesn't have any enrolments in.// Should see that category, and all categories underneath it.$calendar = \calendar_information::create(time(), SITEID, $wrongcategory->id);$this->assertCount(1, $calendar->courses);$this->assertCount(4, $calendar->categories);$this->assertEquals(SITEID, $calendar->courseid);$this->assertArrayHasKey(SITEID, array_flip($calendar->courses));$this->assertArrayHasKey($categories['B']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['B1']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['B1i']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['B1ii']->id, array_flip($calendar->categories));$this->assertEquals(\context_coursecat::instance($wrongcategory->id), $calendar->context);}/*** Given a user has an enrolment in two courses in the same category.* And I ask for the site information.* Then I should see the site.* And I should see the course I am enrolled in.* And I should see the category that my enrolled course is in.* And I should see the parents of the category that my enrolled course is in.*/public function test_site_visibility_two_courses_one_category_site() {$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$user = $generator->create_user();$coursea = $courses['A.1'];$courseb = $courses['A.2'];$category = \core_course_category::get($coursea->category);$wrongcategory = $categories['B1'];$generator->enrol_user($user->id, $coursea->id);$generator->enrol_user($user->id, $courseb->id);$this->setUser($user);// Viewing the site azs a whole.// Should see all courses that this user is enrolled in.$calendar = \calendar_information::create(time(), SITEID, null);$this->assertCount(3, $calendar->courses);$this->assertCount(1, $calendar->categories);$this->assertEquals(SITEID, $calendar->courseid);$this->assertArrayHasKey(SITEID, array_flip($calendar->courses));$this->assertArrayHasKey($coursea->id, array_flip($calendar->courses));$this->assertArrayHasKey($courseb->id, array_flip($calendar->courses));$this->assertEquals(\context_system::instance(), $calendar->context);}/*** Given a user has an enrolment in two courses in the same category.* And I ask for the course information.* Then I should see the site.* And I should see that course.* And I should see the category that my enrolled courses are in.* And I should see the parents of the category that my enrolled course are in.*/public function test_site_visibility_two_courses_one_category_course() {$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$user = $generator->create_user();$coursea = $courses['A.1'];$courseb = $courses['A.2'];$category = \core_course_category::get($coursea->category);$wrongcategory = $categories['B1'];$generator->enrol_user($user->id, $coursea->id);$generator->enrol_user($user->id, $courseb->id);$this->setUser($user);$time = time();// Viewing the course calendar.// Should see all courses that this user is enrolled in.$calendar = \calendar_information::create($time, $coursea->id, null);$this->assertCount(2, $calendar->courses);$this->assertCount(1, $calendar->categories);$this->assertEquals($coursea->id, $calendar->courseid);$this->assertArrayHasKey($coursea->id, array_flip($calendar->courses));$this->assertArrayHasKey(SITEID, array_flip($calendar->courses));$this->assertEquals(\context_course::instance($coursea->id), $calendar->context);// Viewing the course calendar while specifying the category too.// The category is essentially ignored. No change expected.$calendarwithcategory = \calendar_information::create($time, $coursea->id, $category->id);$this->assertEquals($calendar, $calendarwithcategory);// Viewing the course calendar while specifying the wrong category.// The category is essentially ignored. No change expected.$calendarwithwrongcategory = \calendar_information::create($time, $coursea->id, $wrongcategory->id);$this->assertEquals($calendar, $calendarwithwrongcategory);}/*** Given a user has an enrolment in two courses in the same category.* And I ask for the course information of the second course.* Then I should see the site.* And I should see that course.* And I should see the category that my enrolled courses are in.* And I should see the parents of the category that my enrolled course are in.*/public function test_site_visibility_two_courses_one_category_courseb() {$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$user = $generator->create_user();$coursea = $courses['A.1'];$courseb = $courses['A.2'];$category = \core_course_category::get($coursea->category);$wrongcategory = $categories['B1'];$generator->enrol_user($user->id, $coursea->id);$generator->enrol_user($user->id, $courseb->id);$this->setUser($user);$time = time();// Viewing the other course calendar.// Should see all courses that this user is enrolled in.$calendar = \calendar_information::create($time, $courseb->id, null);$this->assertCount(2, $calendar->courses);$this->assertCount(1, $calendar->categories);$this->assertEquals($courseb->id, $calendar->courseid);$this->assertArrayHasKey($courseb->id, array_flip($calendar->courses));$this->assertArrayNotHasKey($coursea->id, array_flip($calendar->courses));$this->assertArrayHasKey(SITEID, array_flip($calendar->courses));$this->assertEquals(\context_course::instance($courseb->id), $calendar->context);// Viewing the course calendar while specifying the category too.// The category is essentially ignored. No change expected.$calendarwithcategory = \calendar_information::create($time, $courseb->id, $category->id);$this->assertEquals($calendar, $calendarwithcategory);// Viewing the course calendar while specifying the wrong category.// The category is essentially ignored. No change expected.$calendarwithcategory = \calendar_information::create($time, $courseb->id, $wrongcategory->id);$this->assertEquals($calendar, $calendarwithcategory);}/*** Given a user has an enrolment in two courses in the same category.* And I ask for the category information.* Then I should see the site.* And I should see that course.* And I should see the category that my enrolled courses are in.* And I should see the parents of the category that my enrolled course are in.*/public function test_site_visibility_two_courses_one_category_category() {$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$user = $generator->create_user();$coursea = $courses['A.1'];$courseb = $courses['A.2'];$category = \core_course_category::get($coursea->category);$wrongcategory = $categories['B1'];$generator->enrol_user($user->id, $coursea->id);$generator->enrol_user($user->id, $courseb->id);$this->setUser($user);// Viewing the category calendar.// Should see all courses that this user is enrolled in.$calendar = \calendar_information::create(time(), SITEID, $category->id);$this->assertCount(3, $calendar->courses);$this->assertCount(7, $calendar->categories);$this->assertEquals(SITEID, $calendar->courseid);$this->assertArrayHasKey($coursea->id, array_flip($calendar->courses));$this->assertArrayHasKey($courseb->id, array_flip($calendar->courses));$this->assertArrayHasKey(SITEID, array_flip($calendar->courses));$this->assertEquals(\context_coursecat::instance($category->id), $calendar->context);}/*** Given a user has an enrolment in two courses in the same category.* And I ask for the categoy information of a different course.* Then I should see the site.* And I should see that course.* And I should see the category that my enrolled courses are in.* And I should see the parents of the category that my enrolled course are in.*/public function test_site_visibility_two_courses_one_category_othercategory() {$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$user = $generator->create_user();$coursea = $courses['A.1'];$courseb = $courses['A.2'];$category = \core_course_category::get($coursea->category);$wrongcategory = $categories['B1'];$generator->enrol_user($user->id, $coursea->id);$generator->enrol_user($user->id, $courseb->id);$this->setUser($user);// Viewing the category calendar for a category the user doesn't have any enrolments in.// Should see that category, and all categories underneath it.$calendar = \calendar_information::create(time(), SITEID, $wrongcategory->id);$this->assertCount(1, $calendar->courses);$this->assertCount(4, $calendar->categories);$this->assertEquals(SITEID, $calendar->courseid);$this->assertArrayHasKey(SITEID, array_flip($calendar->courses));$this->assertEquals(\context_coursecat::instance($wrongcategory->id), $calendar->context);}/*** Given a user has an enrolment in two courses in the separate category.* And I ask for the site informatino.* Then I should see the site.* And I should see both course.* And I should see the categories that my enrolled courses are in.* And I should see the parents of those categories.*/public function test_site_visibility_two_courses_two_categories_site() {$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$user = $generator->create_user();$coursea = $courses['A.1'];$courseb = $courses['B.1'];$categorya = \core_course_category::get($coursea->category);$categoryb = \core_course_category::get($courseb->category);$wrongcategory = $categories['C'];$generator->enrol_user($user->id, $coursea->id);$generator->enrol_user($user->id, $courseb->id);$this->setUser($user);// Viewing the site azs a whole.// Should see all courses that this user is enrolled in.$calendar = \calendar_information::create(time(), SITEID, null);$this->assertCount(3, $calendar->courses);$this->assertCount(2, $calendar->categories);$this->assertEquals(SITEID, $calendar->courseid);$this->assertArrayHasKey($coursea->id, array_flip($calendar->courses));$this->assertArrayHasKey($courseb->id, array_flip($calendar->courses));$this->assertArrayHasKey(SITEID, array_flip($calendar->courses));$this->assertEquals(\context_system::instance(), $calendar->context);}/*** Given a user has an enrolment in two courses in the separate category.* And I ask for the course information for one of those courses.* Then I should see the site.* And I should see one of the courses.* And I should see the categories that my enrolled courses are in.* And I should see the parents of those categories.*/public function test_site_visibility_two_courses_two_categories_coursea() {$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$user = $generator->create_user();$coursea = $courses['A.1'];$courseb = $courses['B.1'];$categorya = \core_course_category::get($coursea->category);$categoryb = \core_course_category::get($courseb->category);$wrongcategory = $categories['C'];$generator->enrol_user($user->id, $coursea->id);$generator->enrol_user($user->id, $courseb->id);$this->setUser($user);$time = time();// Viewing the course calendar.// Should see all courses that this user is enrolled in.$calendar = \calendar_information::create($time, $coursea->id, null);$this->assertCount(2, $calendar->courses);$this->assertCount(1, $calendar->categories);$this->assertEquals($coursea->id, $calendar->courseid);$this->assertArrayHasKey($coursea->id, array_flip($calendar->courses));$this->assertArrayHasKey(SITEID, array_flip($calendar->courses));$this->assertEquals(\context_course::instance($coursea->id), $calendar->context);// Viewing the course calendar while specifying the categorya too.// The categorya is essentially ignored. No change expected.$calendarwithcategory = \calendar_information::create($time, $coursea->id, $categorya->id);$this->assertEquals($calendar, $calendarwithcategory);// Viewing the course calendar while specifying the wrong categorya.// The categorya is essentially ignored. No change expected.$calendarwithwrongcategory = \calendar_information::create($time, $coursea->id, $wrongcategory->id);$this->assertEquals($calendar, $calendarwithwrongcategory);}/*** Given a user has an enrolment in two courses in the separate category.* And I ask for the course information for the second of those courses.* Then I should see the site.* And I should see one of the courses.* And I should see the categories that my enrolled courses are in.* And I should see the parents of those categories.*/public function test_site_visibility_two_courses_two_categories_courseb() {$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$user = $generator->create_user();$coursea = $courses['A.1'];$courseb = $courses['B.1'];$categorya = \core_course_category::get($coursea->category);$categoryb = \core_course_category::get($courseb->category);$wrongcategory = $categories['C'];$generator->enrol_user($user->id, $coursea->id);$generator->enrol_user($user->id, $courseb->id);$this->setUser($user);$time = time();// Viewing the other course calendar.// Should see all courses that this user is enrolled in.$calendar = \calendar_information::create($time, $courseb->id, null);$this->assertCount(2, $calendar->courses);$this->assertCount(1, $calendar->categories);$this->assertEquals($courseb->id, $calendar->courseid);$this->assertArrayHasKey($courseb->id, array_flip($calendar->courses));$this->assertArrayNotHasKey($coursea->id, array_flip($calendar->courses));$this->assertArrayHasKey(SITEID, array_flip($calendar->courses));$this->assertEquals(\context_course::instance($courseb->id), $calendar->context);// Viewing the other course calendar while specifying the categorya too.// The categorya is essentially ignored. No change expected.$calendarwithcategory = \calendar_information::create($time, $courseb->id, $categoryb->id);$this->assertEquals($calendar, $calendarwithcategory);// Viewing the other course calendar while specifying the wrong categorya.// The categorya is essentially ignored. No change expected.$calendarwithwrongcategory = \calendar_information::create($time, $courseb->id, $wrongcategory->id);$this->assertEquals($calendar, $calendarwithwrongcategory);}/*** Given a user has an enrolment in two courses in separate categories.* And I ask for the category information.* Then I should see the site.* And I should see one of the courses.* And I should see the categories that my enrolled courses are in.* And I should see the parents of those categories.*/public function test_site_visibility_two_courses_two_categories_category() {$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$user = $generator->create_user();$coursea = $courses['A.1'];$courseb = $courses['B.1'];$categorya = \core_course_category::get($coursea->category);$categoryb = \core_course_category::get($courseb->category);$wrongcategory = $categories['C'];$generator->enrol_user($user->id, $coursea->id);$generator->enrol_user($user->id, $courseb->id);$this->setUser($user);// Viewing the categorya calendar.// Should see all courses that this user is enrolled in.$calendar = \calendar_information::create(time(), SITEID, $categorya->id);$this->assertCount(2, $calendar->courses);$this->assertCount(7, $calendar->categories);$this->assertEquals(SITEID, $calendar->courseid);$this->assertArrayHasKey($coursea->id, array_flip($calendar->courses));$this->assertArrayHasKey(SITEID, array_flip($calendar->courses));$this->assertArrayNotHasKey($courseb->id, array_flip($calendar->courses));$this->assertArrayHasKey($categories['A']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1i']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1ii']->id, array_flip($calendar->categories));$this->assertEquals(\context_coursecat::instance($categorya->id), $calendar->context);}/*** Given a user has an enrolment in two courses in the separate category.* And I ask for the category information of a different category.* Then I should see the site.* And I should see one of the courses.* And I should see the categories that my enrolled courses are in.* And I should see the parents of those categories.*/public function test_site_visibility_two_courses_two_categories_different_category() {$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$user = $generator->create_user();$coursea = $courses['A.1'];$courseb = $courses['B.1'];$categorya = \core_course_category::get($coursea->category);$categoryb = \core_course_category::get($courseb->category);$wrongcategory = $categories['C'];$generator->enrol_user($user->id, $coursea->id);$generator->enrol_user($user->id, $courseb->id);$this->setUser($user);// Viewing the categorya calendar for a categorya the user doesn't have any enrolments in.// Should see that categorya, and all categories underneath it.$calendar = \calendar_information::create(time(), SITEID, $wrongcategory->id);$this->assertCount(1, $calendar->courses);$this->assertCount(1, $calendar->categories);$this->assertEquals(SITEID, $calendar->courseid);$this->assertArrayHasKey(SITEID, array_flip($calendar->courses));$this->assertEquals(\context_coursecat::instance($wrongcategory->id), $calendar->context);}/*** Given an admin user with no enrolments.* And I ask for the site information.* Then I should see the site.* And I should see no other courses.* And I should see no categories.*/public function test_site_visibility_admin_user() {$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$this->setAdminUser();$calendar = \calendar_information::create(time(), SITEID, null);$this->assertCount(1, $calendar->courses);$this->assertCount(0, $calendar->categories);$this->assertEquals(SITEID, $calendar->courseid);$this->assertEquals(SITEID, reset($calendar->courses));$this->assertEquals(\context_system::instance(), $calendar->context);}/*** Given an admin user with a single enrolments.* And I ask for the site information.* Then I should see the site.* And I should see the course I am enrolled in* And I should see the category of that course.* And I should see the parents of that course category.* And I should see no other courses.* And I should see no other categories.*/public function test_site_visibility_admin_user_with_enrolment_site() {global $USER;$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$course = $courses['A1.1'];$category = \core_course_category::get($course->category);$this->setAdminUser();$generator->enrol_user($USER->id, $course->id);$calendar = \calendar_information::create(time(), SITEID, null);$this->assertCount(2, $calendar->courses);$this->assertCount(2, $calendar->categories);$this->assertArrayHasKey(SITEID, array_flip($calendar->courses));$this->assertArrayHasKey($course->id, array_flip($calendar->courses));$this->assertArrayHasKey($categories['A']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1']->id, array_flip($calendar->categories));$this->assertEquals(\context_system::instance(), $calendar->context);}/*** Given an admin user with a single enrolments.* And I ask for the course information.* Then I should see the site.* And I should see the course I am enrolled in* And I should see the category of that course.* And I should see the parents of that course category.*/public function test_site_visibility_admin_user_with_enrolment_course() {global $USER;$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$course = $courses['A1.1'];$category = \core_course_category::get($course->category);$wrongcategory = $categories['B1'];$this->setAdminUser();$generator->enrol_user($USER->id, $course->id);$time = time();$calendar = \calendar_information::create($time, $course->id, null);$this->assertCount(2, $calendar->courses);$this->assertCount(2, $calendar->categories);$this->assertArrayHasKey(SITEID, array_flip($calendar->courses));$this->assertArrayHasKey($course->id, array_flip($calendar->courses));$this->assertArrayHasKey($categories['A']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1']->id, array_flip($calendar->categories));$this->assertEquals(\context_course::instance($course->id), $calendar->context);// Viewing the course calendar while specifying the category too.// The category is essentially ignored. No change expected.$calendarwithcategory = \calendar_information::create($time, $course->id, $category->id);$this->assertEquals($calendar, $calendarwithcategory);// Viewing the course calendar while specifying the wrong category.// The category is essentially ignored. No change expected.$calendarwithwrongcategory = \calendar_information::create($time, $course->id, $wrongcategory->id);$this->assertEquals($calendar, $calendarwithwrongcategory);}/*** Given an admin user with a single enrolments.* And I ask for the category information for the category my course is in.* Then I should see that category.* And I should see the category parents.* And I should see the category descendants.* And I should see the site.* And I should see my course.* And I should see no other courses.* And I should see no categories.*/public function test_site_visibility_admin_user_with_enrolment_category() {global $USER;$this->resetAfterTest();list ($courses, $categories) = $this->mock_structure();$generator = $this->getDataGenerator();$course = $courses['A1.1'];$category = \core_course_category::get($course->category);$wrongcategory = $categories['B1'];$this->setAdminUser();$generator->enrol_user($USER->id, $course->id);$calendar = \calendar_information::create(time(), SITEID, $category->id);$this->assertCount(2, $calendar->courses);$this->assertCount(4, $calendar->categories);$this->assertArrayHasKey(SITEID, array_flip($calendar->courses));$this->assertArrayHasKey($course->id, array_flip($calendar->courses));$this->assertArrayHasKey($categories['A']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1i']->id, array_flip($calendar->categories));$this->assertArrayHasKey($categories['A1ii']->id, array_flip($calendar->categories));$this->assertEquals(\context_coursecat::instance($category->id), $calendar->context);}}