Update Composer, update everything

This commit is contained in:
Oliver Davies 2018-11-23 12:29:20 +00:00
parent ea3e94409f
commit dda5c284b6
19527 changed files with 1135420 additions and 351004 deletions

View file

@ -0,0 +1,69 @@
langcode: en
status: true
dependencies:
config:
- field.field.media.type_four.field_media_test_image
- field.field.media.type_four.field_media_extra_image
- image.style.medium
- media.type.type_four
module:
- image
- path
id: media.type_four.default
targetEntityType: media
bundle: type_four
mode: default
content:
created:
type: datetime_timestamp
weight: 10
region: content
settings: { }
third_party_settings: { }
field_media_test_image:
weight: 0
settings:
progress_indicator: throbber
preview_image_style: medium
third_party_settings: { }
type: image_image
region: content
field_media_extra_image:
weight: 1
settings:
progress_indicator: throbber
preview_image_style: medium
third_party_settings: { }
type: image_image
region: content
name:
type: string_textfield
weight: -5
region: content
settings:
size: 60
placeholder: ''
third_party_settings: { }
path:
type: path
weight: 30
region: content
settings: { }
third_party_settings: { }
status:
type: boolean_checkbox
settings:
display_label: true
weight: 100
region: content
third_party_settings: { }
uid:
type: entity_reference_autocomplete
weight: 5
settings:
match_operator: CONTAINS
size: 60
placeholder: ''
region: content
third_party_settings: { }
hidden: { }

View file

@ -0,0 +1,44 @@
langcode: en
status: true
dependencies:
config:
- core.entity_form_mode.media.media_library
- field.field.media.type_four.field_media_test_image
- image.style.thumbnail
- media.type.type_four
module:
- image
id: media.type_four.media_library
targetEntityType: media
bundle: type_four
mode: media_library
content:
field_media_test_image:
weight: 2
settings:
progress_indicator: throbber
preview_image_style: thumbnail
third_party_settings: { }
type: image_image
region: content
field_media_extra_image:
weight: 1
settings:
progress_indicator: throbber
preview_image_style: medium
third_party_settings: { }
type: image_image
region: content
name:
type: string_textfield
weight: 0
region: content
settings:
size: 60
placeholder: ''
third_party_settings: { }
hidden:
created: true
path: true
status: true
uid: true

View file

@ -0,0 +1,43 @@
langcode: en
status: true
dependencies:
config:
- field.field.media.type_one.field_media_test
- media.type.type_one
id: media.type_one.default
targetEntityType: media
bundle: type_one
mode: default
content:
created:
type: datetime_timestamp
weight: 10
region: content
settings: { }
third_party_settings: { }
field_media_test:
settings:
size: 60
placeholder: ''
third_party_settings: { }
type: string_textfield
weight: 11
region: content
name:
type: string_textfield
weight: -5
region: content
settings:
size: 60
placeholder: ''
third_party_settings: { }
uid:
type: entity_reference_autocomplete
weight: 5
settings:
match_operator: CONTAINS
size: 60
placeholder: ''
region: content
third_party_settings: { }
hidden: { }

View file

@ -0,0 +1,60 @@
langcode: en
status: true
dependencies:
config:
- field.field.media.type_three.field_media_test_image
- image.style.medium
- media.type.type_three
module:
- image
- path
id: media.type_three.default
targetEntityType: media
bundle: type_three
mode: default
content:
created:
type: datetime_timestamp
weight: 10
region: content
settings: { }
third_party_settings: { }
field_media_test_image:
weight: 0
settings:
progress_indicator: throbber
preview_image_style: medium
third_party_settings: { }
type: image_image
region: content
name:
type: string_textfield
weight: -5
region: content
settings:
size: 60
placeholder: ''
third_party_settings: { }
path:
type: path
weight: 30
region: content
settings: { }
third_party_settings: { }
status:
type: boolean_checkbox
settings:
display_label: true
weight: 100
region: content
third_party_settings: { }
uid:
type: entity_reference_autocomplete
weight: 5
settings:
match_operator: CONTAINS
size: 60
placeholder: ''
region: content
third_party_settings: { }
hidden: { }

View file

@ -0,0 +1,36 @@
langcode: en
status: true
dependencies:
config:
- core.entity_form_mode.media.media_library
- field.field.media.type_three.field_media_test_image
- image.style.thumbnail
- media.type.type_three
module:
- image
id: media.type_three.media_library
targetEntityType: media
bundle: type_three
mode: media_library
content:
field_media_test_image:
weight: 1
settings:
progress_indicator: throbber
preview_image_style: thumbnail
third_party_settings: { }
type: image_image
region: content
name:
type: string_textfield
weight: 0
region: content
settings:
size: 60
placeholder: ''
third_party_settings: { }
hidden:
created: true
path: true
status: true
uid: true

