crm_core-8.x-3.x-dev/modules/crm_core_contact/tests/src/Functional/IndividualUiTest.php
modules/crm_core_contact/tests/src/Functional/IndividualUiTest.php
<?php namespace Drupal\Tests\crm_core_contact\Functional; use Drupal\crm_core_contact\Entity\Individual; use Drupal\crm_core_contact\Entity\IndividualType; use Drupal\Tests\BrowserTestBase; /** * Tests the UI for Individual CRUD operations. * * @group crm_core */ class IndividualUiTest extends BrowserTestBase { /** * {@inheritdoc} */ protected $defaultTheme = 'stark'; /** * Modules to enable. * * @var array */ protected static $modules = [ 'crm_core_contact', 'crm_core_activity', 'block', 'views_ui', 'options', 'datetime', ]; /** * {@inheritdoc} */ protected function setUp(): void { parent::setUp(); IndividualType::create([ 'name' => 'Customer', 'type' => 'customer', 'description' => 'A single customer.', 'primary_fields' => [], ])->save(); // Place local actions and local task blocks. $this->drupalPlaceBlock('local_actions_block'); $this->drupalPlaceBlock('local_tasks_block'); } /** * Tests the individual operations. * * User with permissions 'administer crm_core_individual entities' * should be able to create/edit/delete individuals of any individual type. */ public function testIndividualOperations(): void { $this->drupalGet('crm-core'); $this->assertSession()->statusCodeEquals(403); $user = $this->drupalCreateUser([ 'view any crm_core_individual entity', 'administer crm_core_individual entities', ]); $this->drupalLogin($user); $this->drupalGet('crm-core'); $this->assertSession()->linkExists('CRM Individuals'); $this->assertSession()->linkNotExists('CRM Activities'); $user = $this->drupalCreateUser([ 'view any crm_core_activity entity', ]); $this->drupalLogin($user); $this->drupalGet('crm-core'); $this->assertSession()->linkNotExists('CRM Individuals'); $this->assertSession()->linkExists('CRM Activities'); // User has no permission to create Customer individuals. $this->assertSession()->linkByHrefNotExists('crm-core/individual/add/customer'); $this->drupalGet('crm-core/individual/add/customer'); $this->assertSession()->statusCodeEquals(403); // Create user and login. $user = $this->drupalCreateUser([ 'administer crm_core_individual entities', 'delete any crm_core_individual entity of bundle customer', 'create crm_core_individual entities of bundle customer', 'view any crm_core_individual entity', 'view any crm_core_activity entity', ]); $this->drupalLogin($user); $this->drupalGet('crm-core'); $this->assertSession()->titleEquals('CRM | Drupal'); $this->assertSession()->linkExists('CRM Activities'); $this->assertSession()->linkExists('CRM Individuals'); $this->clickLink('CRM Individuals'); // There should be no individuals available after fresh installation and // there is a link to create new individuals. $this->assertSession()->pageTextContains('There are no individuals available.'); $this->assertSession()->linkExists('Add an individual'); $this->drupalGet('crm-core/individual/add'); $this->assertSession()->addressEquals('crm-core/individual/add/customer'); // Create individual customer. $user = $this->drupalCreateUser([ 'delete any crm_core_individual entity of bundle customer', 'create crm_core_individual entities', 'edit any crm_core_individual entity', 'administer individual types', 'view any crm_core_individual entity', ]); $this->drupalLogin($user); $customer = [ 'name[0][title]' => 'Mr.', 'name[0][given]' => 'John', 'name[0][middle]' => 'Emanuel', 'name[0][family]' => 'Smith', 'name[0][generational]' => 'IV', 'name[0][credentials]' => '', 'status[value]' => TRUE, ]; $this->drupalGet('crm-core/individual/add/customer'); $this->submitForm($customer, 'Save Customer'); // Assert we were redirected back to the list of individuals. $this->assertSession()->addressEquals('crm-core/individual/1'); $this->drupalGet('crm-core/individual'); $this->assertSession()->linkExists('Mr. John Emanuel Smith IV', 0, 'Newly created individual title listed.'); $this->assertSession()->pageTextContains('Customer'); // Assert all view headers are available. $this->assertSession()->linkExists('Name'); $this->assertSession()->linkExists('Individual Type'); $this->assertSession()->linkExists('Updated'); $this->assertSession()->pageTextContains('Operations links'); $elements = $this->xpath('//form[@class="views-exposed-form"]/div/label[text()="Name"]'); $this->assertCount(1, $elements); $elements = $this->xpath('//form[@class="views-exposed-form"]/div/label[text()="Type"]'); $this->assertCount(1, $elements); $elements = $this->xpath('//form[@class="views-exposed-form"]/div/label[text()="Active"]'); $this->assertCount(1, $elements); $individuals = \Drupal::entityTypeManager() ->getStorage('crm_core_individual') ->loadByProperties(['name__given' => 'John', 'name__family' => 'Smith']); $individual = current($individuals); $this->assertSession()->linkByHrefExists('crm-core/individual/' . $individual->id()); // Edit link is available. $this->assertSession()->responseContains('crm-core/individual/' . $individual->id() . '/edit'); // Delete link is available'. $this->assertSession()->responseContains('crm-core/individual/' . $individual->id() . '/delete'); // Individual updated date is available. $this->assertSession() ->pageTextContains($this->container->get('date.formatter') ->format($individual->get('changed')->value, 'medium')); $this->drupalGet('crm-core/individual/1/edit'); // Delete link is available. $this->assertSession()->linkByHrefExists('crm-core/individual/1/delete'); $individual->save(); // Get test view data page. $this->drupalGet('crm-core/individual'); $this->assertSession()->pageTextContains('Mr. John Emanuel Smith IV'); // Edit customer individual. $customer = [ 'name[0][title]' => 'Mr.', 'name[0][given]' => 'Maynard', 'name[0][middle]' => 'James', 'name[0][family]' => 'Keenan', 'name[0][generational]' => 'I', 'name[0][credentials]' => 'MJK', 'status[value]' => TRUE, ]; $individuals = $this->container->get('entity_type.manager') ->getStorage('crm_core_individual') ->loadByProperties(['name__given' => 'John', 'name__family' => 'Smith']); $individual = current($individuals); $this->drupalGet('crm-core/individual/' . $individual->id() . '/edit'); $this->submitForm($customer, 'Save Customer'); // Assert we are viewing the updated entity after update. $this->assertSession()->addressEquals('crm-core/individual/' . $individual->id()); // Local task "Delete" is available. $this->assertSession()->responseContains('data-drupal-link-system-path="crm-core/individual/' . $individual->id() . '/delete"'); // Check listing page. $this->drupalGet('crm-core/individual'); // Updated customer individual title listed. $this->assertSession()->pageTextContains('Maynard James Keenan'); // Delete individual contact. $this->drupalGet('crm-core/individual/' . $individual->id() . '/delete'); $this->submitForm([], 'Delete'); $this->assertSession()->addressEquals('crm-core/individual'); // Deleted individual customer title no more listed. $this->assertSession()->linkNotExists('Maynard Keenan'); // Assert that there are no contacts left. // No individuals available after deleting all of them. $this->assertSession()->pageTextContains('There are no individuals available.'); // Create a individual with no label. /** @var \Drupal\crm_core_contact\ContactInterface $individual */ $individual = Individual::create(['type' => 'customer']); $individual->save(); // Create another user. $new_user = $this->drupalCreateUser(); // Test EntityOwnerTrait functions on contact. $this->assertEquals($individual->getOwnerId(), $user->id()); $this->assertEquals($individual->getOwner()->id(), $user->id()); $individual->setOwner($new_user); $this->assertEquals($individual->getOwnerId(), $new_user->id()); $this->assertEquals($individual->getOwner()->id(), $new_user->id()); $individual->setOwnerId($user->id()); $this->assertEquals($individual->getOwnerId(), $user->id()); $this->assertEquals($individual->getOwner()->id(), $user->id()); // Test whether owner is loaded from database correctly. // No need to save individual here, since nothing has changed. $id = $individual->id(); $individual = Individual::load($id); $this->assertEquals($individual->getOwnerId(), $user->id()); $this->assertEquals($individual->getOwner()->id(), $user->id()); // And then make sure the result is correct even with owner being someone // else than the user who was logged in while creating entity. $individual->setOwnerId($new_user->id()); $individual->save(); $id = $individual->id(); $individual = Individual::load($id); $this->assertEquals($individual->getOwnerId(), $new_user->id()); $this->assertEquals($individual->getOwner()->id(), $new_user->id()); // Go to overview page and assert there is a default label displayed. $this->drupalGet('crm-core/individual'); $this->assertSession()->linkExists('Nameless ' . $individual->type->entity->label() . ' ' . $individual->id()); $this->assertSession()->linkByHrefExists('crm-core/individual/' . $individual->id()); } /** * Tests the individual type operations. * * User with permissions 'administer individual types' should be able to * create/edit/delete individual types. * * @covers \Drupal\crm_core_contact\Form\IndividualTypeForm::buildForm * @covers \Drupal\crm_core_contact\Form\IndividualTypeForm::submitForm */ public function testIndividualTypeOperations(): void { // Given I am logged in as a user with permission 'administer individual // types'. $user = $this->drupalCreateUser(['administer individual types']); $this->drupalLogin($user); // When I visit the individual type admin page. $this->drupalGet('admin/structure/crm-core/individual-types'); // Then I should see edit, and delete links for existing contacts. $this->assertSession()->linkByHrefExists('admin/structure/crm-core/individual-types/customer', 0); $this->assertSession()->linkByHrefExists('admin/structure/crm-core/individual-types/customer/delete', 0); // Given there is a individual of type 'customer.'. Individual::create(['type' => 'customer'])->save(); // When I visit the individual type admin page. $this->drupalGet('admin/structure/crm-core/individual-types'); // Then I should not see a delete link. $this->assertSession()->linkByHrefNotExists('admin/structure/crm-core/individual-types/customer/delete'); $this->drupalGet('admin/structure/crm-core/individual-types/customer/delete'); $this->assertSession()->statusCodeEquals(403); // When I edit the individual type. $this->drupalGet('admin/structure/crm-core/individual-types/customer'); $this->assertSession()->statusCodeEquals(200); // Then I should see "Save individual type" button. $this->assertSession()->buttonExists('Save individual type'); // Then I should not see a delete link. $this->assertSession()->linkByHrefNotExists('admin/structure/crm-core/individual-types/customer/delete'); } /** * Test if the field UI is displayed on individual bundle. */ public function testFieldsUi(): void { $user = $this->drupalCreateUser([ 'administer crm_core_individual display', 'administer crm_core_individual form display', 'administer crm_core_individual fields', 'administer individual types', ]); $this->drupalLogin($user); // List of all types. $this->drupalGet('admin/structure/crm-core/individual-types'); // Manage fields local task in available. $this->assertSession()->linkExists('Edit'); $this->assertSession()->linkExists('Manage fields'); $this->assertSession()->linkExists('Manage form display'); $this->assertSession()->linkExists('Manage display'); // Edit on type. $this->drupalGet('admin/structure/crm-core/individual-types/customer'); // Manage fields local task in available. $this->assertSession()->linkExists('Edit'); $this->assertSession()->linkExists('Manage fields'); $this->assertSession()->linkExists('Manage form display'); $this->assertSession()->linkExists('Manage display'); // Manage fields on type. $this->drupalGet('admin/structure/crm-core/individual-types/customer/fields'); // Manage fields local task in available. $this->assertSession()->linkExists('Edit'); $this->assertSession()->linkExists('Manage fields'); $this->assertSession()->linkExists('Manage form display'); $this->assertSession()->linkExists('Manage display'); $this->drupalGet('admin/structure/crm-core/individual-types/customer/form-display'); // Name field is available on form display. $this->assertSession()->pageTextContains('Name'); $this->drupalGet('admin/structure/crm-core/individual-types/customer/display'); // Name field is available on manage display. $this->assertSession()->pageTextContains('Name'); } /** * Test individual revisions. */ public function testIndividualRevisions() { $user = $this->drupalCreateUser([ 'create crm_core_individual entities', 'view any crm_core_individual entity', 'edit any crm_core_individual entity', 'view all crm_core_individual revisions', 'revert all crm_core_individual revisions', ]); $this->drupalLogin($user); $this->drupalGet('crm-core/individual/add/customer'); $this->submitForm(['name[0][given]' => 'rev', 'name[0][family]' => '1'], 'Save Customer'); $this->drupalGet('crm-core/individual/1/edit'); $this->submitForm(['name[0][family]' => '2'], 'Save Customer'); $this->drupalGet('crm-core/individual/1/edit'); $this->submitForm(['name[0][family]' => '3'], 'Save Customer'); $this->clickLink('Revisions'); $this->assertSession()->linkByHrefExists('crm-core/individual/1'); $this->assertSession()->linkByHrefExists('crm-core/individual/1/revisions/1/view'); $this->assertSession()->linkByHrefExists('crm-core/individual/1/revisions/2/view'); $this->drupalGet('crm-core/individual/1/revisions/1/view'); $this->assertSession()->pageTextContains('rev 1'); $this->drupalGet('crm-core/individual/1/revisions/2/view'); $this->assertSession()->pageTextContains('rev 2'); /** @var \Drupal\crm_core_contact\ContactInterface $individual */ $individual = Individual::create([ 'type' => 'customer', 'status' => TRUE, 'name' => [ [ 'given' => 'Second', 'family' => 'Individual', ], ], ]); $individual->save(); $individual->setNewRevision(TRUE); $individual->isDefaultRevision(FALSE); $individual->save(); $this->drupalGet($individual->toUrl('version-history')); // Assert we have one revision link and current revision. $this->assertEquals($individual->getRevisionId(), 5); $this->assertSession()->linkByHrefExists('crm-core/individual/' . $individual->id() . '/revisions/5/view'); $this->assertSession()->linkByHrefExists('crm-core/individual/' . $individual->id()); // Assert we have revision revert link. $this->assertSession()->linkByHrefExists('crm-core/individual/' . $individual->id() . '/revisions/5/revert'); $this->drupalGet('crm-core/individual/' . $individual->id() . '/revisions/5/revert'); $this->assertSession()->statusCodeEquals(200); // Check view revision route. $this->drupalGet('crm-core/individual/' . $individual->id() . '/revisions/5/view'); $this->assertSession()->pageTextContains('Second Individual'); } /** * Test list builder views for contact entities. * * @covers \Drupal\crm_core_contact\IndividualListBuilder::render */ public function testListBuilder(): void { $user = $this->drupalCreateUser([ 'administer crm_core_individual entities', 'administer crm_core_organization entities', 'administer views', ]); $this->drupalLogin($user); // Delete created organization view to get default view from list builder. $this->drupalGet('admin/structure/views/view/crm_core_organization_overview/delete'); $this->submitForm([], 'Delete'); // Check organization collection page. $this->drupalGet('/crm-core/organization'); $this->assertSession()->statusCodeEquals(200); // Delete created individual view to get default view from list builder. $this->drupalGet('admin/structure/views/view/crm_core_individual_overview/delete'); $this->submitForm([], 'Delete'); // Assert response on individual collection page. $this->drupalGet('/crm-core/individual'); $this->assertSession()->statusCodeEquals(200); } }