119 lines
4.1 KiB
PHP
119 lines
4.1 KiB
PHP
<?php
|
|
|
|
namespace Tests\Unit\EcommerceFinance;
|
|
|
|
use App\Business\UpstreamBusinessInformation;
|
|
use Closure;
|
|
use Mockery;
|
|
use Modules\EcommerceFinance\Repositories\BusinessInformationMirrorRepository;
|
|
use Modules\EcommerceFinance\Services\UpstreamQueryCache;
|
|
use Modules\EcommerceFinance\Services\UpstreamQueryCacheFactory;
|
|
use Tests\TestCase;
|
|
|
|
class UpstreamBusinessInformationTest extends TestCase
|
|
{
|
|
/**
|
|
* @dataProvider businessInformationPages
|
|
*/
|
|
public function test_local_direct_page_resolver_passes_pagination_to_its_fixed_snapshot(
|
|
string $section,
|
|
string $page,
|
|
string $scope,
|
|
): void {
|
|
$cache = new class extends UpstreamQueryCache {
|
|
public array $calls = [];
|
|
|
|
public function __construct()
|
|
{
|
|
}
|
|
|
|
public function remember(string $scope, array $parameters, Closure $resolver): mixed
|
|
{
|
|
$this->calls[] = compact('scope', 'parameters');
|
|
|
|
return $resolver();
|
|
}
|
|
};
|
|
|
|
$caches = new class($cache) extends UpstreamQueryCacheFactory {
|
|
public function __construct(private readonly UpstreamQueryCache $cache)
|
|
{
|
|
}
|
|
|
|
public function forSource(string $source): UpstreamQueryCache
|
|
{
|
|
return $this->cache;
|
|
}
|
|
};
|
|
|
|
$mirror = Mockery::mock(BusinessInformationMirrorRepository::class);
|
|
$mirror->shouldReceive('ready')->once()->with($scope)->andReturnFalse();
|
|
|
|
$information = new class($caches, $mirror) extends UpstreamBusinessInformation {
|
|
public array $snapshots = [];
|
|
|
|
public function snapshot(string $scope, array $parameters): array
|
|
{
|
|
$this->snapshots[] = compact('scope', 'parameters');
|
|
|
|
return ['data' => [], 'total' => 0];
|
|
}
|
|
};
|
|
|
|
$this->app['request']->merge(['page' => 3]);
|
|
|
|
$paginator = $information->paginate($section, $page, 25);
|
|
$expected = ['scope' => $scope, 'parameters' => ['page' => 3, 'perPage' => 25]];
|
|
|
|
$this->assertSame(3, $paginator->currentPage());
|
|
$this->assertSame($expected, $cache->calls[0]);
|
|
$this->assertSame($expected, $information->snapshots[0]);
|
|
}
|
|
|
|
/**
|
|
* @dataProvider businessInformationPages
|
|
*/
|
|
public function test_ready_business_mirror_is_used_without_registering_a_page_snapshot(
|
|
string $section,
|
|
string $page,
|
|
string $scope,
|
|
): void {
|
|
$cache = new class extends UpstreamQueryCache {
|
|
public function __construct() {}
|
|
|
|
public function remember(string $scope, array $parameters, Closure $resolver): mixed
|
|
{
|
|
throw new \RuntimeException('镜像就绪后不应再读取分页快照。');
|
|
}
|
|
};
|
|
$caches = new class($cache) extends UpstreamQueryCacheFactory {
|
|
public function __construct(private readonly UpstreamQueryCache $cache) {}
|
|
|
|
public function forSource(string $source): UpstreamQueryCache { return $this->cache; }
|
|
};
|
|
$mirror = Mockery::mock(BusinessInformationMirrorRepository::class);
|
|
$mirror->shouldReceive('ready')->once()->with($scope)->andReturnTrue();
|
|
$mirror->shouldReceive('paginate')->once()->with($scope, 2, 25)->andReturn([
|
|
'data' => [['id' => 10]],
|
|
'total' => 51,
|
|
]);
|
|
|
|
$this->app['request']->merge(['page' => 2]);
|
|
$paginator = (new UpstreamBusinessInformation($caches, $mirror))
|
|
->paginate($section, $page, 25);
|
|
|
|
$this->assertSame(2, $paginator->currentPage());
|
|
$this->assertSame(51, $paginator->total());
|
|
$this->assertSame(10, $paginator->items()[0]->id);
|
|
}
|
|
|
|
public static function businessInformationPages(): array
|
|
{
|
|
return [
|
|
'company' => ['company-management', 'basic-information', 'company-information.read'],
|
|
'store' => ['store-management', 'basic-information', 'store-information.read'],
|
|
'trademark' => ['trademark-management', 'information', 'trademark-information.read'],
|
|
];
|
|
}
|
|
}
|