Files
DataEnrichmentKit/tests/Service/EnrichmentTest.php
2025-11-27 02:10:03 +04:00

404 lines
11 KiB
PHP

<?php
declare(strict_types=1);
namespace Diffhead\PHP\DataEnrichmentKit\Tests\Service;
use Diffhead\PHP\DataEnrichmentKit\Interface\Enrichment as EnrichmentInterface;
use Diffhead\PHP\DataEnrichmentKit\Interface\Repository;
use Diffhead\PHP\DataEnrichmentKit\Object\Item;
use Diffhead\PHP\DataEnrichmentKit\Object\ItemsBag;
use Diffhead\PHP\DataEnrichmentKit\Object\Request;
use Diffhead\PHP\DataEnrichmentKit\Object\Target;
use Diffhead\PHP\DataEnrichmentKit\Service\Enrichment;
use Diffhead\PHP\DataEnrichmentKit\Storage\Repositories;
use Diffhead\PHP\DataEnrichmentKit\Storage\Requests;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\CoversMethod;
use PHPUnit\Framework\TestCase;
#[CoversClass(Enrichment::class)]
#[CoversMethod(Enrichment::class, 'enrich')]
class EnrichmentTest extends TestCase
{
public function testImplementsEnrichmentInterface(): void
{
$this->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)
];
}
}