LanguageUrlRewritingTest.php 4.9 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

/**
 * @file
 * Definition of Drupal\language\Tests\LanguageUrlRewritingTest.
 */

namespace Drupal\language\Tests;

use Drupal\simpletest\WebTestBase;

/**
 * Test that URL rewriting works as expected.
 */
class LanguageUrlRewritingTest extends WebTestBase {
16
17
18
19
20
21
22
23

  /**
   * Modules to enable.
   *
   * @var array
   */
  public static $modules = array('language');

24
25
26
27
28
29
30
31
32
  public static function getInfo() {
    return array(
      'name' => 'URL rewriting',
      'description' => 'Test that URL rewriting works as expected.',
      'group' => 'Language',
    );
  }

  function setUp() {
33
    parent::setUp();
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

    // Create and login user.
    $this->web_user = $this->drupalCreateUser(array('administer languages', 'access administration pages'));
    $this->drupalLogin($this->web_user);

    // Install French language.
    $edit = array();
    $edit['predefined_langcode'] = 'fr';
    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));

    // Enable URL language detection and selection.
    $edit = array('language_interface[enabled][language-url]' => 1);
    $this->drupalPost('admin/config/regional/language/detection', $edit, t('Save settings'));

    // Reset static caching.
    drupal_static_reset('language_list');
    drupal_static_reset('language_url_outbound_alter');
    drupal_static_reset('language_url_rewrite_url');
  }

  /**
   * Check that non-installed languages are not considered.
   */
  function testUrlRewritingEdgeCases() {
    // Check URL rewriting with a non-installed language.
    $non_existing = language_default();
    $non_existing->langcode = $this->randomName();
61
    $this->checkUrl($non_existing, 'Path language is ignored if language is not installed.', 'URL language negotiation does not work with non-installed languages');
62
63
64
65
66
67
68
69
  }

  /**
   * Check URL rewriting for the given language.
   *
   * The test is performed with a fixed URL (the default front page) to simply
   * check that language prefixes are not added to it and that the prefixed URL
   * is actually not working.
70
71
72
73
74
75
76
   *
   * @param string $language
   *   The language prefix, e.g. 'es'.
   * @param string $message1
   *   Message to display in assertion that language prefixes are not added.
   * @param string $message2
   *   The message to display confirming prefixed URL is not working.
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
   */
  private function checkUrl($language, $message1, $message2) {
    $options = array('language' => $language, 'script' => '');
    $base_path = trim(base_path(), '/');
    $rewritten_path = trim(str_replace($base_path, '', url('node', $options)), '/');
    $segments = explode('/', $rewritten_path, 2);
    $prefix = $segments[0];
    $path = isset($segments[1]) ? $segments[1] : $prefix;

    // If the rewritten URL has not a language prefix we pick a random prefix so
    // we can always check the prefixed URL.
    $prefixes = language_negotiation_url_prefixes();
    $stored_prefix = isset($prefixes[$language->langcode]) ? $prefixes[$language->langcode] : $this->randomName();
    if ($this->assertNotEqual($stored_prefix, $prefix, $message1)) {
      $prefix = $stored_prefix;
    }

    $this->drupalGet("$prefix/$path");
    $this->assertResponse(404, $message2);
  }
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116

  /**
   * Check URL rewriting when using a domain name and a non-standard port.
   */
  function testDomainNameNegotiationPort() {
    $language_domain = 'example.fr';
    $edit = array(
      'language_negotiation_url_part' => 1,
      'domain[fr]' => $language_domain
    );
    $this->drupalPost('admin/config/regional/language/detection/url', $edit, t('Save configuration'));

    // Enable domain configuration.
    variable_set('language_negotiation_url_part', LANGUAGE_NEGOTIATION_URL_DOMAIN);

    // Reset static caching.
    drupal_static_reset('language_list');
    drupal_static_reset('language_url_outbound_alter');
    drupal_static_reset('language_url_rewrite_url');

117
118
119
120
    // In case index.php is part of the URLs, we need to adapt the asserted
    // URLs as well.
    $index_php = strpos(url('', array('absolute' => TRUE)), 'index.php') !== FALSE;

121
122
    // Remember current HTTP_HOST.
    $http_host = $_SERVER['HTTP_HOST'];
123
124
125
126
127
    // Fake a different port.
    $_SERVER['HTTP_HOST'] .= ':88';

    // Create an absolute French link.
    $language = language_load('fr');
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
    $url = url('', array(
      'absolute' => TRUE,
      'language' => $language,
    ));

    $expected = $index_php ? 'http://example.fr:88/index.php/' : 'http://example.fr:88/';

    $this->assertEqual($url, $expected, 'The right port is used.');

    // If we set the port explicitly in url(), it should not be overriden.
    $url = url('', array(
      'absolute' => TRUE,
      'language' => $language,
      'base_url' => $GLOBALS['base_url'] . ':90',
    ));

    $expected = $index_php ? 'http://example.fr:90/index.php/' : 'http://example.fr:90/';
145

146
    $this->assertEqual($url, $expected, 'A given port is not overriden.');
147
148
149

    // Restore HTTP_HOST.
    $_SERVER['HTTP_HOST'] = $http_host;
150
151
  }

152
}