crm_core-8.x-3.x-dev/modules/crm_core_activity/tests/src/Functional/ActivityUiTest.php
modules/crm_core_activity/tests/src/Functional/ActivityUiTest.php
<?php namespace Drupal\Tests\crm_core_activity\Functional; use Drupal\crm_core_activity\Entity\ActivityType; use Drupal\crm_core_contact\Entity\Individual; use Drupal\crm_core_contact\Entity\IndividualType; use Drupal\Tests\BrowserTestBase; /** * Tests the UI for Activity CRUD operations. * * @group crm_core */ class ActivityUiTest extends BrowserTestBase { /** * {@inheritdoc} */ protected $defaultTheme = 'stark'; /** * Modules to enable. * * @var array */ protected static $modules = [ 'crm_core', 'crm_core_contact', 'crm_core_activity', 'block', 'entity', 'views_ui', 'datetime', 'options', ]; /** * {@inheritdoc} */ protected function setUp(): void { parent::setUp(); // Place local actions blocks. $this->drupalPlaceBlock('local_actions_block'); $this->drupalPlaceBlock('local_tasks_block'); IndividualType::create([ 'name' => 'Customer', 'type' => 'customer', 'description' => 'A single customer.', 'primary_fields' => [], ])->save(); ActivityType::create([ 'type' => 'meeting', 'name' => 'Meeting', 'description' => 'A meeting between 2 or more contacts.', ])->save(); ActivityType::create([ 'type' => 'phone_call', 'name' => 'Phone call', 'description' => 'A phone call between 2 or more contacts.', ])->save(); $this->drupalPlaceBlock('system_breadcrumb_block'); } /** * Test basic UI operations with Activities. * * Create an individual. * Add activity of every type to individual. * Assert activities listed on Activities tab listing page. * Edit every activity. Assert activities changed from listing page. * Delete every activity. Assert they disappeared from listing page. */ public function testActivityOperations() { // Create and login user. User should be able to create individuals and // activities. $user = $this->drupalCreateUser([ 'administer crm_core_individual entities', 'view any crm_core_individual entity', 'administer crm_core_activity entities', 'administer activity types', 'view any crm_core_activity entity', ]); $this->drupalLogin($user); // Create customer individual. $individual = Individual::create([ 'name' => [ 'given' => 'John', 'family' => 'Smith', ], 'type' => 'customer', ]); $individual->save(); $this->drupalGet('crm-core/activity'); $this->assertSession()->pageTextContains('There are no activities available.'); $this->assertSession()->linkExists('Add an activity'); $this->drupalGet('crm-core/activity/add'); $this->assertSession()->linkExists('Meeting'); $this->assertSession()->linkExists('Phone call'); // Create Meeting activity. Ensure it is listed. $this->drupalGet('crm-core/activity/add/meeting'); // $this->assertSession()->pageTextContains(date('m/d/Y')); $this->assertSession()->fieldExists('created[0][value][date]'); $this->assertSession()->pageTextContains('Type'); $meeting_activity = [ 'title[0][value]' => 'Pellentesque', 'activity_date[0][value][date]' => $this->randomDate(), 'activity_date[0][value][time]' => $this->randomTime(), 'activity_notes[0][value]' => $this->randomString(), 'activity_participants[0][target_type]' => $individual->getEntityTypeId(), 'activity_participants[0][target_id]' => $individual->label() . ' (' . $individual->id() . ')', ]; // Assert the breadcrumb. $this->assertSession()->linkExists('Home'); $this->assertSession()->linkExists('CRM'); $this->assertSession()->linkExists('Activities'); $this->submitForm($meeting_activity, 'Save Activity'); $this->assertSession()->pageTextContains('Activity Pellentesque created.'); $activities = \Drupal::entityTypeManager() ->getStorage('crm_core_activity') ->loadByProperties(['title' => 'Pellentesque']); $meeting_activity = current($activities); // Create another user. $new_user = $this->drupalCreateUser(); // Test EntityOwnerTrait functions on meeting activity. $this->assertEquals($meeting_activity->getOwnerId(), $user->id()); $this->assertEquals($meeting_activity->getOwner()->id(), $user->id()); $meeting_activity->setOwner($new_user); $this->assertEquals($meeting_activity->getOwnerId(), $new_user->id()); $this->assertEquals($meeting_activity->getOwner()->id(), $new_user->id()); $meeting_activity->setOwnerId($user->id()); $this->assertEquals($meeting_activity->getOwnerId(), $user->id()); $this->assertEquals($meeting_activity->getOwner()->id(), $user->id()); // Test Activity::hasParticipant() method. $this->assertTrue( $meeting_activity->hasParticipant($individual), 'Meeting activity has participant ' . $individual->label() ); $new_individual = Individual::create([ 'name' => [ 'given' => 'John', 'family' => 'Doe', ], 'type' => 'customer', ]); $new_individual->save(); $this->assertFalse($meeting_activity->hasParticipant($new_individual), 'Meeting activity does not have ' . $new_individual->label() ); // Create Meeting activity. Ensure it it listed. $phonecall_activity = [ 'title[0][value]' => 'Mollis', 'activity_date[0][value][date]' => $this->randomDate(), 'activity_date[0][value][time]' => $this->randomTime(), 'activity_notes[0][value]' => $this->randomString(), 'activity_participants[0][target_type]' => $individual->getEntityTypeId(), 'activity_participants[0][target_id]' => $individual->label() . ' (' . $individual->id() . ')', ]; $this->drupalGet('crm-core/activity/add/phone_call'); $this->submitForm($phonecall_activity, 'Save Activity'); $this->assertSession()->pageTextContains('Activity Mollis created.'); /** @var \Drupal\crm_core_activity\Entity\Activity $phonecall_activity_db */ $phonecall_activity_db = \Drupal::entityTypeManager() ->getStorage('crm_core_activity') ->loadByProperties(['title' => 'Mollis']); $phonecall_activity_db = reset($phonecall_activity_db); $this->assertTrue($phonecall_activity_db->hasParticipant($individual)); $this->drupalGet('crm-core/activity/' . $phonecall_activity_db->id() . '/edit'); // Update activity and assert its title changed on the list. $meeting_activity = [ 'title[0][value]' => 'Vestibulum', 'activity_notes[0][value]' => 'Pellentesque egestas neque sit', ]; $this->submitForm($meeting_activity, 'Save Activity'); // Activity updated. $this->assertSession()->pageTextContains('Vestibulum'); $this->drupalGet('crm-core/activity'); $this->assertSession()->linkExists('Vestibulum'); // Assert all views headers are available. $this->assertSession()->linkExists('Activity Date'); $this->assertSession()->linkExists('Title'); $this->assertSession()->linkExists('Activity Type'); $this->assertSession()->pageTextContains('Operations'); $this->assertSession()->pageTextContains('Activity preview'); $elements = $this->xpath('//form[@class="views-exposed-form"]/div/label[text()="Title"]'); // Title is an exposed filter. $this->assertCount(1, $elements); $elements = $this->xpath('//form[@class="views-exposed-form"]/div/label[text()="Type"]'); // Activity type is an exposed filter. $this->assertCount(1, $elements); $activities = \Drupal::entityTypeManager() ->getStorage('crm_core_activity') ->loadByProperties(['title' => 'Vestibulum']); $activity = current($activities); $this->assertSession()->responseContains('crm-core/activity/' . $activity->id() . '/edit'); $this->assertSession()->responseContains('crm-core/activity/' . $activity->id() . '/delete'); $date = $activity->get('activity_date')->date; $this->container->get('date.formatter')->format($date->getTimeStamp(), 'medium'); $this->assertSession()->pageTextContains($this->container->get('date.formatter')->format($date->getTimeStamp(), 'medium')); // Get test view page and check fields data. $this->drupalGet('crm-core/activity'); $this->assertSession()->pageTextContains('Vestibulum'); // Test that empty activity_participants field is not allowed. $empty_participant = [ 'activity_participants[0][target_id]' => '', ]; $this->drupalGet('crm-core/activity/1/edit'); $this->submitForm($empty_participant, 'Save Activity'); $this->assertSession()->pageTextContains('Label field is required.'); // Update phone call activity and assert its title changed on the list. $phonecall_activity = [ 'title[0][value]' => 'Commodo', ]; $this->drupalGet('crm-core/activity/2/edit'); $this->submitForm($phonecall_activity, 'Save Activity'); $this->assertSession()->pageTextContains('Commodo'); $this->drupalGet('crm-core/activity'); $this->assertSession()->linkExists('Commodo', 0); // Delete Meeting activity. $this->drupalGet('crm-core/activity/1/delete'); $this->submitForm([], 'Delete'); $this->assertSession()->pageTextContains('Meeting Pellentesque has been deleted.'); $this->drupalGet('crm-core/activity'); $this->assertSession()->linkNotExists('Pellentesque'); // Delete Phone call activity. $this->drupalGet('crm-core/activity/2/delete'); $this->submitForm([], 'Delete'); $this->assertSession()->pageTextContains('Phone call Commodo has been deleted.'); $this->drupalGet('crm-core/activity'); $this->assertSession()->linkNotExists('Commodo'); // Assert there is no activities left. $this->drupalGet('crm-core/activity'); $this->assertSession()->pageTextContains('There are no activities available.'); // Test activity type operations. $this->drupalGet('admin/structure/crm-core/activity-types'); // Add new activity type. $this->clickLink('Add activity type'); $new_activity_type = [ 'name' => 'New activity type', 'type' => 'new_activity_type', 'description' => 'New activity type description', ]; $this->submitForm($new_activity_type, 'Save activity type'); // Check that new activity type is displayed in activity types overview. $this->drupalGet('admin/structure/crm-core/activity-types'); $this->assertSession()->pageTextContains($new_activity_type['name']); // Edit activity type. $this->clickLink('Edit', 1); $edit = [ 'name' => 'Edited activity type', ]; $this->submitForm($edit, 'Save activity type'); $this->drupalGet('admin/structure/crm-core/activity-types'); $this->assertSession()->pageTextContains($edit['name']); // Test activity type delete operation. $this->drupalGet('admin/structure/crm-core/activity-types'); $this->clickLink('Delete'); $this->submitForm([], 'Delete'); $this->assertSession()->pageTextContains('The activity type ' . $edit['name'] . ' has been deleted.'); $this->drupalGet('admin/structure/crm-core/activity-types'); $this->assertSession()->pageTextNotContains($edit['name']); } /** * Test list builder views for activity entity. */ public function testListBuilder() { $user = $this->drupalCreateUser([ 'view any crm_core_activity entity', 'view any crm_core_activity entity', 'administer views', ]); $this->drupalLogin($user); // Delete generated activity view to get default view from list builder. $this->drupalGet('admin/structure/views/view/crm_core_activity_overview/delete'); $this->submitForm([], 'Delete'); // Check activity collection page. $this->drupalGet('/crm-core/activity'); $this->assertSession()->statusCodeEquals(200); } /** * Generate random Date for form element input. */ protected function randomDate() { $request_time = \Drupal::time()->getRequestTime(); return \Drupal::service('date.formatter')->format($request_time + rand(0, 100000), 'custom', 'Y-m-d'); } /** * Generate random Time for form element input. */ protected function randomTime() { $request_time = \Drupal::time()->getRequestTime(); return \Drupal::service('date.formatter')->format($request_time + rand(0, 100000), 'custom', 'H:m:s'); } }