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']); } }