View file

@ -0,0 +1,43 @@
langcode: en
status: true
dependencies:
config:
- field.field.media.type_two.field_media_test_1
- media.type.type_two
id: media.type_two.default
targetEntityType: media
bundle: type_two
mode: default
content:
created:
type: datetime_timestamp
weight: 10
region: content
settings: { }
third_party_settings: { }
field_media_test_1:
settings:
size: 60
placeholder: ''
third_party_settings: { }
type: string_textfield
weight: 11
region: content
name:
type: string_textfield
weight: -5
region: content
settings:
size: 60
placeholder: ''
third_party_settings: { }
uid:
type: entity_reference_autocomplete
weight: 5
settings:
match_operator: CONTAINS
size: 60
placeholder: ''
region: content
third_party_settings: { }
hidden: { }

View file

@ -0,0 +1,78 @@
langcode: en
status: true
dependencies:
config:
- field.field.node.basic_page.field_twin_media
- field.field.node.basic_page.field_unlimited_media
- field.field.node.basic_page.field_noadd_media
- node.type.basic_page
module:
- media_library
id: node.basic_page.default
targetEntityType: node
bundle: basic_page
mode: default
content:
created:
type: datetime_timestamp
weight: 10
region: content
settings: { }
third_party_settings: { }
field_twin_media:
type: media_library_widget
weight: 122
settings: { }
third_party_settings: { }
region: content
field_unlimited_media:
type: media_library_widget
weight: 121
settings: { }
third_party_settings: { }
region: content
field_noadd_media:
type: media_library_widget
weight: 123
settings: { }
third_party_settings: { }
region: content
promote:
type: boolean_checkbox
settings:
display_label: true
weight: 15
region: content
third_party_settings: { }
status:
type: boolean_checkbox
settings:
display_label: true
weight: 120
region: content
third_party_settings: { }
sticky:
type: boolean_checkbox
settings:
display_label: true
weight: 16
region: content
third_party_settings: { }
title:
type: string_textfield
weight: -5
region: content
settings:
size: 60
placeholder: ''
third_party_settings: { }
uid:
type: entity_reference_autocomplete
weight: 5
settings:
match_operator: CONTAINS
size: 60
placeholder: ''
region: content
third_party_settings: { }
hidden: { }

View file

@ -0,0 +1,50 @@
langcode: en
status: true
dependencies:
config:
- field.field.media.type_one.field_media_test
- image.style.thumbnail
- media.type.type_one
module:
- image
- user
id: media.type_one.default
targetEntityType: media
bundle: type_one
mode: default
content:
created:
label: hidden
type: timestamp
weight: 0
region: content
settings:
date_format: medium
custom_date_format: ''
timezone: ''
third_party_settings: { }
field_media_test:
label: above
settings:
link_to_entity: true
third_party_settings: { }
type: string
weight: 6
region: content
thumbnail:
type: image
weight: 5
label: hidden
settings:
image_style: thumbnail
image_link: ''
region: content
third_party_settings: { }
uid:
label: hidden
type: author
weight: 0
region: content
settings: { }
third_party_settings: { }
hidden: { }

View file

@ -0,0 +1,52 @@
langcode: en
status: true
dependencies:
config:
- field.field.media.type_three.field_media_test_image
- image.style.thumbnail
- media.type.type_three
module:
- image
- user
id: media.type_three.default
targetEntityType: media
bundle: type_three
mode: default
content:
created:
label: hidden
type: timestamp
weight: 0
region: content
settings:
date_format: medium
custom_date_format: ''
timezone: ''
third_party_settings: { }
field_media_test_image:
weight: 6
label: above
settings:
image_style: ''
image_link: ''
third_party_settings: { }
type: image
region: content
thumbnail:
type: image
weight: 5
label: hidden
settings:
image_style: thumbnail
image_link: ''
region: content
third_party_settings: { }
uid:
label: hidden
type: author
weight: 0
region: content
settings: { }
third_party_settings: { }
hidden:
name: true

View file

