Files
KanbanGit/tests/Feature/Api/OpenApiDocumentationTest.php

96 lines
5.3 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([['ApplicationKey' => []]], $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}'],
['get', '/users/{user}/assigned-tickets'],
];
foreach ($expectedOperations as [$method, $path]) {
$this->assertArrayHasKey($path, $document['paths']);
$this->assertArrayHasKey($method, $document['paths'][$path]);
}
$this->assertArrayHasKey('ApplicationKey', $document['components']['securitySchemes']);
$this->assertSame('http', $document['components']['securitySchemes']['ApplicationKey']['type']);
$this->assertSame('bearer', $document['components']['securitySchemes']['ApplicationKey']['scheme']);
$this->assertArrayHasKey('ValidationError', $document['components']['schemas']);
$this->assertArrayHasKey('TicketUpdateRequest', $document['components']['schemas']);
$this->assertArrayHasKey('UserGitConnectionRequest', $document['components']['schemas']);
$this->assertArrayHasKey('AssignedTicketsPayloadEnvelope', $document['components']['schemas']);
$this->assertArrayHasKey('AssignedTicketsProjectGroup', $document['components']['schemas']);
$assigneeSchema = $document['components']['schemas']['AssignedTicketsPayloadEnvelope']['properties']['meta']['properties']['assignee'] ?? null;
$this->assertIsArray($assigneeSchema);
$this->assertSame([
['$ref' => '#/components/schemas/User'],
['type' => 'null'],
], $assigneeSchema['anyOf'] ?? null);
}
}