public function ContactStorageTest::testContactStorage in Contact Storage 8
Tests contact messages submitted through contact form.
File
- tests/
src/ Functional/ ContactStorageTest.php, line 84
Class
- ContactStorageTest
- Tests storing contact messages and viewing them through UI.
Namespace
Drupal\Tests\contact_storage\FunctionalCode
public function testContactStorage() {
// Create first valid contact form.
$mail = 'simpletest@example.com';
$this
->addContactForm('test_id', 'test_label', $mail, TRUE);
$this
->assertText('Contact form test_label has been added.');
// Ensure that anonymous can submit site-wide contact form.
user_role_grant_permissions(AccountInterface::ANONYMOUS_ROLE, [
'access site-wide contact form',
]);
$this
->drupalLogout();
$this
->drupalGet('contact');
$this
->assertText('Your email address');
$this
->assertNoText(t('Form'));
$this
->submitContact('Test_name', $mail, 'Test_subject', 'test_id', 'Test_message');
$this
->assertText('Your message has been sent.');
// Verify that only 1 message has been sent (by default, the "Send a copy
// to yourself" option is disabled.
$captured_emails = $this
->drupalGetMails();
$this
->assertTrue(count($captured_emails) === 1);
// Login as admin.
$this
->drupalLogin($this->adminUser);
// Verify that the global setting stating whether e-mails should be sent in
// HTML format is false by default.
$this
->assertFalse(\Drupal::config('contact_storage.settings')
->get('send_html'));
// Verify that this first e-mail was sent in plain text format.
$captured_emails = $this
->drupalGetMails();
$this
->assertTrue(strpos($captured_emails[0]['headers']['Content-Type'], 'text/plain') !== FALSE);
// Go to the settings form and enable sending messages in HTML format.
$this
->drupalGet('/admin/structure/contact/settings');
$enable_html = [
'send_html' => TRUE,
];
$this
->drupalPostForm(NULL, $enable_html, t('Save configuration'));
// Check that the form POST was successful.
$this
->assertText('The configuration options have been saved.');
// Check that the global setting is properly updated.
$this
->assertTrue(\Drupal::config('contact_storage.settings')
->get('send_html'));
$display_fields = [
"The sender's name",
"The sender's email",
"Subject",
];
// Check that the page title is correct.
$this
->drupalGet('contact/test_id');
$this
->assertTrue(!empty($this
->cssSelect('h1:contains(test_label)')));
$this
->assertTitle('test_label | Drupal');
// Check that the configuration edit page title is correct.
$this
->drupalGet('admin/structure/contact/manage/test_id');
$this
->assertTrue(!empty($this
->cssSelect('h1:contains(test_label)')));
$this
->assertTitle('Edit test_label | Drupal');
// Check that name, subject and mail are configurable on display.
$this
->drupalGet('admin/structure/contact/manage/test_id/display');
foreach ($display_fields as $label) {
$this
->assertText($label);
}
// Check that preview is configurable on form display.
$this
->drupalGet('admin/structure/contact/manage/test_id/form-display');
$this
->assertText('Preview');
// Check the message list overview.
$this
->drupalGet('admin/structure/contact/messages');
$rows = $this
->xpath('//tbody/tr');
// Make sure only 1 message is available.
$this
->assertEqual(count($rows), 1);
// Some fields should be present.
$this
->assertText('Test_subject');
$this
->assertText('Test_name');
$this
->assertText('test_label');
// Click the view link and make sure name, subject and email are displayed
// by default.
$this
->clickLink(t('View'));
foreach ($display_fields as $label) {
$this
->assertText($label);
}
// Make sure the stored message is correct.
$this
->drupalGet('admin/structure/contact/messages');
$this
->clickLink(t('Edit'));
$this
->assertFieldById('edit-name', 'Test_name');
$this
->assertFieldById('edit-mail', $mail);
$this
->assertFieldById('edit-subject-0-value', 'Test_subject');
$this
->assertFieldById('edit-message-0-value', 'Test_message');
// Submit should redirect back to listing.
$this
->drupalPostForm(NULL, [], t('Save'));
$this
->assertUrl('admin/structure/contact/messages');
// Delete the message.
$this
->clickLink(t('Delete'));
$this
->drupalPostForm(NULL, NULL, t('Delete'));
$this
->assertRaw(t('The @entity-type %label has been deleted.', [
// See \Drupal\Core\Entity\EntityDeleteFormTrait::getDeletionMessage().
'@entity-type' => 'contact message',
'%label' => 'Test_subject',
]));
// Make sure no messages are available.
$this
->assertText('There is no Contact message yet.');
// Fill the "Submit button text" field and assert the form can still be
// submitted.
$edit = [
'contact_storage_submit_text' => 'Submit the form',
'contact_storage_preview' => FALSE,
];
$this
->drupalPostForm('admin/structure/contact/manage/test_id', $edit, t('Save'));
$edit = [
'subject[0][value]' => 'Test subject',
'message[0][value]' => 'Test message',
];
$this
->drupalGet('contact');
$element = $this
->cssSelect('#edit-preview');
// Preview button is hidden.
$this
->assertTrue(empty($element));
$this
->drupalPostForm(NULL, $edit, t('Submit the form'));
$this
->assertText('Your message has been sent.');
// Add an Options email item field to the form.
$settings = [
'settings[allowed_values]' => "test_key1|test_label1|simpletest1@example.com\ntest_key2|test_label2|simpletest2@example.com",
];
$this
->fieldUIAddNewField('admin/structure/contact/manage/test_id', 'category', 'Category', 'contact_storage_options_email', $settings);
// Verify that the new field shows up correctly on the form.
$this
->drupalGet('contact');
$this
->assertText('Category');
$this
->assertOption('edit-field-category', '_none');
$this
->assertOption('edit-field-category', 'test_key1');
$this
->assertOption('edit-field-category', 'test_key2');
// Send a message using the Options email item field and enable the "Send a
// copy to yourself" option.
$captured_emails = $this
->drupalGetMails();
$emails_count_before = count($captured_emails);
$edit = [
'subject[0][value]' => 'Test subject',
'message[0][value]' => 'Test message',
'field_category' => 'test_key2',
'copy' => 'checked',
];
$this
->drupalPostForm(NULL, $edit, t('Submit the form'));
$this
->assertText('Your message has been sent.');
// Check that 2 messages were sent and that the body of the last
// message contains the added message.
$captured_emails = $this
->drupalGetMails();
$emails_count_after = count($captured_emails);
$this
->assertTrue($emails_count_after === $emails_count_before + 2);
$this
->assertMailString('body', 'test_key2', 2);
// The last message is the one sent as a copy, the one before it is the
// original. Check that the original contains the added recipients and that
// the copied one is only sent to the sender.
$logged_in_user_email = $this->loggedInUser
->getEmail();
$this
->assertTrue($captured_emails[$emails_count_after - 2]['to'] == "{$mail},simpletest2@example.com");
$this
->assertTrue($captured_emails[$emails_count_after - 1]['to'] == $logged_in_user_email);
// Test clone functionality - add field to existing form.
$this
->fieldUIAddNewField('admin/structure/contact/manage/test_id', 'text_field', 'Text field', 'text');
// Then clone it.
$this
->drupalGet('admin/structure/contact/manage/test_id/clone');
$this
->drupalPostForm(NULL, [
'id' => 'test_id_2',
'label' => 'Cloned',
], t('Clone'));
$edit = [
'subject[0][value]' => 'Test subject',
'message[0][value]' => 'Test message',
];
// The added field should be on the cloned form too.
$edit['field_text_field[0][value]'] = 'Some text';
$this
->drupalGet('contact/test_id_2');
$this
->drupalPostForm(NULL, $edit, t('Submit the form'));
$form = ContactForm::load('test_id_2');
$this
->assertNotEmpty($form
->uuid());
// Try changing the options email label, field default value and setting it
// to required.
$this
->drupalGet('/admin/structure/contact/manage/test_id/fields');
$this
->clickLink('Edit');
$this
->drupalPostForm(NULL, [
'label' => 'Category-2',
'required' => TRUE,
'default_value_input[field_category]' => 'test_key1',
], t('Save settings'));
// Verify that the changes are visible into the contact form.
$this
->drupalGet('contact');
$this
->assertText('Category-2');
$this
->assertOption('edit-field-category', 'test_key1');
$this
->assertOption('edit-field-category', 'test_key2');
$this
->assertNotEmpty($this
->xpath('//select[@id="edit-field-category" and @required="required"]//option[@value="test_key1" and @selected="selected"]'));
// Verify that the 'View messages' link exists for the 2 forms and that it
// links to the correct view.
$this
->drupalGet('/admin/structure/contact');
$this
->assertLinkByHref('/admin/structure/contact/messages?form=test_id');
$this
->assertLinkByHref('/admin/structure/contact/messages?form=test_id_2');
// Create a new contact form and assert that the disable link exists for
// each forms.
$this
->addContactForm('test_disable_id', 'test_disable_label', 'simpletest@example.com', FALSE);
$this
->drupalGet('/admin/structure/contact');
$contact_form_count = count(ContactForm::loadMultiple());
$this
->assertEqual(count($this
->cssSelect('li.disable a:contains(Disable)')), $contact_form_count);
// Disable the form and assert that there is 1 less "Disable" button and 1
// "Enable" button.
$this
->drupalPostForm('/admin/structure/contact/manage/test_disable_id/disable', NULL, t('Disable'));
$this
->assertText('Disabled contact form test_disable_label.');
$this
->drupalGet('/admin/structure/contact');
$this
->assertEqual(count($this
->cssSelect('li.disable a:contains(Disable)')), $contact_form_count - 1);
$this
->assertEqual(count($this
->cssSelect('li.enable a:contains(Enable)')), 1);
// Assert that the disabled form has no input or text area and the message.
$this
->drupalGet('contact/test_disable_id');
$this
->assertEqual(count($this
->cssSelect('input')), 0);
$this
->assertEqual(count($this
->cssSelect('textarea')), 0);
$this
->assertText('This contact form has been disabled.');
// Try to re-enable the form and assert that it can be accessed.
$this
->drupalPostForm('/admin/structure/contact/manage/test_disable_id/enable', NULL, t('Enable'));
$this
->assertText('Enabled contact form test_disable_label.');
$this
->drupalGet('contact/test_disable_id');
$this
->assertNoText('This contact form has been disabled.');
// Create a new contact form with a custom disabled message, disable it and
// assert that the message displayed is correct.
$this
->addContactForm('test_disable_id_2', 'test_disable_label_2', 'simpletest@example.com', FALSE, [
'contact_storage_disabled_form_message' => 'custom disabled message',
]);
$this
->drupalPostForm('/admin/structure/contact/manage/test_disable_id_2/disable', NULL, t('Disable'));
$this
->assertText('Disabled contact form test_disable_label_2.');
$this
->drupalGet('contact/test_disable_id_2');
$this
->assertText('custom disabled message');
}