Projet

Général

Profil

Paste
Télécharger (12,4 ko) Statistiques
| Branche: | Révision:

root / htmltest / sites / all / modules / i18n / i18n_menu / i18n_menu.test @ 4543c6c7

1
<?php
2

    
3
/**
4
 * @file
5
 * Test case for multilingual menus.
6
 */
7
class i18nMenuTestCase extends Drupali18nTestCase {
8
  public static function getInfo() {
9
    return array(
10
      'name' => 'Menu translation',
11
      'group' => 'Internationalization',
12
      'description' => 'Menu translation functions',
13
    );
14
  }
15

    
16
  function setUp() {
17
    parent::setUp(array('i18n_menu', 'translation'));
18
    parent::setUpLanguages(array('administer menu'));
19
    $this->translator = $this->drupalCreateUser(array('translate interface', 'translate user-defined strings'));
20
  }
21

    
22
  function testMenuTranslateLocalize() {
23
    // Test filtering for menu blocks.
24
    $menu = $this->createMenu(array('i18n_mode' => I18N_MODE_MULTIPLE));
25

    
26
    $neutral_item = $this->createMenuLink(array('menu_name' => $menu['menu_name']));
27
    $default_item = $this->createMenuLink(array('menu_name' => $menu['menu_name'], 'language' => $this->default_language));
28
    $secondary_item = $this->createMenuLink(array('menu_name' => $menu['menu_name'], 'language' => $this->secondary_language));
29

    
30
    $block['title'] = $menu['title'];
31
    $block['module'] = 'menu';
32
    $block['delta'] = $menu['menu_name'];
33
    $this->moveBlockToRegion($block, 'sidebar_first');
34

    
35
    $this->drupalGet('<front>');
36
    $this->assertText($neutral_item['link_title']);
37
    $this->assertText($default_item['link_title']);
38
    $this->assertNoText($secondary_item['link_title']);
39

    
40
    $this->i18nGet($this->secondary_language, '<front>');
41
    $this->assertText($neutral_item['link_title']);
42
    $this->assertNoText($default_item['link_title']);
43
    $this->assertText($secondary_item['link_title']);
44

    
45
    // Test filtering for built-in menus.
46
    $edit = array(
47
      'i18n_mode' => I18N_MODE_MULTIPLE,
48
    );
49
    $this->drupalPost('admin/structure/menu/manage/main-menu/edit', $edit, t('Save'));
50

    
51
    $neutral_item = $this->createMenuLink(array('menu_name' => 'main-menu'));
52
    $default_item = $this->createMenuLink(array('menu_name' => 'main-menu', 'language' => $this->default_language));
53
    $secondary_item = $this->createMenuLink(array('menu_name' => 'main-menu', 'language' => $this->secondary_language));
54

    
55
    $this->drupalGet('<front>');
56
    $this->assertText($neutral_item['link_title']);
57
    $this->assertText($default_item['link_title']);
58
    $this->assertNoText($secondary_item['link_title']);
59

    
60
    $this->i18nGet($this->secondary_language, '<front>');
61
    $this->assertText($neutral_item['link_title']);
62
    $this->assertNoText($default_item['link_title']);
63
    $this->assertText($secondary_item['link_title']);
64

    
65
    // Test the same thing with a system menu used as a block.
66
    $block['title'] = $menu['title'];
67
    $block['module'] = 'system';
68
    $block['delta'] = 'main-menu';
69
    $this->moveBlockToRegion($block, 'sidebar_first');
70

    
71
    $this->drupalGet('<front>');
72
    $this->assertText($neutral_item['link_title']);
73
    $this->assertText($default_item['link_title']);
74
    $this->assertNoText($secondary_item['link_title']);
75

    
76
    $this->i18nGet($this->secondary_language, '<front>');
77
    $this->assertText($neutral_item['link_title']);
78
    $this->assertNoText($default_item['link_title']);
79
    $this->assertText($secondary_item['link_title']);
80
  }
81

    
82
  /**
83
   * Test menu items for nodes.
84
   */
85
  function testNodeMenuItems() {
86
    // Create menu and display it in a block.
87
    $menu = $this->createMenu(array(
88
      'i18n_mode' => I18N_MODE_MULTIPLE,
89
      'language' => LANGUAGE_NONE,
90
      'menu_name' => 'test',
91
    ));
92

    
93
    $neutral_item = $this->createMenuLink(array('menu_name' => $menu['menu_name']));
94
    $block['title'] = $menu['title'];
95
    $block['module'] = 'menu';
96
    $block['delta'] = $menu['menu_name'];
97
    $this->moveBlockToRegion($block, 'sidebar_first');
98
    $menu_parent = $menu['menu_name'] . ':0';
99
    // Create content type 'page', translation enabled, login as translator
100
    parent::setUpContentTranslation();
101
    $settings = array(
102
      'menu_options[' . $menu['menu_name'] . ']' => TRUE,
103
      'menu_parent' => $menu_parent,
104
      'node_options[promote]' => FALSE,
105
    );
106
    $this->drupalPost('admin/structure/types/manage/page/edit', $settings, t('Save content type'));
107

    
108
    // Create nodes with language and menu item: es, en, und
109
    $edit = array(
110
      'menu[enabled]' => TRUE,
111
      'menu[parent]' => $menu_parent,
112
      'promote' => FALSE,
113
    );
114
    // English Page => English menu item
115
    $en_title = $this->randomName(10);
116
    $en_body = $this->randomString(50);
117
    $nodes[] = $en_node = $this->createNode('page', $en_title, $en_body, 'en', $edit + array('menu[link_title]' => $en_title));
118
    // Spanish page => Spanish menu item
119
    $es_title = $this->randomName(10);
120
    $es_body = $this->randomString(50);
121
    $nodes[] = $es_node = $this->createNode('page', $es_title, $es_body, 'es', $edit + array('menu[link_title]' => $es_title));
122
    // Language neutral page, localicable menu item
123
    $und_title = $this->randomName(10);
124
    $und_body = $this->randomString(50);
125
    $nodes[] = $und_node = $this->createNode('page', $und_title, $und_body, LANGUAGE_NONE, $edit + array('menu[link_title]' => $und_title));
126
    // Check menu items have right language and we cannot edit them.
127
    foreach ($nodes as $node) {
128
      menu_node_prepare($node);
129
      $this->assertEqual($node->menu['language'], $node->language, 'Menu item has the same language that the node it belongs to.');
130
      $this->drupalGet('admin/structure/menu/item/' . $node->menu['mlid'] . '/edit');
131
      $this->assertText(t('This menu item belongs to a node, so it will have the same language as the node and cannot be localized.'));
132
      $this->assertNoField('language', 'We cannot edit language for menu items that belong to nodes.');
133
    }
134
    // Check menu items show up for the right language.
135
    $this->drupalGet('<front>');
136
    $this->assertText($en_title);
137
    $this->assertNoText($es_title);
138
    $this->assertText($und_title);
139
    $this->i18nGet('es', '<front>');
140
    $this->assertText($es_title);
141
    $this->assertNoText($en_title);
142
    $this->assertText($und_title);
143
    // Create string translation for neutral menu item and check it shows up
144
    $translation = $this->randomName(10);
145
    $this->createStringTranslation('menu', $und_title, array('es' => $translation));
146
    $this->drupalGet('<front>');
147
    $this->assertText($und_title);
148
    $this->i18nGet('es', '<front>');
149
    $this->assertText($translation);
150
  }
151

    
152
  /**
153
   * Tests if the translation set management works.
154
   */
155
  function testMenuTranslationSets() {
156
    $menu = $this->createMenu(array('i18n_mode' => I18N_MODE_MULTIPLE));
157

    
158
    $neutral_item = $this->createMenuLink(array('menu_name' => $menu['menu_name']));
159
    $default_item = $this->createMenuLink(array('menu_name' => $menu['menu_name'], 'language' => $this->default_language));
160
    $secondary_item = $this->createMenuLink(array('menu_name' => $menu['menu_name'], 'language' => $this->secondary_language));
161

    
162
    $translationset_edit = array(
163
      'translations[' . $this->default_language . ']' => $default_item['menu_name'] . ':' . $default_item['mlid'],
164
      'translations[' . $this->secondary_language . ']' => $secondary_item['menu_name'] . ':' . $secondary_item['mlid'],
165
    );
166
    $translation_set = $this->createMenuLinkTranslationSet($translationset_edit);
167

    
168
    // Check if the overview works
169
    $this->drupalGet('admin/structure/menu/manage/translation');
170
    $link = $this->xpath('//*/a[contains(@href,"admin/structure/menu/manage/translation/edit/' . $translation_set->tsid . '")]');
171
    $this->assertTrue(!empty($link), 'Created translation-set found.');
172

    
173
    // Check if the edit mode works
174
    $this->drupalGet('admin/structure/menu/manage/translation/edit/' . $translation_set->tsid);
175
    $this->assertFieldByXPath(
176
      "//*[@id='edit-translations-" . $this->default_language . "']/option[@selected]/@value",
177
      $menu['menu_name'] . ':' . $default_item['mlid'],
178
      'Expected option selection for language ' . $this->default_language . ' found.'
179
    );
180
    $this->assertFieldByXPath(
181
      "//*[@id='edit-translations-" . $this->secondary_language . "']/option[@selected]/@value",
182
      $menu['menu_name'] . ':' . $secondary_item['mlid'],
183
      'Expected option selection for language ' . $this->secondary_language . ' found.'
184
    );
185
  }
186

    
187
  /**
188
   * Tests if on a switch from translatable to non translatable the translation
189
   * sets and links are cleaned up.
190
   */
191
  function testMenuTranslateLocalizeSwitchToNonTranslatable() {
192
    // Test filtering for menu blocks.
193
    $menu = $this->createMenu(array('i18n_mode' => I18N_MODE_MULTIPLE));
194

    
195
    // Check current menu mode
196
    $this->drupalGet('admin/structure/menu/manage/' . $menu['menu_name'] . '/edit');
197
    $this->assertFieldByName('i18n_mode', I18N_MODE_MULTIPLE, 'Menu i18n mode set to I18N_MODE_MULTIPLE');
198

    
199
    // Setup menu links for testing.
200
    $neutral_item = $this->createMenuLink(array('menu_name' => $menu['menu_name']));
201
    $default_item = $this->createMenuLink(array('menu_name' => $menu['menu_name'], 'language' => $this->default_language));
202
    $secondary_item = $this->createMenuLink(array('menu_name' => $menu['menu_name'], 'language' => $this->secondary_language));
203

    
204
    $translationset_edit = array(
205
      'translations[' . $this->default_language . ']' => $default_item['menu_name'] . ':' . $default_item['mlid'],
206
      'translations[' . $this->secondary_language . ']' => $secondary_item['menu_name'] . ':' . $secondary_item['mlid'],
207
    );
208
    $translation_set = $this->createMenuLinkTranslationSet($translationset_edit);
209
    $tsid = $translation_set->tsid;
210

    
211
    // Test language mode switch
212
    $edit = array(
213
      'i18n_mode' => I18N_MODE_LANGUAGE,
214
      'language' => $this->secondary_language,
215
    );
216
    $this->drupalPost('admin/structure/menu/manage/' . $menu['menu_name'] . '/edit', $edit, t('Save'));
217
    $this->drupalGet('admin/structure/menu/manage/' . $menu['menu_name'] . '/edit');
218
    $this->assertFieldByName('i18n_mode', I18N_MODE_LANGUAGE, 'Menu i18n mode changed to I18N_MODE_LANGUAGE');
219

    
220
    $this->assertTrue(!empty(i18n_translation_set_load($tsid)->tsid), 'Translation set kept.');
221

    
222
    $menu_link_languages = db_select('menu_links')
223
      ->fields('menu_links', array('language'))
224
      ->condition('menu_name', $menu['menu_name'])
225
      ->groupBy('language')
226
      ->execute()
227
      ->fetchCol();
228
    $this->assertTrue((count($menu_link_languages) == 1 && reset($menu_link_languages) === $this->secondary_language), 'Menu link language changed to menu language.');
229

    
230
    // Test cleanup.
231
    $edit = array(
232
      'i18n_mode' => I18N_MODE_NONE,
233
    );
234
    $this->drupalPost('admin/structure/menu/manage/' . $menu['menu_name'] . '/edit', $edit, t('Save'));
235
    $this->drupalGet('admin/structure/menu/manage/' . $menu['menu_name'] . '/edit');
236
    $this->assertFieldByName('i18n_mode', I18N_MODE_NONE, 'Menu i18n mode changed to I18N_MODE_NONE');
237
    $translation_sets = entity_load('i18n_translation', FALSE, array('tsid' => $tsid), TRUE);
238
    $this->assertTrue(empty($translation_sets), 'Translation set deleted.');
239

    
240
    $menu_link_languages = db_select('menu_links')
241
      ->fields('menu_links', array('language'))
242
      ->condition('menu_name', $menu['menu_name'])
243
      ->groupBy('language')
244
      ->execute()
245
      ->fetchCol();
246
    $this->assertTrue(((count($menu_link_languages) == 1) && reset($menu_link_languages) === LANGUAGE_NONE), 'Menu link language switched to LANGUAGE_NONE.');
247
  }
248

    
249
  /**
250
   * Helper function to create a menu.
251
   */
252
  function createMenu($edit = array()) {
253
    $edit += array(
254
      'title' => $this->randomName(),
255
      'menu_name' => substr(hash('sha256', $this->randomName(16)), 0, MENU_MAX_MENU_NAME_LENGTH_UI),
256
      'language' => $this->secondary_language,
257
    );
258
    $this->drupalPost('admin/structure/menu/add', $edit, t('Save'));
259
    return menu_load('menu-' . $edit['menu_name']);
260
  }
261

    
262
  /**
263
   * Helper function to create a menu link.
264
   */
265
  function createMenuLink($item = array()) {
266
    $item += array(
267
      'link_title' => $this->randomName(),
268
      'link_path' => '<front>',
269
      'customized' => TRUE,
270
    );
271

    
272
    return menu_link_load(menu_link_save($item));
273
  }
274

    
275
  /**
276
   * Helper function to create a translation set.
277
   */
278
  function createMenuLinkTranslationSet($edit = array()) {
279
    $edit += array(
280
      'title' => $this->randomName(16),
281
    );
282
    $this->drupalPost('admin/structure/menu/manage/translation/add', $edit, t('Save'));
283

    
284
    // Load translation set entity.
285
    $entity = entity_load('i18n_translation', FALSE, array('title' => $edit['title']), TRUE);
286
    if (empty($entity)) {
287
      $this->fail('Could not create a translation set.', 'i18n_translation');
288
      return FALSE;
289
    }
290
    return reset($entity);
291
  }
292
}