|
4 | 4 |
|
5 | 5 | namespace KaririCode\Serializer\Tests\Integration; |
6 | 6 |
|
| 7 | +use KaririCode\Serializer\Core\SerializerEngine; |
| 8 | +use KaririCode\Serializer\Encoder\CsvEncoder; |
| 9 | +use KaririCode\Serializer\Encoder\JsonEncoder; |
| 10 | +use KaririCode\Serializer\Encoder\QueryStringEncoder; |
| 11 | +use KaririCode\Serializer\Encoder\XmlEncoder; |
7 | 12 | use KaririCode\Serializer\Provider\SerializerServiceProvider; |
| 13 | +use PHPUnit\Framework\Attributes\CoversClass; |
| 14 | +use PHPUnit\Framework\Attributes\Test; |
8 | 15 | use PHPUnit\Framework\TestCase; |
9 | 16 |
|
| 17 | +#[CoversClass(JsonEncoder::class)] |
| 18 | +#[CoversClass(XmlEncoder::class)] |
| 19 | +#[CoversClass(CsvEncoder::class)] |
| 20 | +#[CoversClass(QueryStringEncoder::class)] |
| 21 | +#[CoversClass(SerializerEngine::class)] |
10 | 22 | final class FullPipelineTest extends TestCase |
11 | 23 | { |
12 | | - public function testAllFormatsRoundtrip(): void |
| 24 | + private SerializerEngine $engine; |
| 25 | + |
| 26 | + protected function setUp(): void |
13 | 27 | { |
14 | | - $engine = new SerializerServiceProvider()->createEngine(); |
| 28 | + $this->engine = new SerializerServiceProvider()->createEngine(); |
| 29 | + } |
15 | 30 |
|
16 | | - // JSON |
17 | | - $json = $engine->serialize(['x' => 'hello'], 'json'); |
18 | | - $this->assertSame(['x' => 'hello'], $engine->deserialize($json->getPayload(), 'json')); |
| 31 | + #[Test] |
| 32 | + public function testAllFormatsRoundtrip(): void |
| 33 | + { |
| 34 | + // JSON full roundtrip |
| 35 | + $json = $this->engine->serialize(['x' => 'hello'], 'json'); |
| 36 | + $this->assertSame(['x' => 'hello'], $this->engine->deserialize($json->getPayload(), 'json')); |
19 | 37 |
|
20 | | - // XML |
21 | | - $xml = $engine->serialize(['x' => 'hello'], 'xml'); |
22 | | - $this->assertSame(['x' => 'hello'], $engine->deserialize($xml->getPayload(), 'xml')); |
| 38 | + // XML full roundtrip |
| 39 | + $xml = $this->engine->serialize(['x' => 'hello'], 'xml'); |
| 40 | + $this->assertSame(['x' => 'hello'], $this->engine->deserialize($xml->getPayload(), 'xml')); |
23 | 41 |
|
24 | | - // Query String |
25 | | - $qs = $engine->serialize(['x' => 'hello'], 'query_string'); |
26 | | - $this->assertSame(['x' => 'hello'], $engine->deserialize($qs->getPayload(), 'query_string')); |
| 42 | + // Query String full roundtrip |
| 43 | + $qs = $this->engine->serialize(['x' => 'hello'], 'query_string'); |
| 44 | + $this->assertSame(['x' => 'hello'], $this->engine->deserialize($qs->getPayload(), 'query_string')); |
27 | 45 | } |
28 | 46 |
|
| 47 | + #[Test] |
29 | 48 | public function testCsvRoundtrip(): void |
30 | 49 | { |
31 | | - $engine = new SerializerServiceProvider()->createEngine(); |
32 | 50 | $data = [['id' => '1', 'name' => 'A'], ['id' => '2', 'name' => 'B']]; |
33 | 51 |
|
34 | | - $csv = $engine->serialize($data, 'csv'); |
35 | | - $decoded = $engine->deserialize($csv->getPayload(), 'csv'); |
| 52 | + $csv = $this->engine->serialize($data, 'csv'); |
| 53 | + $decoded = $this->engine->deserialize($csv->getPayload(), 'csv'); |
36 | 54 |
|
37 | 55 | $this->assertCount(2, $decoded); |
38 | 56 | $this->assertSame('A', $decoded[0]['name']); |
39 | 57 | } |
| 58 | + |
| 59 | + #[Test] |
| 60 | + public function testJsonEncodeAndDecodeComplexData(): void |
| 61 | + { |
| 62 | + // Exercises JsonEncoder::encode + decode with nested data, pretty-print |
| 63 | + $data = [ |
| 64 | + 'name' => 'Walmir', |
| 65 | + 'nested' => ['key' => 'value'], |
| 66 | + 'list' => [1, 2, 3], |
| 67 | + 'flag' => true, |
| 68 | + 'nothing' => null, |
| 69 | + ]; |
| 70 | + |
| 71 | + $result = $this->engine->serialize($data, 'json'); |
| 72 | + $this->assertJson($result->getPayload()); |
| 73 | + |
| 74 | + $decoded = $this->engine->deserialize($result->getPayload(), 'json'); |
| 75 | + $this->assertSame($data, $decoded); |
| 76 | + } |
| 77 | + |
| 78 | + #[Test] |
| 79 | + public function testXmlEncodeNestedData(): void |
| 80 | + { |
| 81 | + // Exercises XmlEncoder::arrayToXml with nested arrays (covers recursive arrayToXml path) |
| 82 | + $data = ['person' => ['name' => 'Walmir', 'city' => 'Juazeiro']]; |
| 83 | + $result = $this->engine->serialize($data, 'xml'); |
| 84 | + $this->assertStringContainsString('<person>', $result->getPayload()); |
| 85 | + |
| 86 | + $decoded = $this->engine->deserialize($result->getPayload(), 'xml'); |
| 87 | + $this->assertSame('Walmir', $decoded['person']['name']); |
| 88 | + } |
| 89 | + |
| 90 | + #[Test] |
| 91 | + public function testXmlDecodeRepeatedKeys(): void |
| 92 | + { |
| 93 | + // Exercises xmlToArray repeated-key branch |
| 94 | + $xml = '<?xml version="1.0" encoding="UTF-8"?><root><item>a</item><item>b</item></root>'; |
| 95 | + $decoded = $this->engine->deserialize($xml, 'xml'); |
| 96 | + $this->assertIsArray($decoded['item']); |
| 97 | + $this->assertContains('a', $decoded['item']); |
| 98 | + $this->assertContains('b', $decoded['item']); |
| 99 | + } |
| 100 | + |
| 101 | + #[Test] |
| 102 | + public function testCsvWithCustomSeparator(): void |
| 103 | + { |
| 104 | + // Exercises CsvEncoder::str() helper for both separator and enclosure params |
| 105 | + $data = [['name' => 'Alice', 'role' => 'admin']]; |
| 106 | + $result = $this->engine->serialize($data, 'csv', ['separator' => ';']); |
| 107 | + $this->assertStringContainsString('name;role', $result->getPayload()); |
| 108 | + |
| 109 | + $decoded = $this->engine->deserialize($result->getPayload(), 'csv', ['separator' => ';']); |
| 110 | + $this->assertSame('Alice', $decoded[0]['name']); |
| 111 | + } |
| 112 | + |
| 113 | + #[Test] |
| 114 | + public function testSerializerEngineDeserializeWithParameters(): void |
| 115 | + { |
| 116 | + // Explicitly tests SerializerEngine::deserialize $parameters branch (if $parameters !== []) |
| 117 | + $csv = "name,age\nBob,40\n"; |
| 118 | + $decoded = $this->engine->deserialize($csv, 'csv', ['separator' => ',']); |
| 119 | + $this->assertSame('Bob', $decoded[0]['name']); |
| 120 | + } |
40 | 121 | } |
0 commit comments