2 // This file is part of Moodle - http://moodle.org/
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.
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 namespace mod_glossary
;
20 * Concept fetching and caching tests.
22 * @package mod_glossary
24 * @copyright 2014 Petr Skoda
25 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
27 class concept_cache_test
extends \advanced_testcase
{
29 * Test convect fetching.
31 public function test_concept_fetching(): void
{
33 $this->resetAfterTest(true);
34 $this->setAdminUser();
36 $CFG->glossary_linkbydefault
= 1;
37 $CFG->glossary_linkentries
= 0;
39 // Create a test courses.
40 $course1 = $this->getDataGenerator()->create_course();
41 $course2 = $this->getDataGenerator()->create_course();
42 $site = $DB->get_record('course', array('id' => SITEID
));
45 $glossary1a = $this->getDataGenerator()->create_module('glossary',
46 array('course' => $course1->id
, 'mainglossary' => 1, 'usedynalink' => 1));
47 $glossary1b = $this->getDataGenerator()->create_module('glossary',
48 array('course' => $course1->id
, 'mainglossary' => 1, 'usedynalink' => 1));
49 $glossary1c = $this->getDataGenerator()->create_module('glossary',
50 array('course' => $course1->id
, 'mainglossary' => 1, 'usedynalink' => 0));
51 $glossary2 = $this->getDataGenerator()->create_module('glossary',
52 array('course' => $course2->id
, 'mainglossary' => 1, 'usedynalink' => 1));
53 $glossary3 = $this->getDataGenerator()->create_module('glossary',
54 array('course' => $site->id
, 'mainglossary' => 1, 'usedynalink' => 1, 'globalglossary' => 1));
56 /** @var mod_glossary_generator $generator */
57 $generator = $this->getDataGenerator()->get_plugin_generator('mod_glossary');
58 $entry1a1 = $generator->create_content($glossary1a, array('concept' => 'first', 'usedynalink' => 1), array('prvni', 'erste'));
59 $entry1a2 = $generator->create_content($glossary1a, array('concept' => 'A&B', 'usedynalink' => 1));
60 $entry1a3 = $generator->create_content($glossary1a, array('concept' => 'neee', 'usedynalink' => 0));
61 $entry1b1 = $generator->create_content($glossary1b, array('concept' => 'second', 'usedynalink' => 1));
62 $entry1c1 = $generator->create_content($glossary1c, array('concept' => 'third', 'usedynalink' => 1));
63 $entry31 = $generator->create_content($glossary3, array('concept' => 'global', 'usedynalink' => 1), array('globalni'));
65 $cat1 = $generator->create_category($glossary1a, array('name' => 'special'), array($entry1a1, $entry1a2));
67 \mod_glossary\local\concept_cache
::reset_caches();
69 $concepts1 = \mod_glossary\local\concept_cache
::get_concepts($course1->id
);
70 $this->assertCount(3, $concepts1[0]);
71 $this->arrayHasKey($concepts1[0], $glossary1a->id
);
72 $this->arrayHasKey($concepts1[0], $glossary1b->id
);
73 $this->arrayHasKey($concepts1[0], $glossary3->id
);
74 $this->assertCount(3, $concepts1[1]);
75 $this->arrayHasKey($concepts1[1], $glossary1a->id
);
76 $this->arrayHasKey($concepts1[1], $glossary1b->id
);
77 $this->arrayHasKey($concepts1[0], $glossary3->id
);
78 $this->assertCount(5, $concepts1[1][$glossary1a->id
]);
79 foreach($concepts1[1][$glossary1a->id
] as $concept) {
80 $this->assertSame(array('id', 'glossaryid', 'concept', 'casesensitive', 'category', 'fullmatch'), array_keys((array)$concept));
81 if ($concept->concept
=== 'first') {
82 $this->assertEquals($entry1a1->id
, $concept->id
);
83 $this->assertEquals($glossary1a->id
, $concept->glossaryid
);
84 $this->assertEquals(0, $concept->category
);
85 } else if ($concept->concept
=== 'prvni') {
86 $this->assertEquals($entry1a1->id
, $concept->id
);
87 $this->assertEquals($glossary1a->id
, $concept->glossaryid
);
88 $this->assertEquals(0, $concept->category
);
89 } else if ($concept->concept
=== 'erste') {
90 $this->assertEquals($entry1a1->id
, $concept->id
);
91 $this->assertEquals($glossary1a->id
, $concept->glossaryid
);
92 $this->assertEquals(0, $concept->category
);
93 } else if ($concept->concept
=== 'A&B') {
94 $this->assertEquals($entry1a2->id
, $concept->id
);
95 $this->assertEquals($glossary1a->id
, $concept->glossaryid
);
96 $this->assertEquals(0, $concept->category
);
97 } else if ($concept->concept
=== 'special') {
98 $this->assertEquals($cat1->id
, $concept->id
);
99 $this->assertEquals($glossary1a->id
, $concept->glossaryid
);
100 $this->assertEquals(1, $concept->category
);
102 $this->fail('Unexpected concept: ' . $concept->concept
);
105 $this->assertCount(1, $concepts1[1][$glossary1b->id
]);
106 foreach($concepts1[1][$glossary1b->id
] as $concept) {
107 $this->assertSame(array('id', 'glossaryid', 'concept', 'casesensitive', 'category', 'fullmatch'), array_keys((array)$concept));
108 if ($concept->concept
=== 'second') {
109 $this->assertEquals($entry1b1->id
, $concept->id
);
110 $this->assertEquals($glossary1b->id
, $concept->glossaryid
);
111 $this->assertEquals(0, $concept->category
);
113 $this->fail('Unexpected concept: ' . $concept->concept
);
116 $this->assertCount(2, $concepts1[1][$glossary3->id
]);
117 foreach($concepts1[1][$glossary3->id
] as $concept) {
118 $this->assertSame(array('id', 'glossaryid', 'concept', 'casesensitive', 'category', 'fullmatch'), array_keys((array)$concept));
119 if ($concept->concept
=== 'global') {
120 $this->assertEquals($entry31->id
, $concept->id
);
121 $this->assertEquals($glossary3->id
, $concept->glossaryid
);
122 $this->assertEquals(0, $concept->category
);
123 } else if ($concept->concept
=== 'globalni') {
124 $this->assertEquals($entry31->id
, $concept->id
);
125 $this->assertEquals($glossary3->id
, $concept->glossaryid
);
126 $this->assertEquals(0, $concept->category
);
128 $this->fail('Unexpected concept: ' . $concept->concept
);
132 $concepts3 = \mod_glossary\local\concept_cache
::get_concepts($site->id
);
133 $this->assertCount(1, $concepts3[0]);
134 $this->arrayHasKey($concepts3[0], $glossary3->id
);
135 $this->assertCount(1, $concepts3[1]);
136 $this->arrayHasKey($concepts3[0], $glossary3->id
);
137 foreach($concepts3[1][$glossary3->id
] as $concept) {
138 $this->assertSame(array('id', 'glossaryid', 'concept', 'casesensitive', 'category', 'fullmatch'), array_keys((array)$concept));
139 if ($concept->concept
=== 'global') {
140 $this->assertEquals($entry31->id
, $concept->id
);
141 $this->assertEquals($glossary3->id
, $concept->glossaryid
);
142 $this->assertEquals(0, $concept->category
);
143 } else if ($concept->concept
=== 'globalni') {
144 $this->assertEquals($entry31->id
, $concept->id
);
145 $this->assertEquals($glossary3->id
, $concept->glossaryid
);
146 $this->assertEquals(0, $concept->category
);
148 $this->fail('Unexpected concept: ' . $concept->concept
);
152 $concepts2 = \mod_glossary\local\concept_cache
::get_concepts($course2->id
);
153 $this->assertEquals($concepts3, $concepts2);
155 // Test uservisible flag.
156 set_config('enableavailability', 1);
157 $glossary1d = $this->getDataGenerator()->create_module('glossary',
158 array('course' => $course1->id
, 'mainglossary' => 1, 'usedynalink' => 1,
159 'availability' => json_encode(\core_availability\tree
::get_root_json(
160 array(\availability_group\condition
::get_json())))));
161 $entry1d1 = $generator->create_content($glossary1d, array('concept' => 'membersonly', 'usedynalink' => 1));
162 $user = $this->getDataGenerator()->create_user();
163 $this->getDataGenerator()->enrol_user($user->id
, $course1->id
);
164 $this->getDataGenerator()->enrol_user($user->id
, $course2->id
);
165 \mod_glossary\local\concept_cache
::reset_caches();
166 $concepts1 = \mod_glossary\local\concept_cache
::get_concepts($course1->id
);
167 $this->assertCount(4, $concepts1[0]);
168 $this->assertCount(4, $concepts1[1]);
169 $this->setUser($user);
170 \course_modinfo
::clear_instance_cache();
171 \mod_glossary\local\concept_cache
::reset_caches();
172 $concepts1 = \mod_glossary\local\concept_cache
::get_concepts($course1->id
);
173 $this->assertCount(3, $concepts1[0]);
174 $this->assertCount(3, $concepts1[1]);