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'], ]; } }