View source
<?php
namespace Drupal\Tests\user\Functional;
use Drupal\Core\Url;
use Drupal\Tests\rest\Functional\CookieResourceTestTrait;
use Drupal\Tests\rest\Functional\ResourceTestBase;
use Drupal\Core\Test\AssertMailTrait;
use Drupal\user\UserInterface;
use GuzzleHttp\RequestOptions;
class RestRegisterUserTest extends ResourceTestBase {
use CookieResourceTestTrait;
use AssertMailTrait {
getMails as drupalGetMails;
}
protected $defaultTheme = 'stark';
protected static $format = 'hal_json';
protected static $mimeType = 'application/hal+json';
protected static $auth = 'cookie';
protected static $resourceConfigId = 'user_registration';
public static $modules = [
'hal',
'user',
];
const USER_EMAIL_DOMAIN = '@example.com';
const TEST_EMAIL_DOMAIN = 'simpletest@example.com';
public function setUp() {
parent::setUp();
$auth = isset(static::$auth) ? [
static::$auth,
] : [];
$this
->provisionResource([
static::$format,
], $auth);
$this
->setUpAuthorization('POST');
}
public function testRegisterUser() {
$config = $this
->config('user.settings');
$config
->set('register', UserInterface::REGISTER_VISITORS);
$config
->set('verify_mail', 0);
$config
->save();
$user = $this
->registerUser('Palmer.Eldritch');
$this
->assertFalse($user
->isBlocked());
$this
->assertFalse(empty($user
->getPassword()));
$email_count = count($this
->drupalGetMails());
$this
->assertEquals($email_count, 0);
$response = $this
->registerRequest('Rick.Deckard', FALSE);
$this
->assertResourceErrorResponse(422, "No password provided.", $response);
$config
->set('register', UserInterface::REGISTER_VISITORS);
$config
->set('verify_mail', 1);
$config
->save();
$response = $this
->registerRequest('Estraven', TRUE);
$this
->assertResourceErrorResponse(422, 'A Password cannot be specified. It will be generated on login.', $response);
$config
->set('register', UserInterface::REGISTER_VISITORS);
$config
->set('verify_mail', 1);
$config
->save();
$name = 'Jason.Taverner';
$user = $this
->registerUser($name, FALSE);
$this
->assertTrue(empty($user
->getPassword()));
$this
->assertTrue($user
->isBlocked());
$this
->resetAll();
$this
->assertMailString('body', 'You may now log in by clicking this link', 1);
$config
->set('register', UserInterface::REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL);
$config
->set('verify_mail', 0);
$config
->save();
$name = 'Argaven';
$user = $this
->registerUser($name);
$this
->resetAll();
$this
->assertFalse(empty($user
->getPassword()));
$this
->assertTrue($user
->isBlocked());
$this
->assertMailString('body', 'Your application for an account is', 2);
$this
->assertMailString('body', 'Argaven has applied for an account', 2);
$config
->set('register', UserInterface::REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL);
$config
->set('verify_mail', 1);
$config
->save();
$name = 'Bob.Arctor';
$user = $this
->registerUser($name, FALSE);
$this
->resetAll();
$this
->assertTrue(empty($user
->getPassword()));
$this
->assertTrue($user
->isBlocked());
$this
->assertMailString('body', 'Your application for an account is', 2);
$this
->assertMailString('body', 'Bob.Arctor has applied for an account', 2);
$this
->initAuthentication();
$response = $this
->registerRequest($this->account
->getAccountName());
$this
->assertResourceErrorResponse(403, "Only anonymous users can register a user.", $response);
}
protected function createRequestBody($name, $include_password = TRUE, $include_email = TRUE) {
global $base_url;
$request_body = [
'_links' => [
'type' => [
"href" => $base_url . "/rest/type/user/user",
],
],
'langcode' => [
[
'value' => 'en',
],
],
'name' => [
[
'value' => $name,
],
],
];
if ($include_email) {
$request_body['mail'] = [
[
'value' => $name . self::USER_EMAIL_DOMAIN,
],
];
}
if ($include_password) {
$request_body['pass']['value'] = 'SuperSecretPassword';
}
return $request_body;
}
protected function createRequestOptions(array $request_body) {
$request_options = $this
->getAuthenticationRequestOptions('POST');
$request_options[RequestOptions::BODY] = $this->serializer
->encode($request_body, static::$format);
$request_options[RequestOptions::HEADERS]['Content-Type'] = static::$mimeType;
return $request_options;
}
protected function registerUser($name, $include_password = TRUE, $include_email = TRUE) {
$response = $this
->registerRequest($name, $include_password, $include_email);
$this
->assertResourceResponse(200, FALSE, $response);
$user = user_load_by_name($name);
$this
->assertFalse(empty($user), 'User was create as expected');
return $user;
}
protected function registerRequest($name, $include_password = TRUE, $include_email = TRUE) {
$user_register_url = Url::fromRoute('user.register')
->setRouteParameter('_format', static::$format);
$request_body = $this
->createRequestBody($name, $include_password, $include_email);
$request_options = $this
->createRequestOptions($request_body);
$response = $this
->request('POST', $user_register_url, $request_options);
return $response;
}
protected function setUpAuthorization($method) {
switch ($method) {
case 'POST':
$this
->grantPermissionsToAuthenticatedRole([
'restful post user_registration',
]);
$this
->grantPermissionsToAnonymousRole([
'restful post user_registration',
]);
break;
default:
throw new \UnexpectedValueException();
}
}
protected function assertNormalizationEdgeCases($method, Url $url, array $request_options) {
}
protected function getExpectedUnauthorizedAccessMessage($method) {
}
protected function getExpectedBcUnauthorizedAccessMessage($method) {
}
protected function getExpectedUnauthorizedAccessCacheability() {
}
}