X-Git-Url: https://yaffs.net/gitweb/?a=blobdiff_plain;f=web%2Fmodules%2Fcontrib%2Fpathauto%2Fsrc%2FTests%2FPathautoNodeWebTest.php;fp=web%2Fmodules%2Fcontrib%2Fpathauto%2Fsrc%2FTests%2FPathautoNodeWebTest.php;h=95f5eb54c1de932a3bd9be35ebd0322a0fe8541b;hb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;hp=0000000000000000000000000000000000000000;hpb=57c063afa3f66b07c4bbddc2d6129a96d90f0aad;p=yaffs-website diff --git a/web/modules/contrib/pathauto/src/Tests/PathautoNodeWebTest.php b/web/modules/contrib/pathauto/src/Tests/PathautoNodeWebTest.php new file mode 100644 index 000000000..95f5eb54c --- /dev/null +++ b/web/modules/contrib/pathauto/src/Tests/PathautoNodeWebTest.php @@ -0,0 +1,292 @@ +drupalCreateContentType(array('type' => 'page', 'name' => 'Basic page')); + $this->drupalCreateContentType(array('type' => 'article')); + + // Allow other modules to add additional permissions for the admin user. + $permissions = array( + 'administer pathauto', + 'administer url aliases', + 'create url aliases', + 'administer nodes', + 'bypass node access', + 'access content overview', + ); + $this->adminUser = $this->drupalCreateUser($permissions); + $this->drupalLogin($this->adminUser); + + $this->createPattern('node', '/content/[node:title]'); + } + + /** + * Tests editing nodes with different settings. + */ + function testNodeEditing() { + // Ensure that the Pathauto checkbox is checked by default on the node add form. + $this->drupalGet('node/add/page'); + $this->assertFieldChecked('edit-path-0-pathauto'); + + // Create a node by saving the node form. + $title = ' Testing: node title ['; + $automatic_alias = '/content/testing-node-title'; + $this->drupalPostForm(NULL, array('title[0][value]' => $title), t('Save and publish')); + $node = $this->drupalGetNodeByTitle($title); + + // Look for alias generated in the form. + $this->drupalGet("node/{$node->id()}/edit"); + $this->assertFieldChecked('edit-path-0-pathauto'); + $this->assertFieldByName('path[0][alias]', $automatic_alias, 'Generated alias visible in the path alias field.'); + + // Check whether the alias actually works. + $this->drupalGet($automatic_alias); + $this->assertText($title, 'Node accessible through automatic alias.'); + + // Manually set the node's alias. + $manual_alias = '/content/' . $node->id(); + $edit = array( + 'path[0][pathauto]' => FALSE, + 'path[0][alias]' => $manual_alias, + ); + $this->drupalPostForm($node->toUrl('edit-form'), $edit, t('Save and keep published')); + $this->assertText(t('@type @title has been updated.', array('@type' => 'page', '@title' => $title))); + + // Check that the automatic alias checkbox is now unchecked by default. + $this->drupalGet("node/{$node->id()}/edit"); + $this->assertNoFieldChecked('edit-path-0-pathauto'); + $this->assertFieldByName('path[0][alias]', $manual_alias); + + // Submit the node form with the default values. + $this->drupalPostForm(NULL, array('path[0][pathauto]' => FALSE), t('Save and keep published')); + $this->assertText(t('@type @title has been updated.', array('@type' => 'page', '@title' => $title))); + + // Test that the old (automatic) alias has been deleted and only accessible + // through the new (manual) alias. + $this->drupalGet($automatic_alias); + $this->assertResponse(404, 'Node not accessible through automatic alias.'); + $this->drupalGet($manual_alias); + $this->assertText($title, 'Node accessible through manual alias.'); + + // Test that the manual alias is not kept for new nodes when the pathauto + // checkbox is ticked. + $title = 'Automatic Title'; + $edit = array( + 'title[0][value]' => $title, + 'path[0][pathauto]' => TRUE, + 'path[0][alias]' => '/should-not-get-created', + ); + $this->drupalPostForm('node/add/page', $edit, t('Save and publish')); + $this->assertNoAliasExists(array('alias' => 'should-not-get-created')); + $node = $this->drupalGetNodeByTitle($title); + $this->assertEntityAlias($node, '/content/automatic-title'); + + // Remove the pattern for nodes, the pathauto checkbox should not be + // displayed. + $ids = \Drupal::entityQuery('pathauto_pattern') + ->condition('type', 'canonical_entities:node') + ->execute(); + foreach (PathautoPattern::loadMultiple($ids) as $pattern) { + $pattern->delete(); + } + + $this->drupalGet('node/add/article'); + $this->assertNoFieldById('edit-path-0-pathauto'); + $this->assertFieldByName('path[0][alias]', ''); + + $edit = array(); + $edit['title'] = 'My test article'; + $this->drupalCreateNode($edit); + //$this->drupalPostForm(NULL, $edit, t('Save and keep published')); + $node = $this->drupalGetNodeByTitle($edit['title']); + + // Pathauto checkbox should still not exist. + $this->drupalGet($node->toUrl('edit-form')); + $this->assertNoFieldById('edit-path-0-pathauto'); + $this->assertFieldByName('path[0][alias]', ''); + $this->assertNoEntityAlias($node); + } + + /** + * Test node operations. + */ + function testNodeOperations() { + $node1 = $this->drupalCreateNode(array('title' => 'node1')); + $node2 = $this->drupalCreateNode(array('title' => 'node2')); + + // Delete all current URL aliases. + $this->deleteAllAliases(); + + $this->drupalGet('admin/content'); + + // Check which of the two nodes is first. + if (strpos($this->getTextContent(), 'node1') < strpos($this->getTextContent(), 'node2')) { + $index = 0; + } + else { + $index = 1; + } + + $edit = array( + 'action' => 'pathauto_update_alias_node', + 'node_bulk_form[' . $index . ']' => TRUE, + ); + $this->drupalPostForm(NULL, $edit, t('Apply to selected items')); + $this->assertText('Update URL alias was applied to 1 item.'); + + $this->assertEntityAlias($node1, '/content/' . $node1->getTitle()); + $this->assertEntityAlias($node2, '/node/' . $node2->id()); + } + + /** + * @todo Merge this with existing node test methods? + */ + public function testNodeState() { + $nodeNoAliasUser = $this->drupalCreateUser(array('bypass node access')); + $nodeAliasUser = $this->drupalCreateUser(array('bypass node access', 'create url aliases')); + + $node = $this->drupalCreateNode(array( + 'title' => 'Node version one', + 'type' => 'page', + 'path' => array( + 'pathauto' => PathautoState::SKIP, + ), + )); + + $this->assertNoEntityAlias($node); + + // Set a manual path alias for the node. + $node->path->alias = '/test-alias'; + $node->save(); + + // Ensure that the pathauto field was saved to the database. + \Drupal::entityTypeManager()->getStorage('node')->resetCache(); + $node = Node::load($node->id()); + $this->assertIdentical($node->path->pathauto, PathautoState::SKIP); + + // Ensure that the manual path alias was saved and an automatic alias was not generated. + $this->assertEntityAlias($node, '/test-alias'); + $this->assertNoEntityAliasExists($node, '/content/node-version-one'); + + // Save the node as a user who does not have access to path fieldset. + $this->drupalLogin($nodeNoAliasUser); + $this->drupalGet('node/' . $node->id() . '/edit'); + $this->assertNoFieldByName('path[0][pathauto]'); + + $edit = array('title[0][value]' => 'Node version two'); + $this->drupalPostForm(NULL, $edit, 'Save'); + $this->assertText('Basic page Node version two has been updated.'); + + $this->assertEntityAlias($node, '/test-alias'); + $this->assertNoEntityAliasExists($node, '/content/node-version-one'); + $this->assertNoEntityAliasExists($node, '/content/node-version-two'); + + // Load the edit node page and check that the Pathauto checkbox is unchecked. + $this->drupalLogin($nodeAliasUser); + $this->drupalGet('node/' . $node->id() . '/edit'); + $this->assertNoFieldChecked('edit-path-0-pathauto'); + + // Edit the manual alias and save the node. + $edit = array( + 'title[0][value]' => 'Node version three', + 'path[0][alias]' => '/manually-edited-alias', + ); + $this->drupalPostForm(NULL, $edit, 'Save'); + $this->assertText('Basic page Node version three has been updated.'); + + $this->assertEntityAlias($node, '/manually-edited-alias'); + $this->assertNoEntityAliasExists($node, '/test-alias'); + $this->assertNoEntityAliasExists($node, '/content/node-version-one'); + $this->assertNoEntityAliasExists($node, '/content/node-version-two'); + $this->assertNoEntityAliasExists($node, '/content/node-version-three'); + + // Programatically save the node with an automatic alias. + \Drupal::entityTypeManager()->getStorage('node')->resetCache(); + $node = Node::load($node->id()); + $node->path->pathauto = PathautoState::CREATE; + $node->save(); + + // Ensure that the pathauto field was saved to the database. + \Drupal::entityTypeManager()->getStorage('node')->resetCache(); + $node = Node::load($node->id()); + $this->assertIdentical($node->path->pathauto, PathautoState::CREATE); + + $this->assertEntityAlias($node, '/content/node-version-three'); + $this->assertNoEntityAliasExists($node, '/manually-edited-alias'); + $this->assertNoEntityAliasExists($node, '/test-alias'); + $this->assertNoEntityAliasExists($node, '/content/node-version-one'); + $this->assertNoEntityAliasExists($node, '/content/node-version-two'); + + $node->delete(); + $this->assertNull(\Drupal::keyValue('pathauto_state.node')->get($node->id()), 'Pathauto state was deleted'); + } + + + /** + * Tests that nodes without a Pathauto pattern can set custom aliases. + */ + public function testCustomAliasWithoutPattern() { + // First, delete all patterns to be sure that there will be no match. + $entity_ids = \Drupal::entityQuery('pathauto_pattern')->execute(); + $entities = PathautoPattern::loadMultiple($entity_ids); + foreach ($entities as $entity) { + $entity->delete(); + } + + // Next, create a node with a custom alias. + $edit = [ + 'title[0][value]' => 'Sample article', + 'path[0][alias]' => '/sample-article', + ]; + $this->drupalPostForm('node/add/article', $edit, t('Save and publish')); + $this->assertText(t('article Sample article has been created.')); + + // Test the alias. + $this->assertAliasExists(array('alias' => '/sample-article')); + $this->drupalGet('sample-article'); + $this->assertResponse(200, 'A node without a pattern can have a custom alias.'); + + // Now create a node through the API. + $node = Node::create(['type' => 'article', 'title' => 'Sample article API', 'path' => ['alias' => '/sample-article-api']]); + $node->save(); + + // Test the alias. + $this->assertAliasExists(['alias' => '/sample-article-api']); + $this->drupalGet('sample-article-api'); + $this->assertResponse(200); + } + +}