MDL-69549 core: Add context export API
[moodle.git] / lib / tests / content / export / exporters / course_exporter_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 tests for core\content\export\exporters\course_exporter.
19  *
20  * @package     core
21  * @category    test
22  * @copyright   2020 Simey Lameze <simey@moodle.com>
23  * @license     http://www.gnu.org/copyleft/gpl.html GNU Public License
24  */
26 declare(strict_types=1);
28 namespace core\content\export\exporters;
30 use advanced_testcase;
31 use context_course;
32 use context_module;
33 use ZipArchive;
34 use core\content\export\zipwriter;
36 /**
37  * Unit tests for activity exporter.
38  *
39  * @coversDefaultClass \core\content\export\exporters\course_exporter
40  */
41 class course_exporter_test extends advanced_testcase {
43     /**
44      * The course_exporter should still export a module intro when no exportables are passed.
45      */
46     public function test_no_exportables_exported(): void {
47         $this->resetAfterTest(true);
49         $generator = $this->getDataGenerator();
51         $course = $generator->create_course();
52         $coursecontext = context_course::instance($course->id);
54         $intro = 'XX Some introduction should go here XX';
55         $content = 'YY Some content should go here YY';
56         $module = $generator->create_module('page', [
57             'course' => $course->id,
58             'intro' => $intro,
59             'content' => $content,
60         ]);
61         $modcontext = context_module::instance($module->cmid);
63         $user = $generator->create_user();
64         $generator->enrol_user($user->id, $course->id);
66         // Only the module index should be added.
67         $archive = $this->get_mocked_zipwriter(['add_file_from_string']);
68         $archive->expects($this->once())
69             ->method('add_file_from_string')
70             ->with(
71                 $modcontext,
72                 'index.html',
73                 $this->callback(function($html) use ($intro, $content): bool {
74                     if (strpos($html, $intro) === false) {
75                         return false;
76                     }
78                     if (strpos($html, $content) !== false) {
79                         // The content as not exported.
80                         return false;
81                     }
83                     return true;
84                 })
85             );
86         $archive->set_root_context($coursecontext);
88         $coursecontroller = new course_exporter($modcontext->get_course_context(), $user, $archive);
89         $coursecontroller->export_mod_content($modcontext, []);
90     }
92     /**
93      * The course_exporter should still export exportables as well as module intro.
94      */
95     public function test_exportables_exported(): void {
96         $this->resetAfterTest(true);
98         $generator = $this->getDataGenerator();
100         $course = $generator->create_course();
101         $coursecontext = context_course::instance($course->id);
103         $intro = 'XX Some introduction should go here XX';
104         $content = 'YY Some content should go here YY';
105         $module = $generator->create_module('page', [
106             'course' => $course->id,
107             'intro' => $intro,
108             'content' => $content,
109         ]);
110         $modcontext = context_module::instance($module->cmid);
112         $user = $generator->create_user();
113         $generator->enrol_user($user->id, $course->id);
115         // Only the module index should be added.
116         $archive = $this->get_mocked_zipwriter(['add_file_from_string']);
117         $archive->expects($this->once())
118             ->method('add_file_from_string')
119             ->with(
120                 $modcontext,
121                 'index.html',
122                 $this->callback(function($html) use ($intro, $content): bool {
123                     if (strpos($html, $intro) === false) {
124                         return false;
125                     }
127                     if (strpos($html, $content) === false) {
128                         // Content was exported.
129                         return false;
130                     }
132                     return true;
133                 })
134             );
135         $archive->set_root_context($coursecontext);
137         $pagecontroller = new \mod_page\content\exporter($modcontext, "mod_page", $user, $archive);
139         $coursecontroller = new course_exporter($modcontext->get_course_context(), $user, $archive);
140         $coursecontroller->export_mod_content($modcontext, $pagecontroller->get_exportables());
141     }
143     /**
144      * Get a mocked zipwriter instance, stubbing the supplieid classes.
145      *
146      * @param   string[] $methods
147      * @return  zipwriter
148      */
149     protected function get_mocked_zipwriter(?array $methods = []): zipwriter {
150         return $this->getMockBuilder(zipwriter::class)
151             ->setConstructorArgs([$this->getMockBuilder(\ZipStream\ZipStream::class)->getmock()])
152             ->setMethods($methods)
153             ->getMock();
154     }