Move all files to 2017/
This commit is contained in:
parent
ac7370f67f
commit
2875863330
15717 changed files with 0 additions and 0 deletions
|
@ -0,0 +1,61 @@
|
|||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
config:
|
||||
- field.field.node.options_install_test.body
|
||||
- node.type.options_install_test
|
||||
module:
|
||||
- text
|
||||
id: node.options_install_test.default
|
||||
targetEntityType: node
|
||||
bundle: options_install_test
|
||||
mode: default
|
||||
content:
|
||||
title:
|
||||
type: string_textfield
|
||||
weight: -5
|
||||
region: content
|
||||
settings:
|
||||
size: 60
|
||||
placeholder: ''
|
||||
third_party_settings: { }
|
||||
uid:
|
||||
type: entity_reference_autocomplete
|
||||
weight: 5
|
||||
region: content
|
||||
settings:
|
||||
match_operator: CONTAINS
|
||||
size: 60
|
||||
placeholder: ''
|
||||
third_party_settings: { }
|
||||
created:
|
||||
type: datetime_timestamp
|
||||
weight: 10
|
||||
region: content
|
||||
settings: { }
|
||||
third_party_settings: { }
|
||||
promote:
|
||||
type: boolean_checkbox
|
||||
settings:
|
||||
display_label: true
|
||||
weight: 15
|
||||
region: content
|
||||
third_party_settings: { }
|
||||
sticky:
|
||||
type: boolean_checkbox
|
||||
settings:
|
||||
display_label: true
|
||||
weight: 16
|
||||
region: content
|
||||
third_party_settings: { }
|
||||
body:
|
||||
type: text_textarea_with_summary
|
||||
weight: 26
|
||||
region: content
|
||||
settings:
|
||||
rows: 9
|
||||
summary_rows: 3
|
||||
placeholder: ''
|
||||
third_party_settings: { }
|
||||
hidden: { }
|
||||
third_party_settings: { }
|
|
@ -0,0 +1,27 @@
|
|||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
config:
|
||||
- field.field.node.options_install_test.body
|
||||
- node.type.options_install_test
|
||||
module:
|
||||
- text
|
||||
- user
|
||||
id: node.options_install_test.default
|
||||
targetEntityType: node
|
||||
bundle: options_install_test
|
||||
mode: default
|
||||
content:
|
||||
links:
|
||||
weight: 100
|
||||
region: content
|
||||
body:
|
||||
label: hidden
|
||||
type: text_default
|
||||
weight: 101
|
||||
region: content
|
||||
settings: { }
|
||||
third_party_settings: { }
|
||||
hidden:
|
||||
langcode: true
|
||||
third_party_settings: { }
|
|
@ -0,0 +1,29 @@
|
|||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
config:
|
||||
- core.entity_view_mode.node.teaser
|
||||
- field.field.node.options_install_test.body
|
||||
- node.type.options_install_test
|
||||
module:
|
||||
- text
|
||||
- user
|
||||
id: node.options_install_test.teaser
|
||||
targetEntityType: node
|
||||
bundle: options_install_test
|
||||
mode: teaser
|
||||
content:
|
||||
links:
|
||||
weight: 100
|
||||
region: content
|
||||
body:
|
||||
label: hidden
|
||||
type: text_summary_or_trimmed
|
||||
weight: 101
|
||||
region: content
|
||||
settings:
|
||||
trim_length: 600
|
||||
third_party_settings: { }
|
||||
hidden:
|
||||
langcode: true
|
||||
third_party_settings: { }
|
|
@ -0,0 +1,20 @@
|
|||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
config:
|
||||
- field.storage.node.body
|
||||
- node.type.options_install_test
|
||||
id: node.options_install_test.body
|
||||
field_name: body
|
||||
entity_type: node
|
||||
bundle: options_install_test
|
||||
label: Body
|
||||
description: ''
|
||||
required: false
|
||||
translatable: true
|
||||
default_value: { }
|
||||
default_value_callback: ''
|
||||
settings:
|
||||
display_summary: true
|
||||
third_party_settings: { }
|
||||
field_type: text_with_summary
|
|
@ -0,0 +1,19 @@
|
|||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
config:
|
||||
- field.storage.node.field_options_float
|
||||
- node.type.options_install_test
|
||||
id: node.options_install_test.field_options_float
|
||||
field_name: field_options_float
|
||||
entity_type: node
|
||||
bundle: options_install_test
|
||||
label: field_options_float
|
||||
description: ''
|
||||
required: false
|
||||
translatable: true
|
||||
default_value: { }
|
||||
default_value_callback: ''
|
||||
settings: { }
|
||||
third_party_settings: { }
|
||||
field_type: list_float
|
|
@ -0,0 +1,26 @@
|
|||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
module:
|
||||
- node
|
||||
- options
|
||||
id: node.field_options_float
|
||||
field_name: field_options_float
|
||||
entity_type: node
|
||||
type: list_float
|
||||
settings:
|
||||
allowed_values:
|
||||
-
|
||||
value: !!float 0
|
||||
label: Zero
|
||||
-
|
||||
value: 0.5
|
||||
label: 'Point five'
|
||||
allowed_values_function: ''
|
||||
module: options
|
||||
locked: false
|
||||
cardinality: 1
|
||||
translatable: true
|
||||
indexes: { }
|
||||
persist_with_no_fields: false
|
||||
custom_storage: false
|
|
@ -0,0 +1,11 @@
|
|||
langcode: en
|
||||
status: true
|
||||
dependencies: { }
|
||||
name: options_install_test
|
||||
type: options_install_test
|
||||
description: null
|
||||
help: null
|
||||
new_revision: false
|
||||
preview_mode: 1
|
||||
display_submitted: true
|
||||
third_party_settings: { }
|
|
@ -0,0 +1,9 @@
|
|||
name: 'Options config install test'
|
||||
type: module
|
||||
description: 'Support module for the Options module tests.'
|
||||
core: 8.x
|
||||
package: Testing
|
||||
version: VERSION
|
||||
dependencies:
|
||||
- drupal:node
|
||||
- drupal:options
|
|
@ -0,0 +1,6 @@
|
|||
name: 'Options test'
|
||||
type: module
|
||||
description: 'Support module for the Options module tests.'
|
||||
core: 8.x
|
||||
package: Testing
|
||||
version: VERSION
|
|
@ -0,0 +1,56 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Helper module for the List module tests.
|
||||
*/
|
||||
|
||||
use Drupal\Core\Entity\FieldableEntityInterface;
|
||||
use Drupal\Core\Field\FieldStorageDefinitionInterface;
|
||||
|
||||
/**
|
||||
* Implements callback_allowed_values_function().
|
||||
*
|
||||
* @see options_allowed_values()
|
||||
*/
|
||||
function options_test_allowed_values_callback(FieldStorageDefinitionInterface $definition, FieldableEntityInterface $entity = NULL) {
|
||||
$values = [
|
||||
'Group 1' => [
|
||||
0 => 'Zero',
|
||||
],
|
||||
1 => 'One',
|
||||
'Group 2' => [
|
||||
2 => 'Some <script>dangerous</script> & unescaped <strong>markup</strong>',
|
||||
],
|
||||
'More <script>dangerous</script> markup' => [
|
||||
3 => 'Three',
|
||||
],
|
||||
];
|
||||
|
||||
return $values;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements callback_allowed_values_function().
|
||||
*
|
||||
* @todo This function violates the recommendation in options_allowed_values()
|
||||
* to return a list of all possible values in any context when $items is
|
||||
* NULL. Since this is not yet used for testing Views integration, that is
|
||||
* alright for now. Fix this in https://www.drupal.org/node/2012130.
|
||||
*
|
||||
* @see options_allowed_values()
|
||||
*/
|
||||
function options_test_dynamic_values_callback(FieldStorageDefinitionInterface $definition, FieldableEntityInterface $entity = NULL, &$cacheable = NULL) {
|
||||
$values = [];
|
||||
if (isset($entity)) {
|
||||
$cacheable = FALSE;
|
||||
$values = [
|
||||
$entity->label(),
|
||||
$entity->url(),
|
||||
$entity->uuid(),
|
||||
$entity->bundle(),
|
||||
];
|
||||
}
|
||||
// We need the values of the entity as keys.
|
||||
return array_combine($values, $values);
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
name: 'Options test views'
|
||||
type: module
|
||||
description: 'Provides default views for views options tests.'
|
||||
package: Testing
|
||||
version: VERSION
|
||||
core: 8.x
|
||||
dependencies:
|
||||
- drupal:options
|
||||
- drupal:views
|
|
@ -0,0 +1,200 @@
|
|||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
config:
|
||||
- node.type.article
|
||||
module:
|
||||
- node
|
||||
- user
|
||||
id: test_options_list_argument_numeric
|
||||
label: 'test options list argument (numeric)'
|
||||
module: views
|
||||
description: ''
|
||||
tag: ''
|
||||
base_table: node_field_data
|
||||
base_field: nid
|
||||
core: 8.x
|
||||
display:
|
||||
default:
|
||||
display_plugin: default
|
||||
id: default
|
||||
display_title: Master
|
||||
position: 1
|
||||
display_options:
|
||||
access:
|
||||
type: perm
|
||||
options:
|
||||
perm: 'access content'
|
||||
cache:
|
||||
type: tag
|
||||
options: { }
|
||||
query:
|
||||
type: views_query
|
||||
options:
|
||||
disable_sql_rewrite: false
|
||||
distinct: false
|
||||
replica: false
|
||||
query_comment: ''
|
||||
query_tags: { }
|
||||
exposed_form:
|
||||
type: basic
|
||||
options:
|
||||
submit_button: Apply
|
||||
reset_button: false
|
||||
reset_button_label: Reset
|
||||
exposed_sorts_label: 'Sort by'
|
||||
expose_sort_order: true
|
||||
sort_asc_label: Asc
|
||||
sort_desc_label: Desc
|
||||
pager:
|
||||
type: some
|
||||
options:
|
||||
items_per_page: 5
|
||||
offset: 0
|
||||
style:
|
||||
type: default
|
||||
row:
|
||||
type: fields
|
||||
fields:
|
||||
title:
|
||||
id: title
|
||||
table: node_field_data
|
||||
field: title
|
||||
label: ''
|
||||
alter:
|
||||
alter_text: false
|
||||
make_link: false
|
||||
absolute: false
|
||||
trim: false
|
||||
word_boundary: false
|
||||
ellipsis: false
|
||||
strip_tags: false
|
||||
html: false
|
||||
hide_empty: false
|
||||
empty_zero: false
|
||||
relationship: none
|
||||
group_type: group
|
||||
admin_label: ''
|
||||
exclude: false
|
||||
element_type: ''
|
||||
element_class: ''
|
||||
element_label_type: ''
|
||||
element_label_class: ''
|
||||
element_label_colon: true
|
||||
element_wrapper_type: ''
|
||||
element_wrapper_class: ''
|
||||
element_default_classes: true
|
||||
empty: ''
|
||||
hide_alter_empty: true
|
||||
plugin_id: field
|
||||
filters:
|
||||
status:
|
||||
value: '1'
|
||||
table: node_field_data
|
||||
field: status
|
||||
id: status
|
||||
expose:
|
||||
operator: ''
|
||||
group: 1
|
||||
plugin_id: boolean
|
||||
type:
|
||||
id: type
|
||||
table: node_field_data
|
||||
field: type
|
||||
relationship: none
|
||||
group_type: group
|
||||
admin_label: ''
|
||||
operator: in
|
||||
value:
|
||||
article: article
|
||||
group: 1
|
||||
exposed: false
|
||||
expose:
|
||||
operator_id: '0'
|
||||
label: ''
|
||||
description: ''
|
||||
use_operator: false
|
||||
operator: ''
|
||||
identifier: ''
|
||||
required: false
|
||||
remember: false
|
||||
multiple: false
|
||||
remember_roles:
|
||||
authenticated: authenticated
|
||||
reduce: false
|
||||
is_grouped: false
|
||||
group_info:
|
||||
label: ''
|
||||
description: ''
|
||||
identifier: ''
|
||||
optional: true
|
||||
widget: select
|
||||
multiple: false
|
||||
remember: false
|
||||
default_group: All
|
||||
default_group_multiple: { }
|
||||
group_items: { }
|
||||
plugin_id: bundle
|
||||
sorts:
|
||||
nid:
|
||||
id: nid
|
||||
table: nid
|
||||
field: nid
|
||||
order: DESC
|
||||
relationship: none
|
||||
group_type: group
|
||||
admin_label: ''
|
||||
exposed: false
|
||||
expose:
|
||||
label: ''
|
||||
plugin_id: standard
|
||||
title: 'test options list argument'
|
||||
header: { }
|
||||
footer: { }
|
||||
empty: { }
|
||||
relationships: { }
|
||||
arguments:
|
||||
field_test_list_integer_value:
|
||||
id: field_test_list_integer_value
|
||||
table: field_data_field_test_list_integer
|
||||
field: field_test_list_integer_value
|
||||
relationship: none
|
||||
group_type: group
|
||||
admin_label: ''
|
||||
default_action: empty
|
||||
exception:
|
||||
value: all
|
||||
title_enable: false
|
||||
title: All
|
||||
title_enable: false
|
||||
title: ''
|
||||
default_argument_type: fixed
|
||||
default_argument_options:
|
||||
argument: ''
|
||||
default_argument_skip_url: false
|
||||
summary_options:
|
||||
base_path: ''
|
||||
items_per_page: 25
|
||||
count: false
|
||||
override: false
|
||||
summary:
|
||||
sort_order: asc
|
||||
number_of_records: 0
|
||||
format: default_summary
|
||||
human: true
|
||||
specify_validation: false
|
||||
validate:
|
||||
type: none
|
||||
fail: 'not found'
|
||||
validate_options: { }
|
||||
break_phrase: false
|
||||
not: false
|
||||
plugin_id: number_list_field
|
||||
display_extenders: { }
|
||||
block_1:
|
||||
display_plugin: block
|
||||
id: block_1
|
||||
display_title: Block
|
||||
position: 1
|
||||
display_options:
|
||||
display_extenders: { }
|
|
@ -0,0 +1,199 @@
|
|||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
config:
|
||||
- node.type.article
|
||||
module:
|
||||
- node
|
||||
- user
|
||||
id: test_options_list_argument_string
|
||||
label: 'test options list argument (string)'
|
||||
module: views
|
||||
description: ''
|
||||
tag: ''
|
||||
base_table: node_field_data
|
||||
base_field: nid
|
||||
core: 8.x
|
||||
display:
|
||||
default:
|
||||
display_plugin: default
|
||||
id: default
|
||||
display_title: Master
|
||||
position: 1
|
||||
display_options:
|
||||
access:
|
||||
type: perm
|
||||
options:
|
||||
perm: 'access content'
|
||||
cache:
|
||||
type: tag
|
||||
options: { }
|
||||
query:
|
||||
type: views_query
|
||||
options:
|
||||
disable_sql_rewrite: false
|
||||
distinct: false
|
||||
replica: false
|
||||
query_comment: ''
|
||||
query_tags: { }
|
||||
exposed_form:
|
||||
type: basic
|
||||
options:
|
||||
submit_button: Apply
|
||||
reset_button: false
|
||||
reset_button_label: Reset
|
||||
exposed_sorts_label: 'Sort by'
|
||||
expose_sort_order: true
|
||||
sort_asc_label: Asc
|
||||
sort_desc_label: Desc
|
||||
pager:
|
||||
type: some
|
||||
options:
|
||||
items_per_page: 5
|
||||
offset: 0
|
||||
style:
|
||||
type: default
|
||||
row:
|
||||
type: fields
|
||||
fields:
|
||||
title:
|
||||
id: title
|
||||
table: node_field_data
|
||||
field: title
|
||||
label: ''
|
||||
alter:
|
||||
alter_text: false
|
||||
make_link: false
|
||||
absolute: false
|
||||
trim: false
|
||||
word_boundary: false
|
||||
ellipsis: false
|
||||
strip_tags: false
|
||||
html: false
|
||||
hide_empty: false
|
||||
empty_zero: false
|
||||
relationship: none
|
||||
group_type: group
|
||||
admin_label: ''
|
||||
exclude: false
|
||||
element_type: ''
|
||||
element_class: ''
|
||||
element_label_type: ''
|
||||
element_label_class: ''
|
||||
element_label_colon: true
|
||||
element_wrapper_type: ''
|
||||
element_wrapper_class: ''
|
||||
element_default_classes: true
|
||||
empty: ''
|
||||
hide_alter_empty: true
|
||||
plugin_id: field
|
||||
filters:
|
||||
status:
|
||||
value: '1'
|
||||
table: node_field_data
|
||||
field: status
|
||||
id: status
|
||||
expose:
|
||||
operator: ''
|
||||
group: 1
|
||||
plugin_id: boolean
|
||||
type:
|
||||
id: type
|
||||
table: node_field_data
|
||||
field: type
|
||||
relationship: none
|
||||
group_type: group
|
||||
admin_label: ''
|
||||
operator: in
|
||||
value:
|
||||
article: article
|
||||
group: 1
|
||||
exposed: false
|
||||
expose:
|
||||
operator_id: '0'
|
||||
label: ''
|
||||
description: ''
|
||||
use_operator: false
|
||||
operator: ''
|
||||
identifier: ''
|
||||
required: false
|
||||
remember: false
|
||||
multiple: false
|
||||
remember_roles:
|
||||
authenticated: authenticated
|
||||
reduce: false
|
||||
is_grouped: false
|
||||
group_info:
|
||||
label: ''
|
||||
description: ''
|
||||
identifier: ''
|
||||
optional: true
|
||||
widget: select
|
||||
multiple: false
|
||||
remember: false
|
||||
default_group: All
|
||||
default_group_multiple: { }
|
||||
group_items: { }
|
||||
plugin_id: bundle
|
||||
sorts:
|
||||
nid:
|
||||
id: nid
|
||||
table: nid
|
||||
field: nid
|
||||
order: DESC
|
||||
relationship: none
|
||||
group_type: group
|
||||
admin_label: ''
|
||||
exposed: false
|
||||
expose:
|
||||
label: ''
|
||||
plugin_id: standard
|
||||
title: 'test options list argument'
|
||||
header: { }
|
||||
footer: { }
|
||||
empty: { }
|
||||
relationships: { }
|
||||
arguments:
|
||||
field_test_list_string_value:
|
||||
id: field_test_list_string_value
|
||||
table: field_data_field_test_list_string
|
||||
field: field_test_list_string_value
|
||||
relationship: none
|
||||
group_type: group
|
||||
admin_label: ''
|
||||
default_action: empty
|
||||
exception:
|
||||
value: all
|
||||
title_enable: false
|
||||
title: All
|
||||
title_enable: false
|
||||
title: ''
|
||||
default_argument_type: fixed
|
||||
default_argument_options:
|
||||
argument: ''
|
||||
default_argument_skip_url: false
|
||||
summary_options:
|
||||
base_path: ''
|
||||
items_per_page: 25
|
||||
count: false
|
||||
override: false
|
||||
summary:
|
||||
sort_order: asc
|
||||
number_of_records: 0
|
||||
format: default_summary
|
||||
human: true
|
||||
specify_validation: false
|
||||
validate:
|
||||
type: none
|
||||
fail: 'not found'
|
||||
validate_options: { }
|
||||
break_phrase: false
|
||||
plugin_id: string_list_field
|
||||
display_extenders: { }
|
||||
block_1:
|
||||
display_plugin: block
|
||||
id: block_1
|
||||
display_title: Block
|
||||
position: 1
|
||||
display_options:
|
||||
display_extenders: { }
|
|
@ -0,0 +1,204 @@
|
|||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
config:
|
||||
- node.type.article
|
||||
module:
|
||||
- node
|
||||
- user
|
||||
id: test_options_list_filter
|
||||
label: test_options_list_filter
|
||||
module: views
|
||||
description: ''
|
||||
tag: ''
|
||||
base_table: node_field_data
|
||||
base_field: nid
|
||||
core: 8.x
|
||||
display:
|
||||
default:
|
||||
display_plugin: default
|
||||
id: default
|
||||
display_title: Master
|
||||
position: 1
|
||||
display_options:
|
||||
access:
|
||||
type: perm
|
||||
options:
|
||||
perm: 'access content'
|
||||
cache:
|
||||
type: tag
|
||||
options: { }
|
||||
query:
|
||||
type: views_query
|
||||
options:
|
||||
disable_sql_rewrite: false
|
||||
distinct: false
|
||||
replica: false
|
||||
query_comment: ''
|
||||
query_tags: { }
|
||||
exposed_form:
|
||||
type: basic
|
||||
options:
|
||||
submit_button: Apply
|
||||
reset_button: false
|
||||
reset_button_label: Reset
|
||||
exposed_sorts_label: 'Sort by'
|
||||
expose_sort_order: true
|
||||
sort_asc_label: Asc
|
||||
sort_desc_label: Desc
|
||||
pager:
|
||||
type: some
|
||||
options:
|
||||
items_per_page: 5
|
||||
offset: 0
|
||||
style:
|
||||
type: default
|
||||
row:
|
||||
type: fields
|
||||
fields:
|
||||
title:
|
||||
id: title
|
||||
table: node_field_data
|
||||
field: title
|
||||
label: ''
|
||||
alter:
|
||||
alter_text: false
|
||||
make_link: false
|
||||
absolute: false
|
||||
trim: false
|
||||
word_boundary: false
|
||||
ellipsis: false
|
||||
strip_tags: false
|
||||
html: false
|
||||
hide_empty: false
|
||||
empty_zero: false
|
||||
relationship: none
|
||||
group_type: group
|
||||
admin_label: ''
|
||||
exclude: false
|
||||
element_type: ''
|
||||
element_class: ''
|
||||
element_label_type: ''
|
||||
element_label_class: ''
|
||||
element_label_colon: true
|
||||
element_wrapper_type: ''
|
||||
element_wrapper_class: ''
|
||||
element_default_classes: true
|
||||
empty: ''
|
||||
hide_alter_empty: true
|
||||
plugin_id: field
|
||||
filters:
|
||||
status:
|
||||
value: '1'
|
||||
table: node_field_data
|
||||
field: status
|
||||
id: status
|
||||
expose:
|
||||
operator: ''
|
||||
group: 1
|
||||
plugin_id: boolean
|
||||
field_test_list_string_value:
|
||||
id: field_test_list_string_value
|
||||
table: field_data_field_test_list_string
|
||||
field: field_test_list_string_value
|
||||
relationship: none
|
||||
group_type: group
|
||||
admin_label: ''
|
||||
operator: or
|
||||
value:
|
||||
man: man
|
||||
woman: woman
|
||||
group: 1
|
||||
exposed: false
|
||||
expose:
|
||||
operator_id: ''
|
||||
label: ''
|
||||
description: ''
|
||||
use_operator: false
|
||||
operator: ''
|
||||
identifier: ''
|
||||
required: false
|
||||
remember: false
|
||||
multiple: false
|
||||
remember_roles:
|
||||
authenticated: authenticated
|
||||
reduce: false
|
||||
is_grouped: false
|
||||
group_info:
|
||||
label: ''
|
||||
description: ''
|
||||
identifier: ''
|
||||
optional: true
|
||||
widget: select
|
||||
multiple: false
|
||||
remember: false
|
||||
default_group: All
|
||||
default_group_multiple: { }
|
||||
group_items: { }
|
||||
reduce_duplicates: false
|
||||
plugin_id: list_field
|
||||
type:
|
||||
id: type
|
||||
table: node_field_data
|
||||
field: type
|
||||
relationship: none
|
||||
group_type: group
|
||||
admin_label: ''
|
||||
operator: in
|
||||
value:
|
||||
article: article
|
||||
group: 1
|
||||
exposed: false
|
||||
expose:
|
||||
operator_id: ''
|
||||
label: ''
|
||||
description: ''
|
||||
use_operator: false
|
||||
operator: ''
|
||||
identifier: ''
|
||||
required: false
|
||||
remember: false
|
||||
multiple: false
|
||||
remember_roles:
|
||||
authenticated: authenticated
|
||||
reduce: false
|
||||
is_grouped: false
|
||||
group_info:
|
||||
label: ''
|
||||
description: ''
|
||||
identifier: ''
|
||||
optional: true
|
||||
widget: select
|
||||
multiple: false
|
||||
remember: false
|
||||
default_group: All
|
||||
default_group_multiple: { }
|
||||
group_items: { }
|
||||
plugin_id: bundle
|
||||
sorts:
|
||||
nid:
|
||||
id: nid
|
||||
table: nid
|
||||
field: nid
|
||||
order: DESC
|
||||
relationship: none
|
||||
group_type: group
|
||||
admin_label: ''
|
||||
exposed: false
|
||||
expose:
|
||||
label: ''
|
||||
plugin_id: standard
|
||||
title: test_options_list_filter
|
||||
header: { }
|
||||
footer: { }
|
||||
empty: { }
|
||||
relationships: { }
|
||||
arguments: { }
|
||||
display_extenders: { }
|
||||
block_1:
|
||||
display_plugin: block
|
||||
id: block_1
|
||||
display_title: Block
|
||||
position: 1
|
||||
display_options:
|
||||
display_extenders: { }
|
|
@ -0,0 +1,34 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\options\Functional;
|
||||
|
||||
/**
|
||||
* Tests the options allowed values api.
|
||||
*
|
||||
* @group options
|
||||
*/
|
||||
class OptionsDynamicValuesApiTest extends OptionsDynamicValuesTestBase {
|
||||
|
||||
/**
|
||||
* Tests options_allowed_values().
|
||||
*
|
||||
* @see options_test_dynamic_values_callback()
|
||||
*/
|
||||
public function testOptionsAllowedValues() {
|
||||
// Test allowed values without passed $items.
|
||||
$values = options_allowed_values($this->fieldStorage);
|
||||
$this->assertEqual([], $values);
|
||||
|
||||
$values = options_allowed_values($this->fieldStorage, $this->entity);
|
||||
|
||||
$expected_values = [
|
||||
$this->entity->label(),
|
||||
$this->entity->url(),
|
||||
$this->entity->uuid(),
|
||||
$this->entity->bundle(),
|
||||
];
|
||||
$expected_values = array_combine($expected_values, $expected_values);
|
||||
$this->assertEqual($expected_values, $values);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,79 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\options\Functional;
|
||||
|
||||
use Drupal\field\Entity\FieldConfig;
|
||||
use Drupal\field\Entity\FieldStorageConfig;
|
||||
use Drupal\entity_test\Entity\EntityTestRev;
|
||||
use Drupal\Tests\field\Functional\FieldTestBase;
|
||||
|
||||
/**
|
||||
* Base class for testing allowed values of options fields.
|
||||
*/
|
||||
abstract class OptionsDynamicValuesTestBase extends FieldTestBase {
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['options', 'entity_test', 'options_test'];
|
||||
|
||||
/**
|
||||
* The created entity.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\Entity
|
||||
*/
|
||||
protected $entity;
|
||||
|
||||
/**
|
||||
* The field storage.
|
||||
*
|
||||
* @var \Drupal\Core\Field\FieldStorageDefinitionInterface
|
||||
*/
|
||||
protected $fieldStorage;
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
$field_name = 'test_options';
|
||||
$this->fieldStorage = FieldStorageConfig::create([
|
||||
'field_name' => $field_name,
|
||||
'entity_type' => 'entity_test_rev',
|
||||
'type' => 'list_string',
|
||||
'cardinality' => 1,
|
||||
'settings' => [
|
||||
'allowed_values_function' => 'options_test_dynamic_values_callback',
|
||||
],
|
||||
]);
|
||||
$this->fieldStorage->save();
|
||||
|
||||
$this->field = FieldConfig::create([
|
||||
'field_name' => $field_name,
|
||||
'entity_type' => 'entity_test_rev',
|
||||
'bundle' => 'entity_test_rev',
|
||||
'required' => TRUE,
|
||||
])->save();
|
||||
entity_get_form_display('entity_test_rev', 'entity_test_rev', 'default')
|
||||
->setComponent($field_name, [
|
||||
'type' => 'options_select',
|
||||
])
|
||||
->save();
|
||||
|
||||
// Create an entity and prepare test data that will be used by
|
||||
// options_test_dynamic_values_callback().
|
||||
$values = [
|
||||
'user_id' => mt_rand(1, 10),
|
||||
'name' => $this->randomMachineName(),
|
||||
];
|
||||
$this->entity = EntityTestRev::create($values);
|
||||
$this->entity->save();
|
||||
$this->test = [
|
||||
'label' => $this->entity->label(),
|
||||
'uuid' => $this->entity->uuid(),
|
||||
'bundle' => $this->entity->bundle(),
|
||||
'uri' => $this->entity->url(),
|
||||
];
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\options\Functional;
|
||||
|
||||
/**
|
||||
* Tests the Options field allowed values function.
|
||||
*
|
||||
* @group options
|
||||
*/
|
||||
class OptionsDynamicValuesValidationTest extends OptionsDynamicValuesTestBase {
|
||||
|
||||
/**
|
||||
* Test that allowed values function gets the entity.
|
||||
*/
|
||||
public function testDynamicAllowedValues() {
|
||||
// Verify that validation passes against every value we had.
|
||||
foreach ($this->test as $key => $value) {
|
||||
$this->entity->test_options->value = $value;
|
||||
$violations = $this->entity->test_options->validate();
|
||||
$this->assertEqual(count($violations), 0, "$key is a valid value");
|
||||
}
|
||||
|
||||
// Now verify that validation does not pass against anything else.
|
||||
foreach ($this->test as $key => $value) {
|
||||
$this->entity->test_options->value = is_numeric($value) ? (100 - $value) : ('X' . $value);
|
||||
$violations = $this->entity->test_options->validate();
|
||||
$this->assertEqual(count($violations), 1, "$key is not a valid value");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,355 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\options\Functional;
|
||||
|
||||
use Drupal\field\Entity\FieldConfig;
|
||||
use Drupal\field\Entity\FieldStorageConfig;
|
||||
use Drupal\Tests\field\Functional\FieldTestBase;
|
||||
|
||||
/**
|
||||
* Tests the Options field UI functionality.
|
||||
*
|
||||
* @group options
|
||||
*/
|
||||
class OptionsFieldUITest extends FieldTestBase {
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['node', 'options', 'field_test', 'taxonomy', 'field_ui'];
|
||||
|
||||
/**
|
||||
* The name of the created content type.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $typeName;
|
||||
|
||||
/**
|
||||
* Machine name of the created content type.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $type;
|
||||
|
||||
/**
|
||||
* Name of the option field.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $fieldName;
|
||||
|
||||
/**
|
||||
* Admin path to manage field storage settings.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $adminPath;
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
// Create test user.
|
||||
$admin_user = $this->drupalCreateUser(['access content', 'administer taxonomy', 'access administration pages', 'administer site configuration', 'administer content types', 'administer nodes', 'bypass node access', 'administer node fields', 'administer node display']);
|
||||
$this->drupalLogin($admin_user);
|
||||
|
||||
// Create content type, with underscores.
|
||||
$this->typeName = 'test_' . strtolower($this->randomMachineName());
|
||||
$type = $this->drupalCreateContentType(['name' => $this->typeName, 'type' => $this->typeName]);
|
||||
$this->type = $type->id();
|
||||
}
|
||||
|
||||
/**
|
||||
* Options (integer) : test 'allowed values' input.
|
||||
*/
|
||||
public function testOptionsAllowedValuesInteger() {
|
||||
$this->fieldName = 'field_options_integer';
|
||||
$this->createOptionsField('list_integer');
|
||||
|
||||
// Flat list of textual values.
|
||||
$string = "Zero\nOne";
|
||||
$array = ['0' => 'Zero', '1' => 'One'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Unkeyed lists are accepted.');
|
||||
// Explicit integer keys.
|
||||
$string = "0|Zero\n2|Two";
|
||||
$array = ['0' => 'Zero', '2' => 'Two'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Integer keys are accepted.');
|
||||
// Check that values can be added and removed.
|
||||
$string = "0|Zero\n1|One";
|
||||
$array = ['0' => 'Zero', '1' => 'One'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Values can be added and removed.');
|
||||
// Non-integer keys.
|
||||
$this->assertAllowedValuesInput("1.1|One", 'keys must be integers', 'Non integer keys are rejected.');
|
||||
$this->assertAllowedValuesInput("abc|abc", 'keys must be integers', 'Non integer keys are rejected.');
|
||||
// Mixed list of keyed and unkeyed values.
|
||||
$this->assertAllowedValuesInput("Zero\n1|One", 'invalid input', 'Mixed lists are rejected.');
|
||||
|
||||
// Create a node with actual data for the field.
|
||||
$settings = [
|
||||
'type' => $this->type,
|
||||
$this->fieldName => [['value' => 1]],
|
||||
];
|
||||
$node = $this->drupalCreateNode($settings);
|
||||
|
||||
// Check that a flat list of values is rejected once the field has data.
|
||||
$this->assertAllowedValuesInput("Zero\nOne", 'invalid input', 'Unkeyed lists are rejected once the field has data.');
|
||||
|
||||
// Check that values can be added but values in use cannot be removed.
|
||||
$string = "0|Zero\n1|One\n2|Two";
|
||||
$array = ['0' => 'Zero', '1' => 'One', '2' => 'Two'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Values can be added.');
|
||||
$string = "0|Zero\n1|One";
|
||||
$array = ['0' => 'Zero', '1' => 'One'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Values not in use can be removed.');
|
||||
$this->assertAllowedValuesInput("0|Zero", 'some values are being removed while currently in use', 'Values in use cannot be removed.');
|
||||
|
||||
// Delete the node, remove the value.
|
||||
$node->delete();
|
||||
$string = "0|Zero";
|
||||
$array = ['0' => 'Zero'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Values not in use can be removed.');
|
||||
|
||||
// Check that the same key can only be used once.
|
||||
$string = "0|Zero\n0|One";
|
||||
$array = ['0' => 'One'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Same value cannot be used multiple times.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Options (float) : test 'allowed values' input.
|
||||
*/
|
||||
public function testOptionsAllowedValuesFloat() {
|
||||
$this->fieldName = 'field_options_float';
|
||||
$this->createOptionsField('list_float');
|
||||
|
||||
// Flat list of textual values.
|
||||
$string = "Zero\nOne";
|
||||
$array = ['0' => 'Zero', '1' => 'One'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Unkeyed lists are accepted.');
|
||||
// Explicit numeric keys.
|
||||
$string = "0|Zero\n.5|Point five";
|
||||
$array = ['0' => 'Zero', '0.5' => 'Point five'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Integer keys are accepted.');
|
||||
// Check that values can be added and removed.
|
||||
$string = "0|Zero\n.5|Point five\n1.0|One";
|
||||
$array = ['0' => 'Zero', '0.5' => 'Point five', '1' => 'One'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Values can be added and removed.');
|
||||
// Non-numeric keys.
|
||||
$this->assertAllowedValuesInput("abc|abc\n", 'each key must be a valid integer or decimal', 'Non numeric keys are rejected.');
|
||||
// Mixed list of keyed and unkeyed values.
|
||||
$this->assertAllowedValuesInput("Zero\n1|One\n", 'invalid input', 'Mixed lists are rejected.');
|
||||
|
||||
// Create a node with actual data for the field.
|
||||
$settings = [
|
||||
'type' => $this->type,
|
||||
$this->fieldName => [['value' => .5]],
|
||||
];
|
||||
$node = $this->drupalCreateNode($settings);
|
||||
|
||||
// Check that a flat list of values is rejected once the field has data.
|
||||
$this->assertAllowedValuesInput("Zero\nOne", 'invalid input', 'Unkeyed lists are rejected once the field has data.');
|
||||
|
||||
// Check that values can be added but values in use cannot be removed.
|
||||
$string = "0|Zero\n.5|Point five\n2|Two";
|
||||
$array = ['0' => 'Zero', '0.5' => 'Point five', '2' => 'Two'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Values can be added.');
|
||||
$string = "0|Zero\n.5|Point five";
|
||||
$array = ['0' => 'Zero', '0.5' => 'Point five'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Values not in use can be removed.');
|
||||
$this->assertAllowedValuesInput("0|Zero", 'some values are being removed while currently in use', 'Values in use cannot be removed.');
|
||||
|
||||
// Delete the node, remove the value.
|
||||
$node->delete();
|
||||
$string = "0|Zero";
|
||||
$array = ['0' => 'Zero'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Values not in use can be removed.');
|
||||
|
||||
// Check that the same key can only be used once.
|
||||
$string = "0.5|Point five\n0.5|Half";
|
||||
$array = ['0.5' => 'Half'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Same value cannot be used multiple times.');
|
||||
|
||||
// Check that different forms of the same float value cannot be used.
|
||||
$string = "0|Zero\n.5|Point five\n0.5|Half";
|
||||
$array = ['0' => 'Zero', '0.5' => 'Half'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Different forms of the same value cannot be used.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Options (text) : test 'allowed values' input.
|
||||
*/
|
||||
public function testOptionsAllowedValuesText() {
|
||||
$this->fieldName = 'field_options_text';
|
||||
$this->createOptionsField('list_string');
|
||||
|
||||
// Flat list of textual values.
|
||||
$string = "Zero\nOne";
|
||||
$array = ['Zero' => 'Zero', 'One' => 'One'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Unkeyed lists are accepted.');
|
||||
// Explicit keys.
|
||||
$string = "zero|Zero\none|One";
|
||||
$array = ['zero' => 'Zero', 'one' => 'One'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Explicit keys are accepted.');
|
||||
// Check that values can be added and removed.
|
||||
$string = "zero|Zero\ntwo|Two";
|
||||
$array = ['zero' => 'Zero', 'two' => 'Two'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Values can be added and removed.');
|
||||
// Mixed list of keyed and unkeyed values.
|
||||
$string = "zero|Zero\nOne\n";
|
||||
$array = ['zero' => 'Zero', 'One' => 'One'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Mixed lists are accepted.');
|
||||
// Overly long keys.
|
||||
$this->assertAllowedValuesInput("zero|Zero\n" . $this->randomMachineName(256) . "|One", 'each key must be a string at most 255 characters long', 'Overly long keys are rejected.');
|
||||
|
||||
// Create a node with actual data for the field.
|
||||
$settings = [
|
||||
'type' => $this->type,
|
||||
$this->fieldName => [['value' => 'One']],
|
||||
];
|
||||
$node = $this->drupalCreateNode($settings);
|
||||
|
||||
// Check that flat lists of values are still accepted once the field has
|
||||
// data.
|
||||
$string = "Zero\nOne";
|
||||
$array = ['Zero' => 'Zero', 'One' => 'One'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Unkeyed lists are still accepted once the field has data.');
|
||||
|
||||
// Check that values can be added but values in use cannot be removed.
|
||||
$string = "Zero\nOne\nTwo";
|
||||
$array = ['Zero' => 'Zero', 'One' => 'One', 'Two' => 'Two'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Values can be added.');
|
||||
$string = "Zero\nOne";
|
||||
$array = ['Zero' => 'Zero', 'One' => 'One'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Values not in use can be removed.');
|
||||
$this->assertAllowedValuesInput("Zero", 'some values are being removed while currently in use', 'Values in use cannot be removed.');
|
||||
|
||||
// Delete the node, remove the value.
|
||||
$node->delete();
|
||||
$string = "Zero";
|
||||
$array = ['Zero' => 'Zero'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Values not in use can be removed.');
|
||||
|
||||
// Check that string values with dots can be used.
|
||||
$string = "Zero\nexample.com|Example";
|
||||
$array = ['Zero' => 'Zero', 'example.com' => 'Example'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'String value with dot is supported.');
|
||||
|
||||
// Check that the same key can only be used once.
|
||||
$string = "zero|Zero\nzero|One";
|
||||
$array = ['zero' => 'One'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Same value cannot be used multiple times.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Options (text) : test 'trimmed values' input.
|
||||
*/
|
||||
public function testOptionsTrimmedValuesText() {
|
||||
$this->fieldName = 'field_options_trimmed_text';
|
||||
$this->createOptionsField('list_string');
|
||||
|
||||
// Explicit keys.
|
||||
$string = "zero |Zero\none | One";
|
||||
$array = ['zero' => 'Zero', 'one' => 'One'];
|
||||
$this->assertAllowedValuesInput($string, $array, 'Explicit keys are accepted and trimmed.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function to create list field of a given type.
|
||||
*
|
||||
* @param string $type
|
||||
* One of 'list_integer', 'list_float' or 'list_string'.
|
||||
*/
|
||||
protected function createOptionsField($type) {
|
||||
// Create a field.
|
||||
FieldStorageConfig::create([
|
||||
'field_name' => $this->fieldName,
|
||||
'entity_type' => 'node',
|
||||
'type' => $type,
|
||||
])->save();
|
||||
FieldConfig::create([
|
||||
'field_name' => $this->fieldName,
|
||||
'entity_type' => 'node',
|
||||
'bundle' => $this->type,
|
||||
])->save();
|
||||
|
||||
entity_get_form_display('node', $this->type, 'default')->setComponent($this->fieldName)->save();
|
||||
|
||||
$this->adminPath = 'admin/structure/types/manage/' . $this->type . '/fields/node.' . $this->type . '.' . $this->fieldName . '/storage';
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests a string input for the 'allowed values' form element.
|
||||
*
|
||||
* @param $input_string
|
||||
* The input string, in the pipe-linefeed format expected by the form
|
||||
* element.
|
||||
* @param $result
|
||||
* Either an expected resulting array in
|
||||
* $field->getSetting('allowed_values'), or an expected error message.
|
||||
* @param $message
|
||||
* Message to display.
|
||||
*/
|
||||
public function assertAllowedValuesInput($input_string, $result, $message) {
|
||||
$edit = ['settings[allowed_values]' => $input_string];
|
||||
$this->drupalPostForm($this->adminPath, $edit, t('Save field settings'));
|
||||
$this->assertNoRaw('&lt;', 'The page does not have double escaped HTML tags.');
|
||||
|
||||
if (is_string($result)) {
|
||||
$this->assertText($result, $message);
|
||||
}
|
||||
else {
|
||||
$field_storage = FieldStorageConfig::loadByName('node', $this->fieldName);
|
||||
$this->assertIdentical($field_storage->getSetting('allowed_values'), $result, $message);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests normal and key formatter display on node display.
|
||||
*/
|
||||
public function testNodeDisplay() {
|
||||
$this->fieldName = strtolower($this->randomMachineName());
|
||||
$this->createOptionsField('list_integer');
|
||||
$node = $this->drupalCreateNode(['type' => $this->type]);
|
||||
|
||||
$on = $this->randomMachineName();
|
||||
$off = $this->randomMachineName();
|
||||
$edit = [
|
||||
'settings[allowed_values]' =>
|
||||
"1|$on
|
||||
0|$off",
|
||||
];
|
||||
|
||||
$this->drupalPostForm($this->adminPath, $edit, t('Save field settings'));
|
||||
$this->assertText(format_string('Updated field @field_name field settings.', ['@field_name' => $this->fieldName]), "The 'On' and 'Off' form fields work for boolean fields.");
|
||||
|
||||
// Select a default value.
|
||||
$edit = [
|
||||
$this->fieldName => '1',
|
||||
];
|
||||
$this->drupalPostForm('node/' . $node->id() . '/edit', $edit, t('Save'));
|
||||
|
||||
// Check the node page and see if the values are correct.
|
||||
$file_formatters = ['list_default', 'list_key'];
|
||||
foreach ($file_formatters as $formatter) {
|
||||
$edit = [
|
||||
"fields[$this->fieldName][type]" => $formatter,
|
||||
"fields[$this->fieldName][region]" => 'content',
|
||||
];
|
||||
$this->drupalPostForm('admin/structure/types/manage/' . $this->typeName . '/display', $edit, t('Save'));
|
||||
$this->drupalGet('node/' . $node->id());
|
||||
|
||||
if ($formatter == 'list_default') {
|
||||
$output = $on;
|
||||
}
|
||||
else {
|
||||
$output = '1';
|
||||
}
|
||||
|
||||
$elements = $this->xpath('//div[text()="' . $output . '"]');
|
||||
$this->assertEqual(count($elements), 1, 'Correct options found.');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,72 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\options\Functional;
|
||||
|
||||
use Drupal\field\Entity\FieldConfig;
|
||||
use Drupal\field\Entity\FieldStorageConfig;
|
||||
use Drupal\Tests\field\Functional\FieldTestBase;
|
||||
|
||||
/**
|
||||
* Tests option fields can be updated and created through config synchronization.
|
||||
*
|
||||
* @group options
|
||||
*/
|
||||
class OptionsFloatFieldImportTest extends FieldTestBase {
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['node', 'options', 'field_ui', 'config', 'options_config_install_test'];
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
// Create test user.
|
||||
$admin_user = $this->drupalCreateUser(['synchronize configuration', 'access content', 'access administration pages', 'administer site configuration', 'administer content types', 'administer nodes', 'bypass node access', 'administer node fields', 'administer node display']);
|
||||
$this->drupalLogin($admin_user);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that importing list_float fields works.
|
||||
*/
|
||||
public function testImport() {
|
||||
$field_name = 'field_options_float';
|
||||
$type = 'options_install_test';
|
||||
|
||||
// Test the results on installing options_config_install_test. All the
|
||||
// necessary configuration for this test is created by installing that
|
||||
// module.
|
||||
$field_storage = FieldStorageConfig::loadByName('node', $field_name);
|
||||
$this->assertIdentical($field_storage->getSetting('allowed_values'), $array = ['0' => 'Zero', '0.5' => 'Point five']);
|
||||
|
||||
$admin_path = 'admin/structure/types/manage/' . $type . '/fields/node.' . $type . '.' . $field_name . '/storage';
|
||||
|
||||
// Export active config to sync.
|
||||
$this->copyConfig($this->container->get('config.storage'), $this->container->get('config.storage.sync'));
|
||||
|
||||
// Set the active to not use dots in the allowed values key names.
|
||||
$edit = ['settings[allowed_values]' => "0|Zero\n1|One"];
|
||||
$this->drupalPostForm($admin_path, $edit, t('Save field settings'));
|
||||
$field_storage = FieldStorageConfig::loadByName('node', $field_name);
|
||||
$this->assertIdentical($field_storage->getSetting('allowed_values'), $array = ['0' => 'Zero', '1' => 'One']);
|
||||
|
||||
// Import configuration with dots in the allowed values key names. This
|
||||
// tests \Drupal\Core\Config\Entity\ConfigEntityStorage::importUpdate().
|
||||
$this->drupalGet('admin/config/development/configuration');
|
||||
$this->drupalPostForm(NULL, [], t('Import all'));
|
||||
$field_storage = FieldStorageConfig::loadByName('node', $field_name);
|
||||
$this->assertIdentical($field_storage->getSetting('allowed_values'), $array = ['0' => 'Zero', '0.5' => 'Point five']);
|
||||
|
||||
// Delete field to test creation. This tests
|
||||
// \Drupal\Core\Config\Entity\ConfigEntityStorage::importCreate().
|
||||
FieldConfig::loadByName('node', $type, $field_name)->delete();
|
||||
|
||||
$this->drupalGet('admin/config/development/configuration');
|
||||
$this->drupalPostForm(NULL, [], t('Import all'));
|
||||
$field_storage = FieldStorageConfig::loadByName('node', $field_name);
|
||||
$this->assertIdentical($field_storage->getSetting('allowed_values'), $array = ['0' => 'Zero', '0.5' => 'Point five']);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\options\Functional;
|
||||
|
||||
/**
|
||||
* Tests an options select with a dynamic allowed values function.
|
||||
*
|
||||
* @group options
|
||||
*/
|
||||
class OptionsSelectDynamicValuesTest extends OptionsDynamicValuesTestBase {
|
||||
|
||||
/**
|
||||
* Tests the 'options_select' widget (single select).
|
||||
*/
|
||||
public function testSelectListDynamic() {
|
||||
// Create an entity.
|
||||
$this->entity->save();
|
||||
|
||||
// Create a web user.
|
||||
$web_user = $this->drupalCreateUser(['view test entity', 'administer entity_test content']);
|
||||
$this->drupalLogin($web_user);
|
||||
|
||||
// Display form.
|
||||
$this->drupalGet('entity_test_rev/manage/' . $this->entity->id() . '/edit');
|
||||
$options = $this->xpath('//select[@id="edit-test-options"]/option');
|
||||
$this->assertEqual(count($options), count($this->test) + 1);
|
||||
foreach ($options as $option) {
|
||||
$value = $option->getValue();
|
||||
if ($value != '_none') {
|
||||
$this->assertTrue(array_search($value, $this->test));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,493 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\options\Functional;
|
||||
|
||||
use Drupal\entity_test\Entity\EntityTest;
|
||||
use Drupal\field\Entity\FieldConfig;
|
||||
use Drupal\field\Entity\FieldStorageConfig;
|
||||
use Drupal\Tests\field\Functional\FieldTestBase;
|
||||
|
||||
/**
|
||||
* Tests the Options widgets.
|
||||
*
|
||||
* @group options
|
||||
*/
|
||||
class OptionsWidgetsTest extends FieldTestBase {
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['node', 'options', 'entity_test', 'options_test', 'taxonomy', 'field_ui'];
|
||||
|
||||
/**
|
||||
* A field storage with cardinality 1 to use in this test class.
|
||||
*
|
||||
* @var \Drupal\field\Entity\FieldStorageConfig
|
||||
*/
|
||||
protected $card1;
|
||||
|
||||
/**
|
||||
* A field storage with cardinality 2 to use in this test class.
|
||||
*
|
||||
* @var \Drupal\field\Entity\FieldStorageConfig
|
||||
*/
|
||||
protected $card2;
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
// Field storage with cardinality 1.
|
||||
$this->card1 = FieldStorageConfig::create([
|
||||
'field_name' => 'card_1',
|
||||
'entity_type' => 'entity_test',
|
||||
'type' => 'list_integer',
|
||||
'cardinality' => 1,
|
||||
'settings' => [
|
||||
'allowed_values' => [
|
||||
// Make sure that 0 works as an option.
|
||||
0 => 'Zero',
|
||||
1 => 'One',
|
||||
// Make sure that option text is properly sanitized.
|
||||
2 => 'Some <script>dangerous</script> & unescaped <strong>markup</strong>',
|
||||
// Make sure that HTML entities in option text are not double-encoded.
|
||||
3 => 'Some HTML encoded markup with < & >',
|
||||
],
|
||||
],
|
||||
]);
|
||||
$this->card1->save();
|
||||
|
||||
// Field storage with cardinality 2.
|
||||
$this->card2 = FieldStorageConfig::create([
|
||||
'field_name' => 'card_2',
|
||||
'entity_type' => 'entity_test',
|
||||
'type' => 'list_integer',
|
||||
'cardinality' => 2,
|
||||
'settings' => [
|
||||
'allowed_values' => [
|
||||
// Make sure that 0 works as an option.
|
||||
0 => 'Zero',
|
||||
1 => 'One',
|
||||
// Make sure that option text is properly sanitized.
|
||||
2 => 'Some <script>dangerous</script> & unescaped <strong>markup</strong>',
|
||||
],
|
||||
],
|
||||
]);
|
||||
$this->card2->save();
|
||||
|
||||
// Create a web user.
|
||||
$this->drupalLogin($this->drupalCreateUser(['view test entity', 'administer entity_test content']));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the 'options_buttons' widget (single select).
|
||||
*/
|
||||
public function testRadioButtons() {
|
||||
// Create an instance of the 'single value' field.
|
||||
$field = FieldConfig::create([
|
||||
'field_storage' => $this->card1,
|
||||
'bundle' => 'entity_test',
|
||||
]);
|
||||
$field->save();
|
||||
entity_get_form_display('entity_test', 'entity_test', 'default')
|
||||
->setComponent($this->card1->getName(), [
|
||||
'type' => 'options_buttons',
|
||||
])
|
||||
->save();
|
||||
|
||||
// Create an entity.
|
||||
$entity = EntityTest::create([
|
||||
'user_id' => 1,
|
||||
'name' => $this->randomMachineName(),
|
||||
]);
|
||||
$entity->save();
|
||||
$entity_init = clone $entity;
|
||||
|
||||
// With no field data, no buttons are checked.
|
||||
$this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
||||
$this->assertNoFieldChecked('edit-card-1-0');
|
||||
$this->assertNoFieldChecked('edit-card-1-1');
|
||||
$this->assertNoFieldChecked('edit-card-1-2');
|
||||
$this->assertRaw('Some dangerous & unescaped <strong>markup</strong>', 'Option text was properly filtered.');
|
||||
$this->assertRaw('Some HTML encoded markup with < & >');
|
||||
|
||||
// Select first option.
|
||||
$edit = ['card_1' => 0];
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertFieldValues($entity_init, 'card_1', [0]);
|
||||
|
||||
// Check that the selected button is checked.
|
||||
$this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
||||
$this->assertFieldChecked('edit-card-1-0');
|
||||
$this->assertNoFieldChecked('edit-card-1-1');
|
||||
$this->assertNoFieldChecked('edit-card-1-2');
|
||||
|
||||
// Unselect option.
|
||||
$edit = ['card_1' => '_none'];
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertFieldValues($entity_init, 'card_1', []);
|
||||
|
||||
// Check that required radios with one option is auto-selected.
|
||||
$this->card1->setSetting('allowed_values', [99 => 'Only allowed value']);
|
||||
$this->card1->save();
|
||||
$field->setRequired(TRUE);
|
||||
$field->save();
|
||||
$this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
||||
$this->assertFieldChecked('edit-card-1-99');
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the 'options_buttons' widget (multiple select).
|
||||
*/
|
||||
public function testCheckBoxes() {
|
||||
// Create an instance of the 'multiple values' field.
|
||||
$field = FieldConfig::create([
|
||||
'field_storage' => $this->card2,
|
||||
'bundle' => 'entity_test',
|
||||
]);
|
||||
$field->save();
|
||||
entity_get_form_display('entity_test', 'entity_test', 'default')
|
||||
->setComponent($this->card2->getName(), [
|
||||
'type' => 'options_buttons',
|
||||
])
|
||||
->save();
|
||||
|
||||
// Create an entity.
|
||||
$entity = EntityTest::create([
|
||||
'user_id' => 1,
|
||||
'name' => $this->randomMachineName(),
|
||||
]);
|
||||
$entity->save();
|
||||
$entity_init = clone $entity;
|
||||
|
||||
// Display form: with no field data, nothing is checked.
|
||||
$this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
||||
$this->assertNoFieldChecked('edit-card-2-0');
|
||||
$this->assertNoFieldChecked('edit-card-2-1');
|
||||
$this->assertNoFieldChecked('edit-card-2-2');
|
||||
$this->assertRaw('Some dangerous & unescaped <strong>markup</strong>', 'Option text was properly filtered.');
|
||||
|
||||
// Submit form: select first and third options.
|
||||
$edit = [
|
||||
'card_2[0]' => TRUE,
|
||||
'card_2[1]' => FALSE,
|
||||
'card_2[2]' => TRUE,
|
||||
];
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertFieldValues($entity_init, 'card_2', [0, 2]);
|
||||
|
||||
// Display form: check that the right options are selected.
|
||||
$this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
||||
$this->assertFieldChecked('edit-card-2-0');
|
||||
$this->assertNoFieldChecked('edit-card-2-1');
|
||||
$this->assertFieldChecked('edit-card-2-2');
|
||||
|
||||
// Submit form: select only first option.
|
||||
$edit = [
|
||||
'card_2[0]' => TRUE,
|
||||
'card_2[1]' => FALSE,
|
||||
'card_2[2]' => FALSE,
|
||||
];
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertFieldValues($entity_init, 'card_2', [0]);
|
||||
|
||||
// Display form: check that the right options are selected.
|
||||
$this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
||||
$this->assertFieldChecked('edit-card-2-0');
|
||||
$this->assertNoFieldChecked('edit-card-2-1');
|
||||
$this->assertNoFieldChecked('edit-card-2-2');
|
||||
|
||||
// Submit form: select the three options while the field accepts only 2.
|
||||
$edit = [
|
||||
'card_2[0]' => TRUE,
|
||||
'card_2[1]' => TRUE,
|
||||
'card_2[2]' => TRUE,
|
||||
];
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertText('this field cannot hold more than 2 values', 'Validation error was displayed.');
|
||||
|
||||
// Submit form: uncheck all options.
|
||||
$edit = [
|
||||
'card_2[0]' => FALSE,
|
||||
'card_2[1]' => FALSE,
|
||||
'card_2[2]' => FALSE,
|
||||
];
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
// Check that the value was saved.
|
||||
$this->assertFieldValues($entity_init, 'card_2', []);
|
||||
|
||||
// Required checkbox with one option is auto-selected.
|
||||
$this->card2->setSetting('allowed_values', [99 => 'Only allowed value']);
|
||||
$this->card2->save();
|
||||
$field->setRequired(TRUE);
|
||||
$field->save();
|
||||
$this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
||||
$this->assertFieldChecked('edit-card-2-99');
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the 'options_select' widget (single select).
|
||||
*/
|
||||
public function testSelectListSingle() {
|
||||
// Create an instance of the 'single value' field.
|
||||
$field = FieldConfig::create([
|
||||
'field_storage' => $this->card1,
|
||||
'bundle' => 'entity_test',
|
||||
'required' => TRUE,
|
||||
]);
|
||||
$field->save();
|
||||
entity_get_form_display('entity_test', 'entity_test', 'default')
|
||||
->setComponent($this->card1->getName(), [
|
||||
'type' => 'options_select',
|
||||
])
|
||||
->save();
|
||||
|
||||
// Create an entity.
|
||||
$entity = EntityTest::create([
|
||||
'user_id' => 1,
|
||||
'name' => $this->randomMachineName(),
|
||||
]);
|
||||
$entity->save();
|
||||
$entity_init = clone $entity;
|
||||
|
||||
// Display form.
|
||||
$this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
||||
// A required field without any value has a "none" option.
|
||||
$this->assertTrue($this->xpath('//select[@id=:id]//option[@value="_none" and text()=:label]', [':id' => 'edit-card-1', ':label' => '- Select a value -']), 'A required select list has a "Select a value" choice.');
|
||||
|
||||
// With no field data, nothing is selected.
|
||||
$this->assertTrue($this->assertSession()->optionExists('card_1', '_none')->isSelected());
|
||||
$this->assertFalse($this->assertSession()->optionExists('card_1', 0)->isSelected());
|
||||
$this->assertFalse($this->assertSession()->optionExists('card_1', 1)->isSelected());
|
||||
$this->assertFalse($this->assertSession()->optionExists('card_1', 2)->isSelected());
|
||||
$this->assertRaw('Some dangerous & unescaped markup', 'Option text was properly filtered.');
|
||||
|
||||
// Submit form: select invalid 'none' option.
|
||||
$edit = ['card_1' => '_none'];
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertRaw(t('@title field is required.', ['@title' => $field->getName()]), 'Cannot save a required field when selecting "none" from the select list.');
|
||||
|
||||
// Submit form: select first option.
|
||||
$edit = ['card_1' => 0];
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertFieldValues($entity_init, 'card_1', [0]);
|
||||
|
||||
// Display form: check that the right options are selected.
|
||||
$this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
||||
// A required field with a value has no 'none' option.
|
||||
$this->assertFalse($this->xpath('//select[@id=:id]//option[@value="_none"]', [':id' => 'edit-card-1']), 'A required select list with an actual value has no "none" choice.');
|
||||
$this->assertTrue($this->assertSession()->optionExists('card_1', 0)->isSelected());
|
||||
$this->assertFalse($this->assertSession()->optionExists('card_1', 1)->isSelected());
|
||||
$this->assertFalse($this->assertSession()->optionExists('card_1', 2)->isSelected());
|
||||
|
||||
// Make the field non required.
|
||||
$field->setRequired(FALSE);
|
||||
$field->save();
|
||||
|
||||
// Display form.
|
||||
$this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
||||
// A non-required field has a 'none' option.
|
||||
$this->assertTrue($this->xpath('//select[@id=:id]//option[@value="_none" and text()=:label]', [':id' => 'edit-card-1', ':label' => '- None -']), 'A non-required select list has a "None" choice.');
|
||||
// Submit form: Unselect the option.
|
||||
$edit = ['card_1' => '_none'];
|
||||
$this->drupalPostForm('entity_test/manage/' . $entity->id() . '/edit', $edit, t('Save'));
|
||||
$this->assertFieldValues($entity_init, 'card_1', []);
|
||||
|
||||
// Test optgroups.
|
||||
|
||||
$this->card1->setSetting('allowed_values', []);
|
||||
$this->card1->setSetting('allowed_values_function', 'options_test_allowed_values_callback');
|
||||
$this->card1->save();
|
||||
|
||||
// Display form: with no field data, nothing is selected
|
||||
$this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
||||
$this->assertFalse($this->assertSession()->optionExists('card_1', 0)->isSelected());
|
||||
$this->assertFalse($this->assertSession()->optionExists('card_1', 1)->isSelected());
|
||||
$this->assertFalse($this->assertSession()->optionExists('card_1', 2)->isSelected());
|
||||
$this->assertRaw('Some dangerous & unescaped markup', 'Option text was properly filtered.');
|
||||
$this->assertRaw('More <script>dangerous</script> markup', 'Option group text was properly filtered.');
|
||||
$this->assertRaw('Group 1', 'Option groups are displayed.');
|
||||
|
||||
// Submit form: select first option.
|
||||
$edit = ['card_1' => 0];
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertFieldValues($entity_init, 'card_1', [0]);
|
||||
|
||||
// Display form: check that the right options are selected.
|
||||
$this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
||||
$this->assertTrue($this->assertSession()->optionExists('card_1', 0)->isSelected());
|
||||
$this->assertFalse($this->assertSession()->optionExists('card_1', 1)->isSelected());
|
||||
$this->assertFalse($this->assertSession()->optionExists('card_1', 2)->isSelected());
|
||||
|
||||
// Submit form: Unselect the option.
|
||||
$edit = ['card_1' => '_none'];
|
||||
$this->drupalPostForm('entity_test/manage/' . $entity->id() . '/edit', $edit, t('Save'));
|
||||
$this->assertFieldValues($entity_init, 'card_1', []);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the 'options_select' widget (multiple select).
|
||||
*/
|
||||
public function testSelectListMultiple() {
|
||||
// Create an instance of the 'multiple values' field.
|
||||
$field = FieldConfig::create([
|
||||
'field_storage' => $this->card2,
|
||||
'bundle' => 'entity_test',
|
||||
]);
|
||||
$field->save();
|
||||
entity_get_form_display('entity_test', 'entity_test', 'default')
|
||||
->setComponent($this->card2->getName(), [
|
||||
'type' => 'options_select',
|
||||
])
|
||||
->save();
|
||||
|
||||
// Create an entity.
|
||||
$entity = EntityTest::create([
|
||||
'user_id' => 1,
|
||||
'name' => $this->randomMachineName(),
|
||||
]);
|
||||
$entity->save();
|
||||
$entity_init = clone $entity;
|
||||
|
||||
// Display form: with no field data, nothing is selected.
|
||||
$this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
||||
$this->assertTrue($this->assertSession()->optionExists('card_2', '_none')->isSelected());
|
||||
$this->assertFalse($this->assertSession()->optionExists('card_2', 0)->isSelected());
|
||||
$this->assertFalse($this->assertSession()->optionExists('card_2', 1)->isSelected());
|
||||
$this->assertFalse($this->assertSession()->optionExists('card_2', 2)->isSelected());
|
||||
$this->assertRaw('Some dangerous & unescaped markup', 'Option text was properly filtered.');
|
||||
|
||||
// Submit form: select first and third options.
|
||||
$edit = ['card_2[]' => [0 => 0, 2 => 2]];
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertFieldValues($entity_init, 'card_2', [0, 2]);
|
||||
|
||||
// Display form: check that the right options are selected.
|
||||
$this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
||||
$this->assertTrue($this->assertSession()->optionExists('card_2', 0)->isSelected());
|
||||
$this->assertFalse($this->assertSession()->optionExists('card_2', 1)->isSelected());
|
||||
$this->assertTrue($this->assertSession()->optionExists('card_2', 2)->isSelected());
|
||||
|
||||
// Submit form: select only first option.
|
||||
$edit = ['card_2[]' => [0 => 0]];
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertFieldValues($entity_init, 'card_2', [0]);
|
||||
|
||||
// Display form: check that the right options are selected.
|
||||
$this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
||||
$this->assertTrue($this->assertSession()->optionExists('card_2', 0)->isSelected());
|
||||
$this->assertFalse($this->assertSession()->optionExists('card_2', 1)->isSelected());
|
||||
$this->assertFalse($this->assertSession()->optionExists('card_2', 2)->isSelected());
|
||||
|
||||
// Submit form: select the three options while the field accepts only 2.
|
||||
$edit = ['card_2[]' => [0 => 0, 1 => 1, 2 => 2]];
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertText('this field cannot hold more than 2 values', 'Validation error was displayed.');
|
||||
|
||||
// Submit form: uncheck all options.
|
||||
$edit = ['card_2[]' => []];
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertFieldValues($entity_init, 'card_2', []);
|
||||
|
||||
// Test the 'None' option.
|
||||
|
||||
// Check that the 'none' option has no effect if actual options are selected
|
||||
// as well.
|
||||
$edit = ['card_2[]' => ['_none' => '_none', 0 => 0]];
|
||||
$this->drupalPostForm('entity_test/manage/' . $entity->id() . '/edit', $edit, t('Save'));
|
||||
$this->assertFieldValues($entity_init, 'card_2', [0]);
|
||||
|
||||
// Check that selecting the 'none' option empties the field.
|
||||
$edit = ['card_2[]' => ['_none' => '_none']];
|
||||
$this->drupalPostForm('entity_test/manage/' . $entity->id() . '/edit', $edit, t('Save'));
|
||||
$this->assertFieldValues($entity_init, 'card_2', []);
|
||||
|
||||
// A required select list does not have an empty key.
|
||||
$field->setRequired(TRUE);
|
||||
$field->save();
|
||||
$this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
||||
$this->assertFalse($this->xpath('//select[@id=:id]//option[@value=""]', [':id' => 'edit-card-2']), 'A required select list does not have an empty key.');
|
||||
|
||||
// We do not have to test that a required select list with one option is
|
||||
// auto-selected because the browser does it for us.
|
||||
|
||||
// Test optgroups.
|
||||
|
||||
// Use a callback function defining optgroups.
|
||||
$this->card2->setSetting('allowed_values', []);
|
||||
$this->card2->setSetting('allowed_values_function', 'options_test_allowed_values_callback');
|
||||
$this->card2->save();
|
||||
$field->setRequired(FALSE);
|
||||
$field->save();
|
||||
|
||||
// Display form: with no field data, nothing is selected.
|
||||
$this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
||||
$this->assertFalse($this->assertSession()->optionExists('card_2', 0)->isSelected());
|
||||
$this->assertFalse($this->assertSession()->optionExists('card_2', 1)->isSelected());
|
||||
$this->assertFalse($this->assertSession()->optionExists('card_2', 2)->isSelected());
|
||||
$this->assertRaw('Some dangerous & unescaped markup', 'Option text was properly filtered.');
|
||||
$this->assertRaw('More <script>dangerous</script> markup', 'Option group text was properly filtered.');
|
||||
$this->assertRaw('Group 1', 'Option groups are displayed.');
|
||||
|
||||
// Submit form: select first option.
|
||||
$edit = ['card_2[]' => [0 => 0]];
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertFieldValues($entity_init, 'card_2', [0]);
|
||||
|
||||
// Display form: check that the right options are selected.
|
||||
$this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
||||
$this->assertTrue($this->assertSession()->optionExists('card_2', 0)->isSelected());
|
||||
$this->assertFalse($this->assertSession()->optionExists('card_2', 1)->isSelected());
|
||||
$this->assertFalse($this->assertSession()->optionExists('card_2', 2)->isSelected());
|
||||
|
||||
// Submit form: Unselect the option.
|
||||
$edit = ['card_2[]' => ['_none' => '_none']];
|
||||
$this->drupalPostForm('entity_test/manage/' . $entity->id() . '/edit', $edit, t('Save'));
|
||||
$this->assertFieldValues($entity_init, 'card_2', []);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the 'options_select' and 'options_button' widget for empty value.
|
||||
*/
|
||||
public function testEmptyValue() {
|
||||
// Create an instance of the 'single value' field.
|
||||
$field = FieldConfig::create([
|
||||
'field_storage' => $this->card1,
|
||||
'bundle' => 'entity_test',
|
||||
]);
|
||||
$field->save();
|
||||
|
||||
// Change it to the check boxes/radio buttons widget.
|
||||
entity_get_form_display('entity_test', 'entity_test', 'default')
|
||||
->setComponent($this->card1->getName(), [
|
||||
'type' => 'options_buttons',
|
||||
])
|
||||
->save();
|
||||
|
||||
// Create an entity.
|
||||
$entity = EntityTest::create([
|
||||
'user_id' => 1,
|
||||
'name' => $this->randomMachineName(),
|
||||
]);
|
||||
$entity->save();
|
||||
|
||||
// Display form: check that _none options are present and has label.
|
||||
$this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
||||
$this->assertTrue($this->xpath('//div[@id=:id]//input[@value=:value]', [':id' => 'edit-card-1', ':value' => '_none']), 'A test radio button has a "None" choice.');
|
||||
$this->assertTrue($this->xpath('//div[@id=:id]//label[@for=:for and text()=:label]', [':id' => 'edit-card-1', ':for' => 'edit-card-1-none', ':label' => 'N/A']), 'A test radio button has a "N/A" choice.');
|
||||
|
||||
// Change it to the select widget.
|
||||
entity_get_form_display('entity_test', 'entity_test', 'default')
|
||||
->setComponent($this->card1->getName(), [
|
||||
'type' => 'options_select',
|
||||
])
|
||||
->save();
|
||||
|
||||
// Display form: check that _none options are present and has label.
|
||||
$this->drupalGet('entity_test/manage/' . $entity->id() . '/edit');
|
||||
// A required field without any value has a "none" option.
|
||||
$this->assertTrue($this->xpath('//select[@id=:id]//option[@value="_none" and text()=:label]', [':id' => 'edit-card-1', ':label' => '- None -']), 'A test select has a "None" choice.');
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,100 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\options\Kernel;
|
||||
|
||||
use Drupal\Core\Entity\Exception\FieldStorageDefinitionUpdateForbiddenException;
|
||||
use Drupal\entity_test\Entity\EntityTest;
|
||||
use Drupal\field\Entity\FieldConfig;
|
||||
use Drupal\field\Entity\FieldStorageConfig;
|
||||
|
||||
/**
|
||||
* Tests for the 'Options' field types.
|
||||
*
|
||||
* @group options
|
||||
*/
|
||||
class OptionsFieldTest extends OptionsFieldUnitTestBase {
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['options'];
|
||||
|
||||
/**
|
||||
* Test that allowed values can be updated.
|
||||
*/
|
||||
public function testUpdateAllowedValues() {
|
||||
// All three options appear.
|
||||
$entity = EntityTest::create();
|
||||
$form = \Drupal::service('entity.form_builder')->getForm($entity);
|
||||
$this->assertTrue(!empty($form[$this->fieldName]['widget'][1]), 'Option 1 exists');
|
||||
$this->assertTrue(!empty($form[$this->fieldName]['widget'][2]), 'Option 2 exists');
|
||||
$this->assertTrue(!empty($form[$this->fieldName]['widget'][3]), 'Option 3 exists');
|
||||
|
||||
// Use one of the values in an actual entity, and check that this value
|
||||
// cannot be removed from the list.
|
||||
$entity = EntityTest::create();
|
||||
$entity->{$this->fieldName}->value = 1;
|
||||
$entity->save();
|
||||
$this->fieldStorage->setSetting('allowed_values', [2 => 'Two']);
|
||||
try {
|
||||
$this->fieldStorage->save();
|
||||
$this->fail(t('Cannot update a list field storage to not include keys with existing data.'));
|
||||
}
|
||||
catch (FieldStorageDefinitionUpdateForbiddenException $e) {
|
||||
$this->pass(t('Cannot update a list field storage to not include keys with existing data.'));
|
||||
}
|
||||
// Empty the value, so that we can actually remove the option.
|
||||
unset($entity->{$this->fieldName});
|
||||
$entity->save();
|
||||
|
||||
// Removed options do not appear.
|
||||
$this->fieldStorage->setSetting('allowed_values', [2 => 'Two']);
|
||||
$this->fieldStorage->save();
|
||||
$entity = EntityTest::create();
|
||||
$form = \Drupal::service('entity.form_builder')->getForm($entity);
|
||||
$this->assertTrue(empty($form[$this->fieldName]['widget'][1]), 'Option 1 does not exist');
|
||||
$this->assertTrue(!empty($form[$this->fieldName]['widget'][2]), 'Option 2 exists');
|
||||
$this->assertTrue(empty($form[$this->fieldName]['widget'][3]), 'Option 3 does not exist');
|
||||
|
||||
// Completely new options appear.
|
||||
$this->fieldStorage->setSetting('allowed_values', [10 => 'Update', 20 => 'Twenty']);
|
||||
$this->fieldStorage->save();
|
||||
// The entity holds an outdated field object with the old allowed values
|
||||
// setting, so we need to reinitialize the entity object.
|
||||
$entity = EntityTest::create();
|
||||
$form = \Drupal::service('entity.form_builder')->getForm($entity);
|
||||
$this->assertTrue(empty($form[$this->fieldName]['widget'][1]), 'Option 1 does not exist');
|
||||
$this->assertTrue(empty($form[$this->fieldName]['widget'][2]), 'Option 2 does not exist');
|
||||
$this->assertTrue(empty($form[$this->fieldName]['widget'][3]), 'Option 3 does not exist');
|
||||
$this->assertTrue(!empty($form[$this->fieldName]['widget'][10]), 'Option 10 exists');
|
||||
$this->assertTrue(!empty($form[$this->fieldName]['widget'][20]), 'Option 20 exists');
|
||||
|
||||
// Options are reset when a new field with the same name is created.
|
||||
$this->fieldStorage->delete();
|
||||
FieldStorageConfig::create($this->fieldStorageDefinition)->save();
|
||||
FieldConfig::create([
|
||||
'field_name' => $this->fieldName,
|
||||
'entity_type' => 'entity_test',
|
||||
'bundle' => 'entity_test',
|
||||
'required' => TRUE,
|
||||
])->save();
|
||||
entity_get_form_display('entity_test', 'entity_test', 'default')
|
||||
->setComponent($this->fieldName, [
|
||||
'type' => 'options_buttons',
|
||||
])
|
||||
->save();
|
||||
$entity = EntityTest::create();
|
||||
$form = \Drupal::service('entity.form_builder')->getForm($entity);
|
||||
$this->assertTrue(!empty($form[$this->fieldName]['widget'][1]), 'Option 1 exists');
|
||||
$this->assertTrue(!empty($form[$this->fieldName]['widget'][2]), 'Option 2 exists');
|
||||
$this->assertTrue(!empty($form[$this->fieldName]['widget'][3]), 'Option 3 exists');
|
||||
|
||||
// Test the generateSampleValue() method.
|
||||
$entity = EntityTest::create();
|
||||
$entity->{$this->fieldName}->generateSampleItems();
|
||||
$this->entityValidateAndSave($entity);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\options\Kernel;
|
||||
|
||||
use Drupal\field\Entity\FieldConfig;
|
||||
use Drupal\Tests\field\Kernel\FieldKernelTestBase;
|
||||
use Drupal\field\Entity\FieldStorageConfig;
|
||||
|
||||
/**
|
||||
* Base class for Options module integration tests.
|
||||
*/
|
||||
abstract class OptionsFieldUnitTestBase extends FieldKernelTestBase {
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['options'];
|
||||
|
||||
/**
|
||||
* The field name used in the test.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $fieldName = 'test_options';
|
||||
|
||||
/**
|
||||
* The field storage definition used to created the field storage.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $fieldStorageDefinition;
|
||||
|
||||
/**
|
||||
* The list field storage used in the test.
|
||||
*
|
||||
* @var \Drupal\field\Entity\FieldStorageConfig
|
||||
*/
|
||||
protected $fieldStorage;
|
||||
|
||||
/**
|
||||
* The list field used in the test.
|
||||
*
|
||||
* @var \Drupal\field\Entity\FieldConfig
|
||||
*/
|
||||
protected $field;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
$this->container->get('router.builder')->rebuild();
|
||||
|
||||
$this->fieldStorageDefinition = [
|
||||
'field_name' => $this->fieldName,
|
||||
'entity_type' => 'entity_test',
|
||||
'type' => 'list_integer',
|
||||
'cardinality' => 1,
|
||||
'settings' => [
|
||||
'allowed_values' => [1 => 'One', 2 => 'Two', 3 => 'Three'],
|
||||
],
|
||||
];
|
||||
$this->fieldStorage = FieldStorageConfig::create($this->fieldStorageDefinition);
|
||||
$this->fieldStorage->save();
|
||||
|
||||
$this->field = FieldConfig::create([
|
||||
'field_storage' => $this->fieldStorage,
|
||||
'bundle' => 'entity_test',
|
||||
]);
|
||||
$this->field->save();
|
||||
|
||||
entity_get_form_display('entity_test', 'entity_test', 'default')
|
||||
->setComponent($this->fieldName, [
|
||||
'type' => 'options_buttons',
|
||||
])
|
||||
->save();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\options\Kernel;
|
||||
|
||||
use Drupal\entity_test\Entity\EntityTest;
|
||||
|
||||
/**
|
||||
* Tests the Options field type formatters.
|
||||
*
|
||||
* @group options
|
||||
* @see \Drupal\options\Plugin\Field\FieldFormatter\OptionsDefaultFormatter
|
||||
* @see \Drupal\options\Plugin\Field\FieldFormatter\OptionsKeyFormatter
|
||||
*/
|
||||
class OptionsFormattersTest extends OptionsFieldUnitTestBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the formatters.
|
||||
*/
|
||||
public function testFormatter() {
|
||||
$entity = EntityTest::create();
|
||||
$entity->{$this->fieldName}->value = 1;
|
||||
|
||||
$items = $entity->get($this->fieldName);
|
||||
|
||||
$build = $items->view();
|
||||
$this->assertEqual($build['#formatter'], 'list_default', 'Ensure to fall back to the default formatter.');
|
||||
$this->assertEqual($build[0]['#markup'], 'One');
|
||||
|
||||
$build = $items->view(['type' => 'list_key']);
|
||||
$this->assertEqual($build['#formatter'], 'list_key', 'The chosen formatter is used.');
|
||||
$this->assertEqual((string) $build[0]['#markup'], 1);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,92 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\options\Kernel\Views;
|
||||
|
||||
use Drupal\field\Entity\FieldStorageConfig;
|
||||
use Drupal\field\Entity\FieldConfig;
|
||||
use Drupal\Tests\views\Kernel\ViewsKernelTestBase;
|
||||
use Drupal\views\Views;
|
||||
|
||||
/**
|
||||
* Tests file views data.
|
||||
*
|
||||
* @group file
|
||||
*/
|
||||
class FileViewsDataTest extends ViewsKernelTestBase {
|
||||
|
||||
/**
|
||||
* Modules to install.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['file', 'views', 'entity_test', 'user', 'field'];
|
||||
|
||||
/**
|
||||
* Tests views data generated for file field relationship.
|
||||
*
|
||||
* @see file_field_views_data()
|
||||
* @see file_field_views_data_views_data_alter()
|
||||
*/
|
||||
public function testRelationshipViewsData() {
|
||||
// Create file field to entity_test.
|
||||
FieldStorageConfig::create([
|
||||
'entity_type' => 'entity_test',
|
||||
'field_name' => 'field_base_file',
|
||||
'type' => 'file',
|
||||
])->save();
|
||||
FieldConfig::create([
|
||||
'entity_type' => 'entity_test',
|
||||
'field_name' => 'field_base_file',
|
||||
'bundle' => 'entity_test',
|
||||
])->save();
|
||||
// Check the generated views data.
|
||||
$views_data = Views::viewsData()->get('entity_test__field_base_file');
|
||||
$relationship = $views_data['field_base_file_target_id']['relationship'];
|
||||
$this->assertEqual($relationship['id'], 'standard');
|
||||
$this->assertEqual($relationship['base'], 'file_managed');
|
||||
$this->assertEqual($relationship['base field'], 'fid');
|
||||
$this->assertEqual($relationship['entity type'], 'file');
|
||||
// Check the backwards reference.
|
||||
$views_data = Views::viewsData()->get('file_managed');
|
||||
$relationship = $views_data['reverse_field_base_file_entity_test']['relationship'];
|
||||
$this->assertEqual($relationship['id'], 'entity_reverse');
|
||||
$this->assertEqual($relationship['base'], 'entity_test');
|
||||
$this->assertEqual($relationship['base field'], 'id');
|
||||
$this->assertEqual($relationship['field table'], 'entity_test__field_base_file');
|
||||
$this->assertEqual($relationship['field field'], 'field_base_file_target_id');
|
||||
$this->assertEqual($relationship['field_name'], 'field_base_file');
|
||||
$this->assertEqual($relationship['entity_type'], 'entity_test');
|
||||
$this->assertEqual($relationship['join_extra'][0], ['field' => 'deleted', 'value' => 0, 'numeric' => TRUE]);
|
||||
|
||||
// Create file field to entity_test_mul.
|
||||
FieldStorageConfig::create([
|
||||
'entity_type' => 'entity_test_mul',
|
||||
'field_name' => 'field_data_file',
|
||||
'type' => 'file',
|
||||
])->save();
|
||||
FieldConfig::create([
|
||||
'entity_type' => 'entity_test_mul',
|
||||
'field_name' => 'field_data_file',
|
||||
'bundle' => 'entity_test_mul',
|
||||
])->save();
|
||||
// Check the generated views data.
|
||||
$views_data = Views::viewsData()->get('entity_test_mul__field_data_file');
|
||||
$relationship = $views_data['field_data_file_target_id']['relationship'];
|
||||
$this->assertEqual($relationship['id'], 'standard');
|
||||
$this->assertEqual($relationship['base'], 'file_managed');
|
||||
$this->assertEqual($relationship['base field'], 'fid');
|
||||
$this->assertEqual($relationship['entity type'], 'file');
|
||||
// Check the backwards reference.
|
||||
$views_data = Views::viewsData()->get('file_managed');
|
||||
$relationship = $views_data['reverse_field_data_file_entity_test_mul']['relationship'];
|
||||
$this->assertEqual($relationship['id'], 'entity_reverse');
|
||||
$this->assertEqual($relationship['base'], 'entity_test_mul_property_data');
|
||||
$this->assertEqual($relationship['base field'], 'id');
|
||||
$this->assertEqual($relationship['field table'], 'entity_test_mul__field_data_file');
|
||||
$this->assertEqual($relationship['field field'], 'field_data_file_target_id');
|
||||
$this->assertEqual($relationship['field_name'], 'field_data_file');
|
||||
$this->assertEqual($relationship['entity_type'], 'entity_test_mul');
|
||||
$this->assertEqual($relationship['join_extra'][0], ['field' => 'deleted', 'value' => 0, 'numeric' => TRUE]);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\options\Kernel\Views;
|
||||
|
||||
use Drupal\views\Views;
|
||||
|
||||
/**
|
||||
* Tests options list argument for views.
|
||||
*
|
||||
* @see \Drupal\options\Plugin\views\argument\NumberListField.
|
||||
* @group views
|
||||
*/
|
||||
class OptionsListArgumentTest extends OptionsTestBase {
|
||||
|
||||
/**
|
||||
* Views used by this test.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $testViews = ['test_options_list_argument_numeric', 'test_options_list_argument_string'];
|
||||
|
||||
/**
|
||||
* Tests the options field argument.
|
||||
*/
|
||||
public function testViewsTestOptionsListArgument() {
|
||||
$view = Views::getView('test_options_list_argument_numeric');
|
||||
$this->executeView($view, [1]);
|
||||
|
||||
$resultset = [
|
||||
['nid' => $this->nodes[0]->nid->value],
|
||||
['nid' => $this->nodes[1]->nid->value],
|
||||
];
|
||||
|
||||
$column_map = ['nid' => 'nid'];
|
||||
$this->assertIdenticalResultset($view, $resultset, $column_map);
|
||||
|
||||
$view = Views::getView('test_options_list_argument_string');
|
||||
$this->executeView($view, ['man', 'woman']);
|
||||
|
||||
$resultset = [
|
||||
['nid' => $this->nodes[0]->nid->value],
|
||||
['nid' => $this->nodes[1]->nid->value],
|
||||
];
|
||||
|
||||
$column_map = ['nid' => 'nid'];
|
||||
$this->assertIdenticalResultset($view, $resultset, $column_map);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,112 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\options\Kernel\Views;
|
||||
|
||||
use Drupal\views\Views;
|
||||
|
||||
/**
|
||||
* Tests options list filter for views.
|
||||
*
|
||||
* @see \Drupal\field\Plugin\views\filter\ListField.
|
||||
* @group views
|
||||
*/
|
||||
class OptionsListFilterTest extends OptionsTestBase {
|
||||
|
||||
/**
|
||||
* Views used by this test.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $testViews = ['test_options_list_filter'];
|
||||
|
||||
/**
|
||||
* Tests options list field filter.
|
||||
*/
|
||||
public function testViewsTestOptionsListFilter() {
|
||||
$view = Views::getView('test_options_list_filter');
|
||||
$this->executeView($view);
|
||||
|
||||
$resultset = [
|
||||
['nid' => $this->nodes[0]->nid->value],
|
||||
['nid' => $this->nodes[1]->nid->value],
|
||||
];
|
||||
|
||||
$column_map = ['nid' => 'nid'];
|
||||
$this->assertIdenticalResultset($view, $resultset, $column_map);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests options list field filter when grouped.
|
||||
*/
|
||||
public function testViewsTestOptionsListGroupedFilter() {
|
||||
$view = Views::getView('test_options_list_filter');
|
||||
|
||||
$filters = [
|
||||
'field_test_list_string_value' => [
|
||||
'id' => 'field_test_list_string_value',
|
||||
'table' => 'field_data_field_test_list_string',
|
||||
'field' => 'field_test_list_string_value',
|
||||
'relationship' => 'none',
|
||||
'group_type' => 'group',
|
||||
'admin_label' => '',
|
||||
'operator' => 'or',
|
||||
'value' => [
|
||||
'man' => 'man',
|
||||
'woman' => 'woman',
|
||||
],
|
||||
'group' => '1',
|
||||
'exposed' => TRUE,
|
||||
'expose' => [
|
||||
'operator_id' => 'field_test_list_string_value_op',
|
||||
'label' => 'list-text',
|
||||
'description' => '',
|
||||
'identifier' => 'field_test_list_string_value',
|
||||
],
|
||||
'is_grouped' => TRUE,
|
||||
'group_info' => [
|
||||
'label' => 'list-text (field_list_text)',
|
||||
'description' => '',
|
||||
'identifier' => 'field_test_list_string_value',
|
||||
'optional' => TRUE,
|
||||
'widget' => 'radios',
|
||||
'multiple' => TRUE,
|
||||
'remember' => FALSE,
|
||||
'default_group' => '1',
|
||||
'group_items' => [
|
||||
1 => [
|
||||
'title' => 'First',
|
||||
'operator' => 'or',
|
||||
'value' => [
|
||||
$this->fieldValues[0] => $this->fieldValues[0],
|
||||
],
|
||||
],
|
||||
2 => [
|
||||
'title' => 'Second',
|
||||
'operator' => 'or',
|
||||
'value' => [
|
||||
$this->fieldValues[1] => $this->fieldValues[1],
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
'reduce_duplicates' => '',
|
||||
'plugin_id' => 'list_field',
|
||||
],
|
||||
];
|
||||
$view->setDisplay();
|
||||
$view->displayHandlers->get('default')->overrideOption('filters', $filters);
|
||||
|
||||
$view->storage->save();
|
||||
|
||||
$this->executeView($view);
|
||||
|
||||
$resultset = [
|
||||
['nid' => $this->nodes[0]->nid->value],
|
||||
['nid' => $this->nodes[1]->nid->value],
|
||||
];
|
||||
|
||||
$column_map = ['nid' => 'nid'];
|
||||
$this->assertIdenticalResultset($view, $resultset, $column_map);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,120 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\options\Kernel\Views;
|
||||
|
||||
use Drupal\field\Entity\FieldConfig;
|
||||
use Drupal\field\Entity\FieldStorageConfig;
|
||||
use Drupal\node\Entity\Node;
|
||||
use Drupal\node\Entity\NodeType;
|
||||
use Drupal\Tests\views\Kernel\ViewsKernelTestBase;
|
||||
use Drupal\views\Tests\ViewTestData;
|
||||
|
||||
/**
|
||||
* Base class for options views tests.
|
||||
*/
|
||||
abstract class OptionsTestBase extends ViewsKernelTestBase {
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['options', 'options_test_views', 'node', 'user', 'field'];
|
||||
|
||||
/**
|
||||
* Stores the nodes used for the different tests.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $nodes = [];
|
||||
|
||||
/**
|
||||
* Stores the field values used for the different tests.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $fieldValues = [];
|
||||
|
||||
/**
|
||||
* The used field names.
|
||||
*
|
||||
* @var string[]
|
||||
*/
|
||||
protected $fieldNames;
|
||||
|
||||
protected function setUp($import_test_views = TRUE) {
|
||||
parent::setUp();
|
||||
$this->mockStandardInstall();
|
||||
|
||||
ViewTestData::createTestViews(get_class($this), ['options_test_views']);
|
||||
|
||||
$settings = [];
|
||||
$settings['type'] = 'article';
|
||||
$settings['title'] = $this->randomString();
|
||||
$settings['field_test_list_string'][]['value'] = $this->fieldValues[0];
|
||||
$settings['field_test_list_integer'][]['value'] = 0;
|
||||
|
||||
$node = Node::create($settings);
|
||||
$node->save();
|
||||
|
||||
$this->nodes[] = $node;
|
||||
$node = $node->createDuplicate();
|
||||
$node->save();
|
||||
$this->nodes[] = $node;
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides a workaround for the inability to use the standard profile.
|
||||
*
|
||||
* @see https://www.drupal.org/node/1708692
|
||||
*/
|
||||
protected function mockStandardInstall() {
|
||||
$this->installEntitySchema('user');
|
||||
$this->installEntitySchema('node');
|
||||
|
||||
NodeType::create(
|
||||
['type' => 'article']
|
||||
)->save();
|
||||
$this->fieldValues = [
|
||||
$this->randomMachineName(),
|
||||
$this->randomMachineName(),
|
||||
];
|
||||
|
||||
$this->fieldNames = ['field_test_list_string', 'field_test_list_integer'];
|
||||
|
||||
// Create two field entities.
|
||||
FieldStorageConfig::create([
|
||||
'field_name' => $this->fieldNames[0],
|
||||
'entity_type' => 'node',
|
||||
'type' => 'list_string',
|
||||
'cardinality' => 1,
|
||||
'settings' => [
|
||||
'allowed_values' => [
|
||||
$this->fieldValues[0] => $this->fieldValues[0],
|
||||
$this->fieldValues[1] => $this->fieldValues[1],
|
||||
],
|
||||
],
|
||||
])->save();
|
||||
FieldStorageConfig::create([
|
||||
'field_name' => $this->fieldNames[1],
|
||||
'entity_type' => 'node',
|
||||
'type' => 'list_integer',
|
||||
'cardinality' => 1,
|
||||
'settings' => [
|
||||
'allowed_values' => [
|
||||
$this->fieldValues[0],
|
||||
$this->fieldValues[1],
|
||||
],
|
||||
],
|
||||
])->save();
|
||||
foreach ($this->fieldNames as $field_name) {
|
||||
FieldConfig::create([
|
||||
'field_name' => $field_name,
|
||||
'entity_type' => 'node',
|
||||
'label' => 'Test options list field',
|
||||
'bundle' => 'article',
|
||||
])->save();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,65 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\options\Kernel\Views;
|
||||
|
||||
use Drupal\field\Entity\FieldConfig;
|
||||
use Drupal\field\Entity\FieldStorageConfig;
|
||||
|
||||
/**
|
||||
* Test to ensure views data is properly created for the Options module.
|
||||
*
|
||||
* @group views
|
||||
*/
|
||||
class ViewsDataTest extends OptionsTestBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static $modules = ['options', 'options_test', 'entity_test', 'views'];
|
||||
|
||||
/**
|
||||
* The field storage.
|
||||
*
|
||||
* @var \Drupal\Core\Field\FieldStorageDefinitionInterface
|
||||
*/
|
||||
protected $fieldStorage;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp($import_test_views = TRUE) {
|
||||
parent::setUp();
|
||||
|
||||
$field_name = 'test_options';
|
||||
$this->fieldStorage = FieldStorageConfig::create([
|
||||
'field_name' => $field_name,
|
||||
'entity_type' => 'entity_test',
|
||||
'type' => 'list_string',
|
||||
'cardinality' => 1,
|
||||
'settings' => [
|
||||
'allowed_values_function' => 'options_test_dynamic_values_callback',
|
||||
],
|
||||
]);
|
||||
$this->fieldStorage->save();
|
||||
|
||||
$this->field = FieldConfig::create([
|
||||
'field_name' => $field_name,
|
||||
'entity_type' => 'entity_test',
|
||||
'bundle' => 'entity_test',
|
||||
'required' => TRUE,
|
||||
])->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the option module's implementation of hook_field_views_data().
|
||||
*/
|
||||
public function testOptionsFieldViewsData() {
|
||||
$field_data = \Drupal::service('views.views_data')->get('entity_test__test_options');
|
||||
|
||||
// Check that the options module has properly overridden default views data.
|
||||
$test_options_field = $field_data['test_options_value'];
|
||||
$this->assertEqual($test_options_field['argument']['id'], 'string_list_field', 'Argument handler is properly set for fields with allowed value callbacks.');
|
||||
$this->assertEqual($test_options_field['filter']['id'], 'list_field', 'Filter handler is properly set for fields with allowed value callbacks.');
|
||||
}
|
||||
|
||||
}
|
Reference in a new issue