Chris@0: installConfig(['filter', 'node']); Chris@0: Chris@0: $node_type = NodeType::create(['type' => 'article', 'name' => 'Article']); Chris@0: $node_type->save(); Chris@0: node_add_body_field($node_type); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Creates a node, then tests the tokens generated from it. Chris@0: */ Chris@0: public function testNodeTokenReplacement() { Chris@0: $url_options = [ Chris@0: 'absolute' => TRUE, Chris@0: 'language' => $this->interfaceLanguage, Chris@0: ]; Chris@0: Chris@0: // Create a user and a node. Chris@0: $account = $this->createUser(); Chris@0: /* @var $node \Drupal\node\NodeInterface */ Chris@0: $node = Node::create([ Chris@0: 'type' => 'article', Chris@0: 'tnid' => 0, Chris@0: 'uid' => $account->id(), Chris@0: 'title' => 'Blinking Text', Chris@0: 'body' => [['value' => 'Regular NODE body for the test.', 'summary' => 'Fancy NODE summary.', 'format' => 'plain_text']], Chris@0: ]); Chris@0: $node->save(); Chris@0: Chris@0: // Generate and test tokens. Chris@0: $tests = []; Chris@0: $tests['[node:nid]'] = $node->id(); Chris@0: $tests['[node:vid]'] = $node->getRevisionId(); Chris@0: $tests['[node:type]'] = 'article'; Chris@0: $tests['[node:type-name]'] = 'Article'; Chris@0: $tests['[node:title]'] = Html::escape($node->getTitle()); Chris@0: $tests['[node:body]'] = $node->body->processed; Chris@0: $tests['[node:summary]'] = $node->body->summary_processed; Chris@0: $tests['[node:langcode]'] = $node->language()->getId(); Chris@18: $tests['[node:url]'] = $node->toUrl('canonical', $url_options)->toString(); Chris@18: $tests['[node:edit-url]'] = $node->toUrl('edit-form', $url_options)->toString(); Chris@18: $tests['[node:author]'] = $account->getAccountName(); Chris@0: $tests['[node:author:uid]'] = $node->getOwnerId(); Chris@18: $tests['[node:author:name]'] = $account->getAccountName(); Chris@18: /** @var \Drupal\Core\Datetime\DateFormatterInterface $date_formatter */ Chris@18: $date_formatter = $this->container->get('date.formatter'); Chris@18: $tests['[node:created:since]'] = $date_formatter->formatTimeDiffSince($node->getCreatedTime(), ['langcode' => $this->interfaceLanguage->getId()]); Chris@18: $tests['[node:changed:since]'] = $date_formatter->formatTimeDiffSince($node->getChangedTime(), ['langcode' => $this->interfaceLanguage->getId()]); Chris@0: Chris@0: $base_bubbleable_metadata = BubbleableMetadata::createFromObject($node); Chris@0: Chris@0: $metadata_tests = []; Chris@0: $metadata_tests['[node:nid]'] = $base_bubbleable_metadata; Chris@0: $metadata_tests['[node:vid]'] = $base_bubbleable_metadata; Chris@0: $metadata_tests['[node:type]'] = $base_bubbleable_metadata; Chris@0: $metadata_tests['[node:type-name]'] = $base_bubbleable_metadata; Chris@0: $metadata_tests['[node:title]'] = $base_bubbleable_metadata; Chris@0: $metadata_tests['[node:body]'] = $base_bubbleable_metadata; Chris@0: $metadata_tests['[node:summary]'] = $base_bubbleable_metadata; Chris@0: $metadata_tests['[node:langcode]'] = $base_bubbleable_metadata; Chris@0: $metadata_tests['[node:url]'] = $base_bubbleable_metadata; Chris@0: $metadata_tests['[node:edit-url]'] = $base_bubbleable_metadata; Chris@0: $bubbleable_metadata = clone $base_bubbleable_metadata; Chris@0: $metadata_tests['[node:author]'] = $bubbleable_metadata->addCacheTags(['user:1']); Chris@0: $metadata_tests['[node:author:uid]'] = $bubbleable_metadata; Chris@0: $metadata_tests['[node:author:name]'] = $bubbleable_metadata; Chris@0: $bubbleable_metadata = clone $base_bubbleable_metadata; Chris@0: $metadata_tests['[node:created:since]'] = $bubbleable_metadata->setCacheMaxAge(0); Chris@0: $metadata_tests['[node:changed:since]'] = $bubbleable_metadata; Chris@0: Chris@0: // Test to make sure that we generated something for each token. Chris@0: $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.'); Chris@0: Chris@0: foreach ($tests as $input => $expected) { Chris@0: $bubbleable_metadata = new BubbleableMetadata(); Chris@0: $output = $this->tokenService->replace($input, ['node' => $node], ['langcode' => $this->interfaceLanguage->getId()], $bubbleable_metadata); Chris@0: $this->assertEqual($output, $expected, format_string('Node token %token replaced.', ['%token' => $input])); Chris@0: $this->assertEqual($bubbleable_metadata, $metadata_tests[$input]); Chris@0: } Chris@0: Chris@0: // Repeat for a node without a summary. Chris@0: $node = Node::create([ Chris@0: 'type' => 'article', Chris@0: 'uid' => $account->id(), Chris@0: 'title' => 'Blinking Text', Chris@0: 'body' => [['value' => 'A string that looks random like TR5c2I', 'format' => 'plain_text']], Chris@0: ]); Chris@0: $node->save(); Chris@0: Chris@0: // Generate and test token - use full body as expected value. Chris@0: $tests = []; Chris@0: $tests['[node:summary]'] = $node->body->processed; Chris@0: Chris@0: // Test to make sure that we generated something for each token. Chris@0: $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated for node without a summary.'); Chris@0: Chris@0: foreach ($tests as $input => $expected) { Chris@0: $output = $this->tokenService->replace($input, ['node' => $node], ['language' => $this->interfaceLanguage]); Chris@0: $this->assertEqual($output, $expected, new FormattableMarkup('Node token %token replaced for node without a summary.', ['%token' => $input])); Chris@0: } Chris@0: } Chris@0: Chris@0: }