@ -0,0 +1,50 @@
langcode: en
status: true
dependencies:
config:
- field.field.media.type_two.field_media_test_1
- image.style.thumbnail
- media.type.type_two
module:
- image
- user
id: media.type_two.default
targetEntityType: media
bundle: type_two
mode: default
content:
created:
label: hidden
type: timestamp
weight: 0
region: content
settings:
date_format: medium
custom_date_format: ''
timezone: ''
third_party_settings: { }
field_media_test_1:
label: above
settings:
link_to_entity: false
third_party_settings: { }
type: string
weight: 6
region: content
thumbnail:
type: image
weight: 5
label: hidden
settings:
image_style: thumbnail
image_link: ''
region: content
third_party_settings: { }
uid:
label: hidden
type: author
weight: 0
region: content
settings: { }
third_party_settings: { }
hidden: { }

View file

@ -0,0 +1,48 @@
langcode: en
status: true
dependencies:
config:
- field.field.node.basic_page.field_twin_media
- field.field.node.basic_page.field_unlimited_media
- field.field.node.basic_page.field_noadd_media
- node.type.basic_page
module:
- user
id: node.basic_page.default
targetEntityType: node
bundle: basic_page
mode: default
content:
field_twin_media:
type: entity_reference_entity_view
weight: 102
label: above
settings:
view_mode: default
link: false
third_party_settings: { }
region: content
field_unlimited_media:
type: entity_reference_entity_view
weight: 101
label: above
settings:
view_mode: default
link: false
third_party_settings: { }
region: content
field_noadd_media:
type: entity_reference_entity_view
weight: 103
label: above
settings:
view_mode: default
link: false
third_party_settings: { }
region: content
links:
weight: 100
settings: { }
third_party_settings: { }
region: content
hidden: { }

View file

@ -0,0 +1,37 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_media_extra_image
- media.type.type_four
module:
- image
id: media.type_three.field_media_extra_image
field_name: field_media_extra_image
entity_type: media
bundle: type_four
label: Extra Image
description: ''
required: false
translatable: true
default_value: { }
default_value_callback: ''
settings:
file_extensions: 'jpg'
alt_field: false
alt_field_required: false
title_field: false
title_field_required: false
max_resolution: ''
min_resolution: ''
default_image:
uuid: null
alt: ''
title: ''
width: null
height: null
file_directory: 'type-four-extra-dir'
max_filesize: ''
handler: 'default:file'
handler_settings: { }
field_type: image

View file

@ -0,0 +1,37 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_media_test_image
- media.type.type_four
module:
- image
id: media.type_three.field_media_test_image
field_name: field_media_test_image
entity_type: media
bundle: type_four
label: Image
description: ''
required: true
translatable: true
default_value: { }
default_value_callback: ''
settings:
file_extensions: 'jpg'
alt_field: true
alt_field_required: true
title_field: false
title_field_required: false
max_resolution: ''
min_resolution: ''
default_image:
uuid: null
alt: ''
title: ''
width: null
height: null
file_directory: 'type-four-dir'
max_filesize: ''
handler: 'default:file'
handler_settings: { }
field_type: image

View file

@ -0,0 +1,18 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_media_test
- media.type.type_one
id: media.type_one.field_media_test
field_name: field_media_test
entity_type: media
bundle: type_one
label: field_media_test
description: ''
required: false
translatable: true
default_value: { }
default_value_callback: ''
settings: { }
field_type: string

View file

@ -0,0 +1,37 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_media_test_image
- media.type.type_three
module:
- image
id: media.type_three.field_media_test_image
field_name: field_media_test_image
entity_type: media
bundle: type_three
label: Image
description: ''
required: true
translatable: true
default_value: { }
default_value_callback: ''
settings:
file_extensions: 'png gif jpg jpeg'
alt_field: true
alt_field_required: true
title_field: false
title_field_required: false
max_resolution: ''
min_resolution: ''
default_image:
uuid: null
alt: ''
title: ''
width: null
height: null
file_directory: 'type-three-dir'
max_filesize: ''
handler: 'default:file'
handler_settings: { }
field_type: image

View file

@ -0,0 +1,18 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_media_test_1
- media.type.type_two
id: media.type_two.field_media_test_1
field_name: field_media_test_1
entity_type: media
bundle: type_two
label: field_media_test_1
description: ''
required: false
translatable: true
default_value: { }
default_value_callback: ''
settings: { }
field_type: string

View file

@ -0,0 +1,29 @@
langcode: en
status: true
dependencies:
config:
- field.storage.node.field_noadd_media
- media.type.type_one
- media.type.type_two
- node.type.basic_page
id: node.basic_page.field_noadd_media
field_name: field_noadd_media
entity_type: node
bundle: basic_page
label: 'No add media'
description: ''
required: false
translatable: false
default_value: { }
default_value_callback: ''
settings:
handler: 'default:media'
handler_settings:
target_bundles:
type_one: type_one
type_two: type_two
sort:
field: _none
auto_create: false
auto_create_bundle: file
field_type: entity_reference

