Proyectos de Subversion Moodle

Rev

Ir a la última revisión | | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 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/>.
16
 
17
namespace repository_googledocs\local\browser;
18
 
19
defined('MOODLE_INTERNAL') || die();
20
 
21
global $CFG;
22
require_once($CFG->dirroot . '/repository/googledocs/tests/googledocs_content_testcase.php');
23
require_once($CFG->dirroot . '/repository/googledocs/lib.php');
24
 
25
/**
26
 * Class containing unit tests for the drive browser class.
27
 *
28
 * @package    repository_googledocs
29
 * @copyright  2021 Mihail Geshoski <mihail@moodle.com>
30
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
31
 */
32
class googledocs_drive_content_test extends \googledocs_content_testcase {
33
 
34
    /**
35
     * Test get_content_nodes().
36
     *
37
     * @dataProvider get_content_nodes_provider
38
     * @param string $query The query string
39
     * @param string $path The path
40
     * @param bool $sortcontent Whether the contents should be sorted in alphabetical order
41
     * @param array $filterextensions The array containing file extensions that should be disallowed (filtered)
42
     * @param array $shareddrives The array containing the existing shared drives
43
     * @param array $drivecontents The array containing the fetched google drive contents
44
     * @param array $expected The expected array which contains the generated repository content nodes
45
     */
46
    public function test_get_content_nodes(string $query, string $path, bool $sortcontent, array $filterextensions,
47
            array $shareddrives, array $drivecontents, array $expected) {
48
 
49
        // Mock the service object.
50
        $servicemock = $this->createMock(\repository_googledocs\rest::class);
51
 
52
        $listparams = [
53
            'q' => "'" . str_replace("'", "\'", $query) . "' in parents AND trashed = false",
54
            'fields' => 'files(id,name,mimeType,webContentLink,webViewLink,fileExtension,modifiedTime,size,iconLink)',
55
            'spaces' => 'drive',
56
        ];
57
 
58
        if (!empty($shareddrives)) {
59
            $listparams['supportsAllDrives'] = 'true';
60
            $listparams['includeItemsFromAllDrives'] = 'true';
61
        }
62
 
63
        // Assert that the call() method is being called twice with the given arguments consecutively. In the first
64
        // instance it is being called to fetch the shared drives (shared_drives_list), while in the second instance
65
        // to fetch the relevant drive contents (list). Also, define the returned data objects by these calls.
66
        $servicemock->expects($this->exactly(2))
67
            ->method('call')
68
            ->withConsecutive(
69
                [
70
                    'shared_drives_list',
71
                    [],
72
                ],
73
                [
74
                    'list',
75
                    $listparams,
76
                ]
77
            )
78
            ->willReturnOnConsecutiveCalls(
79
                (object)[
80
                    'kind' => 'drive#driveList',
81
                    'nextPageToken' => 'd838181f30b0f5',
82
                    'drives' => $shareddrives,
83
                ],
84
                (object)[
85
                    'files' => $drivecontents,
86
                ]
87
            );
88
 
89
        // Set the disallowed file types (extensions).
90
        $this->disallowedextensions = $filterextensions;
91
        $drivebrowser = new googledocs_drive_content($servicemock, $path, $sortcontent);
92
        $contentnodes = $drivebrowser->get_content_nodes($query, [$this, 'filter']);
93
 
94
        // Assert that the returned array of repository content nodes is equal to the expected one.
95
        $this->assertEquals($expected, $contentnodes);
96
    }
97
 
98
    /**
99
     * Data provider for test_get_content_nodes().
100
     *
101
     * @return array
102
     */
103
    public function get_content_nodes_provider(): array {
104
 
105
        $rootid = \repository_googledocs::REPOSITORY_ROOT_ID;
106
        $mydriveid = \repository_googledocs::MY_DRIVE_ROOT_ID;
107
 
108
        return [
109
            'Folders and files exist in the drive; shared drives exist; ordering applied.' =>
110
                [
111
                    $mydriveid,
112
                    "{$rootid}|Google+Drive/{$mydriveid}|My+Drive",
113
                    true,
114
                    [],
115
                    [
116
                        $this->create_google_drive_shared_drive_object('d85b21c0f86cb5', 'Shared Drive 1'),
117
                    ],
118
                    [
119
                        $this->create_google_drive_folder_object('1c4ad262c65333', 'Folder 2'),
120
                        $this->create_google_drive_file_object('d85b21c0f86cb0', 'File 3.pdf',
121
                            'application/pdf', 'pdf', '1000'),
122
                        $this->create_google_drive_folder_object('0c4ad262c65333', 'Folder 1'),
123
                        $this->create_google_drive_file_object('bed5a0f08d412a', 'File 1.pdf',
124
                            'application/pdf', 'pdf'),
125
                    ],
126
                    [
127
                        $this->create_folder_content_node_array('0c4ad262c65333', 'Folder 1',
128
                            "{$rootid}|Google+Drive/{$mydriveid}|My+Drive"),
129
                        $this->create_folder_content_node_array('1c4ad262c65333', 'Folder 2',
130
                            "{$rootid}|Google+Drive/{$mydriveid}|My+Drive"),
131
                        $this->create_file_content_node_array('bed5a0f08d412a', 'File 1.pdf', 'File 1.pdf',
132
                            null, '', 'https://googleusercontent.com/type/application/pdf', '',
133
                            'download'),
134
                        $this->create_file_content_node_array('d85b21c0f86cb0', 'File 3.pdf', 'File 3.pdf',
135
                            '1000', '', 'https://googleusercontent.com/type/application/pdf', '',
136
                            'download'),
137
                    ],
138
                ],
139
            'Only folders exist in the drive; shared drives do not exist; ordering not applied.' =>
140
                [
141
                    $mydriveid,
142
                    "{$rootid}|Google+Drive/{$mydriveid}|My+Drive",
143
                    false,
144
                    [],
145
                    [],
146
                    [
147
                        $this->create_google_drive_folder_object('0c4ad262c65333', 'Folder 3'),
148
                        $this->create_google_drive_folder_object('d85b21c0f86cb0', 'Folder 1'),
149
                        $this->create_google_drive_folder_object('bed5a0f08d412a', 'Folder 2'),
150
                    ],
151
                    [
152
                        $this->create_folder_content_node_array('0c4ad262c65333', 'Folder 3',
153
                            "{$rootid}|Google+Drive/{$mydriveid}|My+Drive"),
154
                        $this->create_folder_content_node_array('d85b21c0f86cb0', 'Folder 1',
155
                            "{$rootid}|Google+Drive/{$mydriveid}|My+Drive"),
156
                        $this->create_folder_content_node_array('bed5a0f08d412a', 'Folder 2',
157
                            "{$rootid}|Google+Drive/{$mydriveid}|My+Drive"),
158
                    ],
159
                ],
160
            'Only files exist in the drive; shared drives do not exist; ordering not applied; filter .txt.' =>
161
                [
162
                    $mydriveid,
163
                    "{$rootid}|Google+Drive/{$mydriveid}|My+Drive",
164
                    false,
165
                    ['txt'],
166
                    [],
167
                    [
168
                        $this->create_google_drive_file_object('d85b21c0f86cb0', 'File 3.pdf',
169
                            'application/pdf', 'pdf', '1000'),
170
                        $this->create_google_drive_file_object('a85b21c0f86cb0', 'File 1.txt',
171
                            'text/plain', 'txt', '3000'),
172
                        $this->create_google_drive_file_object('f85b21c0f86cb0', 'File 2.doc',
173
                            'application/msword', 'doc', '2000'),
174
                    ],
175
                    [
176
                        $this->create_file_content_node_array('d85b21c0f86cb0', 'File 3.pdf', 'File 3.pdf',
177
                            '1000', '', 'https://googleusercontent.com/type/application/pdf', '',
178
                            'download'),
179
                        $this->create_file_content_node_array('f85b21c0f86cb0', 'File 2.doc', 'File 2.doc',
180
                            '2000', '', 'https://googleusercontent.com/type/application/msword', '',
181
                            'download'),
182
                    ],
183
                ],
184
            'Contents do not exist in the drive; shared drives do not exist.' =>
185
                [
186
                    $mydriveid,
187
                    "{$rootid}|Google+Drive/{$mydriveid}|My+Drive",
188
                    false,
189
                    [],
190
                    [],
191
                    [],
192
                    [],
193
                ],
194
        ];
195
    }
196
 
197
    /**
198
     * Test get_navigation().
199
     *
200
     * @dataProvider get_navigation_provider
201
     * @param string $nodepath The node path string
202
     * @param array $expected The expected array containing the repository navigation nodes
203
     */
204
    public function test_get_navigation(string $nodepath, array $expected) {
205
        // Mock the service object.
206
        $servicemock = $this->createMock(\repository_googledocs\rest::class);
207
 
208
        $drivebrowser = new googledocs_drive_content($servicemock, $nodepath);
209
        $navigation = $drivebrowser->get_navigation();
210
 
211
        // Assert that the returned array containing the navigation nodes is equal to the expected one.
212
        $this->assertEquals($expected, $navigation);
213
    }
214
 
215
    /**
216
     * Data provider for test_get_navigation().
217
     *
218
     * @return array
219
     */
220
    public function get_navigation_provider(): array {
221
 
222
        $rootid = \repository_googledocs::REPOSITORY_ROOT_ID;
223
        $mydriveid = \repository_googledocs::MY_DRIVE_ROOT_ID;
224
 
225
        return [
226
            'Return navigation nodes array from path where all nodes have a name.' =>
227
                [
228
                    "{$rootid}|Google+Drive/{$mydriveid}|My+Drive/bed5a0f08d|Test+Folder",
229
                    [
230
                        [
231
                            'name' => 'Google Drive',
232
                            'path' => "{$rootid}|Google+Drive",
233
                        ],
234
                        [
235
                            'name' => 'My Drive',
236
                            'path' => "{$rootid}|Google+Drive/{$mydriveid}|My+Drive",
237
                        ],
238
                        [
239
                            'name' => 'Test Folder',
240
                            'path' => "{$rootid}|Google+Drive/{$mydriveid}|My+Drive/bed5a0f08d|Test+Folder",
241
                        ],
242
                    ],
243
                ],
244
            'Return navigation nodes array from path where some nodes do not have a name.' =>
245
                [
246
                    "{$rootid}|Google+Drive/{$mydriveid}|My+Drive/bed5a0f08d/d85b21c0f8|Test+Folder",
247
                    [
248
                        [
249
                            'name' => 'Google Drive',
250
                            'path' => "{$rootid}|Google+Drive",
251
                        ],
252
                        [
253
                            'name' => 'My Drive',
254
                            'path' => "{$rootid}|Google+Drive/{$mydriveid}|My+Drive",
255
                        ],
256
                        [
257
                            'name' => 'bed5a0f08d',
258
                            'path' => "{$rootid}|Google+Drive/{$mydriveid}|My+Drive/bed5a0f08d|bed5a0f08d",
259
                        ],
260
                        [
261
                            'name' => 'Test Folder',
262
                            'path' => "{$rootid}|Google+Drive/{$mydriveid}|My+Drive/bed5a0f08d|bed5a0f08d/" .
263
                                "d85b21c0f8|Test+Folder",
264
                        ],
265
                    ],
266
                ],
267
        ];
268
    }
269
}