CaiWuXiTong/tests/Unit/EcommerceFinance/SupplierManagementSyncScheduleTest.php

55 lines
2.8 KiB
PHP

<?php
namespace Tests\Unit\EcommerceFinance;
use App\Console\Commands\SyncBusinessMirrors;
use Illuminate\Support\Carbon;
use Mockery;
use Modules\EcommerceFinance\Repositories\GenericBusinessMirrorRepository;
use Modules\EcommerceFinance\Services\BusinessMirrorDatasetRegistry;
use Modules\EcommerceFinance\Repositories\SupplierManagementMirrorRepository;
use Tests\TestCase;
class SupplierManagementSyncScheduleTest extends TestCase
{
public function test_supplier_datasets_have_explicit_shared_row_store_policies(): void
{
$policies = config('business_data.datasets');
foreach ([SupplierManagementMirrorRepository::DATASET, ...array_values(SupplierManagementMirrorRepository::RELATED)] as $key) {
$this->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();
}
}
}