--- /dev/null
+<?php
+
+namespace Drupal\Tests\field\Functional\Email;
+
+use Drupal\entity_test\Entity\EntityTest;
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\Tests\BrowserTestBase;
+
+/**
+ * Tests email field functionality.
+ *
+ * @group field
+ */
+class EmailFieldTest extends BrowserTestBase {
+
+ /**
+ * Modules to enable.
+ *
+ * @var array
+ */
+ public static $modules = ['node', 'entity_test', 'field_ui'];
+
+ /**
+ * A field storage to use in this test class.
+ *
+ * @var \Drupal\field\Entity\FieldStorageConfig
+ */
+ protected $fieldStorage;
+
+ /**
+ * The field used in this test class.
+ *
+ * @var \Drupal\field\Entity\FieldConfig
+ */
+ protected $field;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->drupalLogin($this->drupalCreateUser([
+ 'view test entity',
+ 'administer entity_test content',
+ 'administer content types',
+ ]));
+ }
+
+ /**
+ * Tests email field.
+ */
+ public function testEmailField() {
+ // Create a field with settings to validate.
+ $field_name = mb_strtolower($this->randomMachineName());
+ $this->fieldStorage = FieldStorageConfig::create([
+ 'field_name' => $field_name,
+ 'entity_type' => 'entity_test',
+ 'type' => 'email',
+ ]);
+ $this->fieldStorage->save();
+ $this->field = FieldConfig::create([
+ 'field_storage' => $this->fieldStorage,
+ 'bundle' => 'entity_test',
+ ]);
+ $this->field->save();
+
+ // Create a form display for the default form mode.
+ entity_get_form_display('entity_test', 'entity_test', 'default')
+ ->setComponent($field_name, [
+ 'type' => 'email_default',
+ 'settings' => [
+ 'placeholder' => 'example@example.com',
+ ],
+ ])
+ ->save();
+ // Create a display for the full view mode.
+ entity_get_display('entity_test', 'entity_test', 'full')
+ ->setComponent($field_name, [
+ 'type' => 'email_mailto',
+ ])
+ ->save();
+
+ // Display creation form.
+ $this->drupalGet('entity_test/add');
+ $this->assertFieldByName("{$field_name}[0][value]", '', 'Widget found.');
+ $this->assertRaw('placeholder="example@example.com"');
+
+ // Submit a valid email address and ensure it is accepted.
+ $value = 'test@example.com';
+ $edit = [
+ "{$field_name}[0][value]" => $value,
+ ];
+ $this->drupalPostForm(NULL, $edit, t('Save'));
+ preg_match('|entity_test/manage/(\d+)|', $this->getUrl(), $match);
+ $id = $match[1];
+ $this->assertText(t('entity_test @id has been created.', ['@id' => $id]));
+ $this->assertRaw($value);
+
+ // Verify that a mailto link is displayed.
+ $entity = EntityTest::load($id);
+ $display = entity_get_display($entity->getEntityTypeId(), $entity->bundle(), 'full');
+ $content = $display->build($entity);
+ $rendered_content = (string) \Drupal::service('renderer')->renderRoot($content);
+ $this->assertContains('href="mailto:test@example.com"', $rendered_content);
+ }
+
+}