Projet

Général

Profil

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

root / drupal7 / sites / all / modules / i18n / i18n_menu / i18n_menu.test @ 9faa5de0

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
      // Edit the node and submit it to see if the menu link stays enabled.
134
      $this->drupalPost('node/' . $node->nid . '/edit', array(), t('Save'));
135
    }
136
    // Check menu items show up for the right language.
137
    $this->drupalGet('<front>');
138
    $this->assertText($en_title);
139
    $this->assertNoText($es_title);
140
    $this->assertText($und_title);
141
    $this->i18nGet('es', '<front>');
142
    $this->assertText($es_title);
143
    $this->assertNoText($en_title);
144
    $this->assertText($und_title);
145
    // Create string translation for neutral menu item and check it shows up
146
    $translation = $this->randomName(10);
147
    $this->createStringTranslation('menu', $und_title, array('es' => $translation));
148
    $this->drupalGet('<front>');
149
    $this->assertText($und_title);
150
    $this->i18nGet('es', '<front>');
151
    $this->assertText($translation);
152
  }
153

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
274
    return menu_link_load(menu_link_save($item));
275
  }
276

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

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