diff --git a/gss-api-app/src/main/java/com/devoops/service/facade/RepositoryFacadeService.java b/gss-api-app/src/main/java/com/devoops/service/facade/RepositoryFacadeService.java index 98ae987..8a8e78c 100644 --- a/gss-api-app/src/main/java/com/devoops/service/facade/RepositoryFacadeService.java +++ b/gss-api-app/src/main/java/com/devoops/service/facade/RepositoryFacadeService.java @@ -10,6 +10,7 @@ import com.devoops.dto.request.RepositorySaveRequest; import com.devoops.dto.response.GithubRepoInfoResponse; import com.devoops.event.AnalyzeMyPrEvent; +import com.devoops.exception.GithubForbiddenException; import com.devoops.exception.GithubNotFoundException; import com.devoops.exception.custom.GssException; import com.devoops.exception.errorcode.ErrorCode; @@ -42,7 +43,7 @@ public GithubRepository save(RepositorySaveRequest request, User user) { eventPublisher.publishEvent(new AnalyzeMyPrEvent(repoUrl, user, this)); return savedRepository; - } catch (GithubNotFoundException githubNotFoundException) { + } catch (GithubNotFoundException | GithubForbiddenException githubException) { throw new GssException(ErrorCode.REGISTRY_GITHUB_REPOSITORY_NOT_FOUND); } } diff --git a/gss-api-app/src/test/java/com/devoops/service/facade/RepositoryFacadeServiceTest.java b/gss-api-app/src/test/java/com/devoops/service/facade/RepositoryFacadeServiceTest.java index 32ba568..1cf09b7 100644 --- a/gss-api-app/src/test/java/com/devoops/service/facade/RepositoryFacadeServiceTest.java +++ b/gss-api-app/src/test/java/com/devoops/service/facade/RepositoryFacadeServiceTest.java @@ -18,6 +18,7 @@ import com.devoops.dto.response.GithubRepoInfoResponse; import com.devoops.dto.response.OwnerResponse; import com.devoops.dto.response.WebHookCreateResponse; +import com.devoops.exception.GithubForbiddenException; import com.devoops.exception.GithubNotFoundException; import com.devoops.exception.custom.GssException; import com.devoops.exception.errorcode.ErrorCode; @@ -59,10 +60,21 @@ class Save { } @Test - void 웹훅_등록_실패_시_애플리케이션_에러로_전환한다() { + void 웹훅_등록_시_404_에러가_발생하면_애플리케이션_에러로_전환한다() { User user = userGenerator.generate("김건우"); RepositorySaveRequest request = new RepositorySaveRequest("https://github.com/octocat/Hello-World"); - mockingErrorWhenCreateWebHook(); + mockingErrorWhenCreateWebHook(new GithubNotFoundException("mocking error")); + + assertThatThrownBy(() -> repositoryFacadeService.save(request, user)) + .isInstanceOf(GssException.class) + .hasMessage(ErrorCode.REGISTRY_GITHUB_REPOSITORY_NOT_FOUND.getMessage()); + } + + @Test + void 웹훅_등록_시_403_에러가_발생하면_애플리케이션_에러로_전환한다() { + User user = userGenerator.generate("김건우"); + RepositorySaveRequest request = new RepositorySaveRequest("https://github.com/octocat/Hello-World"); + mockingErrorWhenCreateWebHook(new GithubForbiddenException("mocking error")); assertThatThrownBy(() -> repositoryFacadeService.save(request, user)) .isInstanceOf(GssException.class) @@ -121,14 +133,14 @@ private void mockingGithubClient() { .thenReturn(mockWebHookCreateResponse); } - private void mockingErrorWhenCreateWebHook() { + private void mockingErrorWhenCreateWebHook(Exception exception) { GithubRepoInfoResponse mockResponse = new GithubRepoInfoResponse(123, "testName", "testUrl", new OwnerResponse("김건우")); WebHookCreateResponse mockWebHookCreateResponse = new WebHookCreateResponse(123); Mockito.when(gitHubClient.getRepositoryInfo(anyString(), anyString(), anyString())) .thenReturn(mockResponse); Mockito.when(gitHubClient.createWebhook(any(), any(), any(), any())) - .thenThrow(new GithubNotFoundException("mocking error")); + .thenThrow(exception); } } diff --git a/gss-client/gss-github-client/src/main/java/com/devoops/client/GithubExchangeFilterFunction.java b/gss-client/gss-github-client/src/main/java/com/devoops/client/GithubExchangeFilterFunction.java index ab85609..bcbb387 100644 --- a/gss-client/gss-github-client/src/main/java/com/devoops/client/GithubExchangeFilterFunction.java +++ b/gss-client/gss-github-client/src/main/java/com/devoops/client/GithubExchangeFilterFunction.java @@ -1,5 +1,6 @@ package com.devoops.client; +import com.devoops.exception.GithubForbiddenException; import com.devoops.exception.GithubNotFoundException; import com.devoops.exception.custom.GssException; import com.devoops.exception.errorcode.ErrorCode; @@ -30,6 +31,9 @@ public ExchangeFilterFunction githubErrorLogger() { if (response.statusCode().isSameCodeAs(HttpStatusCode.valueOf(404))) { return Mono.error(new GithubNotFoundException("깃허브에서 자원을 찾을 수 없습니다.")); } + if(response.statusCode().isSameCodeAs(HttpStatusCode.valueOf(403))) { + return Mono.error(new GithubForbiddenException("깃허브 자원의 접근 권한이 없습니다")); + } return Mono.error(new GssException(ErrorCode.GITHUB_CLIENT_ERROR)); }); } diff --git a/gss-client/gss-github-client/src/main/java/com/devoops/exception/GithubForbiddenException.java b/gss-client/gss-github-client/src/main/java/com/devoops/exception/GithubForbiddenException.java new file mode 100644 index 0000000..387b6f8 --- /dev/null +++ b/gss-client/gss-github-client/src/main/java/com/devoops/exception/GithubForbiddenException.java @@ -0,0 +1,8 @@ +package com.devoops.exception; + +public class GithubForbiddenException extends RuntimeException { + + public GithubForbiddenException(String message) { + super(message); + } +}