[ 'driver' => 'sqlite', 'database' => ':memory:', 'prefix' => '', ], 'upstream_mirrors.connection' => 'business_mirror', 'upstream_mirrors.datasets' => [], 'upstream_mirrors.auto_follow_columns' => ['demo/page' => self::DATASET], ]); DB::purge('business_mirror'); DB::table('business_mirror_datasets')->insert([ 'dataset_key' => self::DATASET, 'source_key' => 'demo', 'definition' => json_encode([ 'source_key' => 'demo', 'schema' => 'external', 'object' => 'accounts_v1', 'target' => 'demo_accounts', 'keys' => ['id'], 'columns' => ['id', 'name'], ], JSON_THROW_ON_ERROR), 'sync_enabled' => true, 'initial_sync_approved' => true, 'created_at' => now(), 'updated_at' => now(), ]); $this->insertCatalogColumn('id', 1); $this->insertCatalogColumn('name', 2); } private function insertCatalogColumn(string $column, int $position): void { DB::table('upstream_schema_columns')->insert([ 'source_key' => 'demo', 'schema_name' => 'external', 'object_name' => 'accounts_v1', 'object_type' => 'view', 'column_name' => $column, 'ordinal_position' => $position, 'data_type' => 'varchar', 'max_length' => 191, 'synchronized_at' => now(), ]); } public function test_it_adds_new_upstream_columns_and_skips_sensitive_ones(): void { $this->insertCatalogColumn('platform', 3); $this->insertCatalogColumn('passwordCiphertext', 4); $this->artisan('business-mirror:follow-upstream-columns')->assertSuccessful(); $definition = json_decode( (string) DB::table('business_mirror_datasets')->where('dataset_key', self::DATASET)->value('definition'), true, ); $this->assertSame(['id', 'name', 'platform'], $definition['columns']); $this->assertSame(['platform'], $definition['followed_columns']); $this->assertTrue(Schema::connection('business_mirror')->hasColumn('demo_accounts', 'platform')); $this->assertFalse(Schema::connection('business_mirror')->hasColumn('demo_accounts', 'passwordCiphertext')); } public function test_it_is_idempotent_when_there_is_nothing_new(): void { $this->insertCatalogColumn('platform', 3); $this->artisan('business-mirror:follow-upstream-columns')->assertSuccessful(); $definition = json_decode( (string) DB::table('business_mirror_datasets')->where('dataset_key', self::DATASET)->value('definition'), true, ); $this->assertSame(['id', 'name', 'platform'], $definition['columns']); // 再跑一次不会重复追加,也不会重复记录。 $this->artisan('business-mirror:follow-upstream-columns')->assertSuccessful(); $again = json_decode( (string) DB::table('business_mirror_datasets')->where('dataset_key', self::DATASET)->value('definition'), true, ); $this->assertSame(['id', 'name', 'platform'], $again['columns']); $this->assertSame(['platform'], $again['followed_columns']); } }