You are here

public function JsonapiMenuItemsTest::testJsonapiMenuItemsResource in JSON:API Menu Items 1.1.x

Same name and namespace in other branches
  1. 1.2.x tests/src/Functional/JsonapiMenuItemsTest.php \Drupal\Tests\jsonapi_menu_items\Functional\JsonapiMenuItemsTest::testJsonapiMenuItemsResource()
  2. 1.0.x tests/src/Functional/JsonapiMenuItemsTest.php \Drupal\Tests\jsonapi_menu_items\Functional\JsonapiMenuItemsTest::testJsonapiMenuItemsResource()

Tests the JSON:API Menu Items resource.

File

tests/src/Functional/JsonapiMenuItemsTest.php, line 38

Class

JsonapiMenuItemsTest
Tests JSON:API Menu Items functionality.

Namespace

Drupal\Tests\jsonapi_menu_items\Functional

Code

public function testJsonapiMenuItemsResource() {
  $link_title = $this
    ->randomMachineName();
  $content_link = MenuLinkContent::create([
    'link' => [
      'uri' => 'route:menu_test.menu_callback_title',
    ],
    'langcode' => 'en',
    'enabled' => 1,
    'title' => $link_title,
    'menu_name' => 'jsonapi_menu_items_test',
    'parent' => 'jsonapi_menu_test.open',
    'weight' => 0,
  ]);
  $content_link
    ->save();
  $request_options = [];
  $request_options[RequestOptions::HEADERS]['Accept'] = 'application/vnd.api+json';
  $url = Url::fromRoute('jsonapi_menu_items.menu', [
    'menu' => 'jsonapi_menu_items_test',
  ]);
  $response = $this
    ->request('GET', $url, $request_options);
  $this
    ->assertSame(200, $response
    ->getStatusCode());
  $content = Json::decode($response
    ->getBody());

  // There are 5 items in this menu - 4 from
  // jsonapi_menu_items_test.links.menu.yml and the content item created
  // above. One of the four in that file is disabled and should be filtered
  // out, another is not accesible to the current users. This leaves a total
  // of 3 items in the response.
  $this
    ->assertCount(3, $content['data']);
  $expected_items = Json::decode(strtr(file_get_contents(dirname(__DIR__, 2) . '/fixtures/expected-items.json'), [
    '%uuid' => $content_link
      ->uuid(),
    '%title' => $link_title,
    '%base_path' => Url::fromRoute('<front>')
      ->toString(),
  ]));
  $this
    ->assertSame($expected_items['data'], $content['data']);

  // Assert response is cached with appropriate cacheability metadata such
  // that re-saving the link with a new title yields the new title in a
  // subsequent request.
  $new_title = $this
    ->randomMachineName();
  $content_link->title = $new_title;
  $content_link
    ->save();
  $response = $this
    ->request('GET', $url, $request_options);
  $this
    ->assertSame(200, $response
    ->getStatusCode());
  $content = Json::decode($response
    ->getBody());
  $match = array_filter($content['data'], function (array $item) use ($content_link) {
    return $item['id'] === 'menu_link_content:' . $content_link
      ->uuid();
  });
  $this
    ->assertEqual($new_title, reset($match)['attributes']['title']);

  // Add another link and ensue cacheability metadata ensures the new item
  // appears in a subsequent request.
  $content_link2 = MenuLinkContent::create([
    'link' => [
      'uri' => 'route:menu_test.menu_callback_title',
    ],
    'langcode' => 'en',
    'enabled' => 1,
    'title' => $link_title,
    'menu_name' => 'jsonapi_menu_items_test',
    'parent' => 'jsonapi_menu_test.open',
    'weight' => 0,
  ]);
  $content_link2
    ->save();
  $response = $this
    ->request('GET', $url, $request_options);
  $this
    ->assertSame(200, $response
    ->getStatusCode());
  $content = Json::decode($response
    ->getBody());
  $this
    ->assertCount(4, $content['data']);
}