View source  
  <?php
namespace Drupal\crm_core_contact\Tests;
use Drupal\crm_core_contact\Entity\Organization;
use Drupal\crm_core_contact\Entity\OrganizationType;
use Drupal\simpletest\WebTestBase;
class OrganizationUiTest extends WebTestBase {
  
  public static $modules = [
    'crm_core_contact',
    'crm_core_activity',
    'crm_core_tests',
    'block',
    'datetime',
    'options',
  ];
  
  public function setUp() {
    parent::setUp();
    OrganizationType::create([
      'label' => 'Supplier',
      'id' => 'supplier',
      'description' => 'A person or company that supplies goods or services.',
      'primary_fields' => [],
    ])
      ->save();
    OrganizationType::create([
      'label' => 'Household',
      'id' => 'household',
      'description' => 'A collection of individuals generally located at the same residence.',
      'primary_fields' => [],
    ])
      ->save();
    
    $this
      ->drupalPlaceBlock('local_actions_block');
    $this
      ->drupalPlaceBlock('local_tasks_block');
  }
  
  public function testOrganizationOperations() {
    
    $user = $this
      ->drupalCreateUser([
      'administer crm_core_organization entities',
      'administer organization types',
      'create crm_core_organization entities of bundle supplier',
      'view any crm_core_organization entity',
      'view any crm_core_activity entity',
    ]);
    $this
      ->drupalLogin($user);
    $this
      ->drupalGet('crm-core');
    $this
      ->assertLink(t('CRM Organizations'));
    $this
      ->clickLink(t('CRM Organizations'));
    
    $this
      ->assertText(t('There are no organizations available.'), 'No organizations available after fresh installation.');
    $this
      ->assertLink(t('Add an organization'));
    $household_node = [
      'name[0][value]' => 'Fam. Johnson',
    ];
    $this
      ->drupalPostForm('crm-core/organization/add/household', $household_node, 'Save Household');
    
    $this
      ->assertUrl('crm-core/organization');
    $this
      ->assertText('Fam. Johnson', 0, 'Newly created organization title listed.');
    $this
      ->assertText(t('Household'), 'Newly created organization type listed.');
    $household_node = [
      'name[0][value]' => 'Fam. Bane',
    ];
    $households = \Drupal::entityTypeManager()
      ->getStorage('crm_core_organization')
      ->loadByProperties([
      'name' => 'Fam. Johnson',
    ]);
    $household = current($households);
    $this
      ->drupalPostForm('crm-core/organization/' . $household
      ->id() . '/edit', $household_node, 'Save Household');
    
    $this
      ->assertUrl('crm-core/organization/' . $household
      ->id());
    $this
      ->assertText('Fam. Bane', 0, 'Organization updated.');
    
    $this
      ->assertRaw('Fam. Bane</div>');
    
    $this
      ->drupalGet('crm-core/organization');
    $this
      ->assertText('Fam. Bane', 0, 'Updated organization title listed.');
    
    $supplier_node = [
      'name[0][value]' => 'Example ltd',
    ];
    $this
      ->drupalPostForm('crm-core/organization/add/supplier', $supplier_node, 'Save Supplier');
    
    $this
      ->drupalPostForm('crm-core/organization/add/supplier', [], 'Save Supplier');
    
    $this
      ->assertUrl('crm-core/organization');
    $this
      ->assertLink('Example ltd', 0, 'Newly created organization title listed.');
    $this
      ->assertLink('Nameless #3', 0, 'Nameless organization title listed.');
    $this
      ->assertText(t('Supplier'), 'Newly created organization type listed.');
    
    $this
      ->assertLink('Name');
    $this
      ->assertLink('Organization type');
    $this
      ->assertLink('Updated');
    $this
      ->assertText('Operations');
    $count = $this
      ->xpath('//form[@class="views-exposed-form"]/div/div/label[text()="Type"]');
    $this
      ->assertTrue($count, 1, 'Individual type is an exposed filter.');
    $count = $this
      ->xpath('//form[@class="views-exposed-form"]/div/div/label[text()="Name"]');
    $this
      ->assertTrue($count, 1, 'Name is an exposed filter.');
    $organizations = \Drupal::entityTypeManager()
      ->getStorage('crm_core_organization')
      ->loadByProperties([
      'name' => 'Example ltd',
    ]);
    $organization = current($organizations);
    
    $new_user = $this
      ->drupalCreateUser();
    
    $this
      ->assertEqual($organization
      ->getOwnerId(), $user
      ->id());
    $this
      ->assertEqual($organization
      ->getOwner()
      ->id(), $user
      ->id());
    $organization
      ->setOwner($new_user);
    $this
      ->assertEqual($organization
      ->getOwnerId(), $new_user
      ->id());
    $this
      ->assertEqual($organization
      ->getOwner()
      ->id(), $new_user
      ->id());
    $organization
      ->setOwnerId($user
      ->id());
    $this
      ->assertEqual($organization
      ->getOwnerId(), $user
      ->id());
    $this
      ->assertEqual($organization
      ->getOwner()
      ->id(), $user
      ->id());
    $this
      ->assertRaw('crm-core/organization/' . $organization
      ->id() . '/edit', 'Edit link is available.');
    $this
      ->assertRaw('crm-core/organization/' . $organization
      ->id() . '/delete', 'Delete link is available.');
    $this
      ->assertText($this->container
      ->get('date.formatter')
      ->format($organization
      ->get('changed')->value, 'short'), 'Organization updated date is available.');
    
    $supplier_node = [
      'name[0][value]' => 'Another Example ltd',
    ];
    $this
      ->drupalPostForm('crm-core/organization/' . $organization
      ->id() . '/edit', $supplier_node, 'Save Supplier');
    
    $this
      ->assertUrl('crm-core/organization/' . $organization
      ->id());
    $this
      ->assertText('Another Example ltd', 0, 'Organization updated.');
    $this
      ->drupalGet('crm-core/organization/1/edit');
    $this
      ->assertRaw('data-drupal-link-system-path="crm-core/organization/1/delete"', 'Local task "Delete" is available.');
    $this
      ->assertRaw('crm-core/organization/1/delete" class="button button--danger" data-drupal-selector="edit-delete" id="edit-delete"', 'Delete link is available.');
    
    $this
      ->drupalGet('crm-core/organization');
    $this
      ->assertLink('Another Example ltd', 0, 'Updated organization title listed.');
    
    $this
      ->drupalPostForm('crm-core/organization/1/delete', [], t('Delete'));
    $this
      ->drupalPostForm('crm-core/organization/2/delete', [], t('Delete'));
    $this
      ->drupalPostForm('crm-core/organization/3/delete', [], t('Delete'));
    $this
      ->assertUrl('crm-core/organization');
    $this
      ->assertNoLink('Another Example ltd', 0, 'Deleted organization title no more listed.');
    
    $this
      ->assertText(t('There are no organizations available.'), 'No organizations available.');
  }
  
