95 lines
4.0 KiB
PHP
95 lines
4.0 KiB
PHP
<?php
|
|
|
|
namespace Tests\Unit\EcommerceFinance;
|
|
|
|
use Illuminate\Database\Schema\Blueprint;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Schema;
|
|
use Modules\EcommerceFinance\Services\BusinessDataPlacement;
|
|
use Tests\TestCase;
|
|
|
|
class BusinessDataPlacementTest extends TestCase
|
|
{
|
|
protected function setUp(): void
|
|
{
|
|
parent::setUp();
|
|
config([
|
|
'database.connections.business_mirror' => ['driver' => 'sqlite', 'database' => ':memory:', 'prefix' => ''],
|
|
'upstream_mirrors.connection' => 'business_mirror',
|
|
'upstream_mirrors.datasets' => [
|
|
'source.schema.fact' => ['source_key' => 'source', 'schema' => 'schema', 'object' => 'fact', 'target' => 'fact_rows', 'keys' => ['id']],
|
|
'source.schema.unused' => ['source_key' => 'source', 'schema' => 'schema', 'object' => 'unused', 'target' => 'unused_rows', 'keys' => ['id']],
|
|
],
|
|
'business_data.datasets' => [
|
|
'source.schema.fact' => ['role' => 'fact', 'target_store' => 'clickhouse', 'sync' => 'after_columnar_activation'],
|
|
'source.schema.unused' => ['role' => 'archive_only', 'target_store' => 'parquet', 'sync' => 'disabled'],
|
|
],
|
|
]);
|
|
DB::purge('business_mirror');
|
|
Schema::connection('business_mirror')->create('business_data_placements', function (Blueprint $table): void {
|
|
$table->string('dataset_key')->primary();
|
|
$table->string('target_store');
|
|
$table->string('phase')->default('planned');
|
|
$table->string('active_generation')->nullable();
|
|
$table->timestamps();
|
|
});
|
|
}
|
|
|
|
protected function tearDown(): void
|
|
{
|
|
DB::purge('business_mirror');
|
|
parent::tearDown();
|
|
}
|
|
|
|
public function test_it_stops_unused_data_and_enables_columnar_sync_only_after_activation(): void
|
|
{
|
|
$placement = new BusinessDataPlacement(app('db'));
|
|
|
|
$this->assertFalse($placement->shouldSchedule('source.schema.unused'));
|
|
$this->assertFalse($placement->shouldSchedule('source.schema.fact'));
|
|
|
|
DB::connection('business_mirror')->table('business_data_placements')->insert([
|
|
'dataset_key' => 'source.schema.fact',
|
|
'target_store' => 'clickhouse',
|
|
'phase' => 'active',
|
|
'active_generation' => '11111111-1111-4111-8111-111111111111',
|
|
'created_at' => now(),
|
|
'updated_at' => now(),
|
|
]);
|
|
|
|
$this->assertTrue($placement->shouldSchedule('source.schema.fact'));
|
|
$this->assertTrue($placement->isActive('source.schema.fact', 'clickhouse'));
|
|
}
|
|
|
|
public function test_runtime_registered_dataset_defaults_to_a_mariadb_dimension(): void
|
|
{
|
|
$policy = (new BusinessDataPlacement(app('db')))->policy('database_4.accounts_v1');
|
|
|
|
$this->assertSame('external_dimension', $policy['role']);
|
|
$this->assertSame('mariadb', $policy['target_store']);
|
|
$this->assertSame('always', $policy['sync']);
|
|
}
|
|
|
|
public function test_every_fixed_upstream_dataset_has_exactly_one_storage_policy(): void
|
|
{
|
|
$upstream = require base_path('config/upstream_mirrors.php');
|
|
$businessData = require base_path('config/business_data.php');
|
|
|
|
$this->assertCount(55, $upstream['datasets']);
|
|
$upstreamKeys = array_keys($upstream['datasets']);
|
|
$policyKeys = array_keys($businessData['datasets']);
|
|
sort($upstreamKeys);
|
|
sort($policyKeys);
|
|
$this->assertSame($upstreamKeys, $policyKeys);
|
|
}
|
|
|
|
public function test_original_bills_keep_refreshing_for_the_current_alipay_reader(): void
|
|
{
|
|
$businessData = require base_path('config/business_data.php');
|
|
config(['business_data.datasets' => $businessData['datasets']]);
|
|
$placement = new BusinessDataPlacement(app('db'));
|
|
$this->assertFalse($placement->isActive('operations_replica.rpt.jst_originalBillInfo', 'clickhouse'));
|
|
$this->assertTrue($placement->shouldSchedule('operations_replica.rpt.jst_originalBillInfo'));
|
|
}
|
|
}
|