app->make(\Illuminate\Contracts\Console\Kernel::class) ->registerCommand($this->app->make(SyncAltumVersionsCommand::class)); (new AltumCodeVendorSeeder)->run(); }); it('updates product versions from init.php files', function () { $basePath = createMockServicesDirectory([ '66analytics' => '42.0.0', '66biolinks' => '43.0.0', ]); $this->artisan('uptelligence:sync-altum-versions', ['--path' => $basePath]) ->assertSuccessful(); expect(Vendor::where('slug', '66analytics')->first()->current_version)->toBe('42.0.0') ->and(Vendor::where('slug', '66biolinks')->first()->current_version)->toBe('43.0.0'); }); it('updates plugin versions from config.php files', function () { $basePath = createMockServicesDirectory( productVersions: ['66biolinks' => '43.0.0'], pluginVersions: ['affiliate' => '2.5.0', 'teams' => '3.1.0'], ); $this->artisan('uptelligence:sync-altum-versions', ['--path' => $basePath]) ->assertSuccessful(); expect(Vendor::where('slug', 'altum-plugin-affiliate')->first()->current_version)->toBe('2.5.0') ->and(Vendor::where('slug', 'altum-plugin-teams')->first()->current_version)->toBe('3.1.0'); }); it('shows WOULD UPDATE in dry-run mode without writing', function () { $basePath = createMockServicesDirectory(['66analytics' => '99.0.0']); $this->artisan('uptelligence:sync-altum-versions', [ '--path' => $basePath, '--dry-run' => true, ])->assertSuccessful(); // Version should NOT have changed expect(Vendor::where('slug', '66analytics')->first()->current_version)->toBe('0.0.0'); }); it('shows current status when version matches', function () { Vendor::where('slug', '66analytics')->update(['current_version' => '42.0.0']); $basePath = createMockServicesDirectory(['66analytics' => '42.0.0']); $this->artisan('uptelligence:sync-altum-versions', ['--path' => $basePath]) ->assertSuccessful(); expect(Vendor::where('slug', '66analytics')->first()->current_version)->toBe('42.0.0'); }); it('skips products whose init.php does not exist', function () { // Create directory structure but only for one product $basePath = createMockServicesDirectory(['66analytics' => '42.0.0']); $this->artisan('uptelligence:sync-altum-versions', ['--path' => $basePath]) ->assertSuccessful(); // 66analytics should be updated, others should remain at 0.0.0 expect(Vendor::where('slug', '66analytics')->first()->current_version)->toBe('42.0.0') ->and(Vendor::where('slug', '66pusher')->first()->current_version)->toBe('0.0.0'); }); it('fails when base path does not exist', function () { $this->artisan('uptelligence:sync-altum-versions', ['--path' => '/nonexistent/path']) ->assertFailed(); }); it('skips plugins not registered in vendors table', function () { $basePath = createMockServicesDirectory( productVersions: ['66biolinks' => '43.0.0'], pluginVersions: ['unknown-plugin' => '1.0.0'], ); $this->artisan('uptelligence:sync-altum-versions', ['--path' => $basePath]) ->assertSuccessful(); // Unknown plugin should not cause an error, but should be SKIPPED expect(Vendor::where('slug', 'altum-plugin-unknown-plugin')->first())->toBeNull(); }); /** * Create a temporary directory structure mimicking the SaaS services layout. * * @param array $productVersions slug => version * @param array $pluginVersions plugin_id => version */ function createMockServicesDirectory( array $productVersions = [], array $pluginVersions = [], ): string { $basePath = sys_get_temp_dir() . '/uptelligence-test-' . uniqid(); $productPaths = [ '66analytics' => '66analytics/package/product', '66biolinks' => '66biolinks/package/product', '66pusher' => '66pusher/package/product', '66socialproof' => '66socialproof/package/product', ]; foreach ($productVersions as $slug => $version) { if (! isset($productPaths[$slug])) { continue; } $productDir = $basePath . '/' . $productPaths[$slug] . '/app'; mkdir($productDir, 0755, true); file_put_contents( $productDir . '/init.php', " $version) { $pluginDir = $pluginsBase . '/' . $pluginId; mkdir($pluginDir, 0755, true); file_put_contents( $pluginDir . '/config.php', " '{$version}',\n 'name' => 'Test Plugin',\n];\n", ); } } // Ensure base path itself exists even if no products if (! is_dir($basePath)) { mkdir($basePath, 0755, true); } return $basePath; }