assertArrayHasKey($key, $policies); $this->assertSame('mariadb', $policies[$key]['target_store']); $this->assertStringStartsWith('供应商管理', $policies[$key]['consumer']); } } public function test_supplier_reconciliation_refreshes_old_rows_and_resumes_partial_full_runs_only_when_opted_in(): void { Carbon::setTestNow('2026-10-11 12:00:00'); try { $registry = new BusinessMirrorDatasetRegistry(); $dataset = $registry->get(SupplierManagementMirrorRepository::DATASET); $datasets = Mockery::mock(BusinessMirrorDatasetRegistry::class)->makePartial(); $datasets->shouldReceive('all')->andReturn([$dataset->key() => $dataset]); $datasets->shouldReceive('scheduled')->andReturnTrue(); $mirror = Mockery::mock(GenericBusinessMirrorRepository::class); $command = app(SyncBusinessMirrors::class); $command->setInput(new \Symfony\Component\Console\Input\ArrayInput([], $command->getDefinition())); $method = new \ReflectionMethod($command, 'scheduledKeys'); $state = ['initial_completed_at' => '2026-10-10 12:00:00', 'status' => 'succeeded', 'last_full_succeeded_at' => '2026-10-11 10:30:00']; $mirror->shouldReceive('state')->andReturnUsing(function () use (&$state) { return $state; }); $this->assertTrue($method->invoke($command, $datasets, $mirror)[0]['full']); $state['last_full_succeeded_at'] = '2026-10-11 11:30:00'; $this->assertFalse($method->invoke($command, $datasets, $mirror)[0]['full']); $state['status'] = 'running'; $state['run_mode'] = 'full'; $this->assertTrue($method->invoke($command, $datasets, $mirror)[0]['full']); $definitions = config('upstream_mirrors.datasets'); $definitions[$dataset->key()]['full_reconcile_hours'] = 0; config(['upstream_mirrors.datasets' => $definitions]); $this->assertFalse($method->invoke($command, $datasets, $mirror)[0]['full']); } finally { Carbon::setTestNow(); } } }