Skip to content

Commit c5a3b59

Browse files
committed
feat: implement test for merge diffs action
1 parent 4363bc0 commit c5a3b59

File tree

3 files changed

+132
-8
lines changed

3 files changed

+132
-8
lines changed

src/Actions/MergeDiffsAction.php

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,16 @@
1010
class MergeDiffsAction
1111
{
1212
/**
13-
* @param Collection<JsonDiff> $diffs
13+
* @param Collection<JsonDiff> $jsonDiffs
1414
*/
15-
public function execute(Collection $diffs): JsonDiff
15+
public function execute(Collection $jsonDiffs): JsonDiff
1616
{
17-
/** @var JsonDiff $mergedDiff */
18-
$mergedDiff = $diffs->shift();
19-
$diffs
20-
->each(function (JsonDiff $diff) use ($mergedDiff): void {
21-
$mergedDiff->mergeChanges($diff);
17+
$mergedJsonDiff = new JsonDiff([], []);
18+
$jsonDiffs
19+
->each(function (JsonDiff $jsonDiff) use ($mergedJsonDiff): void {
20+
$mergedJsonDiff->mergeChanges($jsonDiff);
2221
});
2322

24-
return $mergedDiff;
23+
return $mergedJsonDiff;
2524
}
2625
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Jet\Tests\Factories;
6+
7+
use Illuminate\Support\Collection;
8+
use Jet\JsonDiff\JsonDiff;
9+
10+
class JsonDiffFactory
11+
{
12+
/**
13+
* @var bool
14+
*/
15+
protected $createListArray = false;
16+
17+
/**
18+
* @var array
19+
*/
20+
protected $original;
21+
22+
/**
23+
* @var array
24+
*/
25+
protected $new;
26+
27+
public static function new(): self
28+
{
29+
return new self();
30+
}
31+
32+
public function create(?array $original = null, ?array $new = null): JsonDiff
33+
{
34+
if ($this->createListArray) {
35+
$arrayFactory = ListArrayFactory::new();
36+
} else {
37+
$arrayFactory = AssociativeArrayFactory::new();
38+
}
39+
40+
return new JsonDiff(
41+
$original ?? $this->original ?? $arrayFactory->create(),
42+
$new ?? $this->new ?? $arrayFactory->create()
43+
);
44+
}
45+
46+
/**
47+
* @return Collection<JsonDiff>
48+
*/
49+
public function createMany(int $count): Collection
50+
{
51+
$jsonDiffs = collect([]);
52+
53+
for ($i = 0; $i < $count; $i++) {
54+
$jsonDiffs->push($this->create());
55+
}
56+
57+
return $jsonDiffs;
58+
}
59+
60+
public function withOriginal(array $original): self
61+
{
62+
$clone = clone $this;
63+
$clone->original = $original;
64+
65+
return $clone;
66+
}
67+
68+
public function withNew(array $new): self
69+
{
70+
$clone = clone $this;
71+
$clone->new = $new;
72+
73+
return $clone;
74+
}
75+
76+
public function forAssociativeArray(): self
77+
{
78+
$clone = clone $this;
79+
$this->createListArray = false;
80+
81+
return $clone;
82+
}
83+
84+
public function forListArray(): self
85+
{
86+
$clone = clone $this;
87+
$this->createListArray = true;
88+
89+
return $clone;
90+
}
91+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Jet\Tests\Unit\Actions;
6+
7+
use Illuminate\Container\Container;
8+
use Jet\JsonDiff\Actions\MergeDiffsAction;
9+
use Jet\JsonDiff\JsonDiff;
10+
use Jet\Tests\Factories\JsonDiffFactory;
11+
use PHPUnit\Framework\TestCase;
12+
13+
class MergeDiffsActionTest extends TestCase
14+
{
15+
public function test_it_merges_all_json_diffs_into_one_json_diff(): void
16+
{
17+
$jsonDiffs = JsonDiffFactory::new()->createMany(2);
18+
19+
/** @var JsonDiff $firstJsonDiff */
20+
$firstJsonDiff = $jsonDiffs->first();
21+
/** @var JsonDiff $secondJsonDiff */
22+
$secondJsonDiff = $jsonDiffs->skip(1)->first();
23+
24+
/** @var MergeDiffsAction $action */
25+
$action = Container::getInstance()->make(MergeDiffsAction::class);
26+
27+
$mergedJsonDiff = $action->execute($jsonDiffs);
28+
29+
$this->assertSame(
30+
$firstJsonDiff->getNumberOfChanges() + $secondJsonDiff->getNumberOfChanges(),
31+
$mergedJsonDiff->getNumberOfChanges()
32+
);
33+
}
34+
}

0 commit comments

Comments
 (0)