View file

@ -0,0 +1,31 @@
langcode: en
status: true
dependencies:
config:
- field.storage.node.field_twin_media
- media.type.type_one
- media.type.type_two
- node.type.basic_page
id: node.basic_page.field_twin_media
field_name: field_twin_media
entity_type: node
bundle: basic_page
label: 'Twin media'
description: ''
required: false
translatable: false
default_value: { }
default_value_callback: ''
settings:
handler: 'default:media'
handler_settings:
target_bundles:
type_one: type_one
type_two: type_two
type_three: type_three
type_four: type_four
sort:
field: _none
auto_create: false
auto_create_bundle: file
field_type: entity_reference

View file

@ -0,0 +1,28 @@
langcode: en
status: true
dependencies:
config:
- field.storage.node.field_unlimited_media
- media.type.type_one
- node.type.basic_page
id: node.basic_page.field_unlimited_media
field_name: field_unlimited_media
entity_type: node
bundle: basic_page
label: 'Unlimited media'
description: ''
required: false
translatable: false
default_value: { }
default_value_callback: ''
settings:
handler: 'default:media'
handler_settings:
target_bundles:
type_one: type_one
type_three: type_three
sort:
field: _none
auto_create: false
auto_create_bundle: audio
field_type: entity_reference

View file

@ -0,0 +1,29 @@
langcode: en
status: true
dependencies:
module:
- file
- image
- media
id: media.field_media_extra_image
field_name: field_media_extra_image
entity_type: media
type: image
settings:
default_image:
uuid: null
alt: ''
title: ''
width: null
height: null
target_type: file
display_field: false
display_default: false
uri_scheme: public
module: image
locked: false
cardinality: 1
translatable: true
indexes: { }
persist_with_no_fields: false
custom_storage: false

View file

@ -0,0 +1,20 @@
langcode: en
status: true
dependencies:
module:
- media
id: media.field_media_test
field_name: field_media_test
entity_type: media
type: string
settings:
max_length: 255
is_ascii: false
case_sensitive: false
module: core
locked: false
cardinality: 1
translatable: true
indexes: { }
persist_with_no_fields: false
custom_storage: false

View file

@ -0,0 +1,20 @@
langcode: en
status: true
dependencies:
module:
- media
id: media.field_media_test_1
field_name: field_media_test_1
entity_type: media
type: string
settings:
max_length: 255
is_ascii: false
case_sensitive: false
module: core
locked: false
cardinality: 1
translatable: true
indexes: { }
persist_with_no_fields: false
custom_storage: false

View file

@ -0,0 +1,29 @@
langcode: en
status: true
dependencies:
module:
- file
- image
- media
id: media.field_media_test_image
field_name: field_media_test_image
entity_type: media
type: image
settings:
default_image:
uuid: null
alt: ''
title: ''
width: null
height: null
target_type: file
display_field: false
display_default: false
uri_scheme: public
module: image
locked: false
cardinality: 1
translatable: true
indexes: { }
persist_with_no_fields: false
custom_storage: false

View file

@ -0,0 +1,19 @@
langcode: en
status: true
dependencies:
module:
- media
- node
id: node.field_noadd_media
field_name: field_noadd_media
entity_type: node
type: entity_reference
settings:
target_type: media
module: core
locked: false
cardinality: -1
translatable: true
indexes: { }
persist_with_no_fields: false
custom_storage: false

View file

@ -0,0 +1,19 @@
langcode: en
status: true
dependencies:
module:
- media
- node
id: node.field_twin_media
field_name: field_twin_media
entity_type: node
type: entity_reference
settings:
target_type: media
module: core
locked: false
cardinality: 2
translatable: true
indexes: { }
persist_with_no_fields: false
custom_storage: false

View file

@ -0,0 +1,19 @@
langcode: en
status: true
dependencies:
module:
- media
- node
id: node.field_unlimited_media
field_name: field_unlimited_media
entity_type: node
type: entity_reference
settings:
target_type: media
module: core
locked: false
cardinality: -1
translatable: true
indexes: { }
persist_with_no_fields: false
custom_storage: false

View file

@ -0,0 +1,12 @@
langcode: en
status: true
dependencies: { }
id: type_four
label: 'Type Four'
description: ''
source: image
queue_thumbnail_downloads: false
new_revision: false
source_configuration:
source_field: field_media_test_image
field_map: { }

