5 * Definition of Drupal\filefield_sources\Tests\FileFieldSourcesTestBase.
8 namespace Drupal\filefield_sources\Tests;
10 use Drupal\file\Tests\FileFieldTestBase;
11 use Drupal\simpletest\WebTestBase;
12 use Drupal\field\Entity\FieldConfig;
13 use Drupal\user\Entity\Role;
16 * Base class for File Field Sources test cases.
18 abstract class FileFieldSourcesTestBase extends FileFieldTestBase {
25 public static $modules = array('filefield_sources');
34 * Sets up for file field sources test cases.
36 protected function setUp() {
39 // Create admin user, then login.
40 $this->adminUser = $this->drupalCreateUser(array(
42 'access administration pages',
43 'administer site configuration',
45 'administer permissions',
46 'administer content types',
47 'administer node fields',
48 'administer node display',
49 'administer node form display',
53 $this->drupalLogin($this->adminUser);
55 // Create content type.
56 $this->typeName = 'article';
57 $this->drupalCreateContentType(array('type' => $this->typeName, 'name' => 'Article'));
60 $this->node = $this->drupalCreateNode();
63 $this->fieldName = strtolower($this->randomMachineName());
64 $this->createFileField($this->fieldName, 'node', $this->typeName);
68 * Sets up for imce test cases.
70 protected function setUpImce() {
71 foreach ($this->adminUser->getRoles(TRUE) as $rid) {
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'));
82 * Enable file field sources.
84 * @param array $sources
85 * List of sources to enable or disable. e.g
91 public function enableSources($sources = array()) {
92 $sources += array('upload' => TRUE);
95 'remote' => 'Remote URL',
96 'clipboard' => 'Clipboard',
97 'reference' => 'Reference existing',
98 'attach' => 'File attach',
99 'imce' => 'File browser',
101 $sources = array_intersect_key($sources, $map);
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.');
109 // Click on the widget settings button to open the widget settings form.
110 $this->drupalPostAjaxForm(NULL, array(), $this->fieldName . "_settings_edit");
113 $prefix = 'fields[' . $this->fieldName . '][settings_edit_form][third_party_settings][filefield_sources][filefield_sources][sources]';
115 foreach ($sources as $source => $enabled) {
116 $edit[$prefix . '[' . $source . ']'] = $enabled ? TRUE : FALSE;
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.');
121 // Save the form to save the third party settings.
122 $this->drupalPostForm(NULL, array(), t('Save'));
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);
134 foreach ($map as $source => $label) {
135 $this->assertNoLink($label);
141 * Create permanent file entity.
144 * Permanent file entity.
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();
154 // Permanent file must be used by an entity.
155 \Drupal::service('file.usage')->add($file, 'file', 'node', $this->node->id());
161 * Create temporary file entity.
164 * Temporary file entity.
166 public function createTemporaryFileEntity() {
167 $file = $this->createTemporaryFile();
169 // Add a filesize property to files as would be read by file_load().
170 $file->filesize = filesize($file->uri);
172 return entity_create('file', (array) $file);
176 * Create temporary file.
179 * Permanent file object.
181 public function createTemporaryFile($path = '') {
182 $filename = $this->randomMachineName() . '.txt';
184 $path = file_default_scheme() . '://';
186 $uri = $path . $filename;
187 $contents = $this->randomString();
189 // Change mode so that we can create files.
190 file_prepare_directory($path, FILE_CREATE_DIRECTORY);
191 drupal_chmod($path, FILE_CHMOD_DIRECTORY);
193 file_put_contents($uri, $contents);
194 $this->assertTrue(is_file($uri), 'The temporary file has been created.');
196 // Change mode so that we can delete created file.
197 drupal_chmod($uri, FILE_CHMOD_FILE);
199 // Return object similar to file_scan_directory().
200 $file = new \stdClass();
202 $file->filename = $filename;
203 $file->name = pathinfo($filename, PATHINFO_FILENAME);
208 * Update file field sources settings.
210 * @param string $source_key
211 * Wrapper, defined by each source.
213 * Key, defined by each source.
214 * @param mixed $value
217 public function updateFilefieldSourcesSettings($source_key, $key, $value) {
218 $manage_display = 'admin/structure/types/manage/' . $this->typeName . '/form-display';
219 $this->drupalGet($manage_display);
221 // Click on the widget settings button to open the widget settings form.
222 $this->drupalPostAjaxForm(NULL, array(), $this->fieldName . "_settings_edit");
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')));
229 // Save the form to save the third party settings.
230 $this->drupalPostForm(NULL, array(), t('Save'));
234 * Upload file by 'Attach' source.
238 * @param string $filename
241 * Delta in multiple values field.
243 public function uploadFileByAttachSource($uri = '', $filename = '', $delta = 0) {
246 $this->fieldName . '[' . $delta . '][filefield_attach][filename]' => $uri,
252 $this->drupalPostAjaxForm(NULL, $edit, array($this->fieldName . '_' . $delta . '_attach' => t('Attach')));
255 $this->assertFileUploaded($filename, $delta);
258 $this->assertFileNotUploaded($delta);
263 * Upload file by 'Reference' source.
267 * @param string $filename
270 * Delta in multiple values field.
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')));
279 $this->assertFileUploaded($filename, $delta);
282 $this->assertFileNotUploaded($delta);
287 * Upload file by 'Clipboard' source.
291 * @param string $filename
294 * Delta in multiple values field.
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)) : '';
300 $prefix . '[filename]' => $filename,
301 $prefix . '[contents]' => $file_content,
303 $this->drupalPostAjaxForm(NULL, $edit, array($this->fieldName . '_' . $delta . '_clipboard_upload_button' => t('Upload')));
306 $this->assertFileUploaded($filename, $delta);
309 $this->assertFileNotUploaded($delta);
314 * Upload file by 'Imce' source.
318 * @param string $filename
321 * Delta in multiple values field.
323 public function uploadFileByImceSource($uri = '', $filename = '', $delta = 0) {
324 $scheme = parse_url($uri, PHP_URL_SCHEME);
325 $imce_path = str_replace("$scheme://", '', $uri);
327 $this->fieldName . '[' . $delta . '][filefield_imce][imce_paths]' => $imce_path,
329 $this->drupalPostAjaxForm(NULL, $edit, array($this->fieldName . '_' . $delta . '_imce_select' => t('Select')));
333 $this->assertFileUploaded($filename, $delta);
336 $this->assertFileNotUploaded($delta);
341 * Upload file by 'Remote' source.
345 * @param string $filename
348 * Delta in multiple values field.
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')));
356 $this->assertFileUploaded($filename, $delta);
359 $this->assertFileNotUploaded($delta);
364 * Upload file by 'Upload' source.
368 * @param string $filename
371 * Delta in multiple values field.
373 public function uploadFileByUploadSource($uri = '', $filename = '', $delta = 0, $multiple = FALSE) {
374 $name = 'files[' . $this->fieldName . '_' . $delta . ']';
379 $name => $uri ? drupal_realpath($uri) : '',
381 $this->drupalPostAjaxForm(NULL, $edit, array($this->fieldName . '_' . $delta . '_upload_button' => t('Upload')));
384 $this->assertFileUploaded($filename, $delta);
387 $this->assertFileNotUploaded($delta);
392 * Check to see if file is uploaded.
394 * @param string $filename
397 * Delta in multiple values field.
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.');
405 * Check to see if file is not uploaded.
408 * Delta in multiple values field.
410 public function assertFileNotUploaded($delta = 0) {
411 $this->assertNoFieldByXPath('//input[@name="' . $this->fieldName . '_' . $delta . '_remove_button"]', t('Remove'), '"Remove" button is not displayed.');
415 * Remove uploaded file.
417 * @param string $filename
420 * Delta in multiple values field.
422 public function removeFile($filename, $delta = 0) {
423 $this->drupalPostAjaxForm(NULL, array(), array($this->fieldName . '_' . $delta . '_remove_button' => t('Remove')));
425 // Ensure file is removed.
426 $this->assertFileRemoved($filename);
430 * Check to see if file is removed.
432 * @param string $filename
435 public function assertFileRemoved($filename) {
436 $this->assertNoLink($filename);
442 * @param string $setting_name
445 public function getFieldSetting($setting_name) {
446 $field_definition = FieldConfig::load("node.{$this->typeName}.{$this->fieldName}");
447 return $field_definition->getSetting($setting_name);