Further modules included.
[yaffs-website] / web / modules / contrib / filefield_sources / src / Tests / FileFieldSourcesTestBase.php
1 <?php
2
3 /**
4  * @file
5  * Definition of Drupal\filefield_sources\Tests\FileFieldSourcesTestBase.
6  */
7
8 namespace Drupal\filefield_sources\Tests;
9
10 use Drupal\file\Tests\FileFieldTestBase;
11 use Drupal\simpletest\WebTestBase;
12 use Drupal\field\Entity\FieldConfig;
13 use Drupal\user\Entity\Role;
14
15 /**
16  * Base class for File Field Sources test cases.
17  */
18 abstract class FileFieldSourcesTestBase extends FileFieldTestBase {
19
20   /**
21    * Modules to enable.
22    *
23    * @var array
24    */
25   public static $modules = array('filefield_sources');
26
27   protected $adminUser;
28
29   protected $typeName;
30   protected $fieldName;
31   protected $node;
32
33   /**
34    * Sets up for file field sources test cases.
35    */
36   protected function setUp() {
37     WebTestBase::setUp();
38
39     // Create admin user, then login.
40     $this->adminUser = $this->drupalCreateUser(array(
41       'access content',
42       'access administration pages',
43       'administer site configuration',
44       'administer users',
45       'administer permissions',
46       'administer content types',
47       'administer node fields',
48       'administer node display',
49       'administer node form display',
50       'administer nodes',
51       'bypass node access',
52     ));
53     $this->drupalLogin($this->adminUser);
54
55     // Create content type.
56     $this->typeName = 'article';
57     $this->drupalCreateContentType(array('type' => $this->typeName, 'name' => 'Article'));
58
59     // Add node.
60     $this->node = $this->drupalCreateNode();
61
62     // Add file field.
63     $this->fieldName = strtolower($this->randomMachineName());
64     $this->createFileField($this->fieldName, 'node', $this->typeName);
65   }
66
67   /**
68    * Sets up for imce test cases.
69    */
70   protected function setUpImce() {
71     foreach ($this->adminUser->getRoles(TRUE) as $rid) {
72       // Grant permission.
73       $role = Role::load($rid);
74       $this->grantPermissions($role, ['administer imce']);
75       // Assign member profile to user's role.
76       $edit["roles_profiles[$rid][public]"] = 'member';
77       $this->drupalPostForm('admin/config/media/imce', $edit, t('Save configuration'));
78     }
79   }
80
81   /**
82    * Enable file field sources.
83    *
84    * @param array $sources
85    *   List of sources to enable or disable. e.g
86    *   array(
87    *     'upload' => FALSE,
88    *     'remote' => TRUE,
89    *   ).
90    */
91   public function enableSources($sources = array()) {
92     $sources += array('upload' => TRUE);
93     $map = array(
94       'upload' => 'Upload',
95       'remote' => 'Remote URL',
96       'clipboard' => 'Clipboard',
97       'reference' => 'Reference existing',
98       'attach' => 'File attach',
99       'imce' => 'File browser',
100     );
101     $sources = array_intersect_key($sources, $map);
102     ksort($sources);
103
104     // Upload source enabled by default.
105     $manage_display = 'admin/structure/types/manage/' . $this->typeName . '/form-display';
106     $this->drupalGet($manage_display);
107     $this->assertText("File field sources: upload", 'The expected summary is displayed.');
108
109     // Click on the widget settings button to open the widget settings form.
110     $this->drupalPostAjaxForm(NULL, array(), $this->fieldName . "_settings_edit");
111
112     // Enable sources.
113     $prefix = 'fields[' . $this->fieldName . '][settings_edit_form][third_party_settings][filefield_sources][filefield_sources][sources]';
114     $edit = array();
115     foreach ($sources as $source => $enabled) {
116       $edit[$prefix . '[' . $source . ']'] = $enabled ? TRUE : FALSE;
117     }
118     $this->drupalPostAjaxForm(NULL, $edit, array($this->fieldName . '_plugin_settings_update' => t('Update')));
119     $this->assertText("File field sources: " . implode(', ', array_keys($sources)), 'The expected summary is displayed.');
120
121     // Save the form to save the third party settings.
122     $this->drupalPostForm(NULL, array(), t('Save'));
123
124     $add_node = 'node/add/' . $this->typeName;
125     $this->drupalGet($add_node);
126     if (count($sources) > 1) {
127       // We can swith between sources.
128       foreach ($sources as $source => $enabled) {
129         $label = $map[$source];
130         $this->assertLink($label);
131       }
132     }
133     else {
134       foreach ($map as $source => $label) {
135         $this->assertNoLink($label);
136       }
137     }
138   }
139
140   /**
141    * Create permanent file entity.
142    *
143    * @return object
144    *   Permanent file entity.
145    */
146   public function createPermanentFileEntity() {
147     $file = $this->createTemporaryFileEntity();
148     // Only permanent file can be referred.
149     $file->status = FILE_STATUS_PERMANENT;
150     // Author has permission to access file.
151     $file->uid = $this->adminUser->id();
152     $file->save();
153
154     // Permanent file must be used by an entity.
155     \Drupal::service('file.usage')->add($file, 'file', 'node', $this->node->id());
156
157     return $file;
158   }
159
160   /**
161    * Create temporary file entity.
162    *
163    * @return object
164    *   Temporary file entity.
165    */
166   public function createTemporaryFileEntity() {
167     $file = $this->createTemporaryFile();
168
169     // Add a filesize property to files as would be read by file_load().
170     $file->filesize = filesize($file->uri);
171
172     return entity_create('file', (array) $file);
173   }
174
175   /**
176    * Create temporary file.
177    *
178    * @return object
179    *   Permanent file object.
180    */
181   public function createTemporaryFile($path = '') {
182     $filename = $this->randomMachineName() . '.txt';
183     if (empty($path)) {
184       $path = file_default_scheme() . '://';
185     }
186     $uri = $path . $filename;
187     $contents = $this->randomString();
188
189     // Change mode so that we can create files.
190     file_prepare_directory($path, FILE_CREATE_DIRECTORY);
191     drupal_chmod($path, FILE_CHMOD_DIRECTORY);
192
193     file_put_contents($uri, $contents);
194     $this->assertTrue(is_file($uri), 'The temporary file has been created.');
195
196     // Change mode so that we can delete created file.
197     drupal_chmod($uri, FILE_CHMOD_FILE);
198
199     // Return object similar to file_scan_directory().
200     $file = new \stdClass();
201     $file->uri = $uri;
202     $file->filename = $filename;
203     $file->name = pathinfo($filename, PATHINFO_FILENAME);
204     return $file;
205   }
206
207   /**
208    * Update file field sources settings.
209    *
210    * @param string $source_key
211    *   Wrapper, defined by each source.
212    * @param string $key
213    *   Key, defined by each source.
214    * @param mixed $value
215    *   Value to set.
216    */
217   public function updateFilefieldSourcesSettings($source_key, $key, $value) {
218     $manage_display = 'admin/structure/types/manage/' . $this->typeName . '/form-display';
219     $this->drupalGet($manage_display);
220
221     // Click on the widget settings button to open the widget settings form.
222     $this->drupalPostAjaxForm(NULL, array(), $this->fieldName . "_settings_edit");
223
224     // Update settings.
225     $name = 'fields[' . $this->fieldName . '][settings_edit_form][third_party_settings][filefield_sources][filefield_sources]' . "[$source_key][$key]";
226     $edit = array($name => $value);
227     $this->drupalPostAjaxForm(NULL, $edit, array($this->fieldName . '_plugin_settings_update' => t('Update')));
228
229     // Save the form to save the third party settings.
230     $this->drupalPostForm(NULL, array(), t('Save'));
231   }
232
233   /**
234    * Upload file by 'Attach' source.
235    *
236    * @param string $uri
237    *   File uri.
238    * @param string $filename
239    *   File name.
240    * @param int $delta
241    *   Delta in multiple values field.
242    */
243   public function uploadFileByAttachSource($uri = '', $filename = '', $delta = 0) {
244     if ($uri) {
245       $edit = array(
246         $this->fieldName . '[' . $delta . '][filefield_attach][filename]' => $uri,
247       );
248     }
249     else {
250       $edit = array();
251     }
252     $this->drupalPostAjaxForm(NULL, $edit, array($this->fieldName . '_' . $delta . '_attach' => t('Attach')));
253
254     if ($filename) {
255       $this->assertFileUploaded($filename, $delta);
256     }
257     else {
258       $this->assertFileNotUploaded($delta);
259     }
260   }
261
262   /**
263    * Upload file by 'Reference' source.
264    *
265    * @param int $fid
266    *   File id.
267    * @param string $filename
268    *   File name.
269    * @param int $delta
270    *   Delta in multiple values field.
271    */
272   public function uploadFileByReferenceSource($fid = 0, $filename = '', $delta = 0) {
273     $name = $this->fieldName . '[' . $delta . '][filefield_reference][autocomplete]';
274     $value = $fid ? $filename . ' [fid:' . $fid . ']' : '';
275     $edit = array($name => $value);
276     $this->drupalPostAjaxForm(NULL, $edit, array($this->fieldName . '_' . $delta . '_autocomplete_select' => t('Select')));
277
278     if ($filename) {
279       $this->assertFileUploaded($filename, $delta);
280     }
281     else {
282       $this->assertFileNotUploaded($delta);
283     }
284   }
285
286   /**
287    * Upload file by 'Clipboard' source.
288    *
289    * @param string $uri
290    *   File uri.
291    * @param string $filename
292    *   File name.
293    * @param int $delta
294    *   Delta in multiple values field.
295    */
296   public function uploadFileByClipboardSource($uri = '', $filename = '', $delta = 0) {
297     $prefix = $this->fieldName . '[' . $delta . '][filefield_clipboard]';
298     $file_content = $uri ? 'data:text/plain;base64,' . base64_encode(file_get_contents($uri)) : '';
299     $edit = array(
300       $prefix . '[filename]' => $filename,
301       $prefix . '[contents]' => $file_content,
302     );
303     $this->drupalPostAjaxForm(NULL, $edit, array($this->fieldName . '_' . $delta . '_clipboard_upload_button' => t('Upload')));
304
305     if ($filename) {
306       $this->assertFileUploaded($filename, $delta);
307     }
308     else {
309       $this->assertFileNotUploaded($delta);
310     }
311   }
312
313   /**
314    * Upload file by 'Imce' source.
315    *
316    * @param string $uri
317    *   File uri.
318    * @param string $filename
319    *   File name.
320    * @param int $delta
321    *   Delta in multiple values field.
322    */
323   public function uploadFileByImceSource($uri = '', $filename = '', $delta = 0) {
324     $scheme = parse_url($uri, PHP_URL_SCHEME);
325     $imce_path = str_replace("$scheme://", '', $uri);
326     $edit = array(
327       $this->fieldName . '[' . $delta . '][filefield_imce][imce_paths]' => $imce_path,
328     );
329     $this->drupalPostAjaxForm(NULL, $edit, array($this->fieldName . '_' . $delta . '_imce_select' => t('Select')));
330
331
332     if ($filename) {
333       $this->assertFileUploaded($filename, $delta);
334     }
335     else {
336       $this->assertFileNotUploaded($delta);
337     }
338   }
339
340   /**
341    * Upload file by 'Remote' source.
342    *
343    * @param string $url
344    *   File url.
345    * @param string $filename
346    *   File name.
347    * @param int $delta
348    *   Delta in multiple values field.
349    */
350   public function uploadFileByRemoteSource($url = '', $filename = '', $delta = 0) {
351     $name = $this->fieldName . '[' . $delta . '][filefield_remote][url]';
352     $edit = array($name => $url);
353     $this->drupalPostAjaxForm(NULL, $edit, array($this->fieldName . '_' . $delta . '_transfer' => t('Transfer')));
354
355     if ($filename) {
356       $this->assertFileUploaded($filename, $delta);
357     }
358     else {
359       $this->assertFileNotUploaded($delta);
360     }
361   }
362
363   /**
364    * Upload file by 'Upload' source.
365    *
366    * @param string $uri
367    *   File uri.
368    * @param string $filename
369    *   File name.
370    * @param int $delta
371    *   Delta in multiple values field.
372    */
373   public function uploadFileByUploadSource($uri = '', $filename = '', $delta = 0, $multiple = FALSE) {
374     $name = 'files[' . $this->fieldName . '_' . $delta . ']';
375     if ($multiple) {
376       $name .= '[]';
377     }
378     $edit = array(
379       $name => $uri ? drupal_realpath($uri) : '',
380     );
381     $this->drupalPostAjaxForm(NULL, $edit, array($this->fieldName . '_' . $delta . '_upload_button' => t('Upload')));
382
383     if ($filename) {
384       $this->assertFileUploaded($filename, $delta);
385     }
386     else {
387       $this->assertFileNotUploaded($delta);
388     }
389   }
390
391   /**
392    * Check to see if file is uploaded.
393    *
394    * @param string $filename
395    *   File name.
396    * @param int $delta
397    *   Delta in multiple values field.
398    */
399   public function assertFileUploaded($filename, $delta = 0) {
400     $this->assertLink($filename);
401     $this->assertFieldByXPath('//input[@name="' . $this->fieldName . '_' . $delta . '_remove_button"]', t('Remove'), 'After uploading a file, "Remove" button is displayed.');
402   }
403
404   /**
405    * Check to see if file is not uploaded.
406    *
407    * @param int $delta
408    *   Delta in multiple values field.
409    */
410   public function assertFileNotUploaded($delta = 0) {
411     $this->assertNoFieldByXPath('//input[@name="' . $this->fieldName . '_' . $delta . '_remove_button"]', t('Remove'), '"Remove" button is not displayed.');
412   }
413
414   /**
415    * Remove uploaded file.
416    *
417    * @param string $filename
418    *   File name.
419    * @param int $delta
420    *   Delta in multiple values field.
421    */
422   public function removeFile($filename, $delta = 0) {
423     $this->drupalPostAjaxForm(NULL, array(), array($this->fieldName . '_' . $delta . '_remove_button' => t('Remove')));
424
425     // Ensure file is removed.
426     $this->assertFileRemoved($filename);
427   }
428
429   /**
430    * Check to see if file is removed.
431    *
432    * @param string $filename
433    *   File name.
434    */
435   public function assertFileRemoved($filename) {
436     $this->assertNoLink($filename);
437   }
438
439   /**
440    * Get field setting.
441    *
442    * @param string $setting_name
443    *   Setting name.
444    */
445   public function getFieldSetting($setting_name) {
446     $field_definition = FieldConfig::load("node.{$this->typeName}.{$this->fieldName}");
447     return $field_definition->getSetting($setting_name);
448   }
449
450 }