X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;f=web%2Fmodules%2Fcontrib%2Fmetatag%2Fsrc%2FTests%2FMetatagStringTest.php;fp=web%2Fmodules%2Fcontrib%2Fmetatag%2Fsrc%2FTests%2FMetatagStringTest.php;h=9c5beb9d21d2608f79641dcfc0d8b3fcf4759258;hb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;hp=0000000000000000000000000000000000000000;hpb=57c063afa3f66b07c4bbddc2d6129a96d90f0aad;p=yaffs-website diff --git a/web/modules/contrib/metatag/src/Tests/MetatagStringTest.php b/web/modules/contrib/metatag/src/Tests/MetatagStringTest.php new file mode 100644 index 000000000..9c5beb9d2 --- /dev/null +++ b/web/modules/contrib/metatag/src/Tests/MetatagStringTest.php @@ -0,0 +1,311 @@ +adminUser = $this->drupalCreateUser($this->permissions); + $this->drupalLogin($this->adminUser); + + $this->drupalCreateContentType(['type' => 'page', 'display_submitted' => FALSE]); + + // Add a Metatag field to the content type. + $this->drupalGet("admin/structure/types"); + $this->drupalGet("admin/structure/types/manage/page/fields/add-field"); + $this->assertResponse(200); + $edit = [ + 'label' => 'Metatag', + 'field_name' => 'metatag_field', + 'new_storage_type' => 'metatag', + ]; + $this->drupalPostForm(NULL, $edit, t('Save and continue')); + $this->drupalPostForm(NULL, [], t('Save field settings')); + $this->container->get('entity.manager')->clearCachedFieldDefinitions(); + } + + /** + * Tests that a meta tag with single quote is not double escaped. + */ + function testSingleQuote() { + $this->_testAString("bla'bleblu"); + } + + /** + * Tests that a meta tag with a double quote is not double escaped. + */ + function testDoubleQuote() { + $this->_testAString('bla"bleblu'); + } + + /** + * Tests that a meta tag with an ampersand is not double escaped. + */ + function testAmpersand() { + $this->_testAString("blable&blu"); + } + + /** + * Tests that specific strings are not double escaped. + */ + function _testAString($string) { + $this->_testConfig($string); + $this->_testNode($string); + $this->_testEncodedField($string); + } + + /** + * Tests that a specific config string is not double encoded. + */ + function _testConfig($string) { + // The original strings. + $title_original = 'Title: ' . $string; + $desc_original = 'Description: ' . $string; + + // The strings after they're encoded, but quotes will not be encoded. + $title_encoded = htmlentities($title_original, ENT_QUOTES); + $desc_encoded = htmlentities($desc_original, ENT_QUOTES); + + // The strings double-encoded, to make sure the tags aren't broken. + $title_encodeded = htmlentities($title_encoded, ENT_QUOTES); + $desc_encodeded = htmlentities($desc_encoded, ENT_QUOTES); + + // Update the Global defaults and test them. + $values = [ + 'title' => $title_original, + 'description' => $desc_original, + ]; + $this->drupalPostForm('admin/config/search/metatag/front', $values, 'Save'); + $this->assertResponse(200); + + $metatag_defaults = \Drupal::config('metatag.metatag_defaults.front'); + $default_title = $metatag_defaults->get('tags')['title']; + $default_description = $metatag_defaults->get('tags')['description']; + + // Make sure the title tag is stored correctly. + $this->assertEqual($title_original, $default_title, 'The title tag was stored in its original format.'); + $this->assertNotEqual($title_encoded, $default_title, 'The title tag was not stored in an encoded format.'); + $this->assertNotEqual($title_encodeded, $default_title, 'The title tag was not stored in a double-encoded format.'); + + // Make sure the description tag is stored correctly. + $this->assertEqual($desc_original, $default_description, 'The description tag was stored in its original format.'); + $this->assertNotEqual($desc_encoded, $default_description, 'The description tag was not stored in an encoded format.'); + $this->assertNotEqual($desc_encodeded, $default_description, 'The description tag was not stored in a double-encoded format.'); + + // Set up a node without explicit metatag description. This causes the + // global default to be used, which contains a token (node:summary). The + // token value should be correctly translated. + + // Create a node. + $this->drupalGet("node/add/page"); + $edit = [ + 'title[0][value]' => $title_original, + 'body[0][value]' => $desc_original, + ]; + $this->drupalPostForm("node/add/page", $edit, t('Save and publish')); + + $this->config('system.site')->set('page.front', '/node/1')->save(); + + // Load the front page. + $this->drupalGet(''); + $this->assertResponse(200); + + // Again, with xpath the HTML entities will be parsed automagically. + $xpath_title = (string) current($this->xpath("//title")); + $this->assertEqual($xpath_title, $title_original); + $this->assertNotEqual($xpath_title, $title_encoded); + $this->assertNotEqual($xpath_title, $title_encodeded); + + // The page title should be HTML encoded; have to do this check manually + // because assertRaw() checks the raw HTML, not the parsed strings like + // xpath does. + $this->assertRaw('' . $title_encoded . '', 'Confirmed the node title tag is available in its encoded format.'); + $this->assertNoRaw('' . $title_original . '', 'Confirmed the node title tag is not available in its original format.'); + $this->assertNoRaw('' . $title_encodeded . '', 'Confirmed the node title tag is not double-double-encoded?'); + + // Again, with xpath the HTML entities will be parsed automagically. + $xpath = $this->xpath("//meta[@name='description']"); + $this->assertEqual($xpath[0]['content'], $desc_original); + $this->assertNotEqual($xpath[0]['content'], $desc_encoded); + $this->assertNotEqual($xpath[0]['content'], $desc_encodeded); + } + + /** + * Tests that a specific node string is not double escaped. + */ + function _testNode($string) { + // The original strings. + $title_original = 'Title: ' . $string; + $desc_original = 'Description: ' . $string; + + // The strings after they're encoded, but quotes will not be encoded. + $title_encoded = htmlentities($title_original, ENT_QUOTES); + $desc_encoded = htmlentities($desc_original, ENT_QUOTES); + + // The strings double-encoded, to make sure the tags aren't broken. + $title_encodeded = htmlentities($title_encoded, ENT_QUOTES); + $desc_encodeded = htmlentities($desc_encoded, ENT_QUOTES); + + // Update the Global defaults and test them. + $this->drupalGet('admin/config/search/metatag/global'); + $this->assertResponse(200); + $values = [ + 'title' => $title_original, + 'description' => $desc_original, + ]; + $this->drupalPostForm(NULL, $values, t('Save')); + $this->assertResponse(200); + + // Set up a node without explicit metatag description. This causes the + // global default to be used, which contains a token (node:summary). The + // token value should be correctly translated. + + // Create a node. + $this->drupalGet('node/add/page'); + $this->assertResponse(200); + $edit = [ + 'title[0][value]' => $title_original, + 'body[0][value]' => $desc_original, + ]; + $this->drupalPostForm(NULL, $edit, t('Save and publish')); + $this->assertResponse(200); + + // Load the node page. + $this->drupalGet('node/1'); + $this->assertResponse(200); + + // Again, with xpath the HTML entities will be parsed automagically. + $xpath_title = (string) current($this->xpath("//title")); + $this->assertEqual($xpath_title, $title_original); + $this->assertNotEqual($xpath_title, $title_encoded); + $this->assertNotEqual($xpath_title, $title_encodeded); + + // The page title should be HTML encoded; have to do this check manually + // because assertRaw() checks the raw HTML, not the parsed strings like + // xpath does. + $this->assertRaw('' . $title_encoded . '', 'Confirmed the node title tag is encoded.'); + // Again, with xpath the HTML entities will be parsed automagically. + $xpath = $this->xpath("//meta[@name='description']"); + $value = (string) $xpath[0]['content']; + $this->assertEqual($value, $desc_original); + $this->assertNotEqual($value, $desc_encoded); + $this->assertNotEqual($value, $desc_encodeded); + + // Normal meta tags should be encoded properly. + $this->assertRaw('"' . $desc_encoded . '"', 'Confirmed the node "description" meta tag string was encoded properly.'); + // Normal meta tags with HTML entities should be displayed in their original + // format. + $this->assertNoRaw('"' . $desc_original . '"', 'Confirmed the node "description" meta tag string does not show in its original form.'); + // Normal meta tags should not be double-encoded. + $this->assertNoRaw('"' . $desc_encodeded . '"', 'Confirmed the node "description" meta tag string was not double-encoded.'); + } + + /** + * Tests that fields with encoded HTML entities will not be double-encoded. + */ + function _testEncodedField($string) { + // The original strings. + $title_original = 'Title: ' . $string; + $desc_original = 'Description: ' . $string; + + // The strings after they're encoded, but quotes will not be encoded. + $desc_encoded = htmlentities($desc_original, ENT_QUOTES); + + // The strings double-encoded, to make sure the tags aren't broken. + $desc_encodeded = htmlentities($desc_encoded, ENT_QUOTES); + + // Update the Global defaults and test them. + $this->drupalGet('admin/config/search/metatag/global'); + $this->assertResponse(200); + $values = [ + 'title' => $title_original, + 'description' => $desc_original, + ]; + $this->drupalPostForm(NULL, $values, t('Save')); + $this->assertResponse(200); + + // Set up a node without explicit metatag description. This causes the + // global default to be used, which contains a token (node:summary). The + // token value should be correctly translated. + + // Create a node. + $this->drupalGet('node/add/page'); + $this->assertResponse(200); + $edit = [ + 'title[0][value]' => $title_original, + 'body[0][value]' => $desc_original, + ]; + $this->drupalPostForm(NULL, $edit, t('Save and publish')); + $this->assertResponse(200); + + // Load the node page. + $this->drupalGet('node/1'); + $this->assertResponse(200); + + // With xpath the HTML entities will be parsed automagically. + $xpath = $this->xpath("//meta[@name='description']"); + $value = (string) $xpath[0]['content']; + $this->assertEqual($value, $desc_original); + $this->assertNotEqual($value, $desc_encoded); + $this->assertNotEqual($value, $desc_encodeded); + + // Normal meta tags should be encoded properly. + $this->assertRaw('"' . $desc_encoded . '"', 'Confirmed the node "description" meta tag string was encoded properly.'); + + // Normal meta tags with HTML entities should be displayed in their original + // format. + $this->assertNoRaw('"' . $desc_original . '"', 'Confirmed the node "description" meta tag string does not show in its original form.'); + + // Normal meta tags should not be double-encoded. + $this->assertNoRaw('"' . $desc_encodeded . '"', 'Confirmed the node "description" meta tag string was not double-encoded.'); + } + +} +