Skip to content

Commit

Permalink
add phpunit tests
Browse files Browse the repository at this point in the history
Signed-off-by: Swikriti Tripathi <swikriti808@gmail.com>
  • Loading branch information
SwikritiT committed Oct 9, 2023
1 parent 1ce0c90 commit ccc4c76
Show file tree
Hide file tree
Showing 3 changed files with 170 additions and 7 deletions.
2 changes: 1 addition & 1 deletion appinfo/routes.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
['name' => 'openProjectAPI#getOpenProjectOauthURLWithStateAndPKCE', 'url' => '/op-oauth-url', 'verb' => 'GET'],
['name' => 'openProjectAPI#getProjectFolderSetupStatus', 'url' => '/project-folder-status', 'verb' => 'GET'],
['name' => 'openProjectAPI#getAvailableOpenProjectProjects', 'url' => '/projects','verb' => 'GET'],
['name' => 'openProjectAPI#getWorkpackageForm', 'url' => '/projects/{id}/work-packages/form','verb' => 'POST'],
['name' => 'openProjectAPI#getOpenProjectWorkPackageForm', 'url' => '/projects/{id}/work-packages/form','verb' => 'POST'],
['name' => 'openProjectAPI#getAvailableAssignees', 'url' => '/projects/{id}/available-assignees','verb' => 'GET'],
['name' => 'openProjectAPI#createWorkPackages', 'url' => '/create/work-packages','verb' => 'POST'],
],
Expand Down
11 changes: 5 additions & 6 deletions lib/Controller/OpenProjectAPIController.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
use GuzzleHttp\Exception\ServerException;
use InvalidArgumentException;
use OCA\OpenProject\Exception\OpenprojectErrorException;
use OCA\OpenProject\Exception\OpenprojectResponseException;
use OCP\AppFramework\Http\DataDisplayResponse;
use OCP\AppFramework\Http\DataDownloadResponse;
use OCP\Files\NotFoundException;
Expand Down Expand Up @@ -371,6 +370,8 @@ public function getAvailableOpenProjectProjects(): DataResponse {
}
try {
$result = $this->openprojectAPIService->getAvailableOpenProjectProjects($this->userId);
} catch (OpenprojectErrorException $e) {
return new DataResponse($e->getMessage(), $e->getCode());
} catch (\Exception $e) {
return new DataResponse($e->getMessage(), Http::STATUS_INTERNAL_SERVER_ERROR);
}
Expand All @@ -385,14 +386,16 @@ public function getAvailableOpenProjectProjects(): DataResponse {
* @param array<mixed> $body body is same in the format that openproject api expects the body to be
* @return DataResponse
*/
public function getWorkpackageForm(string $id, array $body): DataResponse {
public function getOpenProjectWorkPackageForm(string $id, array $body): DataResponse {
if ($this->accessToken === '') {
return new DataResponse('', Http::STATUS_UNAUTHORIZED);
} elseif (!OpenProjectAPIService::validateURL($this->openprojectUrl)) {
return new DataResponse('', Http::STATUS_BAD_REQUEST);
}
try {
$result = $this->openprojectAPIService->getOpenProjectWorkPackageForm($this->userId, $id, $body);
} catch (OpenprojectErrorException $e) {
return new DataResponse($e->getMessage(), $e->getcode());
} catch (\Exception $e) {
return new DataResponse($e->getMessage(), Http::STATUS_INTERNAL_SERVER_ERROR);
}
Expand All @@ -415,8 +418,6 @@ public function getAvailableAssignees(string $id): DataResponse {
$result = $this->openprojectAPIService->getAvailableAssignees($this->userId, $id);
} catch (OpenprojectErrorException $e) {
return new DataResponse($e->getMessage(), $e->getcode());
} catch (OpenprojectResponseException $e) {
return new DataResponse($e->getMessage(), Http::STATUS_BAD_REQUEST);
} catch (\Exception $e) {
return new DataResponse($e->getMessage(), Http::STATUS_INTERNAL_SERVER_ERROR);
}
Expand All @@ -439,8 +440,6 @@ public function createWorkPackages(array $body): DataResponse {
$result = $this->openprojectAPIService->createWorkPackages($this->userId, $body);
} catch (OpenprojectErrorException $e) {
return new DataResponse($e->getMessage(), $e->getcode());
} catch (OpenprojectResponseException $e) {
return new DataResponse($e->getMessage(), Http::STATUS_BAD_REQUEST);
} catch (\Exception $e) {
return new DataResponse($e->getMessage(), Http::STATUS_INTERNAL_SERVER_ERROR);
}
Expand Down
164 changes: 164 additions & 0 deletions tests/lib/Controller/OpenProjectAPIControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1315,4 +1315,168 @@ public function testLinkWorkPackageToFileForInvalidDataError(): void {
$this->assertSame(Http::STATUS_BAD_REQUEST, $response->getStatus());
$this->assertSame('invalid data', $response->getData());
}


public function exceptionDataProvider(): array {
return [
[
new OpenprojectErrorException('Precondition failed', 412),
412,
'Precondition failed'
],
[
new OpenprojectResponseException('Malformed response'),
500,
'Malformed response'
],
[
new Exception("Internal server error"),
500,
'Internal server error'
]
];
}

public function testGetAvailableOpenProjectProjects(): void {
$this->getUserValueMock();
$service = $this->getMockBuilder(OpenProjectAPIService::class)
->disableOriginalConstructor()
->onlyMethods(['getAvailableOpenProjectProjects'])
->getMock();
$service->expects($this->once())
->method('getAvailableOpenProjectProjects')
->with('test')
->willReturn([
6 => [
"_type" => "Project",
"id" => 6,
"name" => "[dev] Custom fields",
"_links" => [
"parent" => ["href" => "https://openproject.local/projects/6"]
]
]
]);
$controller = new OpenProjectAPIController(
'integration_openproject',
$this->requestMock,
$this->configMock,
$service,
$this->urlGeneratorMock,
$this->loggerMock,
'test'
);
$response = $controller->getAvailableOpenProjectProjects();
$this->assertSame(Http::STATUS_OK, $response->getStatus());
$this->assertSame([
6 => [
"_type" => "Project",
"id" => 6,
"name" => "[dev] Custom fields",
"_links" => [
"parent" => ["href" => "https://openproject.local/projects/6"]
]
]
], $response->getData());
}

/**
* @param \Exception $exception
* @param int $expectedHttpStatusCode
* @param string $expectedError
* @dataProvider exceptionDataProvider
*
*@return void
*/
public function testGetAvailableOpenProjectProjectsException(Exception $exception, int $expectedHttpStatusCode, string $expectedError) {
$this->getUserValueMock();
$service = $this->getMockBuilder(OpenProjectAPIService::class)
->disableOriginalConstructor()
->getMock();
$service
->method('getAvailableOpenProjectProjects')
->willThrowException($exception);
$controller = new OpenProjectAPIController(
'integration_openproject',
$this->requestMock,
$this->configMock,
$service,
$this->urlGeneratorMock,
$this->loggerMock,
'test'
);
$response = $controller->getAvailableOpenProjectProjects();
$this->assertSame($expectedHttpStatusCode, $response->getStatus());
$this->assertSame($expectedError, $response->getData());
}

public function testGetOpenProjectWorkPackageForm(): void {
$this->getUserValueMock();
$body = [
"_links" => [
"type" => [
"href" => "/api/v3/types/2",
"title" => "Milestone"
],
"status" => [
"href" => "/api/v3/statuses/1",
"title" => "New"
],
"subject" => "This is a new workpackage",
"description" => [
"format" => "markdown",
"raw" => "this is a default description for milestone type",
"html" => null
]
]
];
$result = [
"payload" => [
"subject" => "This is a new workpackage",
"description" => [
"format" => "markdown",
"raw" => "this is a default description for task type",
"html" => "<p class=\"op-uc-p\">this is a default description for task type</p>"
],
"_links" => [
"type" => [
"href" => "/api/v3/types/2",
"title" => "Milestone"
],
"status" => [
"href" => "/api/v3/statuses/1",
"title" => "New"
],
"project" => [
"href" => "/api/v3/projects/1",
"title" > "Demo project"
],
"assignee" => [
"href" => null
],
]
],
"schema" => [],
"validationErrors" => []
];
$service = $this->getMockBuilder(OpenProjectAPIService::class)
->disableOriginalConstructor()
->onlyMethods(['getOpenProjectWorkPackageForm'])
->getMock();
$service->expects($this->once())
->method('getOpenProjectWorkPackageForm')
->with('test', 6, $body)
->willReturn($result);
$controller = new OpenProjectAPIController(
'integration_openproject',
$this->requestMock,
$this->configMock,
$service,
$this->urlGeneratorMock,
$this->loggerMock,
'test'
);
$response = $controller->getOpenProjectWorkPackageForm(6, $body);
$this->assertSame(Http::STATUS_OK, $response->getStatus());
$this->assertSame($result, $response->getData());
}
}

0 comments on commit ccc4c76

Please sign in to comment.