create(); $application = Application::factory()->for($organisation)->create(['name' => 'Billing API']); $environment = Environment::factory()->for($application)->create(); Service::factory()->for($environment)->create([ 'organisation_id' => $organisation->id, 'category' => ServiceCategory::APPLICATION, 'type' => ServiceType::LARAVEL, 'version' => 'php-8.4', 'version_track' => 'php-8.4', 'driver_name' => 'laravel.php-8.4', 'deploy_policy' => DeployPolicy::WITH_ENVIRONMENT, 'desired_replicas' => 1, ]); $artifact = app(PlanBuildArtifact::class)->execute($environment, str_repeat('a', 40)); expect($artifact->status)->toBe(BuildArtifactStatus::PENDING) ->and($artifact->image_tag)->toBe('billing-api:aaaaaaaaaaaa') ->and($artifact->registry_ref)->toBeNull() ->and($artifact->metadata['build_strategy'])->toBe(BuildStrategy::TARGET_SERVER->value); }); it('requires a registry before planning multi-server builds', function () { $organisation = Organisation::factory()->create(); $application = Application::factory()->for($organisation)->create(); $environment = Environment::factory()->for($application)->create(); Service::factory()->for($environment)->create([ 'organisation_id' => $organisation->id, 'category' => ServiceCategory::APPLICATION, 'type' => ServiceType::LARAVEL, 'version' => 'php-8.4', 'version_track' => 'php-8.4', 'driver_name' => 'laravel.php-8.4', 'deploy_policy' => DeployPolicy::WITH_ENVIRONMENT, 'desired_replicas' => 2, ]); expect(fn () => app(PlanBuildArtifact::class)->execute($environment, str_repeat('b', 40))) ->toThrow(RuntimeException::class, 'A registry is required before building artifacts for multi-server deployments.'); }); it('plans multi-server builds against the configured external registry', function () { $organisation = Organisation::factory()->create(); $organisation->registries()->create([ 'name' => 'GHCR', 'type' => RegistryType::GHCR, 'url' => 'ghcr.io/example', ]); $application = Application::factory()->for($organisation)->create(['name' => 'Billing API']); $environment = Environment::factory()->for($application)->create(); Service::factory()->for($environment)->create([ 'organisation_id' => $organisation->id, 'category' => ServiceCategory::APPLICATION, 'type' => ServiceType::LARAVEL, 'version' => 'php-8.4', 'version_track' => 'php-8.4', 'driver_name' => 'laravel.php-8.4', 'deploy_policy' => DeployPolicy::WITH_ENVIRONMENT, 'desired_replicas' => 2, ]); $artifact = app(PlanBuildArtifact::class)->execute($environment, str_repeat('c', 40)); expect($artifact->registry_ref)->toBe('ghcr.io/example/billing-api:cccccccccccc') ->and($artifact->metadata['build_strategy'])->toBe(BuildStrategy::EXTERNAL_REGISTRY->value); });