404 lines
11 KiB
PHP
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)
|
|
];
|
|
}
|
|
}
|