View source  
  <?php
namespace Drupal\Tests\feeds\Kernel\Feeds\Target;
use Drupal\feeds\Plugin\Type\Processor\ProcessorInterface;
use Drupal\Tests\feeds\Kernel\FeedsKernelTestBase;
use Drupal\user\UserInterface;
class UserRoleTest extends FeedsKernelTestBase {
  
  public static $modules = [
    'field',
    'user',
    'feeds',
    'feeds_test_alter_source',
  ];
  
  protected $feedType;
  
  protected $userStorage;
  
  protected $roleStorage;
  
  protected function setUp() {
    parent::setUp();
    $this
      ->installEntitySchema('user');
    
    $this->feedType = $this
      ->createFeedTypeForCsv([
      'name' => 'name',
      'mail' => 'mail',
      'role_ids' => 'role_ids',
      'role_labels' => 'role_labels',
    ], [
      'id' => 'user_import',
      'processor' => 'entity:user',
      'processor_configuration' => [
        'update_existing' => ProcessorInterface::UPDATE_EXISTING,
        'authorize' => FALSE,
      ],
      'mappings' => [
        [
          'target' => 'name',
          'map' => [
            'value' => 'name',
          ],
        ],
        [
          'target' => 'mail',
          'map' => [
            'value' => 'mail',
          ],
          'unique' => [
            'value' => TRUE,
          ],
        ],
      ],
    ]);
    $this->userStorage = $this->container
      ->get('entity_type.manager')
      ->getStorage('user');
    $this->roleStorage = $this->container
      ->get('entity_type.manager')
      ->getStorage('user_role');
  }
  
  protected function assertHasRole(UserInterface $account, $rid, $message = '') {
    $this
      ->assertTrue($account
      ->hasRole($rid), $message);
  }
  
  protected function assertNotHasRole(UserInterface $account, $rid, $message = '') {
    $this
      ->assertFalse($account
      ->hasRole($rid), $message);
  }
  
  protected function assertRoleCount($expected_number_of_roles, UserInterface $account, $message = '') {
    $this
      ->assertEquals($expected_number_of_roles, count($account
      ->getRoles(TRUE)), $message);
  }
  
  public function testWithoutRoleCreation() {
    
    $this
      ->createRole([], 'manager');
    
    $this->feedType
      ->addMapping([
      'target' => 'roles',
      'map' => [
        'target_id' => 'role_ids',
      ],
    ]);
    $this->feedType
      ->save();
    
    $feed = $this
      ->createFeed($this->feedType
      ->id(), [
      'source' => $this
        ->resourcesPath() . '/csv/users_roles.csv',
    ]);
    $feed
      ->import();
    
    $account = user_load_by_name('Morticia');
    $this
      ->assertNotHasRole($account, 'editor', 'Morticia does not have the editor role.');
    $this
      ->assertRoleCount(0, $account, 'Morticia has no special roles.');
    
    $account = user_load_by_name('Fester');
    $this
      ->assertHasRole($account, 'manager', 'Fester has the manager role.');
    $this
      ->assertRoleCount(1, $account, 'Fester has one role.');
    
    $account = user_load_by_name('Gomez');
    $this
      ->assertHasRole($account, 'manager', 'Gomez has the manager role.');
    $this
      ->assertNotHasRole($account, 'tester', 'Gomez does not have the tester role.');
    $this
      ->assertRoleCount(1, $account, 'Gomez has one role.');
    
    $account = user_load_by_name('Pugsley');
    $this
      ->assertRoleCount(0, $account, 'Pugsley has no special roles.');
    
    $roles = $this->roleStorage
      ->loadMultiple();
    $this
      ->assertEquals(1, count($roles), 'Only one role exists.');
  }
  
  public function testWithRoleCreation() {
    
    $this
      ->createRole([], 'manager');
    
    $this->feedType
      ->addMapping([
      'target' => 'roles',
      'map' => [
        'target_id' => 'role_ids',
      ],
      'settings' => [
        'autocreate' => TRUE,
      ],
    ]);
    $this->feedType
      ->save();
    
    $feed = $this
      ->createFeed($this->feedType
      ->id(), [
      'source' => $this
        ->resourcesPath() . '/csv/users_roles.csv',
    ]);
    $feed
      ->import();
    
    $account = user_load_by_name('Morticia');
    $this
      ->assertHasRole($account, 'editor', 'Morticia has the editor role.');
    $this
      ->assertRoleCount(1, $account, 'Morticia has one role.');
    
    $account = user_load_by_name('Fester');
    $this
      ->assertHasRole($account, 'manager', 'Fester has the manager role.');
    $this
      ->assertRoleCount(1, $account, 'Fester has one role.');
    
    $account = user_load_by_name('Gomez');
    $this
      ->assertHasRole($account, 'manager', 'Gomez has the manager role.');
    $this
      ->assertHasRole($account, 'tester', 'Gomez has the tester role.');
    $this
      ->assertRoleCount(2, $account, 'Gomez has two roles.');
    
    $account = user_load_by_name('Pugsley');
    $this
      ->assertRoleCount(0, $account, 'Pugsley has no special roles.');
    
    $roles = $this->roleStorage
      ->loadMultiple();
    $this
      ->assertEquals(3, count($roles), 'Three roles exist.');
    
    $this
      ->assertEquals('editor', $roles['editor']
      ->label());
    $this
      ->assertEquals('tester', $roles['tester']
      ->label());
  }
  
