From 2bafa3b5bf208d4291987b68dcb0f28129f607cc Mon Sep 17 00:00:00 2001
From: Daniel Karso <daniel@netbuffer.com>
Date: Fri, 18 May 2018 17:37:22 +0200
Subject: [PATCH] [CORE] #GEN Fix PHP warning.

---
 core/lib/Drupal/Core/Render/Element/Email.php | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/core/lib/Drupal/Core/Render/Element/Email.php b/core/lib/Drupal/Core/Render/Element/Email.php
index dce2a344c4..96bf0b31f1 100644
--- a/core/lib/Drupal/Core/Render/Element/Email.php
+++ b/core/lib/Drupal/Core/Render/Element/Email.php
@@ -70,7 +70,13 @@ public function getInfo() {
    * Note that #maxlength and #required is validated by _form_validate() already.
    */
   public static function validateEmail(&$element, FormStateInterface $form_state, &$complete_form) {
-    $value = trim($element['#value']);
+    $value = $element['#value'];
+    if (!is_string($value)) {
+      $form_state->setError($element, t('The email address is not valid.'));
+      return;
+    }
+
+    $value = trim($value);
     $form_state->setValueForElement($element, $value);
 
     if ($value !== '' && !\Drupal::service('email.validator')->isValid($value)) {
-- 
2.16.2

From 2f526ede73f9dae602029e216a061ab3d2af941f Mon Sep 17 00:00:00 2001
From: Daniel Karso <daniel@netbuffer.com>
Date: Tue, 22 May 2018 13:12:36 +0200
Subject: [PATCH] [CORE] #GEN Add Email render element unit test.

---
 .../Drupal/Tests/Core/Render/Element/EmailTest.php | 73 ++++++++++++++++++++++
 1 file changed, 73 insertions(+)
 create mode 100644 core/tests/Drupal/Tests/Core/Render/Element/EmailTest.php

diff --git a/core/tests/Drupal/Tests/Core/Render/Element/EmailTest.php b/core/tests/Drupal/Tests/Core/Render/Element/EmailTest.php
new file mode 100644
index 0000000000..34aeca941b
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/Render/Element/EmailTest.php
@@ -0,0 +1,73 @@
+<?php
+
+namespace Drupal\Tests\Core\Render\Element;
+
+use Drupal\Core\Form\FormState;
+use Drupal\Core\Render\Element\Email;
+use Drupal\Tests\UnitTestCase;
+use Egulias\EmailValidator\EmailValidatorInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * @coversDefaultClass \Drupal\Core\Render\Element\Email
+ * @group RenderEmailTest
+ */
+class EmailTest extends UnitTestCase {
+
+  /**
+   * @covers ::validateEmail
+   *
+   * @dataProvider providerTestValidateEmail
+   */
+  public function testValidateEmail($input, $expected, $expected_error_count) {
+    $element = [];
+    $form_state = new FormState();
+    $complete_form = [];
+    $element_object = new Email([], 'email', []);
+    $info = $element_object->getInfo();
+    $element += $info;
+    $element['#value'] = $input;
+    $element['#parents'] = [];
+    $email_validator = $this->prophesize(EmailValidatorInterface::class);
+    $email_validator->isValid($input)->willReturn($expected);
+    $container = $this->prophesize(ContainerInterface::class);
+    $container->get('email.validator')->willReturn($email_validator->reveal());
+    \Drupal::setContainer($container->reveal());
+
+    // Test if the form_state error has been set properly.
+    Email::validateEmail($element, $form_state,$complete_form);
+    $errors = $form_state->getErrors();
+    $this->assertEquals($expected_error_count, count($errors));
+  }
+
+  /**
+   * Data provider for testValidateEmail().
+   *
+   * @return array
+   *   The test data set.
+   */
+  public function providerTestValidateEmail() {
+    $data = [];
+    $data[] = ['foo.bar@example.com', TRUE, 0];
+    $data[] = ['miauw@', FALSE, 1];
+    $data[] = [['#email'], FALSE, 1];
+
+    return $data;
+  }
+
+  /**
+   * @covers ::preRenderEmail
+   */
+  public function testPreRenderEmail() {
+    $element = [];
+    $element_object = new Email([], 'email', []);
+    $info = $element_object->getInfo();
+    $element += $info;
+    $element = Email::preRenderEmail($element);
+    $this->assertEquals('email', $element['#attributes']['type']);
+    $this->assertEquals(60, $element['#attributes']['size']);
+    $this->assertEquals(254, $element['#attributes']['maxlength']);
+    $this->assertEquals('form-email', $element['#attributes']['class'][0]);
+  }
+
+}
-- 
2.16.2

