function ConfigLocaleOverride::testConfigLocaleUserOverride

Tests locale override based on user's preferred language.

File

drupal/core/modules/config/lib/Drupal/config/Tests/ConfigLocaleOverride.php, line 65
Contains \Drupal\config\Tests\ConfigLocaleOverride.

Class

ConfigLocaleOverride
Tests locale config override.

Namespace

Drupal\config\Tests

Code

function testConfigLocaleUserOverride() {
  $this
    ->installSchema('system', 'variable');
  $this
    ->installSchema('language', 'language');
  language_save(new Language(array(
    'name' => 'French',
    'langcode' => 'fr',
  )));
  language_save(new Language(array(
    'name' => 'English',
    'langcode' => 'en',
  )));
  language_save(new Language(array(
    'name' => 'German',
    'langcode' => 'de',
  )));
  $this
    ->installSchema('user', 'users');
  $account = entity_create('user', array(
    'name' => 'French user',
    'mail' => 'test@example.com',
    'created' => REQUEST_TIME,
    'status' => 1,
    'preferred_langcode' => 'fr',
  ));
  $user_config_context = config_context_enter('Drupal\\user\\UserConfigContext');
  $user_config_context
    ->setAccount($account);
  $config = config('config_test.system');
  $this
    ->assertIdentical($config
    ->get('foo'), 'fr bar');

  // Ensure the non-overriden value is still the same.
  $this
    ->assertIdentical($config
    ->get('404'), 'herp');

  // Ensure that we get the expected value when we leave the user context. The
  // locale overrides contain an English override too, so although we are not
  // in a user based language override context, the English language override
  // applies due to the negotiated language for the page.
  config_context_leave();
  $config = config('config_test.system');
  $this
    ->assertIdentical($config
    ->get('foo'), 'en bar');
  $account = entity_create('user', array(
    'name' => 'German user',
    'mail' => 'test@example.com',
    'created' => REQUEST_TIME,
    'status' => 1,
    'preferred_langcode' => 'de',
  ));
  $config_factory = drupal_container()
    ->get('config.factory');
  $config_factory
    ->enterContext($user_config_context
    ->setAccount($account));

  // Should not have to re-initialize the configuration object to get new
  // overrides as the new context will have a different uuid.
  $config = config('config_test.system');
  $this
    ->assertIdentical($config
    ->get('foo'), 'de bar');

  // Enter an english context on top of the german context.
  $account = entity_create('user', array(
    'name' => 'English user',
    'mail' => 'test@example.com',
    'created' => REQUEST_TIME,
    'status' => 1,
    'preferred_langcode' => 'en',
  ));

  // Create a new user config context to stack on top of the existign one.
  $en_user_config_context = config_context_enter('Drupal\\user\\UserConfigContext');
  $en_user_config_context
    ->setAccount($account);
  $config = config('config_test.system');
  $this
    ->assertIdentical($config
    ->get('foo'), 'en bar');

  // Ensure that we get the expected value when we leave the english user
  // context.
  config_context_leave();
  $config = config('config_test.system');
  $this
    ->assertIdentical($config
    ->get('foo'), 'de bar');

  // Ensure that we get the expected value when we leave the german user
  // context.
  config_context_leave();
  $config = config('config_test.system');
  $this
    ->assertIdentical($config
    ->get('foo'), 'en bar');

  // Ensure that we cannot leave the default context.
  config_context_leave();
  $config = config('config_test.system');
  $this
    ->assertIdentical($config
    ->get('foo'), 'en bar');
}