View source
<?php
namespace Drupal\Tests\pbf\Functional;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\Core\Entity\Entity\EntityFormDisplay;
use Drupal\Core\Entity\Display\EntityFormDisplayInterface;
use Drupal\Core\Entity\Entity\EntityViewDisplay;
use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
use Drupal\taxonomy\VocabularyInterface;
use Drupal\Tests\BrowserTestBase;
use Drupal\Tests\taxonomy\Traits\TaxonomyTestTrait;
use Drupal\user\Entity\User;
abstract class PbfBaseTest extends BrowserTestBase {
use TaxonomyTestTrait;
public static $modules = array(
'system',
'language',
'user',
'node',
'field',
'field_ui',
'taxonomy',
'search',
'pbf',
);
protected $profile = 'testing';
protected $permissions;
protected $adminUser;
protected $normalUser;
protected $otherUser;
protected $formDisplay;
protected $viewDisplay;
protected $article1;
protected $article2;
protected $article3;
protected $group1;
protected $group2;
protected $vocabulary;
protected $term1;
protected $term2;
protected $role1;
protected $defaultTheme = 'classy';
public function setUp() {
parent::setUp();
$this
->drupalCreateContentType([
'type' => 'article',
]);
$this
->drupalCreateContentType([
'type' => 'group',
]);
$this->adminUser = $this
->drupalCreateUser([
'create article content',
'create group content',
'edit own article content',
'edit any article content',
'edit any group content',
'delete any article content',
'delete own article content',
'administer nodes',
'administer content types',
'administer node fields',
'administer account settings',
'administer node form display',
'administer node display',
'administer users',
'administer user fields',
'administer user form display',
'administer user display',
'bypass node access',
'search content',
'administer search',
]);
$this->permissions = [
'create article content',
'edit own article content',
'delete own article content',
'access content',
'search content',
'access user profiles',
];
$this->normalUser = $this
->drupalCreateUser($this->permissions);
$this->otherUser = $this
->drupalCreateUser($this->permissions);
$this->group1 = $this
->drupalCreateNode([
'type' => 'group',
'title' => 'Group 1',
]);
$this->group2 = $this
->drupalCreateNode([
'type' => 'group',
'title' => 'Group 2',
]);
$this->vocabulary = $this
->createVocabulary();
$this->term1 = $this
->createTerm($this->vocabulary);
$this->term2 = $this
->createTerm($this->vocabulary);
$this->role1 = $this
->createRole($this->permissions);
node_access_rebuild();
}
protected function checkSearchResults($search_query, $expected_result_count) {
$this
->drupalPostForm('search/node', array(
'keys' => $search_query,
), 'Search');
$search_results = $this
->xpath("//ol[contains(@class, 'search-results')]/li");
$this
->assertEqual(count($search_results), $expected_result_count, t('Found the expected number of search results'));
}
protected function createPbfField($entity_type, $bundle, $field_name, $field_label, $target_entity_type, $selection_handler = 'default', $selection_handler_settings = array(), $cardinality = -1, $user_method = 'user', $priority = 0, $synchronized_with = '', $synchronized_from_target = 0) {
if (!FieldStorageConfig::loadByName($entity_type, $field_name)) {
FieldStorageConfig::create(array(
'field_name' => $field_name,
'type' => 'pbf',
'entity_type' => $entity_type,
'cardinality' => $cardinality,
'settings' => array(
'target_type' => $target_entity_type,
),
))
->save();
}
if (!FieldConfig::loadByName($entity_type, $bundle, $field_name)) {
FieldConfig::create(array(
'field_name' => $field_name,
'entity_type' => $entity_type,
'bundle' => $bundle,
'label' => $field_label,
'settings' => array(
'handler' => $selection_handler,
'handler_settings' => $selection_handler_settings,
'priority' => $priority,
'user_method' => $user_method,
'synchronized_with' => $synchronized_with,
'synchronized_form_target' => $synchronized_from_target,
),
))
->save();
}
$field = FieldConfig::loadByName($entity_type, $bundle, $field_name);
return $field;
}
protected function setUserField($uid, $field_name = '', $value = NULL) {
if ($field_name) {
User::load($uid)
->set($field_name, $value)
->save();
}
}
protected function setFormDisplay($form_display_id, $entity_type, $bundle, $mode = 'default', $field_name, $widget_id, $settings) {
$this->formDisplay = EntityFormDisplay::load($form_display_id);
if (!$this->formDisplay) {
EntityFormDisplay::create([
'targetEntityType' => $entity_type,
'bundle' => $bundle,
'mode' => $mode,
'status' => TRUE,
])
->save();
$this->formDisplay = EntityFormDisplay::load($form_display_id);
}
if ($this->formDisplay instanceof EntityFormDisplayInterface) {
$this->formDisplay
->setComponent($field_name, [
'type' => $widget_id,
'settings' => $settings,
])
->save();
}
}
protected function setViewDisplay($form_display_id, $entity_type, $bundle, $mode = 'default', $field_name, $formatter_id, $settings) {
$this->viewDisplay = EntityViewDisplay::load($form_display_id);
if (!$this->viewDisplay) {
EntityViewDisplay::create([
'targetEntityType' => $entity_type,
'bundle' => $bundle,
'mode' => $mode,
'status' => TRUE,
])
->save();
$this->viewDisplay = EntityViewDisplay::load($form_display_id);
}
if ($this->viewDisplay instanceof EntityViewDisplayInterface) {
$this->viewDisplay
->setComponent($field_name, [
'type' => $formatter_id,
'settings' => $settings,
])
->save();
}
}
protected function attachPbfNodeFields($field_name, $widget_settings = []) {
$handler_settings = array(
'target_bundles' => array(
'group' => 'group',
),
'auto_create' => FALSE,
);
$this
->createPbfField('node', 'article', $field_name, 'Content of group', 'node', 'default', $handler_settings, -1);
$this
->createPbfField('user', 'user', $field_name, 'Member of group', 'node', 'default', $handler_settings, -1);
$settings = $widget_settings + [
'match_operator' => 'CONTAINS',
'size' => 30,
'placeholder' => '',
];
$this
->setFormDisplay('node.article.default', 'node', 'article', 'default', $field_name, 'pbf_widget', $settings);
$this
->setFormDisplay('user.user.default', 'user', 'user', 'default', $field_name, 'pbf_widget', $settings);
$settings = [
'link' => TRUE,
];
$this
->setViewDisplay('node.article.default', 'node', 'article', 'default', $field_name, 'pbf_formatter_default', $settings);
$this
->setViewDisplay('user.user.default', 'user', 'user', 'default', $field_name, 'pbf_formatter_default', $settings);
}
protected function attachPbfSynchronizedFields($field_name, $group_field_name, $widget_settings = []) {
$handler_settings = array(
'target_bundles' => array(
'group' => 'group',
),
'auto_create' => FALSE,
);
$this
->createPbfField('node', 'article', $field_name, 'Content of group', 'node', 'default', $handler_settings, -1);
$this
->createPbfField('user', 'user', $field_name, 'Member of group', 'node', 'default', $handler_settings, -1);
$handler_settings = array(
'target_bundles' => array(
'user' => 'user',
),
'auto_create' => FALSE,
);
$this
->createPbfField('node', 'group', $group_field_name, 'Group members', 'user', 'default', $handler_settings, -1);
$settings = $widget_settings + [
'match_operator' => 'CONTAINS',
'match_limit' => 10,
'size' => 30,
'placeholder' => '',
];
$this
->setFormDisplay('node.article.default', 'node', 'article', 'default', $field_name, 'pbf_widget', $settings);
$this
->setFormDisplay('node.group.default', 'node', 'group', 'default', $group_field_name, 'pbf_widget', $settings);
$this
->setFormDisplay('user.user.default', 'user', 'user', 'default', $field_name, 'pbf_widget', $settings);
$settings = [
'link' => TRUE,
];
$this
->setViewDisplay('node.article.default', 'node', 'article', 'default', $field_name, 'pbf_formatter_default', $settings);
$this
->setViewDisplay('node.group.default', 'node', 'group', 'default', $group_field_name, 'pbf_formatter_default', $settings);
$this
->setViewDisplay('user.user.default', 'user', 'user', 'default', $field_name, 'pbf_formatter_default', $settings);
}
protected function attachPbfTermFields(VocabularyInterface $vocabulary, $field_name) {
$handler_settings = array(
'target_bundles' => array(
$vocabulary
->id() => $vocabulary
->id(),
),
'auto_create' => FALSE,
);
$this
->createPbfField('node', 'article', $field_name, 'Content related to term', 'taxonomy_term', 'default', $handler_settings, -1);
$this
->createPbfField('user', 'user', $field_name, 'User related to term', 'taxonomy_term', 'default', $handler_settings, -1);
$settings = [
'match_operator' => 'CONTAINS',
'size' => 30,
'placeholder' => '',
];
$this
->setFormDisplay('node.article.default', 'node', 'article', 'default', $field_name, 'pbf_widget', $settings);
$this
->setFormDisplay('user.user.default', 'user', 'user', 'default', $field_name, 'pbf_widget', $settings);
$settings = [
'link' => TRUE,
];
$this
->setViewDisplay('node.article.default', 'node', 'article', 'default', $field_name, 'pbf_formatter_default', $settings);
$this
->setViewDisplay('user.user.default', 'user', 'user', 'default', $field_name, 'pbf_formatter_default', $settings);
}
protected function attachPbfUserFields($field_name, $user_method = 'user') {
$handler_settings = array(
'target_bundles' => array(
'user' => 'user',
),
'auto_create' => FALSE,
);
$this
->createPbfField('node', 'article', $field_name, 'Grant access to user', 'user', 'default', $handler_settings, -1, $user_method);
$settings = [
'match_operator' => 'CONTAINS',
'size' => 30,
'placeholder' => '',
];
$this
->setFormDisplay('node.article.default', 'node', 'article', 'default', $field_name, 'pbf_widget', $settings);
$settings = [
'link' => TRUE,
];
$this
->setViewDisplay('node.article.default', 'node', 'article', 'default', $field_name, 'pbf_formatter_default', $settings);
if ($user_method == 'ref_user') {
$this
->createPbfField('user', 'user', $field_name, 'User related to user', 'user', 'default', $handler_settings, -1);
$this
->setFormDisplay('user.user.default', 'user', 'user', 'default', $field_name, 'pbf_widget', $settings);
$this
->setViewDisplay('user.user.default', 'user', 'user', 'default', $field_name, 'pbf_formatter_default', $settings);
}
}
protected function attachPbfRoleFields($field_name) {
$handler_settings = array(
'target_bundles' => NULL,
'auto_create' => FALSE,
);
$this
->createPbfField('node', 'article', $field_name, 'Grant access to role', 'user_role', 'default', $handler_settings, -1);
$settings = [
'match_operator' => 'CONTAINS',
'size' => 30,
'placeholder' => '',
];
$this
->setFormDisplay('node.article.default', 'node', 'article', 'default', $field_name, 'pbf_widget', $settings);
$settings = [
'link' => FALSE,
];
$this
->setViewDisplay('node.article.default', 'node', 'article', 'default', $field_name, 'pbf_formatter_default', $settings);
}
protected function createSimpleArticle($title, $field_name = '', $target_id = NULL, $grant_public = 1, $grant_view = 0, $grant_update = 0, $grant_delete = 0) {
$values = array(
'type' => 'article',
'title' => $title,
'body' => [
'value' => 'Content body for ' . $title,
],
);
if ($field_name) {
$values[$field_name] = [
'target_id' => $target_id,
'grant_public' => $grant_public,
'grant_view' => $grant_view,
'grant_update' => $grant_update,
'grant_delete' => $grant_delete,
];
}
return $this
->drupalCreateNode($values);
}
protected function createSimpleGroup($title, $field_name = '', $target_id = NULL, $grant_public = 1, $grant_view = 0, $grant_update = 0, $grant_delete = 0) {
$values = array(
'type' => 'group',
'title' => $title,
'body' => [
'value' => 'Content body for ' . $title,
],
);
if ($field_name) {
$values[$field_name] = [
'target_id' => $target_id,
'grant_public' => $grant_public,
'grant_view' => $grant_view,
'grant_update' => $grant_update,
'grant_delete' => $grant_delete,
];
}
return $this
->drupalCreateNode($values);
}
protected function createComplexArticle($title, $fields_name = [], $target_id = [], $grant_public = [], $grant_view = [], $grant_update = [], $grant_delete = []) {
$values = array(
'type' => 'article',
'title' => $title,
'body' => [
'value' => 'Content body for ' . $title,
],
);
foreach ($fields_name as $key => $field_name) {
$values[$field_name] = [
'target_id' => $target_id[$key],
'grant_public' => $grant_public[$key],
'grant_view' => $grant_view[$key],
'grant_update' => $grant_update[$key],
'grant_delete' => $grant_delete[$key],
];
}
return $this
->drupalCreateNode($values);
}
protected function createArticles() {
$values = array(
'type' => 'article',
'title' => 'Article 1',
'body' => [
'value' => 'Content body for article 1',
],
'field_pbf_group' => [
'target_id' => $this->group1
->id(),
'grant_public' => 1,
'grant_view' => 0,
'grant_update' => 0,
'grant_delete' => 0,
],
);
$this->article1 = $this
->drupalCreateNode($values);
$values = array(
'type' => 'article',
'title' => 'Article 2',
'body' => [
'value' => 'Content body for article 2',
],
'field_pbf_group' => [
'target_id' => $this->group1
->id(),
'grant_public' => 0,
'grant_view' => 1,
'grant_update' => 0,
'grant_delete' => 0,
],
);
$this->article2 = $this
->drupalCreateNode($values);
}
}