View file

@ -0,0 +1,16 @@
langcode: en
status: true
dependencies:
module:
- media
- media_test_source
id: type_one
label: 'Type One'
description: ''
source: test
queue_thumbnail_downloads: false
new_revision: false
source_configuration:
source_field: field_media_test
test_config_value: 'This is default value.'
field_map: { }

View file

@ -0,0 +1,12 @@
langcode: en
status: true
dependencies: { }
id: type_three
label: 'Type Three'
description: ''
source: image
queue_thumbnail_downloads: false
new_revision: false
source_configuration:
source_field: field_media_test_image
field_map: { }

View file

@ -0,0 +1,16 @@
langcode: en
status: true
dependencies:
module:
- media
- media_test_source
id: type_two
label: 'Type Two'
description: ''
source: test
queue_thumbnail_downloads: false
new_revision: false
source_configuration:
source_field: field_media_test_1
test_config_value: 'This is default value.'
field_map: { }

View file

@ -0,0 +1,9 @@
langcode: en
status: true
name: 'Basic Page'
type: basic_page
description: ''
help: ''
new_revision: true
preview_mode: 1
display_submitted: true

View file

@ -0,0 +1,12 @@
name: 'Media library test'
type: module
description: 'Test module for Media library.'
package: Testing
core: 8.x
dependencies:
- drupal:image
- drupal:media_library
- drupal:media_test_source
- drupal:menu_ui
- drupal:node
- drupal:path

View file

