assertInstanceOf( EnrichmentInterface::class, new Enrichment($this->getRepositories()) ); } public function testEnrichmentJsonObjectWithArraysInside(): void { $payload = [ "data" => [ [ 'user_id' => 1, 'content' => 'Post by user 1' ], [ 'user_id' => 2, 'content' => 'Post by user 2' ], ] ]; $items = new ItemsBag(); $items->push(new Item('data.*.user_id', 'user')); $target = new Target('user', 'id'); $requests = new Requests(); $requests->append(new Request($items, $target)); $enrichment = new Enrichment($this->getRepositories()); $enriched = $enrichment->enrich($payload, $requests); $this->assertSame( [ 'user_id' => 1, 'content' => 'Post by user 1', 'user' => [ 'id' => 1, 'name' => 'Blank.1', ], ], $enriched['data'][0] ); $this->assertSame( [ 'user_id' => 2, 'content' => 'Post by user 2', 'user' => [ 'id' => 2, 'name' => 'Blank.2', ], ], $enriched['data'][1] ); } public function testEnrichmentJsonObject(): void { $payload = [ 'user_id' => 1, 'content' => 'Post by user 1' ]; $items = new ItemsBag(); $items->push(new Item('user_id', 'user')); $target = new Target('user', 'id'); $requests = new Requests(); $requests->append(new Request($items, $target)); $enrichment = new Enrichment($this->getRepositories()); $enriched = $enrichment->enrich($payload, $requests); $this->assertSame( [ 'user_id' => 1, 'content' => 'Post by user 1', 'user' => [ 'id' => 1, 'name' => 'Blank.1', ], ], $enriched ); } public function testEnrichArrayItemsUsingProperlyRequest(): void { $posts = [ [ 'user_id' => 1, 'content' => 'Post by user 1' ], [ 'user_id' => 2, 'content' => 'Post by user 2' ], [ 'user_id' => 3, 'content' => 'Post by user 3' ], ]; $items = new ItemsBag(); $items->push(new Item('*.user_id', 'user')); $target = new Target('user', 'id'); $requests = new Requests(); $requests->append(new Request($items, $target)); $enrichment = new Enrichment($this->getRepositories()); $enriched = $enrichment->enrich($posts, $requests); $this->assertSame( [ 'user_id' => 1, 'content' => 'Post by user 1', 'user' => [ 'id' => 1, 'name' => 'Blank.1', ], ], $enriched[0] ); $this->assertSame( [ 'user_id' => 2, 'content' => 'Post by user 2', 'user' => [ 'id' => 2, 'name' => 'Blank.2', ], ], $enriched[1] ); $this->assertSame( [ 'user_id' => 3, 'content' => 'Post by user 3', 'user' => [ 'id' => 3, 'name' => 'Blank.3', ], ], $enriched[2] ); } public function tesEnrichArrayItemsWithoutExistingTargets(): void { $posts = [ [ 'user_id' => 10, 'content' => 'Post by user 10' ], [ 'user_id' => 20, 'content' => 'Post by user 20' ], ]; $items = new ItemsBag(); $items->push(new Item('*.user_id', 'user')); $target = new Target('user', 'id'); $requests = new Requests(); $requests->append(new Request($items, $target)); $enrichment = new Enrichment($this->getRepositories()); $enriched = $enrichment->enrich($posts, $requests); $this->assertSame( [ 'user_id' => 10, 'content' => 'Post by user 10', 'user' => null, ], $enriched[0] ); $this->assertSame( [ 'user_id' => 20, 'content' => 'Post by user 20', 'user' => null, ], $enriched[1] ); } public function testEnrichArrayUsingNotWildcardKey(): void { $posts = [ [ 'user_id' => 1, 'content' => 'Post by user 1' ], ]; $items = new ItemsBag(); $items->push( new Item('data.invalid_path', 'user') ); $target = new Target('user', 'id'); $requests = new Requests(); $requests->append(new Request($items, $target)); $enrichment = new Enrichment($this->getRepositories()); $enriched = $enrichment->enrich($posts, $requests); $this->assertSame( [ [ 'user_id' => 1, 'content' => 'Post by user 1', ], 'data' => [ 'user' => null ] ], $enriched ); } public function testEnrichNestedArrayItems(): void { $categoriesGroups = [ [ [ 'category_id' => 1, 'name' => 'Category 1', 'creator_id' => 1 ], [ 'category_id' => 2, 'name' => 'Category 2', 'creator_id' => 3 ], ] ]; $items = new ItemsBag(); $items->push(new Item('*.*.creator_id', 'creator')); $target = new Target('user', 'id'); $requests = new Requests(); $requests->append(new Request($items, $target)); $enrichment = new Enrichment($this->getRepositories()); $enriched = $enrichment->enrich($categoriesGroups, $requests); $this->assertSame( [ [ [ 'category_id' => 1, 'name' => 'Category 1', 'creator_id' => 1, 'creator' => [ 'id' => 1, 'name' => 'Blank.1', ], ], [ 'category_id' => 2, 'name' => 'Category 2', 'creator_id' => 3, 'creator' => [ 'id' => 3, 'name' => 'Blank.3', ], ], ] ], $enriched ); } public function testProperlyWorkingWithRepositoriesReturnNonArrayAccessObject(): void { $posts = [ [ 'user_id' => 1, 'content' => 'Post by user 1' ], ]; $items = new ItemsBag(); $items->push(new Item('*.user_id', 'user')); $target = new Target('user', 'id'); $requests = new Requests(); $requests->append(new Request($items, $target)); $enrichment = new Enrichment($this->getRepositories(true)); $enriched = $enrichment->enrich($posts, $requests); $this->assertSame( [ 'user_id' => 1, 'content' => 'Post by user 1', 'user' => [ 'id' => 1, 'name' => 'Blank.1', ], ], $enriched[0] ); } private function getRepositories(bool $repoUsingGenerator = false): Repositories { return new Repositories([ 'user' => $repoUsingGenerator ? new EnrichmentTestUserRepositoryUsingGenerator() : new EnrichmentTestUserRepository() ]); } } class EnrichmentTestUserRepository implements Repository { public function getByFieldValues(string $field, array $values): iterable { return array_filter( [ $this->getBlankWithId(1), $this->getBlankWithId(2), $this->getBlankWithId(3), ], fn ($item) => in_array($item[$field], $values, true) ); } private function getBlankWithId(int $id): array { return [ 'id' => $id, 'name' => sprintf('Blank.%d', $id) ]; } } class EnrichmentTestUserRepositoryUsingGenerator implements Repository { public function getByFieldValues(string $field, array $values): iterable { $items = [ $this->getBlankWithId(1), $this->getBlankWithId(2), $this->getBlankWithId(3), ]; foreach ($items as $item) { if (in_array($item[$field], $values, true)) { yield $item; } } } private function getBlankWithId(int $id): array { return [ 'id' => $id, 'name' => sprintf('Blank.%d', $id) ]; } }