diff --git a/core/modules/jsonapi/tests/src/Unit/JsonApiResource/LinkTest.php b/core/modules/jsonapi/tests/src/Unit/JsonApiResource/LinkTest.php index fb5a075550bb55e62ccc1e6fe71010ecf763405b..6c5916bb4d2e07cf1dec3b245af9eacda48fc131 100644 --- a/core/modules/jsonapi/tests/src/Unit/JsonApiResource/LinkTest.php +++ b/core/modules/jsonapi/tests/src/Unit/JsonApiResource/LinkTest.php @@ -24,66 +24,68 @@ class LinkTest extends UnitTestCase { * @covers ::compare * @dataProvider linkComparisonProvider */ - public function testLinkComparison(Link $a, Link $b, $expected) { - $actual = Link::compare($a, $b); + public function testLinkComparison(array $a, array $b, bool $expected): void { + $this->mockUrlAssembler(); + + $link_a = new Link(new CacheableMetadata(), Url::fromUri($a[0]), $a[1], $a[2] ?? []); + $link_b = new Link(new CacheableMetadata(), Url::fromUri($b[0]), $b[1], $b[2] ?? []); + + $actual = Link::compare($link_a, $link_b); $this->assertSame($expected, $actual === 0); } /** * Provides test data for link comparison. */ - public function linkComparisonProvider() { - $this->mockUrlAssembler(); - return [ - 'same href and same link relation type' => [ - new Link(new CacheableMetadata(), Url::fromUri('https://jsonapi.org/foo'), 'self'), - new Link(new CacheableMetadata(), Url::fromUri('https://jsonapi.org/foo'), 'self'), - TRUE, - ], - 'different href and same link relation type' => [ - new Link(new CacheableMetadata(), Url::fromUri('https://jsonapi.org/foo'), 'self'), - new Link(new CacheableMetadata(), Url::fromUri('https://jsonapi.org/bar'), 'self'), - FALSE, - ], - 'same href and different link relation type' => [ - new Link(new CacheableMetadata(), Url::fromUri('https://jsonapi.org/foo'), 'self'), - new Link(new CacheableMetadata(), Url::fromUri('https://jsonapi.org/foo'), 'related'), - FALSE, - ], - 'same href and same link relation type and empty target attributes' => [ - new Link(new CacheableMetadata(), Url::fromUri('https://jsonapi.org/foo'), 'self', []), - new Link(new CacheableMetadata(), Url::fromUri('https://jsonapi.org/foo'), 'self', []), - TRUE, - ], - 'same href and same link relation type and same target attributes' => [ - new Link(new CacheableMetadata(), Url::fromUri('https://jsonapi.org/foo'), 'self', ['anchor' => 'https://jsonapi.org']), - new Link(new CacheableMetadata(), Url::fromUri('https://jsonapi.org/foo'), 'self', ['anchor' => 'https://jsonapi.org']), - TRUE, - ], - // These links are not considered equivalent because it would while the - // `href` remains the same, the anchor changes the context of the link. - 'same href and same link relation type and different target attributes' => [ - new Link(new CacheableMetadata(), Url::fromUri('https://jsonapi.org/boy'), 'self', ['title' => 'sue']), - new Link(new CacheableMetadata(), Url::fromUri('https://jsonapi.org/boy'), 'self', ['anchor' => '/sob', 'title' => 'pa']), - FALSE, - ], - 'same href and same link relation type and same nested target attributes' => [ - new Link(new CacheableMetadata(), Url::fromUri('https://jsonapi.org/foo'), 'self', ['data' => ['foo' => 'bar']]), - new Link(new CacheableMetadata(), Url::fromUri('https://jsonapi.org/foo'), 'self', ['data' => ['foo' => 'bar']]), - TRUE, - ], - 'same href and same link relation type and different nested target attributes' => [ - new Link(new CacheableMetadata(), Url::fromUri('https://jsonapi.org/foo'), 'self', ['data' => ['foo' => 'bar']]), - new Link(new CacheableMetadata(), Url::fromUri('https://jsonapi.org/foo'), 'self', ['data' => ['foo' => 'baz']]), - FALSE, - ], - // These links are not considered equivalent because it would be unclear - // which title corresponds to which link relation type. - 'same href and different link relation types and different target attributes' => [ - new Link(new CacheableMetadata(), Url::fromUri('https://jsonapi.org/boy'), 'self', ['title' => 'A boy named Sue']), - new Link(new CacheableMetadata(), Url::fromUri('https://jsonapi.org/boy'), 'edit', ['title' => 'Change name to Bill or George']), - FALSE, - ], + public static function linkComparisonProvider(): \Generator { + yield 'same href and same link relation type' => [ + ['https://jsonapi.org/foo', 'self'], + ['https://jsonapi.org/foo', 'self'], + TRUE, + ]; + yield 'different href and same link relation type' => [ + ['https://jsonapi.org/foo', 'self'], + ['https://jsonapi.org/bar', 'self'], + FALSE, + ]; + yield 'same href and different link relation type' => [ + ['https://jsonapi.org/foo', 'self'], + ['https://jsonapi.org/foo', 'related'], + FALSE, + ]; + yield 'same href and same link relation type and empty target attributes' => [ + ['https://jsonapi.org/foo', 'self', []], + ['https://jsonapi.org/foo', 'self', []], + TRUE, + ]; + yield 'same href and same link relation type and same target attributes' => [ + ['https://jsonapi.org/foo', 'self', ['anchor' => 'https://jsonapi.org']], + ['https://jsonapi.org/foo', 'self', ['anchor' => 'https://jsonapi.org']], + TRUE, + ]; + // These links are not considered equivalent because it would while the + // `href` remains the same, the anchor changes the context of the link. + yield 'same href and same link relation type and different target attributes' => [ + ['https://jsonapi.org/boy', 'self', ['title' => 'sue']], + ['https://jsonapi.org/boy', 'self', ['anchor' => '/sob', 'title' => 'pa']], + FALSE, + ]; + yield 'same href and same link relation type and same nested target attributes' => [ + ['https://jsonapi.org/foo', 'self', ['data' => ['foo' => 'bar']]], + ['https://jsonapi.org/foo', 'self', ['data' => ['foo' => 'bar']]], + TRUE, + ]; + yield 'same href and same link relation type and different nested target attributes' => [ + ['https://jsonapi.org/foo', 'self', ['data' => ['foo' => 'bar']]], + ['https://jsonapi.org/foo', 'self', ['data' => ['foo' => 'baz']]], + FALSE, + ]; + // These links are not considered equivalent because it would be unclear + // which title corresponds to which link relation type. + yield 'same href and different link relation types and different target attributes' => [ + ['https://jsonapi.org/boy', 'self', ['title' => 'A boy named Sue']], + ['https://jsonapi.org/boy', 'edit', ['title' => 'Change name to Bill or George']], + FALSE, ]; } @@ -91,32 +93,29 @@ public function linkComparisonProvider() { * @covers ::merge * @dataProvider linkMergeProvider */ - public function testLinkMerge(Link $a, Link $b, $expected) { - if ($expected instanceof Link) { - $this->assertSame($expected->getCacheTags(), Link::merge($a, $b)->getCacheTags()); - } - else { - $this->expectExceptionObject($expected); - Link::merge($a, $b); - } + public function testLinkMerge(array $a, array $b, array $expected): void { + $this->mockUrlAssembler(); + + $link_a = new Link((new CacheableMetadata())->addCacheTags($a[0]), Url::fromUri($a[1]), $a[2]); + $link_b = new Link((new CacheableMetadata())->addCacheTags($b[0]), Url::fromUri($b[1]), $b[2]); + $link_expected = new Link((new CacheableMetadata())->addCacheTags($expected[0]), Url::fromUri($expected[1]), $expected[2]); + + $this->assertSame($link_expected->getCacheTags(), Link::merge($link_a, $link_b)->getCacheTags()); } /** * Provides test data for link merging. */ - public function linkMergeProvider() { - $this->mockUrlAssembler(); - return [ - 'same everything' => [ - new Link((new CacheableMetadata())->addCacheTags(['foo']), Url::fromUri('https://jsonapi.org/foo'), 'self'), - new Link((new CacheableMetadata())->addCacheTags(['foo']), Url::fromUri('https://jsonapi.org/foo'), 'self'), - new Link((new CacheableMetadata())->addCacheTags(['foo']), Url::fromUri('https://jsonapi.org/foo'), 'self'), - ], - 'different cache tags' => [ - new Link((new CacheableMetadata())->addCacheTags(['foo']), Url::fromUri('https://jsonapi.org/foo'), 'self'), - new Link((new CacheableMetadata())->addCacheTags(['bar']), Url::fromUri('https://jsonapi.org/foo'), 'self'), - new Link((new CacheableMetadata())->addCacheTags(['foo', 'bar']), Url::fromUri('https://jsonapi.org/foo'), 'self'), - ], + public static function linkMergeProvider(): \Generator { + yield 'same everything' => [ + [['foo'], 'https://jsonapi.org/foo', 'self'], + [['foo'], 'https://jsonapi.org/foo', 'self'], + [['foo'], 'https://jsonapi.org/foo', 'self'], + ]; + yield 'different cache tags' => [ + [['foo'], 'https://jsonapi.org/foo', 'self'], + [['bar'], 'https://jsonapi.org/foo', 'self'], + [['foo', 'bar'], 'https://jsonapi.org/foo', 'self'], ]; }