refactor(integration): streamline integration management by removing IntegrationInstanceController and updating related requests and services
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user