Version 1.0.0

This commit is contained in:
diffhead
2025-11-16 01:51:25 +04:00
committed by Viktor Smagin
commit 8cb7f400fd
43 changed files with 4462 additions and 0 deletions

View 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)
];
}
}

View 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('');
}
}

View 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);
}
}