  public function testRoleCreationUsingLabel() {
    
    $this->feedType
      ->addMapping([
      'target' => 'roles',
      'map' => [
        'target_id' => 'role_labels',
      ],
      'settings' => [
        'reference_by' => 'label',
        'autocreate' => TRUE,
      ],
    ]);
    $this->feedType
      ->save();
    
    $feed = $this
      ->createFeed($this->feedType
      ->id(), [
      'source' => $this
        ->resourcesPath() . '/csv/users_roles.csv',
    ]);
    $feed
      ->import();
    
    $account = user_load_by_name('Morticia');
    $this
      ->assertHasRole($account, 'article_editor', 'Morticia got the Article Editor role.');
    $this
      ->assertRoleCount(1, $account, 'Morticia has one role.');
    
    $account = user_load_by_name('Gomez');
    $this
      ->assertHasRole($account, 'account_manager', 'Gomez has the manager role.');
    $this
      ->assertHasRole($account, 'software_tester', 'Gomez has the tester role.');
    $this
      ->assertRoleCount(2, $account, 'Gomez has two roles.');
    
    $roles = $this->roleStorage
      ->loadMultiple();
    $this
      ->assertEquals(3, count($roles), 'Three roles exist.');
    $this
      ->assertEquals('Article Editor', $roles['article_editor']
      ->label());
    $this
      ->assertEquals('Account Manager', $roles['account_manager']
      ->label());
    $this
      ->assertEquals('Software Tester', $roles['software_tester']
      ->label());
  }
  
  public function testImportByRoleLabels() {
    
    $this
      ->createRole([], 'account_manager', 'Account Manager');
    $this
      ->createRole([], 'software_tester', 'Software Tester');
    
    $this->feedType
      ->addMapping([
      'target' => 'roles',
      'map' => [
        'target_id' => 'role_labels',
      ],
      'settings' => [
        'reference_by' => 'label',
      ],
    ]);
    $this->feedType
      ->save();
    
    $feed = $this
      ->createFeed($this->feedType
      ->id(), [
      'source' => $this
        ->resourcesPath() . '/csv/users_roles.csv',
    ]);
    $feed
      ->import();
    
    $account = user_load_by_name('Morticia');
    $this
      ->assertNotHasRole($account, 'editor', 'Morticia does not have the editor role.');
    $this
      ->assertRoleCount(0, $account, 'Morticia has no special roles.');
    
    $account = user_load_by_name('Fester');
    $this
      ->assertHasRole($account, 'account_manager', 'Fester has the manager role.');
    $this
      ->assertRoleCount(1, $account, 'Fester has one role.');
    
    $account = user_load_by_name('Gomez');
    $this
      ->assertHasRole($account, 'account_manager', 'Gomez has the manager role.');
    $this
      ->assertHasRole($account, 'software_tester', 'Gomez has the tester role.');
    $this
      ->assertRoleCount(2, $account, 'Gomez has two roles.');
    
    $account = user_load_by_name('Pugsley');
    $this
      ->assertRoleCount(0, $account, 'Pugsley has no special roles.');
    
    $roles = $this->roleStorage
      ->loadMultiple();
    $this
      ->assertEquals(2, count($roles), 'Two roles exist.');
  }
  
