refactor(integration): streamline integration management by removing IntegrationInstanceController and updating related requests and services

This commit is contained in:
2026-09-04 16:00:19 -03:00
parent 85edea0661
commit 99fe94fa6a
11 changed files with 75 additions and 196 deletions

View File

@@ -39,49 +39,47 @@ class IntegrationInstanceTest extends TestCase
public function test_management_requires_an_authenticated_global_admin(): void
{
$this->getJson('/api/integration-instances')->assertUnauthorized();
Client::create(['code' => 'acme', 'name' => 'Acme']);
WebsiteType::create(['codigo' => 'demo', 'nombre' => 'Demo']);
$this->getJson('/api/clients/acme/integrations')->assertUnauthorized();
Sanctum::actingAs(User::factory()->create());
$this->getJson('/api/integration-instances')->assertForbidden();
$this->postJson('/api/integration-instances', [])->assertForbidden();
$this->getJson('/api/integrations')->assertForbidden();
$this->getJson('/api/clients/acme/integrations')->assertForbidden();
$this->getJson('/api/website-types/demo/integrations')->assertForbidden();
}
public function test_instance_crud_validates_configuration_and_never_returns_secrets(): void
{
$this->admin();
$this->postJson('/api/integration-instances', [
'integration_code' => 'test', 'name' => 'Invalid', 'integration_data' => [],
])->assertUnprocessable()->assertJsonValidationErrors('integration_data.api_key');
$response = $this->postJson('/api/integration-instances', [
'integration_code' => 'test', 'name' => 'Shared', 'integration_data' => ['api_key' => 'secret'],
])->assertCreated()->assertJsonMissingPath('data.integration_data');
$id = $response->json('data.id');
$this->getJson('/api/integration-instances/'.$id)->assertOk()->assertJsonMissingPath('data.integration_data');
$this->patchJson('/api/integration-instances/'.$id, ['name' => 'Renamed'])->assertOk();
self::assertSame('secret', IntegrationInstance::findOrFail($id)->integration_data['api_key']);
$this->patchJson('/api/integration-instances/'.$id, ['integration_code' => 'test'])->assertUnprocessable();
$this->patchJson('/api/integration-instances/'.$id, ['integration_data' => []])->assertUnprocessable();
$this->patchJson('/api/integration-instances/'.$id, ['integration_data' => ['api_key' => 'new']])->assertOk();
self::assertSame('new', IntegrationInstance::findOrFail($id)->integration_data['api_key']);
$this->deleteJson('/api/integration-instances/'.$id)->assertNoContent();
}
public function test_association_api_checks_integration_and_protects_linked_instances(): void
public function test_only_owner_endpoints_can_manage_configuration(): void
{
$this->admin();
$client = Client::create(['code' => 'acme', 'name' => 'Acme']);
$type = WebsiteType::create(['codigo' => 'demo', 'nombre' => 'Demo']);
$instance = $this->makeInstance('shared');
$this->putJson('/api/clients/acme/integrations/wrong/instance', ['integration_instance_id' => $instance->id])->assertUnprocessable();
$this->putJson('/api/clients/acme/integrations/test/instance', ['integration_instance_id' => $instance->id])
->assertCreated()->assertJsonPath('data.integration_instance.name', 'shared')->assertJsonMissingPath('data.integration_instance.integration_data');
$this->putJson('/api/website-types/demo/integrations/test', ['integration_instance_id' => $instance->id])->assertCreated();
$this->getJson('/api/website-types/demo/integrations/test')->assertOk()->assertJsonPath('data.integration_instance_id', $instance->id);
$this->deleteJson('/api/integration-instances/'.$instance->id)->assertConflict();
$this->getJson('/api/integrations')->assertNotFound();
$this->getJson('/api/integration-instances')->assertNotFound();
$this->putJson('/api/clients/acme/integrations/test/instance', [])->assertNotFound();
$this->putJson('/api/clients/acme/integrations/test', ['integration_data' => []])
->assertUnprocessable()->assertJsonValidationErrors('integration_data.api_key');
$this->putJson('/api/website-types/demo/integrations/test', ['integration_data' => []])
->assertUnprocessable()->assertJsonValidationErrors('integration_data.api_key');
$this->putJson('/api/clients/acme/integrations/test', [
'integration_data' => ['api_key' => 'client-secret'],
])->assertOk()->assertJsonMissingPath('integration_data');
$clientInstanceId = $client->integrations()->firstOrFail()->integration_instance_id;
self::assertSame('client-secret', IntegrationInstance::findOrFail($clientInstanceId)->integration_data['api_key']);
$this->putJson('/api/website-types/demo/integrations/test', [
'integration_data' => ['api_key' => 'type-secret'],
])->assertCreated()
->assertJsonPath('data.integration_instance.name', 'Test / Demo')
->assertJsonMissingPath('data.integration_instance.integration_data');
$typeInstanceId = $type->integrations()->firstOrFail()->integration_instance_id;
$this->getJson('/api/website-types/demo/integrations/test')
->assertOk()->assertJsonPath('data.integration_instance_id', $typeInstanceId);
$this->deleteJson('/api/clients/acme/integrations/test')->assertNoContent();
$this->deleteJson('/api/website-types/demo/integrations/test')->assertNoContent();
self::assertTrue($instance->fresh()->exists);
$this->deleteJson('/api/integration-instances/'.$instance->id)->assertNoContent();
}
public function test_tenant_prefers_client_then_type_and_client_context_does_not_inherit(): void