MDL-39571 repository_recent: query improvement
[moodle.git] / repository / recent / tests / lib_test.php
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.
13 //
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  * Unit test for recent repository
19  *
20  * @package repository_recent
21  *
22  * @author  Nathan Nguyen <nathannguyen@catalyst-au.net>
23  * @copyright  Catalyst IT
24  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25  */
27 defined('MOODLE_INTERNAL') || die();
29 global $CFG;
30 require_once($CFG->dirroot . '/repository/lib.php');
31 require_once($CFG->dirroot . '/files/externallib.php');
32 /**
33  * Unit test for recent repository
34  *
35  * @package repository_recent
36  *
37  * @author  Nathan Nguyen <nathannguyen@catalyst-au.net>
38  * @copyright  Catalyst IT
39  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
40  */
41 class repository_recent_lib_testcase extends advanced_testcase {
43     /** @var repository Recent repository */
44     private $repo;
46     /** @var context repository */
47     private $usercontext;
49     /**
50      * SetUp to create an repository instance.
51      */
52     protected function setUp() {
53         global $USER;
54         $this->setAdminUser();
55         $this->usercontext = context_user::instance($USER->id);
56         $repoid = $this->getDataGenerator()->create_repository('recent')->id;
57         $this->repo = repository::get_repository_by_id($repoid, $this->usercontext);
58     }
60     /**
61      * Test get listing
62      */
63     public function test_get_listing_with_duplicate_file() {
64         global $itemid;
65         $this->resetAfterTest(true);
67         // Set global itemid for draft file (file manager mockup).
68         $itemid = file_get_unused_draft_itemid();
70         // No recent file.
71         $filelist = $this->repo->get_listing()['list'];
72         $this->assertCount(0, $filelist);
74         // Create test file 1.
75         $this->create_test_file('TestFile1', 'draft', $itemid);
76         $filelist = $this->repo->get_listing()['list'];
77         $this->assertCount(1, $filelist);
79         // Due to create_test_file function, same filename means same content as the content is the filename hash.
80         $this->create_test_file('TestFile1', 'private');
81         $filelist = $this->repo->get_listing()['list'];
82         $this->assertCount(1, $filelist);
84         // Create test file 2, different area.
85         $this->create_test_file('TestFile2', 'private');
86         $filelist = $this->repo->get_listing()['list'];
87         $this->assertCount(2, $filelist);
88     }
90     /**
91      * Test get listing reference file
92      */
93     public function test_get_listing_with_reference_file() {
94         $this->resetAfterTest(true);
95         // Create test file 1.
96         $file1 = $this->create_test_file('TestFile1', 'private');
97         $filelist = $this->repo->get_listing()['list'];
98         $this->assertCount(1, $filelist);
100         // Create reference file.
101         $file2 = $this->create_reference_file($file1, 'TestFile2', 'private');
102         $filelist = $this->repo->get_listing()['list'];
103         $this->assertCount(1, $filelist);
105         // Delete reference.
106         $file2->delete_reference();
107         $filelist = $this->repo->get_listing()['list'];
108         $this->assertCount(2, $filelist);
109     }
111     /**
112      * Test number limit
113      */
114     public function test_get_listing_number_limit() {
115         $this->resetAfterTest(true);
116         $this->create_multiple_test_files('private', 75);
117         $filelist = $this->repo->get_listing()['list'];
118         $this->assertCount(50, $filelist);
120         // The number limit is set as property of the repo, so we need to create new repo instance.
121         set_config('recentfilesnumber', 100, 'recent');
122         $repoid = $this->getDataGenerator()->create_repository('recent')->id;
123         $repo = repository::get_repository_by_id($repoid, $this->usercontext);
124         $filelist = $repo->get_listing()['list'];
125         $this->assertCount(75, $filelist);
126     }
128     /**
129      * Test time limit
130      */
131     public function test_get_listing_time_limit() {
132         $this->resetAfterTest(true);
133         $this->create_multiple_test_files('private', 25);
134         $file1 = $this->create_test_file('TestFileTimeLimit', 'private');
135         // Set time modified back to a year ago.
136         $file1->set_timemodified(time() - YEARSECS);
138         // There is no time limit by default.
139         $filelist = $this->repo->get_listing()['list'];
140         $this->assertCount(26, $filelist);
142         // The time limit is set as property of the repo, so we need to create new repo instance.
143         set_config('recentfilestimelimit', 3600, 'recent');
144         $repoid = $this->getDataGenerator()->create_repository('recent')->id;
145         $repo = repository::get_repository_by_id($repoid, $this->usercontext);
146         $filelist = $repo->get_listing()['list'];
147         // Only get the recent files in the last hour.
148         $this->assertCount(25, $filelist);
149     }
151     /**
152      * Create multiple test file
153      *
154      * @param string $filearea file area
155      * @param int $numberoffiles number of files to be created
156      */
157     private function create_multiple_test_files($filearea, $numberoffiles) {
158         for ($i = 0; $i < $numberoffiles; ++$i) {
159             $filename = "TestFile$i" . time();
160             $this->create_test_file($filename, $filearea);
161         }
162     }
164     /**
165      * Create test file
166      *
167      * @param string $filename file name
168      * @param string $filearea file area
169      * @param int $itemid item id
170      * @return stored_file the newly created file
171      */
172     private function create_test_file($filename, $filearea, $itemid = 0) {
173         global $USER;
175         $filerecord = array();
176         $filerecord['contextid'] = $this->usercontext->id;
177         $filerecord['component'] = 'user';
178         $filerecord['filearea'] = $filearea;
179         $filerecord['itemid'] = $itemid;
180         $filerecord['filepath'] = '/';
181         $filerecord['filename'] = $filename;
182         $filerecord['userid'] = $USER->id;
184         $fs = get_file_storage();
185         $content = hash("md5", $filename);
186         return $fs->create_file_from_string($filerecord, $content);
187     }
189     /**
190      * Create reference file
191      *
192      * @param stored_file $file source file
193      * @param string $filename file name
194      * @param string $filearea file area
195      * @param int $itemid item id
196      * @return stored_file the newly created file
197      */
198     private function create_reference_file($file, $filename, $filearea, $itemid = 0) {
199         global $USER, $DB;
201         $newfilerecord = array();
202         $newfilerecord['contextid'] = $this->usercontext->id;
203         $newfilerecord['component'] = 'user';
204         $newfilerecord['filearea'] = $filearea;
205         $newfilerecord['itemid'] = $itemid;
206         $newfilerecord['filepath'] = '/';
207         $newfilerecord['filename'] = $filename;
208         $newfilerecord['userid'] = $USER->id;
210         $fs = get_file_storage();
211         $oldfilerecord = $DB->get_record('files', ['id' => $file->get_id()]);
212         $ref = $fs->pack_reference($oldfilerecord);
213         return $fs->create_file_from_reference($newfilerecord, $this->repo->id, $ref);
214     }