  public function testWithAllowedRoles() {
    
    $this
      ->createRole([], 'manager');
    $this
      ->createRole([], 'editor');
    
    $this->feedType
      ->addMapping([
      'target' => 'roles',
      'map' => [
        'target_id' => 'role_ids',
      ],
      'settings' => [
        'allowed_roles' => [
          'manager' => FALSE,
          'editor' => 'editor',
        ],
        'autocreate' => TRUE,
      ],
    ]);
    $this->feedType
      ->save();
    
    $feed = $this
      ->createFeed($this->feedType
      ->id(), [
      'source' => $this
        ->resourcesPath() . '/csv/users_roles.csv',
    ]);
    $feed
      ->import();
    
    $account = user_load_by_name('Morticia');
    $this
      ->assertHasRole($account, 'editor', 'Morticia has the editor role.');
    $this
      ->assertRoleCount(1, $account, 'Morticia has one role.');
    
    $account = user_load_by_name('Fester');
    $this
      ->assertNotHasRole($account, 'manager', 'Fester does not have the manager role.');
    $this
      ->assertRoleCount(0, $account, 'Fester has no special roles.');
    
    $account = user_load_by_name('Gomez');
    $this
      ->assertNotHasRole($account, 'manager', 'Gomez does not have the manager role.');
    $this
      ->assertHasRole($account, 'tester', 'Gomez has the tester role.');
    $this
      ->assertRoleCount(1, $account, 'Gomez has one role.');
  }
  
  public function testRevokeRoles() {
    
    $this
      ->createRole([], 'manager');
    $this
      ->createRole([], 'editor');
    $this
      ->createRole([], 'tester');
    
    $this->feedType
      ->addMapping([
      'target' => 'roles',
      'map' => [
        'target_id' => 'role_ids',
      ],
      'settings' => [
        'allowed_roles' => [
          'manager' => FALSE,
          'editor' => 'editor',
          'tester' => 'tester',
        ],
        'revoke_roles' => TRUE,
      ],
    ]);
    $this->feedType
      ->save();
    
    $this->userStorage
      ->create([
      'name' => 'Morticia',
      'mail' => 'morticia@example.com',
      'pass' => 'mort',
      'status' => 1,
      'roles' => [
        'manager',
        'editor',
      ],
    ])
      ->save();
    
    $this->userStorage
      ->create([
      'name' => 'Pugsley',
      'mail' => 'pugsley@example.com',
      'pass' => 'pugs',
      'status' => 1,
      'roles' => [
        'manager',
        'editor',
        'tester',
      ],
    ])
      ->save();
    
    $this->userStorage
      ->create([
      'name' => 'Gomez',
      'mail' => 'gomez@example.com',
      'pass' => 'gome',
      'status' => 1,
      'roles' => [
        'editor',
      ],
    ])
      ->save();
    
    $feed = $this
      ->createFeed($this->feedType
      ->id(), [
      'source' => $this
        ->resourcesPath() . '/csv/users_roles.csv',
    ]);
    $feed
      ->import();
    
    $account = user_load_by_name('Morticia');
    $this
      ->assertHasRole($account, 'manager', 'Morticia still has the manager role.');
    $this
      ->assertHasRole($account, 'editor', 'Morticia has the editor role.');
    $this
      ->assertRoleCount(2, $account, 'Morticia has two roles.');
    
    $account = user_load_by_name('Pugsley');
    $this
      ->assertHasRole($account, 'manager', 'Pugsley still has the manager role.');
    $this
      ->assertNotHasRole($account, 'editor', 'Pugsley no longer has the editor role.');
    $this
      ->assertNotHasRole($account, 'tester', 'Pugsley no longer has the tester role.');
    $this
      ->assertRoleCount(1, $account, 'Pugsley has one role.');
    
    $account = user_load_by_name('Gomez');
    $this
      ->assertNotHasRole($account, 'editor', 'Gomez no longer has the editor role.');
    $this
      ->assertHasRole($account, 'tester', 'Gomez has the tester role.');
    $this
      ->assertRoleCount(1, $account, 'Gomez has one role.');
  }
  
  public function testNoRevokeRoles() {
    
    $this
      ->createRole([], 'manager');
    $this
      ->createRole([], 'editor');
    
    $this->feedType
      ->addMapping([
      'target' => 'roles',
      'map' => [
        'target_id' => 'role_ids',
      ],
      'settings' => [
        'allowed_roles' => [
          'manager' => FALSE,
          'editor' => 'editor',
        ],
        'revoke_roles' => FALSE,
      ],
    ]);
    $this->feedType
      ->save();
    
    $this->userStorage
      ->create([
      'name' => 'Pugsley',
      'mail' => 'pugsley@example.com',
      'pass' => 'pugs',
      'status' => 1,
      'roles' => [
        'manager',
        'editor',
      ],
    ])
      ->save();
    
    $feed = $this
      ->createFeed($this->feedType
      ->id(), [
      'source' => $this
        ->resourcesPath() . '/csv/users_roles.csv',
    ]);
    $feed
      ->import();
    
    $account = user_load_by_name('Pugsley');
    $this
      ->assertHasRole($account, 'manager', 'Pugsley still has the manager role.');
    $this
      ->assertHasRole($account, 'editor', 'Pugsley still has the editor role.');
    $this
      ->assertRoleCount(2, $account, 'Pugsley has two roles.');
  }
}