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' => '',
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' => '',
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: }