Files
KanbanGit/tests/Feature/Api/OpenApiDocumentationTest.php
T
Twyco 8b25421e7c
linter / quality (pull_request) Successful in 1m18s
tests / ci (8.4) (pull_request) Successful in 1m28s
Add application API and OpenAPI docs
2026-04-20 13:22:56 +02:00

82 lines
4.4 KiB
PHP

<?php
namespace Tests\Feature\Api;
use Tests\TestCase;
class OpenApiDocumentationTest extends TestCase
{
public function test_openapi_document_is_valid_json_and_covers_application_api_routes(): void
{
$documentPath = base_path('docs/openapi/kanbangit-api.openapi.json');
$this->assertFileExists($documentPath);
$document = json_decode((string) file_get_contents($documentPath), true);
$this->assertIsArray($document);
$this->assertSame(JSON_ERROR_NONE, json_last_error());
$this->assertSame('3.1.0', $document['openapi']);
$this->assertSame([], $document['security']);
$expectedOperations = [
['get', '/projects'],
['post', '/projects'],
['get', '/projects/{project}'],
['delete', '/projects/{project}'],
['get', '/projects/{project}/board'],
['get', '/projects/{project}/backlog'],
['get', '/projects/{project}/ticket-options'],
['get', '/projects/{project}/tickets'],
['post', '/projects/{project}/tickets'],
['get', '/projects/{project}/tickets/{ticket}'],
['patch', '/projects/{project}/tickets/{ticket}'],
['get', '/projects/{project}/tickets/{ticket}/status-targets'],
['patch', '/projects/{project}/tickets/{ticket}/status'],
['get', '/projects/{project}/tickets/{ticket}/branches/validate'],
['post', '/projects/{project}/tickets/{ticket}/branches'],
['post', '/projects/{project}/tickets/{ticket}/links'],
['delete', '/projects/{project}/tickets/{ticket}/links/{ticketLink}'],
['get', '/projects/{project}/settings/board'],
['post', '/projects/{project}/settings/board/columns'],
['patch', '/projects/{project}/settings/board/columns/{boardColumn}'],
['delete', '/projects/{project}/settings/board/columns/{boardColumn}'],
['post', '/projects/{project}/settings/board/statuses'],
['patch', '/projects/{project}/settings/board/statuses/{ticketStatus}'],
['delete', '/projects/{project}/settings/board/statuses/{ticketStatus}'],
['patch', '/projects/{project}/settings/board/statuses/{ticketStatus}/transitions'],
['get', '/projects/{project}/settings/metadata'],
['patch', '/projects/{project}/settings/metadata'],
['post', '/projects/{project}/settings/metadata/types'],
['patch', '/projects/{project}/settings/metadata/types/{ticketType}'],
['delete', '/projects/{project}/settings/metadata/types/{ticketType}'],
['post', '/projects/{project}/settings/metadata/priorities'],
['patch', '/projects/{project}/settings/metadata/priorities/{ticketPriority}'],
['delete', '/projects/{project}/settings/metadata/priorities/{ticketPriority}'],
['post', '/projects/{project}/settings/metadata/fields'],
['patch', '/projects/{project}/settings/metadata/fields/{ticketFieldDefinition}'],
['delete', '/projects/{project}/settings/metadata/fields/{ticketFieldDefinition}'],
['post', '/projects/{project}/settings/metadata/link-types'],
['patch', '/projects/{project}/settings/metadata/link-types/{ticketLinkType}'],
['delete', '/projects/{project}/settings/metadata/link-types/{ticketLinkType}'],
['get', '/projects/{project}/settings/repositories'],
['post', '/projects/{project}/settings/repositories'],
['patch', '/projects/{project}/settings/repositories/{repositoryConnection}'],
['delete', '/projects/{project}/settings/repositories/{repositoryConnection}'],
['get', '/git-connections'],
['post', '/git-connections'],
['patch', '/git-connections/{gitConnection}'],
['delete', '/git-connections/{gitConnection}'],
];
foreach ($expectedOperations as [$method, $path]) {
$this->assertArrayHasKey($path, $document['paths']);
$this->assertArrayHasKey($method, $document['paths'][$path]);
}
$this->assertArrayHasKey('ValidationError', $document['components']['schemas']);
$this->assertArrayHasKey('TicketUpdateRequest', $document['components']['schemas']);
$this->assertArrayHasKey('UserGitConnectionRequest', $document['components']['schemas']);
}
}