  public function testOrganizationTypeOperations() {
    
    $user = $this
      ->drupalCreateUser([
      'administer organization types',
    ]);
    $this
      ->drupalLogin($user);
    $this
      ->drupalGet('admin/structure/crm-core/organization-types');
    
    $this
      ->assertOrganizationTypeLink('supplier', 'Edit link for supplier.');
    $this
      ->assertOrganizationTypeLink('supplier/delete', 'Delete link for supplier.');
    $this
      ->assertOrganizationTypeLink('household', 'Edit link for household.');
    $this
      ->assertOrganizationTypeLink('household/delete', 'Delete link for household.');
    
    $second_organization_type = OrganizationType::create([
      'id' => 'new_organization_type',
      'label' => 'New organization type',
      'primary_fields' => [],
    ]);
    $second_organization_type
      ->save();
    $this
      ->drupalGet('admin/structure/crm-core/organization-types');
    
    Organization::create([
      'type' => 'supplier',
    ])
      ->save();
    $this
      ->drupalGet('admin/structure/crm-core/organization-types');
    
    $this
      ->assertNoOrganizationTypeLink('supplier/delete', 'No delete link for supplier.');
    $this
      ->drupalGet('admin/structure/crm-core/organization-types/supplier/delete');
    $this
      ->assertResponse(403);
    $this
      ->drupalGet('admin/structure/crm-core/organization-types/supplier');
    
    $this
      ->assertNoOrganizationTypeLink('supplier/delete', 'No delete link on supplier type form.');
  }
  
  public function testFieldsUi() {
    $user = $this
      ->drupalCreateUser([
      'administer crm_core_organization display',
      'administer crm_core_organization form display',
      'administer crm_core_organization fields',
    ]);
    $this
      ->drupalLogin($user);
    $this
      ->drupalGet('admin/structure/crm-core/organization-types/supplier/fields');
    $this
      ->assertText(t('Manage fields'), 'Manage fields local task is available.');
    $this
      ->assertText(t('Manage form display'), 'Manage form display local task is available.');
    $this
      ->assertText(t('Manage display'), 'Manage display local task is available.');
    $this
      ->drupalGet('admin/structure/crm-core/organization-types/supplier/form-display');
    $this
      ->assertText(t('Name'), 'Name field is available on form display.');
    $this
      ->drupalGet('admin/structure/crm-core/organization-types/supplier/display');
    $this
      ->assertText(t('Name'), 'Name field is available on manage display.');
  }
  
  public function testOrganizationRevisions() {
    $user = $this
      ->drupalCreateUser([
      'administer crm_core_organization entities',
      'view all crm_core_organization revisions',
    ]);
    $this
      ->drupalLogin($user);
    $organization = [
      'name[0][value]' => 'rev',
    ];
    $this
      ->drupalPostForm('crm-core/organization/add/supplier', $organization, 'Save Supplier');
    $organization_1 = [
      'name[0][value]' => 'rev1',
    ];
    $this
      ->drupalPostForm('crm-core/organization/1/edit', $organization_1, 'Save Supplier');
    $organization_2 = [
      'name[0][value]' => 'rev2',
    ];
    $this
      ->drupalPostForm('crm-core/organization/1/edit', $organization_2, 'Save Supplier');
    $this
      ->clickLink('Revisions');
    $this
      ->assertLinkByHref('crm-core/organization/1');
    $this
      ->assertLinkByHref('crm-core/organization/1/revisions/1/view');
    $this
      ->assertLinkByHref('crm-core/organization/1/revisions/2/view');
    $this
      ->drupalGet('crm-core/organization/1/revisions/1/view');
    $this
      ->assertText('rev');
    $this
      ->drupalGet('crm-core/organization/1/revisions/2/view');
    $this
      ->assertText('rev1');
  }
  
  public function assertOrganizationTypeLink($href, $message = '') {
    $this
      ->assertLinkByHref('admin/structure/crm-core/organization-types/' . $href, 0, $message);
  }
  
  public function assertNoOrganizationTypeLink($href, $message = '') {
    $this
      ->assertNoLinkByHref('admin/structure/crm-core/organization-types/' . $href, $message);
  }
}