MDL-63854 competencies, themes: misplaced dropdown arrows
[moodle.git] / course / tests / courseformat_test.php
blobdd7b1a94dfe5f80a5bb419400e98c505790927be
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
17 /**
18 * Course related unit tests
20 * @package core_course
21 * @copyright 2014 Marina Glancy
22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25 defined('MOODLE_INTERNAL') || die();
27 global $CFG;
28 require_once($CFG->dirroot . '/course/lib.php');
29 require_once($CFG->dirroot . '/course/tests/fixtures/format_theunittest.php');
31 class core_course_courseformat_testcase extends advanced_testcase {
32 public function test_available_hook() {
33 global $DB;
34 $this->resetAfterTest();
36 // Generate a course with two sections (0 and 1) and two modules. Course format is set to 'theunittest'.
37 $generator = $this->getDataGenerator();
38 $course1 = $generator->create_course(array('format' => 'theunittest'));
39 $this->assertEquals('theunittest', $course1->format);
40 course_create_sections_if_missing($course1, array(0, 1));
41 $assign0 = $generator->create_module('assign', array('course' => $course1, 'section' => 0));
42 $assign1 = $generator->create_module('assign', array('course' => $course1, 'section' => 1));
43 $assign2 = $generator->create_module('assign', array('course' => $course1, 'section' => 0, 'visible' => 0));
45 // Create a courseoverview role based on the student role.
46 $roleattr = array('name' => 'courseoverview', 'shortname' => 'courseoverview', 'archetype' => 'student');
47 $generator->create_role($roleattr);
49 // Create user student, editingteacher, teacher and courseoverview.
50 $student = $generator->create_user();
51 $teacher = $generator->create_user();
52 $editingteacher = $generator->create_user();
53 $courseoverviewuser = $generator->create_user();
55 // Enrol users into their roles.
56 $roleids = $DB->get_records_menu('role', null, '', 'shortname, id');
57 $generator->enrol_user($student->id, $course1->id, $roleids['student']);
58 $generator->enrol_user($teacher->id, $course1->id, $roleids['teacher']);
59 $generator->enrol_user($editingteacher->id, $course1->id, $roleids['editingteacher']);
60 $generator->enrol_user($courseoverviewuser->id, $course1->id, $roleids['courseoverview']);
62 // Remove the ignoreavailabilityrestrictions from the teacher role.
63 role_change_permission($roleids['teacher'], context_system::instance(0),
64 'moodle/course:ignoreavailabilityrestrictions', CAP_PREVENT);
66 // Allow the courseoverview role to ingore available restriction.
67 role_change_permission($roleids['courseoverview'], context_system::instance(0),
68 'moodle/course:ignoreavailabilityrestrictions', CAP_ALLOW);
70 // Make sure that initially both sections and both modules are available and visible for a student.
71 $modinfostudent = get_fast_modinfo($course1, $student->id);
72 $this->assertTrue($modinfostudent->get_section_info(1)->available);
73 $this->assertTrue($modinfostudent->get_cm($assign0->cmid)->available);
74 $this->assertTrue($modinfostudent->get_cm($assign0->cmid)->uservisible);
75 $this->assertTrue($modinfostudent->get_cm($assign1->cmid)->available);
76 $this->assertTrue($modinfostudent->get_cm($assign1->cmid)->uservisible);
77 $this->assertFalse($modinfostudent->get_cm($assign2->cmid)->uservisible);
79 // Set 'hideoddsections' for the course to 1.
80 // Section1 and assign1 will be unavailable, uservisible will be false for student and true for teacher.
81 $data = (object)array('id' => $course1->id, 'hideoddsections' => 1);
82 course_get_format($course1)->update_course_format_options($data);
83 $modinfostudent = get_fast_modinfo($course1, $student->id);
84 $this->assertFalse($modinfostudent->get_section_info(1)->available);
85 $this->assertEmpty($modinfostudent->get_section_info(1)->availableinfo);
86 $this->assertFalse($modinfostudent->get_section_info(1)->uservisible);
87 $this->assertTrue($modinfostudent->get_cm($assign0->cmid)->available);
88 $this->assertTrue($modinfostudent->get_cm($assign0->cmid)->uservisible);
89 $this->assertFalse($modinfostudent->get_cm($assign1->cmid)->available);
90 $this->assertFalse($modinfostudent->get_cm($assign1->cmid)->uservisible);
91 $this->assertFalse($modinfostudent->get_cm($assign2->cmid)->uservisible);
93 $modinfoteacher = get_fast_modinfo($course1, $teacher->id);
94 $this->assertFalse($modinfoteacher->get_section_info(1)->available);
95 $this->assertEmpty($modinfoteacher->get_section_info(1)->availableinfo);
96 $this->assertFalse($modinfoteacher->get_section_info(1)->uservisible);
97 $this->assertTrue($modinfoteacher->get_cm($assign0->cmid)->available);
98 $this->assertTrue($modinfoteacher->get_cm($assign0->cmid)->uservisible);
99 $this->assertFalse($modinfoteacher->get_cm($assign1->cmid)->available);
100 $this->assertFalse($modinfoteacher->get_cm($assign1->cmid)->uservisible);
101 $this->assertTrue($modinfoteacher->get_cm($assign2->cmid)->available);
102 $this->assertTrue($modinfoteacher->get_cm($assign2->cmid)->uservisible);
104 $modinfoteacher = get_fast_modinfo($course1, $editingteacher->id);
105 $this->assertFalse($modinfoteacher->get_section_info(1)->available);
106 $this->assertEmpty($modinfoteacher->get_section_info(1)->availableinfo);
107 $this->assertTrue($modinfoteacher->get_section_info(1)->uservisible);
108 $this->assertTrue($modinfoteacher->get_cm($assign0->cmid)->available);
109 $this->assertTrue($modinfoteacher->get_cm($assign0->cmid)->uservisible);
110 $this->assertFalse($modinfoteacher->get_cm($assign1->cmid)->available);
111 $this->assertTrue($modinfoteacher->get_cm($assign1->cmid)->uservisible);
112 $this->assertTrue($modinfoteacher->get_cm($assign2->cmid)->uservisible);
114 $modinfocourseoverview = get_fast_modinfo($course1, $courseoverviewuser->id);
115 $this->assertFalse($modinfocourseoverview->get_section_info(1)->available);
116 $this->assertEmpty($modinfocourseoverview->get_section_info(1)->availableinfo);
117 $this->assertTrue($modinfocourseoverview->get_section_info(1)->uservisible);
118 $this->assertTrue($modinfocourseoverview->get_cm($assign0->cmid)->available);
119 $this->assertTrue($modinfocourseoverview->get_cm($assign0->cmid)->uservisible);
120 $this->assertFalse($modinfocourseoverview->get_cm($assign1->cmid)->available);
121 $this->assertTrue($modinfocourseoverview->get_cm($assign1->cmid)->uservisible);
122 $this->assertFalse($modinfocourseoverview->get_cm($assign2->cmid)->uservisible);
124 // Set 'hideoddsections' for the course to 2.
125 // Section1 and assign1 will be unavailable, uservisible will be false for student and true for teacher.
126 // Property availableinfo will be not empty.
127 $data = (object)array('id' => $course1->id, 'hideoddsections' => 2);
128 course_get_format($course1)->update_course_format_options($data);
129 $modinfostudent = get_fast_modinfo($course1, $student->id);
130 $this->assertFalse($modinfostudent->get_section_info(1)->available);
131 $this->assertNotEmpty($modinfostudent->get_section_info(1)->availableinfo);
132 $this->assertFalse($modinfostudent->get_section_info(1)->uservisible);
133 $this->assertTrue($modinfostudent->get_cm($assign0->cmid)->available);
134 $this->assertTrue($modinfostudent->get_cm($assign0->cmid)->uservisible);
135 $this->assertFalse($modinfostudent->get_cm($assign1->cmid)->available);
136 $this->assertFalse($modinfostudent->get_cm($assign1->cmid)->uservisible);
138 $modinfoteacher = get_fast_modinfo($course1, $editingteacher->id);
139 $this->assertFalse($modinfoteacher->get_section_info(1)->available);
140 $this->assertNotEmpty($modinfoteacher->get_section_info(1)->availableinfo);
141 $this->assertTrue($modinfoteacher->get_section_info(1)->uservisible);
142 $this->assertTrue($modinfoteacher->get_cm($assign0->cmid)->available);
143 $this->assertTrue($modinfoteacher->get_cm($assign0->cmid)->uservisible);
144 $this->assertFalse($modinfoteacher->get_cm($assign1->cmid)->available);
145 $this->assertTrue($modinfoteacher->get_cm($assign1->cmid)->uservisible);
149 * Test for supports_news() with a course format plugin that doesn't define 'news_items' in default blocks.
151 public function test_supports_news() {
152 $this->resetAfterTest();
153 $format = course_get_format((object)['format' => 'testformat']);
154 $this->assertFalse($format->supports_news());
158 * Test for supports_news() for old course format plugins that defines 'news_items' in default blocks.
160 public function test_supports_news_legacy() {
161 $this->resetAfterTest();
162 $format = course_get_format((object)['format' => 'testlegacy']);
163 $this->assertTrue($format->supports_news());
167 * Test for get_view_url() to ensure that the url is only given for the correct cases
169 public function test_get_view_url() {
170 global $CFG;
171 $this->resetAfterTest();
173 $linkcoursesections = $CFG->linkcoursesections;
175 // Generate a course with two sections (0 and 1) and two modules. Course format is set to 'testformat'.
176 // This will allow us to test the default implementation of get_view_url.
177 $generator = $this->getDataGenerator();
178 $course1 = $generator->create_course(array('format' => 'testformat'));
179 course_create_sections_if_missing($course1, array(0, 1));
181 $data = (object)['id' => $course1->id];
182 $format = course_get_format($course1);
183 $format->update_course_format_options($data);
185 // In page.
186 $CFG->linkcoursesections = 0;
187 $this->assertNotEmpty($format->get_view_url(null));
188 $this->assertNotEmpty($format->get_view_url(0));
189 $this->assertNotEmpty($format->get_view_url(1));
190 $CFG->linkcoursesections = 1;
191 $this->assertNotEmpty($format->get_view_url(null));
192 $this->assertNotEmpty($format->get_view_url(0));
193 $this->assertNotEmpty($format->get_view_url(1));
195 // Navigation.
196 $CFG->linkcoursesections = 0;
197 $this->assertNull($format->get_view_url(1, ['navigation' => 1]));
198 $this->assertNull($format->get_view_url(0, ['navigation' => 1]));
199 $CFG->linkcoursesections = 1;
200 $this->assertNotEmpty($format->get_view_url(1, ['navigation' => 1]));
201 $this->assertNotEmpty($format->get_view_url(0, ['navigation' => 1]));
206 * Class format_testformat.
208 * A test class that simulates a course format that doesn't define 'news_items' in default blocks.
210 * @copyright 2016 Jun Pataleta <jun@moodle.com>
211 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
213 class format_testformat extends format_base {
215 * Returns the list of blocks to be automatically added for the newly created course.
217 * @return array
219 public function get_default_blocks() {
220 return [
221 BLOCK_POS_RIGHT => [],
222 BLOCK_POS_LEFT => []
228 * Class format_testlegacy.
230 * A test class that simulates old course formats that define 'news_items' in default blocks.
232 * @copyright 2016 Jun Pataleta <jun@moodle.com>
233 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
235 class format_testlegacy extends format_base {
237 * Returns the list of blocks to be automatically added for the newly created course.
239 * @return array
241 public function get_default_blocks() {
242 return [
243 BLOCK_POS_RIGHT => ['news_items'],
244 BLOCK_POS_LEFT => []