Version 1.0.0
This commit is contained in:
403
tests/Service/EnrichmentTest.php
Normal file
403
tests/Service/EnrichmentTest.php
Normal file
@@ -0,0 +1,403 @@
|
||||
<?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)
|
||||
];
|
||||
}
|
||||
}
|
||||
66
tests/Service/ParserTest.php
Normal file
66
tests/Service/ParserTest.php
Normal file
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Diffhead\PHP\DataEnrichmentKit\Tests\Service;
|
||||
|
||||
use Diffhead\PHP\DataEnrichmentKit\Object\Request;
|
||||
use Diffhead\PHP\DataEnrichmentKit\Service\Parser;
|
||||
use Diffhead\PHP\DataEnrichmentKit\Exception\InvalidRequest;
|
||||
use Diffhead\PHP\DataEnrichmentKit\Interface\Parser as ParserInterface;
|
||||
use PHPUnit\Framework\Attributes\CoversClass;
|
||||
use PHPUnit\Framework\Attributes\CoversMethod;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
#[CoversClass(Parser::class)]
|
||||
#[CoversMethod(Parser::class, 'parse')]
|
||||
class ParserTest extends TestCase
|
||||
{
|
||||
public function testImplementsParserInterface(): void
|
||||
{
|
||||
$this->assertInstanceOf(ParserInterface::class, new Parser());
|
||||
}
|
||||
|
||||
public function testParseValidInput(): void
|
||||
{
|
||||
$parser = new Parser();
|
||||
$input = 'key1+alias1,key2+alias2@entity,field';
|
||||
|
||||
$request = $parser->parse($input);
|
||||
|
||||
$this->assertInstanceOf(Request::class, $request);
|
||||
$this->assertEquals('entity', $request->target()->entity());
|
||||
$this->assertEquals('field', $request->target()->field());
|
||||
|
||||
$items = iterator_to_array($request->items()->getIterator());
|
||||
$this->assertCount(2, $items);
|
||||
$this->assertEquals('key1', $items[0]->key());
|
||||
$this->assertEquals('alias1', $items[0]->alias());
|
||||
$this->assertEquals('key2', $items[1]->key());
|
||||
$this->assertEquals('alias2', $items[1]->alias());
|
||||
}
|
||||
|
||||
public function testParseThrowsExceptionOnEmptyTarget(): void
|
||||
{
|
||||
$this->expectException(InvalidRequest::class);
|
||||
|
||||
$parser = new Parser();
|
||||
$parser->parse('key1+alias1,key2+alias2@');
|
||||
}
|
||||
|
||||
public function testParseThrowsExceptionOnInvalidTarget(): void
|
||||
{
|
||||
$this->expectException(InvalidRequest::class);
|
||||
|
||||
$parser = new Parser();
|
||||
$parser->parse('key1+alias1,key2+alias2@entity');
|
||||
}
|
||||
|
||||
public function testParseThrowsExceptionOnEmptyInput(): void
|
||||
{
|
||||
$this->expectException(InvalidRequest::class);
|
||||
|
||||
$parser = new Parser();
|
||||
$parser->parse('');
|
||||
}
|
||||
}
|
||||
55
tests/Service/SerializerTest.php
Normal file
55
tests/Service/SerializerTest.php
Normal file
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Diffhead\PHP\DataEnrichmentKit\Tests\Service;
|
||||
|
||||
use Diffhead\PHP\DataEnrichmentKit\Interface\Serializer as SerializerInterface;
|
||||
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\Serializer;
|
||||
use PHPUnit\Framework\Attributes\CoversClass;
|
||||
use PHPUnit\Framework\Attributes\CoversMethod;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
#[CoversClass(Serializer::class)]
|
||||
#[CoversMethod(Serializer::class, 'toString')]
|
||||
class SerializerTest extends TestCase
|
||||
{
|
||||
public function testImplementsSerializerInterface(): void
|
||||
{
|
||||
$this->assertInstanceOf(SerializerInterface::class, new Serializer());
|
||||
}
|
||||
|
||||
public function testToString(): void
|
||||
{
|
||||
$itemsBag = new ItemsBag();
|
||||
$itemsBag->push(new Item('key1', 'alias1'));
|
||||
$itemsBag->push(new Item('key2', 'alias2'));
|
||||
|
||||
$target = new Target('entity', 'field');
|
||||
$request = new Request($itemsBag, $target);
|
||||
|
||||
$serializer = new Serializer();
|
||||
$result = $serializer->toString($request);
|
||||
|
||||
$this->assertEquals('key1+alias1,key2+alias2@entity,field', $result);
|
||||
}
|
||||
|
||||
public function testToStringWithEmptyAlias(): void
|
||||
{
|
||||
$itemsBag = new ItemsBag();
|
||||
$itemsBag->push(new Item('key1'));
|
||||
$itemsBag->push(new Item('key2', 'alias2'));
|
||||
|
||||
$target = new Target('entity', 'field');
|
||||
$request = new Request($itemsBag, $target);
|
||||
|
||||
$serializer = new Serializer();
|
||||
$result = $serializer->toString($request);
|
||||
|
||||
$this->assertEquals('key1,key2+alias2@entity,field', $result);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user