@ -0,0 +1,445 @@
<?php
namespace Drupal\Tests\media_library\FunctionalJavascript;
use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
use Drupal\media\Entity\Media;
use Drupal\Tests\TestFileCreationTrait;
use Drupal\user\Entity\Role;
use Drupal\user\RoleInterface;
/**
* Contains Media library integration tests.
*
* @group media_library
*/
class MediaLibraryTest extends WebDriverTestBase {
use TestFileCreationTrait;
/**
* {@inheritdoc}
*/
protected static $modules = ['block', 'media_library_test'];
/**
* {@inheritdoc}
*/
protected function setUp() {
parent::setUp();
// Create a few example media items for use in selection.
$media = [
'type_one' => [
'Horse',
'Bear',
'Cat',
'Dog',
],
'type_two' => [
'Crocodile',
'Lizard',
'Snake',
'Turtle',
],
];
$time = time();
foreach ($media as $type => $names) {
foreach ($names as $name) {
$entity = Media::create(['name' => $name, 'bundle' => $type]);
$source_field = $type === 'type_one' ? 'field_media_test' : 'field_media_test_1';
$entity->setCreatedTime(++$time);
$entity->set($source_field, $name);
$entity->save();
}
}
// Create a user who can use the Media library.
$user = $this->drupalCreateUser([
'access administration pages',
'access content',
'access media overview',
'edit own basic_page content',
'create basic_page content',
'create media',
'delete any media',
'view media',
]);
$this->drupalLogin($user);
$this->drupalPlaceBlock('local_tasks_block');
$this->drupalPlaceBlock('local_actions_block');
}
/**
* Tests that the Media library's administration page works as expected.
*/
public function testAdministrationPage() {
$session = $this->getSession();
$page = $session->getPage();
$assert_session = $this->assertSession();
// Visit the administration page.
$this->drupalGet('admin/content/media');
// Verify that the "Add media" link is present.
$assert_session->linkExists('Add media');
// Verify that media from two separate types is present.
$assert_session->pageTextContains('Dog');
$assert_session->pageTextContains('Turtle');
// Test that users can filter by type.
$page->selectFieldOption('Media type', 'Type One');
$page->pressButton('Apply Filters');
$assert_session->assertWaitOnAjaxRequest();
$assert_session->pageTextContains('Dog');
$assert_session->pageTextNotContains('Turtle');
$page->selectFieldOption('Media type', 'Type Two');
$page->pressButton('Apply Filters');
$assert_session->assertWaitOnAjaxRequest();
$assert_session->pageTextNotContains('Dog');
$assert_session->pageTextContains('Turtle');
// Test that selecting elements as a part of bulk operations works.
$page->selectFieldOption('Media type', '- Any -');
$page->pressButton('Apply Filters');
$assert_session->assertWaitOnAjaxRequest();
// This tests that anchor tags clicked inside the preview are suppressed.
$this->getSession()->executeScript('jQuery(".js-click-to-select-trigger a")[0].click()');
$this->submitForm([], 'Apply to selected items');
$assert_session->pageTextContains('Dog');
$assert_session->pageTextNotContains('Cat');
$this->submitForm([], 'Delete');
$assert_session->pageTextNotContains('Dog');
$assert_session->pageTextContains('Cat');
// Test 'Select all media'.
$this->getSession()->getPage()->checkField('Select all media');
$this->getSession()->getPage()->selectFieldOption('Action', 'media_delete_action');
$this->submitForm([], 'Apply to selected items');
$this->getSession()->getPage()->pressButton('Delete');
$assert_session->pageTextNotContains('Cat');
$assert_session->pageTextNotContains('Turtle');
$assert_session->pageTextNotContains('Snake');
// Test empty text.
$assert_session->pageTextContains('No media available.');
// Verify that the "Table" link is present, click it and check address.
$assert_session->linkExists('Table');
$page->clickLink('Table');
$assert_session->addressEquals('admin/content/media-table');
// Verify that the "Add media" link is present.
$assert_session->linkExists('Add media');
}
/**
* Tests that the Media library's widget works as expected.
*/
public function testWidget() {
$assert_session = $this->assertSession();
$page = $this->getSession()->getPage();
// Visit a node create page.
$this->drupalGet('node/add/basic_page');
// Verify that both media widget instances are present.
$assert_session->pageTextContains('Unlimited media');
$assert_session->pageTextContains('Twin media');
// Add to the unlimited cardinality field.
$unlimited_button = $assert_session->elementExists('css', '.media-library-open-button[href*="field_unlimited_media"]');
$unlimited_button->click();
$assert_session->assertWaitOnAjaxRequest();
// Assert that only type_one media items exist, since this field only
// accepts items of that type.
$assert_session->pageTextContains('Media library');
$assert_session->pageTextContains('Dog');
$assert_session->pageTextContains('Bear');
$assert_session->pageTextNotContains('Turtle');
// Ensure that the "Select all" checkbox is not visible.
$this->assertFalse($assert_session->elementExists('css', '.media-library-select-all')->isVisible());
// Use an exposed filter.
$session = $this->getSession();
$session->getPage()->fillField('Name', 'Dog');
$session->getPage()->pressButton('Apply Filters');
$assert_session->assertWaitOnAjaxRequest();
$assert_session->pageTextContains('Dog');
$assert_session->pageTextNotContains('Bear');
// Clear the exposed filter.
$session->getPage()->fillField('Name', '');
$session->getPage()->pressButton('Apply Filters');
$assert_session->assertWaitOnAjaxRequest();
// Select the first three media items (should be Dog/Cat/Bear).
$checkbox_selector = '.media-library-view .js-click-to-select-checkbox input';
$checkboxes = $page->findAll('css', $checkbox_selector);
$checkboxes[0]->click();
$checkboxes[1]->click();
$checkboxes[2]->click();
$assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Select media');
$assert_session->assertWaitOnAjaxRequest();
// Ensure that the selection completed successfully.
$assert_session->pageTextNotContains('Media library');
$assert_session->pageTextContains('Dog');
$assert_session->pageTextContains('Cat');
$assert_session->pageTextContains('Bear');
// Remove "Dog" (happens to be the first remove button on the page).
$assert_session->elementExists('css', '.media-library-item__remove')->click();
$assert_session->assertWaitOnAjaxRequest();
$assert_session->pageTextNotContains('Dog');
$assert_session->pageTextContains('Cat');
$assert_session->pageTextContains('Bear');
// Open another Media library on the same page.
$twin_button = $assert_session->elementExists('css', '.media-library-open-button[href*="field_twin_media"]');
$twin_button->click();
$assert_session->assertWaitOnAjaxRequest();
// This field allows both media types.
$assert_session->pageTextContains('Media library');
$assert_session->pageTextContains('Dog');
$assert_session->pageTextContains('Turtle');
// Attempt to select three items - the cardinality of this field is two so
// the third selection should be disabled.
$checkbox_selector = '.media-library-view .js-click-to-select-checkbox input';
$checkboxes = $page->findAll('css', $checkbox_selector);
$this->assertFalse($checkboxes[5]->hasAttribute('disabled'));
$checkboxes[0]->click();
$checkboxes[7]->click();
$this->assertTrue($checkboxes[5]->hasAttribute('disabled'));
$assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Select media');
$assert_session->assertWaitOnAjaxRequest();
// Ensure that the selection completed successfully, and we have only two
// media items of two different types.
$assert_session->pageTextNotContains('Media library');
$assert_session->pageTextContains('Horse');
$assert_session->pageTextContains('Turtle');
$assert_session->pageTextNotContains('Snake');
// Finally, save the form.
$assert_session->elementExists('css', '.js-media-library-widget-toggle-weight')->click();
$this->submitForm([
'title[0][value]' => 'My page',
'field_unlimited_media[selection][0][weight]' => '2',
], 'Save');
$assert_session->pageTextContains('Basic Page My page has been created');
// We removed this item earlier.
$assert_session->pageTextNotContains('Dog');
// This item should not have been selected due to cardinality constraints.
$assert_session->pageTextNotContains('Snake');
// "Cat" should come after "Bear", since we changed the weight.
$assert_session->elementExists('css', '.field--name-field-unlimited-media > .field__items > .field__item:last-child:contains("Cat")');
// Make sure everything that was selected shows up.
$assert_session->pageTextContains('Cat');
$assert_session->pageTextContains('Bear');
$assert_session->pageTextContains('Horse');
$assert_session->pageTextContains('Turtle');
// Re-edit the content and make a new selection.
$this->drupalGet('node/1/edit');
$assert_session->pageTextNotContains('Dog');
$assert_session->pageTextContains('Cat');
$assert_session->pageTextContains('Bear');
$assert_session->pageTextContains('Horse');
$assert_session->pageTextContains('Turtle');
$unlimited_button = $assert_session->elementExists('css', '.media-library-open-button[href*="field_unlimited_media"]');
$unlimited_button->click();
$assert_session->assertWaitOnAjaxRequest();
$assert_session->pageTextContains('Media library');
// Select the first media items (should be Dog, again).
$checkbox_selector = '.media-library-view .js-click-to-select-checkbox input';
$checkboxes = $page->findAll('css', $checkbox_selector);
$checkboxes[0]->click();
$assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Select media');
$assert_session->assertWaitOnAjaxRequest();
// "Dog" and the existing selection should still exist.
$assert_session->pageTextContains('Dog');
$assert_session->pageTextContains('Cat');
$assert_session->pageTextContains('Bear');
$assert_session->pageTextContains('Horse');
$assert_session->pageTextContains('Turtle');
}
/**
* Tests that the widget works as expected for anonymous users.
*/
public function testWidgetAnonymous() {
$assert_session = $this->assertSession();
$this->drupalLogout();
$role = Role::load(RoleInterface::ANONYMOUS_ID);
$role->revokePermission('view media');
$role->save();
// Verify that unprivileged users can't access the widget view.
$this->drupalGet('admin/content/media-widget');
$assert_session->responseContains('Access denied');
// Allow the anonymous user to create pages and view media.
$this->grantPermissions($role, [
'access content',
'create basic_page content',
'view media',
]);
// Ensure the widget works as an anonymous user.
$this->drupalGet('node/add/basic_page');
// Add to the unlimited cardinality field.
$unlimited_button = $assert_session->elementExists('css', '.media-library-open-button[href*="field_unlimited_media"]');
$unlimited_button->click();
$assert_session->assertWaitOnAjaxRequest();
// Select the first media item (should be Dog).
$checkbox_selector = '.media-library-view .js-click-to-select-checkbox input';
$checkboxes = $this->getSession()->getPage()->findAll('css', $checkbox_selector);
$checkboxes[0]->click();
$assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Select media');
$assert_session->assertWaitOnAjaxRequest();
// Ensure that the selection completed successfully.
$assert_session->pageTextNotContains('Media library');
$assert_session->pageTextContains('Dog');
// Save the form.
$assert_session->elementExists('css', '.js-media-library-widget-toggle-weight')->click();
$this->submitForm([
'title[0][value]' => 'My page',
'field_unlimited_media[selection][0][weight]' => '0',
], 'Save');
$assert_session->pageTextContains('Basic Page My page has been created');
$assert_session->pageTextContains('Dog');
}
/**
* Tests that uploads in the Media library's widget works as expected.
*/
public function testWidgetUpload() {
$assert_session = $this->assertSession();
$page = $this->getSession()->getPage();
foreach ($this->getTestFiles('image') as $image) {
$extension = pathinfo($image->filename, PATHINFO_EXTENSION);
if ($extension === 'png') {
$png_image = $image;
}
elseif ($extension === 'jpg') {
$jpg_image = $image;
}
}
if (!isset($png_image) || !isset($jpg_image)) {
$this->fail('Expected test files not present.');
}
// Visit a node create page.
$this->drupalGet('node/add/basic_page');
$file_storage = $this->container->get('entity_type.manager')->getStorage('file');
/** @var \Drupal\Core\File\FileSystemInterface $file_system */
$file_system = $this->container->get('file_system');
// Ensure that the add button is not present if no media can be created.
$assert_session->elementNotExists('css', '.media-library-add-button[href*="field_noadd_media"]');
// Add to the twin media field using the add button directly on the widget.
$twin_button = $assert_session->elementExists('css', '.media-library-add-button[href*="field_twin_media"]');
$twin_button->click();
$assert_session->assertWaitOnAjaxRequest();
$page->attachFileToField('Upload', $this->container->get('file_system')->realpath($png_image->uri));
$assert_session->assertWaitOnAjaxRequest();
// Files are temporary until the form is saved.
$files = $file_storage->loadMultiple();
$file = array_pop($files);
$this->assertSame('public://type-three-dir', $file_system->dirname($file->getFileUri()));
$this->assertTrue($file->isTemporary());
$this->assertSame($assert_session->fieldExists('Name')->getValue(), $png_image->filename);
$assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save');
$assert_session->assertWaitOnAjaxRequest();
$assert_session->pageTextContains('Alternative text field is required');
$page->fillField('Alternative text', $this->randomString());
$assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save');
$assert_session->assertWaitOnAjaxRequest();
// The file should be permanent now.
$files = $file_storage->loadMultiple();
$file = array_pop($files);
$this->assertFalse($file->isTemporary());
// Ensure the media item was added.
$assert_session->pageTextNotContains('Media library');
$assert_session->pageTextContains($png_image->filename);
// Also make sure that we can upload to the unlimited cardinality field.
$unlimited_button = $assert_session->elementExists('css', '.media-library-add-button[href*="field_unlimited_media"]');
$unlimited_button->click();
$assert_session->assertWaitOnAjaxRequest();
// Multiple uploads should be allowed.
// @todo Add test when https://github.com/minkphp/Mink/issues/358 is closed
$this->assertTrue($assert_session->fieldExists('Upload')->hasAttribute('multiple'));
$page->attachFileToField('Upload', $this->container->get('file_system')->realpath($png_image->uri));
$assert_session->assertWaitOnAjaxRequest();
$page->fillField('Name', 'Unlimited Cardinality Image');
$page->fillField('Alternative text', $this->randomString());
$assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save');
$assert_session->assertWaitOnAjaxRequest();
// Ensure the media item was added.
$assert_session->pageTextNotContains('Media library');
$assert_session->pageTextContains('Unlimited Cardinality Image');
// Open the browser again to test type resolution.
$twin_button = $assert_session->elementExists('css', '.media-library-open-button[href*="field_twin_media"]');
$twin_button->click();
$assert_session->assertWaitOnAjaxRequest();
$assert_session->pageTextContains('Media library');
$assert_session->elementExists('css', '#drupal-modal')->clickLink('Add media');
$assert_session->assertWaitOnAjaxRequest();
$page->attachFileToField('Upload', $file_system->realpath($jpg_image->uri));
$assert_session->assertWaitOnAjaxRequest();
$assert_session->pageTextContains('Select a media type for ' . $jpg_image->filename);
// Before the type is determined, the file lives in the default upload
// location (temporary://).
$files = $file_storage->loadMultiple();
$file = array_pop($files);
$this->assertSame('temporary', $file_system->uriScheme($file->getFileUri()));
// Both the type_three and type_four media types accept jpg images.
$assert_session->buttonExists('Type Three');
$assert_session->buttonExists('Type Four')->click();
$assert_session->assertWaitOnAjaxRequest();
// The file should have been moved when the type was selected.
$files = $file_storage->loadMultiple();
$file = array_pop($files);
$this->assertSame('public://type-four-dir', $file_system->dirname($file->getFileUri()));
$this->assertSame($assert_session->fieldExists('Name')->getValue(), $jpg_image->filename);
$page->fillField('Alternative text', $this->randomString());
// The type_four media type has another optional image field.
$assert_session->pageTextContains('Extra Image');
$page->attachFileToField('Extra Image', $this->container->get('file_system')->realpath($jpg_image->uri));
$assert_session->assertWaitOnAjaxRequest();
// Ensure that the extra image was uploaded to the correct directory.
$files = $file_storage->loadMultiple();
$file = array_pop($files);
$this->assertSame('public://type-four-extra-dir', $file_system->dirname($file->getFileUri()));
$assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save');
$assert_session->assertWaitOnAjaxRequest();
$assert_session->pageTextNotContains('Media library');
$assert_session->pageTextContains($jpg_image->filename);
}
}