package com.mydreamjob.common.exception; import com.mydreamjob.common.api.ApiResponse; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.mock.web.MockHttpServletRequest; import static org.junit.jupiter.api.Assertions.*; class GlobalExceptionHandlerHttpStatusTest { private GlobalExceptionHandler handler; private MockHttpServletRequest request; @BeforeEach void setUp() { handler = new GlobalExceptionHandler(new com.mydreamjob.common.logging.RequestIdAccessor()); request = new MockHttpServletRequest(); request.setRequestURI("/api/v1/test"); } // ── 403 ─────────────────────────────────────────────────── @Test void forbiddenError_shouldReturnHttp403() { BusinessException ex = new BusinessException(ErrorCode.FORBIDDEN); ResponseEntity> resp = handler.handleBusinessException(ex, request); assertEquals(HttpStatus.FORBIDDEN.value(), resp.getStatusCode().value()); assertEquals(ErrorCode.FORBIDDEN.getCode(), resp.getBody().getCode()); } // ── 404 ─────────────────────────────────────────────────── @Test void companyNotFound_shouldReturnHttp404() { BusinessException ex = new BusinessException(ErrorCode.COMPANY_NOT_FOUND); ResponseEntity> resp = handler.handleBusinessException(ex, request); assertEquals(HttpStatus.NOT_FOUND.value(), resp.getStatusCode().value()); } @Test void jobNotFound_shouldReturnHttp404() { BusinessException ex = new BusinessException(ErrorCode.JOB_NOT_FOUND); ResponseEntity> resp = handler.handleBusinessException(ex, request); assertEquals(HttpStatus.NOT_FOUND.value(), resp.getStatusCode().value()); assertEquals(ErrorCode.JOB_NOT_FOUND.getCode(), resp.getBody().getCode()); } @Test void applicationNotFound_shouldReturnHttp404() { BusinessException ex = new BusinessException(ErrorCode.APPLICATION_NOT_FOUND); ResponseEntity> resp = handler.handleBusinessException(ex, request); assertEquals(HttpStatus.NOT_FOUND.value(), resp.getStatusCode().value()); } // ── 409 ─────────────────────────────────────────────────── @Test void companyAlreadyExists_shouldReturnHttp409() { BusinessException ex = new BusinessException(ErrorCode.COMPANY_ALREADY_EXISTS); ResponseEntity> resp = handler.handleBusinessException(ex, request); assertEquals(HttpStatus.CONFLICT.value(), resp.getStatusCode().value()); assertEquals(ErrorCode.COMPANY_ALREADY_EXISTS.getCode(), resp.getBody().getCode()); } @Test void applicationDuplicate_shouldReturnHttp409() { BusinessException ex = new BusinessException(ErrorCode.APPLICATION_DUPLICATE); ResponseEntity> resp = handler.handleBusinessException(ex, request); assertEquals(HttpStatus.CONFLICT.value(), resp.getStatusCode().value()); assertEquals(ErrorCode.APPLICATION_DUPLICATE.getCode(), resp.getBody().getCode()); } @Test void invalidJobStatusTransition_shouldReturnHttp409() { BusinessException ex = new BusinessException(ErrorCode.INVALID_JOB_STATUS_TRANSITION); ResponseEntity> resp = handler.handleBusinessException(ex, request); assertEquals(HttpStatus.CONFLICT.value(), resp.getStatusCode().value()); } @Test void invalidApplicationStatusTransition_shouldReturnHttp409() { BusinessException ex = new BusinessException(ErrorCode.INVALID_APPLICATION_STATUS_TRANSITION); ResponseEntity> resp = handler.handleBusinessException(ex, request); assertEquals(HttpStatus.CONFLICT.value(), resp.getStatusCode().value()); } @Test void duplicateReview_shouldReturnHttp409() { BusinessException ex = new BusinessException(ErrorCode.DUPLICATE_REVIEW); ResponseEntity> resp = handler.handleBusinessException(ex, request); assertEquals(HttpStatus.CONFLICT.value(), resp.getStatusCode().value()); assertEquals(ErrorCode.DUPLICATE_REVIEW.getCode(), resp.getBody().getCode()); } @Test void reviewNotFound_shouldReturnHttp404() { BusinessException ex = new BusinessException(ErrorCode.REVIEW_NOT_FOUND); ResponseEntity> resp = handler.handleBusinessException(ex, request); assertEquals(HttpStatus.NOT_FOUND.value(), resp.getStatusCode().value()); assertEquals(ErrorCode.REVIEW_NOT_FOUND.getCode(), resp.getBody().getCode()); } @Test void conversationNotFound_shouldReturnHttp404() { BusinessException ex = new BusinessException(ErrorCode.CONVERSATION_NOT_FOUND); ResponseEntity> resp = handler.handleBusinessException(ex, request); assertEquals(HttpStatus.NOT_FOUND.value(), resp.getStatusCode().value()); assertEquals(ErrorCode.CONVERSATION_NOT_FOUND.getCode(), resp.getBody().getCode()); } @Test void privacySettingsConcurrentUpdate_shouldReturnHttp409() { BusinessException ex = new BusinessException(ErrorCode.PRIVACY_SETTINGS_CONCURRENT_UPDATE); ResponseEntity> resp = handler.handleBusinessException(ex, request); assertEquals(HttpStatus.CONFLICT.value(), resp.getStatusCode().value()); assertEquals(ErrorCode.PRIVACY_SETTINGS_CONCURRENT_UPDATE.getCode(), resp.getBody().getCode()); } // ── 400 ─────────────────────────────────────────────────── @Test void genericBusinessError_shouldReturnHttp400() { BusinessException ex = new BusinessException(ErrorCode.BAD_REQUEST); ResponseEntity> resp = handler.handleBusinessException(ex, request); assertEquals(HttpStatus.BAD_REQUEST.value(), resp.getStatusCode().value()); assertEquals(ErrorCode.BAD_REQUEST.getCode(), resp.getBody().getCode()); } @Test void interviewOnlineUrlRequired_shouldReturnHttp400() { BusinessException ex = new BusinessException(ErrorCode.INTERVIEW_ONLINE_URL_REQUIRED); ResponseEntity> resp = handler.handleBusinessException(ex, request); assertEquals(HttpStatus.BAD_REQUEST.value(), resp.getStatusCode().value()); assertEquals(ErrorCode.INTERVIEW_ONLINE_URL_REQUIRED.getCode(), resp.getBody().getCode()); } @Test void interviewOfflineAddressRequired_shouldReturnHttp400() { BusinessException ex = new BusinessException(ErrorCode.INTERVIEW_OFFLINE_ADDRESS_REQUIRED); ResponseEntity> resp = handler.handleBusinessException(ex, request); assertEquals(HttpStatus.BAD_REQUEST.value(), resp.getStatusCode().value()); assertEquals(ErrorCode.INTERVIEW_OFFLINE_ADDRESS_REQUIRED.getCode(), resp.getBody().getCode()); } @Test void unauthorized_shouldReturnHttp400() { BusinessException ex = new BusinessException(ErrorCode.UNAUTHORIZED); ResponseEntity> resp = handler.handleBusinessException(ex, request); assertEquals(HttpStatus.BAD_REQUEST.value(), resp.getStatusCode().value()); assertEquals(ErrorCode.UNAUTHORIZED.getCode(), resp.getBody().getCode()); } // ── Offer 进阶错误码映射 ───────────────────────────────── @Test void offerCounterOfferNotFound_shouldReturnHttp404() { BusinessException ex = new BusinessException(ErrorCode.OFFER_COUNTER_OFFER_NOT_FOUND); ResponseEntity> resp = handler.handleBusinessException(ex, request); assertEquals(HttpStatus.NOT_FOUND.value(), resp.getStatusCode().value()); assertEquals(ErrorCode.OFFER_COUNTER_OFFER_NOT_FOUND.getCode(), resp.getBody().getCode()); } @Test void offerCounterOfferExists_shouldReturnHttp409() { BusinessException ex = new BusinessException(ErrorCode.OFFER_COUNTER_OFFER_EXISTS); ResponseEntity> resp = handler.handleBusinessException(ex, request); assertEquals(HttpStatus.CONFLICT.value(), resp.getStatusCode().value()); assertEquals(ErrorCode.OFFER_COUNTER_OFFER_EXISTS.getCode(), resp.getBody().getCode()); } @Test void offerCounterOfferNotPending_shouldReturnHttp409() { BusinessException ex = new BusinessException(ErrorCode.OFFER_COUNTER_OFFER_NOT_PENDING); ResponseEntity> resp = handler.handleBusinessException(ex, request); assertEquals(HttpStatus.CONFLICT.value(), resp.getStatusCode().value()); assertEquals(ErrorCode.OFFER_COUNTER_OFFER_NOT_PENDING.getCode(), resp.getBody().getCode()); } @Test void offerCounterOfferExpired_shouldReturnHttp409() { BusinessException ex = new BusinessException(ErrorCode.OFFER_COUNTER_OFFER_EXPIRED); ResponseEntity> resp = handler.handleBusinessException(ex, request); assertEquals(HttpStatus.CONFLICT.value(), resp.getStatusCode().value()); assertEquals(ErrorCode.OFFER_COUNTER_OFFER_EXPIRED.getCode(), resp.getBody().getCode()); } @Test void offerNotWithdrawable_shouldReturnHttp400() { BusinessException ex = new BusinessException(ErrorCode.OFFER_NOT_WITHDRAWABLE); ResponseEntity> resp = handler.handleBusinessException(ex, request); assertEquals(HttpStatus.BAD_REQUEST.value(), resp.getStatusCode().value()); assertEquals(ErrorCode.OFFER_NOT_WITHDRAWABLE.getCode(), resp.getBody().getCode()); } @Test void offerCompareTooMany_shouldReturnHttp400() { BusinessException ex = new BusinessException(ErrorCode.OFFER_COMPARE_TOO_MANY); ResponseEntity> resp = handler.handleBusinessException(ex, request); assertEquals(HttpStatus.BAD_REQUEST.value(), resp.getStatusCode().value()); assertEquals(ErrorCode.OFFER_COMPARE_TOO_MANY.getCode(), resp.getBody().getCode()); } @Test void offerCompareNotOwner_shouldReturnHttp403() { BusinessException ex = new BusinessException(ErrorCode.OFFER_COMPARE_NOT_OWNER); ResponseEntity> resp = handler.handleBusinessException(ex, request); assertEquals(HttpStatus.FORBIDDEN.value(), resp.getStatusCode().value()); assertEquals(ErrorCode.OFFER_COMPARE_NOT_OWNER.getCode(), resp.getBody().getCode()); } }