Mercurial > hg > isophonics-drupal-site
comparison core/tests/Drupal/FunctionalJavascriptTests/Ajax/DialogTest.php @ 17:129ea1e6d783
Update, including to Drupal core 8.6.10
author | Chris Cannam |
---|---|
date | Thu, 28 Feb 2019 13:21:36 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
16:c2387f117808 | 17:129ea1e6d783 |
---|---|
1 <?php | |
2 | |
3 namespace Drupal\FunctionalJavascriptTests\Ajax; | |
4 | |
5 use Drupal\ajax_test\Controller\AjaxTestController; | |
6 use Drupal\Component\Render\FormattableMarkup; | |
7 use Drupal\FunctionalJavascriptTests\WebDriverTestBase; | |
8 | |
9 /** | |
10 * Performs tests on opening and manipulating dialogs via AJAX commands. | |
11 * | |
12 * @group Ajax | |
13 */ | |
14 class DialogTest extends WebDriverTestBase { | |
15 | |
16 /** | |
17 * {@inheritdoc} | |
18 */ | |
19 protected static $modules = ['ajax_test', 'ajax_forms_test', 'contact']; | |
20 | |
21 /** | |
22 * Test sending non-JS and AJAX requests to open and manipulate modals. | |
23 */ | |
24 public function testDialog() { | |
25 $this->drupalLogin($this->drupalCreateUser(['administer contact forms'])); | |
26 // Ensure the elements render without notices or exceptions. | |
27 $this->drupalGet('ajax-test/dialog'); | |
28 | |
29 // Set up variables for this test. | |
30 $dialog_renderable = AjaxTestController::dialogContents(); | |
31 $dialog_contents = \Drupal::service('renderer')->renderRoot($dialog_renderable); | |
32 | |
33 // Check that requesting a modal dialog without JS goes to a page. | |
34 $this->drupalGet('ajax-test/dialog-contents'); | |
35 $this->assertSession()->responseContains($dialog_contents); | |
36 | |
37 // Visit the page containing the many test dialog links. | |
38 $this->drupalGet('ajax-test/dialog'); | |
39 | |
40 // Tests a basic modal dialog by verifying the contents of the dialog are as | |
41 // expected. | |
42 $this->getSession()->getPage()->clickLink('Link 1 (modal)'); | |
43 | |
44 // Clicking the link triggers a AJAX request/response. | |
45 // Opens a Dialog panel. | |
46 $link1_dialog_div = $this->assertSession()->waitForElementVisible('css', 'div.ui-dialog'); | |
47 $this->assertNotNull($link1_dialog_div, 'Link was used to open a dialog ( modal )'); | |
48 | |
49 $link1_modal = $link1_dialog_div->find('css', '#drupal-modal'); | |
50 $this->assertNotNull($link1_modal, 'Link was used to open a dialog ( non-modal )'); | |
51 $this->assertSession()->responseContains($dialog_contents); | |
52 | |
53 $dialog_title = $link1_dialog_div->find('css', "span.ui-dialog-title:contains('AJAX Dialog & contents')"); | |
54 $this->assertNotNull($dialog_title); | |
55 $dialog_title_amp = $link1_dialog_div->find('css', "span.ui-dialog-title:contains('AJAX Dialog & contents')"); | |
56 $this->assertNull($dialog_title_amp); | |
57 | |
58 // Close open dialog, return to the dialog links page. | |
59 $close_button = $link1_dialog_div->findButton('Close'); | |
60 $this->assertNotNull($close_button); | |
61 $close_button->press(); | |
62 | |
63 // Tests a modal with a dialog-option. | |
64 // Link 2 is similar to Link 1, except it submits additional width | |
65 // information which must be echoed in the resulting DOM update. | |
66 $this->getSession()->getPage()->clickLink('Link 2 (modal)'); | |
67 $dialog = $this->assertSession()->waitForElementVisible('css', 'div.ui-dialog'); | |
68 $this->assertNotNull($dialog, 'Link was used to open a dialog ( non-modal, with options )'); | |
69 $style = $dialog->getAttribute('style'); | |
70 $this->assertContains('width: 400px;', $style, new FormattableMarkup('Modal respected the dialog-options width parameter. Style = style', ['%style' => $style])); | |
71 | |
72 // Reset: Return to the dialog links page. | |
73 $this->drupalGet('ajax-test/dialog'); | |
74 | |
75 // Test a non-modal dialog ( with target ). | |
76 $this->clickLink('Link 3 (non-modal)'); | |
77 $non_modal_dialog = $this->assertSession()->waitForElementVisible('css', 'div.ui-dialog'); | |
78 $this->assertNotNull($non_modal_dialog, 'Link opens a non-modal dialog.'); | |
79 | |
80 // Tests the dialog contains a target element specified in the AJAX request. | |
81 $non_modal_dialog->find('css', 'div#ajax-test-dialog-wrapper-1'); | |
82 $this->assertSession()->responseContains($dialog_contents); | |
83 | |
84 // Reset: Return to the dialog links page. | |
85 $this->drupalGet('ajax-test/dialog'); | |
86 | |
87 // Tests a non-modal dialog ( without target ). | |
88 $this->clickLink('Link 7 (non-modal, no target)'); | |
89 $no_target_dialog = $this->assertSession()->waitForElementVisible('css', 'div.ui-dialog'); | |
90 $this->assertNotNull($no_target_dialog, 'Link opens a non-modal dialog.'); | |
91 | |
92 $contents_no_target = $no_target_dialog->find('css', 'div.ui-dialog-content'); | |
93 $this->assertNotNull($contents_no_target, 'non-modal dialog opens ( no target ). '); | |
94 $id = $contents_no_target->getAttribute('id'); | |
95 $partial_match = strpos($id, 'drupal-dialog-ajax-testdialog-contents') === 0; | |
96 $this->assertTrue($partial_match, 'The non-modal ID has the expected prefix.'); | |
97 | |
98 $no_target_button = $no_target_dialog->findButton('Close'); | |
99 $this->assertNotNull($no_target_button, 'Link dialog has a close button'); | |
100 $no_target_button->press(); | |
101 | |
102 $this->getSession()->getPage()->findButton('Button 1 (modal)')->press(); | |
103 $button1_dialog = $this->assertSession()->waitForElementVisible('css', 'div.ui-dialog'); | |
104 $this->assertNotNull($button1_dialog, 'Button opens a modal dialog.'); | |
105 | |
106 $button1_dialog_content = $button1_dialog->find('css', 'div.ui-dialog-content'); | |
107 $this->assertNotNull($button1_dialog_content, 'Button opens a modal dialog.'); | |
108 | |
109 // Test the HTML escaping of & character. | |
110 $button1_dialog_title = $button1_dialog->find('css', "span.ui-dialog-title:contains('AJAX Dialog & contents')"); | |
111 $this->assertNotNull($button1_dialog_title); | |
112 $button1_dialog_title_amp = $button1_dialog->find('css', "span.ui-dialog-title:contains('AJAX Dialog & contents')"); | |
113 $this->assertNull($button1_dialog_title_amp); | |
114 | |
115 // Reset: Close the dialog. | |
116 $button1_dialog->findButton('Close')->press(); | |
117 | |
118 // Abbreviated test for "normal" dialogs, testing only the difference. | |
119 $this->getSession()->getPage()->findButton('Button 2 (non-modal)')->press(); | |
120 $button2_dialog = $this->assertSession()->waitForElementVisible('css', 'div.ui-dialog-content'); | |
121 $this->assertNotNull($button2_dialog, 'Non-modal content displays as expected.'); | |
122 | |
123 // Use a link to close the pagnel opened by button 2. | |
124 $this->getSession()->getPage()->clickLink('Link 4 (close non-modal if open)'); | |
125 | |
126 // Form modal. | |
127 $this->clickLink('Link 5 (form)'); | |
128 // Two links have been clicked in succession - This time wait for a change | |
129 // in the title as the previous closing dialog may temporarily be open. | |
130 $form_dialog_title = $this->assertSession()->waitForElementVisible('css', "span.ui-dialog-title:contains('Ajax Form contents')"); | |
131 $this->assertNotNull($form_dialog_title, 'Dialog form has the expected title.'); | |
132 // Locate the newly opened dialog. | |
133 $form_dialog = $this->getSession()->getPage()->find('css', 'div.ui-dialog'); | |
134 $this->assertNotNull($form_dialog, 'Form dialog is visible'); | |
135 | |
136 $form_contents = $form_dialog->find('css', "p:contains('Ajax Form contents description.')"); | |
137 $this->assertNotNull($form_contents, 'For has the expected text.'); | |
138 $do_it = $form_dialog->findButton('Do it'); | |
139 $this->assertNotNull($do_it, 'The dialog has a "Do it" button.'); | |
140 $preview = $form_dialog->findButton('Preview'); | |
141 $this->assertNotNull($preview, 'The dialog contains a "Preview" button.'); | |
142 | |
143 // Reset: close the form. | |
144 $form_dialog->findButton('Close')->press(); | |
145 | |
146 // Non AJAX version of Link 6. | |
147 $this->drupalGet('admin/structure/contact/add'); | |
148 // Check we get a chunk of the code, we can't test the whole form as form | |
149 // build id and token with be different. | |
150 $contact_form = $this->xpath("//form[@id='contact-form-add-form']"); | |
151 $this->assertTrue(!empty($contact_form), 'Non-JS entity form page present.'); | |
152 | |
153 // Reset: Return to the dialog links page. | |
154 $this->drupalGet('ajax-test/dialog'); | |
155 | |
156 $this->clickLink('Link 6 (entity form)'); | |
157 $dialog_add = $this->assertSession()->waitForElementVisible('css', 'div.ui-dialog'); | |
158 $this->assertNotNull($dialog_add, 'Form dialog is visible'); | |
159 | |
160 $form_add = $dialog_add->find('css', 'form.contact-form-add-form'); | |
161 $this->assertNotNull($form_add, 'Modal dialog JSON contains entity form.'); | |
162 | |
163 $form_title = $dialog_add->find('css', "span.ui-dialog-title:contains('Add contact form')"); | |
164 $this->assertNotNull($form_title, 'The add form title is as expected.'); | |
165 } | |
166 | |
167 } |