init: 클린 기반 auth 서버 설계

This commit is contained in:
DongHyeonka
2026-07-24 14:30:18 +09:00
parent 471db0203d
commit 8a1ac1e769
3642 changed files with 275893 additions and 1 deletions
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>AuthenticatedUserController</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <a href="index.html" class="el_package">com.project.auth.presentation.auth.controller</a> &gt; <span class="el_class">AuthenticatedUserController</span></div><h1>AuthenticatedUserController</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">42 of 42</td><td class="ctr2">0%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">3</td><td class="ctr2">3</td><td class="ctr1">14</td><td class="ctr2">14</td><td class="ctr1">3</td><td class="ctr2">3</td></tr></tfoot><tbody><tr><td id="a1"><a href="AuthenticatedUserController.java.html#L43" class="el_method">me(AuthenticatedUser)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="27" alt="27"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"/><td class="ctr2" id="e0">n/a</td><td class="ctr1" id="f0">1</td><td class="ctr2" id="g0">1</td><td class="ctr1" id="h0">8</td><td class="ctr2" id="i0">8</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a0"><a href="AuthenticatedUserController.java.html#L34" class="el_method">AuthenticatedUserController(LoadKeycloakUserUseCase, AuthenticatedUserPresentationMapper, ApiResultFactory)</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="53" height="10" title="12" alt="12"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"/><td class="ctr2" id="e1">n/a</td><td class="ctr1" id="f1">1</td><td class="ctr2" id="g1">1</td><td class="ctr1" id="h1">5</td><td class="ctr2" id="i1">5</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a2"><a href="AuthenticatedUserController.java.html#L24" class="el_method">static {...}</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="13" height="10" title="3" alt="3"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">1</td><td class="ctr2" id="i2">1</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>AuthenticatedUserController.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <a href="index.source.html" class="el_package">com.project.auth.presentation.auth.controller</a> &gt; <span class="el_source">AuthenticatedUserController.java</span></div><h1>AuthenticatedUserController.java</h1><pre class="source lang-java linenums">package com.project.auth.presentation.auth.controller;
import com.project.auth.application.auth.identity.KeycloakUserClaims;
import com.project.auth.application.auth.identity.LoadedKeycloakUser;
import com.project.auth.application.auth.identity.LoadKeycloakUserUseCase;
import com.project.auth.presentation.auth.current.AuthenticatedUser;
import com.project.auth.presentation.auth.current.CurrentUser;
import com.project.auth.presentation.auth.docs.AuthenticatedUserApiDocs;
import com.project.auth.presentation.auth.dto.AuthenticatedUserResponse;
import com.project.auth.presentation.auth.mapper.AuthenticatedUserPresentationMapper;
import com.project.auth.presentation.support.response.ApiResult;
import com.project.auth.presentation.support.response.ApiResultFactory;
import com.project.auth.presentation.support.response.ApiSuccessCode;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(&quot;/api/v1/auth&quot;)
@Tag(name = &quot;Auth&quot;, description = &quot;Keycloak 토큰 기반 인증 API&quot;)
public class AuthenticatedUserController implements AuthenticatedUserApiDocs {
<span class="nc" id="L24"> private static final ApiSuccessCode USER_LOADED = ApiSuccessCode.AUTHENTICATED_USER_LOADED;</span>
private final LoadKeycloakUserUseCase loadKeycloakUserUseCase;
private final AuthenticatedUserPresentationMapper authenticatedUserPresentationMapper;
private final ApiResultFactory apiResultFactory;
public AuthenticatedUserController(
LoadKeycloakUserUseCase loadKeycloakUserUseCase,
AuthenticatedUserPresentationMapper authenticatedUserPresentationMapper,
ApiResultFactory apiResultFactory
<span class="nc" id="L34"> ) {</span>
<span class="nc" id="L35"> this.loadKeycloakUserUseCase = loadKeycloakUserUseCase;</span>
<span class="nc" id="L36"> this.authenticatedUserPresentationMapper = authenticatedUserPresentationMapper;</span>
<span class="nc" id="L37"> this.apiResultFactory = apiResultFactory;</span>
<span class="nc" id="L38"> }</span>
@Override
@GetMapping(&quot;/me&quot;)
public ApiResult&lt;AuthenticatedUserResponse&gt; me(@CurrentUser AuthenticatedUser currentUser) {
<span class="nc" id="L43"> LoadedKeycloakUser user = loadKeycloakUserUseCase.load(new KeycloakUserClaims(</span>
<span class="nc" id="L44"> currentUser.subject(),</span>
<span class="nc" id="L45"> currentUser.email(),</span>
<span class="nc" id="L46"> currentUser.name()</span>
));
<span class="nc" id="L49"> return apiResultFactory.success(</span>
<span class="nc" id="L50"> USER_LOADED.code(),</span>
<span class="nc" id="L51"> USER_LOADED.message(),</span>
<span class="nc" id="L52"> authenticatedUserPresentationMapper.toResponse(user, currentUser.authorities())</span>
);
}
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>com.project.auth.presentation.auth.controller</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb', 'coveragetable'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="index.source.html" class="el_source">Source Files</a><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <span class="el_package">com.project.auth.presentation.auth.controller</span></div><h1>com.project.auth.presentation.auth.controller</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td><td class="sortable ctr1" id="l" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="m" onclick="toggleSort(this)">Classes</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">42 of 42</td><td class="ctr2">0%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">3</td><td class="ctr2">3</td><td class="ctr1">14</td><td class="ctr2">14</td><td class="ctr1">3</td><td class="ctr2">3</td><td class="ctr1">1</td><td class="ctr2">1</td></tr></tfoot><tbody><tr><td id="a0"><a href="AuthenticatedUserController.html" class="el_class">AuthenticatedUserController</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="42" alt="42"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"/><td class="ctr2" id="e0">n/a</td><td class="ctr1" id="f0">3</td><td class="ctr2" id="g0">3</td><td class="ctr1" id="h0">14</td><td class="ctr2" id="i0">14</td><td class="ctr1" id="j0">3</td><td class="ctr2" id="k0">3</td><td class="ctr1" id="l0">1</td><td class="ctr2" id="m0">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>com.project.auth.presentation.auth.controller</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb', 'coveragetable'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="index.html" class="el_class">Classes</a><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <span class="el_package">com.project.auth.presentation.auth.controller</span></div><h1>com.project.auth.presentation.auth.controller</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td><td class="sortable ctr1" id="l" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="m" onclick="toggleSort(this)">Classes</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">42 of 42</td><td class="ctr2">0%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">3</td><td class="ctr2">3</td><td class="ctr1">14</td><td class="ctr2">14</td><td class="ctr1">3</td><td class="ctr2">3</td><td class="ctr1">1</td><td class="ctr2">1</td></tr></tfoot><tbody><tr><td id="a0"><a href="AuthenticatedUserController.java.html" class="el_source">AuthenticatedUserController.java</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="42" alt="42"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"/><td class="ctr2" id="e0">n/a</td><td class="ctr1" id="f0">3</td><td class="ctr2" id="g0">3</td><td class="ctr1" id="h0">14</td><td class="ctr2" id="i0">14</td><td class="ctr1" id="j0">3</td><td class="ctr2" id="k0">3</td><td class="ctr1" id="l0">1</td><td class="ctr2" id="m0">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>AuthenticatedUser</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <a href="index.html" class="el_package">com.project.auth.presentation.auth.current</a> &gt; <span class="el_class">AuthenticatedUser</span></div><h1>AuthenticatedUser</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">22 of 22</td><td class="ctr2">0%</td><td class="bar">2 of 2</td><td class="ctr2">0%</td><td class="ctr1">2</td><td class="ctr2">2</td><td class="ctr1">3</td><td class="ctr2">3</td><td class="ctr1">1</td><td class="ctr2">1</td></tr></tfoot><tbody><tr><td id="a0"><a href="AuthenticatedUser.java.html#L12" class="el_method">AuthenticatedUser(String, String, String, Set)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="22" alt="22"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="2" alt="2"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">2</td><td class="ctr2" id="g0">2</td><td class="ctr1" id="h0">3</td><td class="ctr2" id="i0">3</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>AuthenticatedUser.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <a href="index.source.html" class="el_package">com.project.auth.presentation.auth.current</a> &gt; <span class="el_source">AuthenticatedUser.java</span></div><h1>AuthenticatedUser.java</h1><pre class="source lang-java linenums">package com.project.auth.presentation.auth.current;
import java.util.Set;
public record AuthenticatedUser(
String subject,
String email,
String name,
Set&lt;String&gt; authorities
) {
<span class="nc" id="L12"> public AuthenticatedUser {</span>
<span class="nc bnc" id="L13" title="All 2 branches missed."> authorities = authorities == null ? Set.of() : Set.copyOf(authorities);</span>
<span class="nc" id="L14"> }</span>
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>com.project.auth.presentation.auth.current</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb', 'coveragetable'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="index.source.html" class="el_source">Source Files</a><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <span class="el_package">com.project.auth.presentation.auth.current</span></div><h1>com.project.auth.presentation.auth.current</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td><td class="sortable ctr1" id="l" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="m" onclick="toggleSort(this)">Classes</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">22 of 22</td><td class="ctr2">0%</td><td class="bar">2 of 2</td><td class="ctr2">0%</td><td class="ctr1">2</td><td class="ctr2">2</td><td class="ctr1">3</td><td class="ctr2">3</td><td class="ctr1">1</td><td class="ctr2">1</td><td class="ctr1">1</td><td class="ctr2">1</td></tr></tfoot><tbody><tr><td id="a0"><a href="AuthenticatedUser.html" class="el_class">AuthenticatedUser</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="22" alt="22"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="2" alt="2"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">2</td><td class="ctr2" id="g0">2</td><td class="ctr1" id="h0">3</td><td class="ctr2" id="i0">3</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td><td class="ctr1" id="l0">1</td><td class="ctr2" id="m0">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>com.project.auth.presentation.auth.current</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb', 'coveragetable'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="index.html" class="el_class">Classes</a><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <span class="el_package">com.project.auth.presentation.auth.current</span></div><h1>com.project.auth.presentation.auth.current</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td><td class="sortable ctr1" id="l" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="m" onclick="toggleSort(this)">Classes</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">22 of 22</td><td class="ctr2">0%</td><td class="bar">2 of 2</td><td class="ctr2">0%</td><td class="ctr1">2</td><td class="ctr2">2</td><td class="ctr1">3</td><td class="ctr2">3</td><td class="ctr1">1</td><td class="ctr2">1</td><td class="ctr1">1</td><td class="ctr2">1</td></tr></tfoot><tbody><tr><td id="a0"><a href="AuthenticatedUser.java.html" class="el_source">AuthenticatedUser.java</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="22" alt="22"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="2" alt="2"/></td><td class="ctr2" id="e0">0%</td><td class="ctr1" id="f0">2</td><td class="ctr2" id="g0">2</td><td class="ctr1" id="h0">3</td><td class="ctr2" id="i0">3</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td><td class="ctr1" id="l0">1</td><td class="ctr2" id="m0">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>AuthenticatedUserPresentationMapper</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <a href="index.html" class="el_package">com.project.auth.presentation.auth.mapper</a> &gt; <span class="el_class">AuthenticatedUserPresentationMapper</span></div><h1>AuthenticatedUserPresentationMapper</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">0 of 18</td><td class="ctr2">100%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">0</td><td class="ctr2">2</td><td class="ctr1">0</td><td class="ctr2">7</td><td class="ctr1">0</td><td class="ctr2">2</td></tr></tfoot><tbody><tr><td id="a1"><a href="AuthenticatedUserPresentationMapper.java.html#L13" class="el_method">toResponse(LoadedKeycloakUser, Set)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/greenbar.gif" width="120" height="10" title="15" alt="15"/></td><td class="ctr2" id="c0">100%</td><td class="bar" id="d0"/><td class="ctr2" id="e0">n/a</td><td class="ctr1" id="f0">0</td><td class="ctr2" id="g0">1</td><td class="ctr1" id="h0">0</td><td class="ctr2" id="i0">6</td><td class="ctr1" id="j0">0</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a0"><a href="AuthenticatedUserPresentationMapper.java.html#L10" class="el_method">AuthenticatedUserPresentationMapper()</a></td><td class="bar" id="b1"><img src="../jacoco-resources/greenbar.gif" width="24" height="10" title="3" alt="3"/></td><td class="ctr2" id="c1">100%</td><td class="bar" id="d1"/><td class="ctr2" id="e1">n/a</td><td class="ctr1" id="f1">0</td><td class="ctr2" id="g1">1</td><td class="ctr1" id="h1">0</td><td class="ctr2" id="i1">1</td><td class="ctr1" id="j1">0</td><td class="ctr2" id="k1">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>AuthenticatedUserPresentationMapper.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <a href="index.source.html" class="el_package">com.project.auth.presentation.auth.mapper</a> &gt; <span class="el_source">AuthenticatedUserPresentationMapper.java</span></div><h1>AuthenticatedUserPresentationMapper.java</h1><pre class="source lang-java linenums">package com.project.auth.presentation.auth.mapper;
import com.project.auth.application.auth.identity.LoadedKeycloakUser;
import com.project.auth.presentation.auth.dto.AuthenticatedUserResponse;
import org.springframework.stereotype.Component;
import java.util.Set;
@Component
<span class="fc" id="L10">public class AuthenticatedUserPresentationMapper {</span>
public AuthenticatedUserResponse toResponse(LoadedKeycloakUser user, Set&lt;String&gt; authorities) {
<span class="fc" id="L13"> return new AuthenticatedUserResponse(</span>
<span class="fc" id="L14"> user.userId(),</span>
<span class="fc" id="L15"> user.providerSubject(),</span>
<span class="fc" id="L16"> user.email(),</span>
<span class="fc" id="L17"> user.name(),</span>
<span class="fc" id="L18"> user.provider(),</span>
authorities
);
}
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>com.project.auth.presentation.auth.mapper</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb', 'coveragetable'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="index.source.html" class="el_source">Source Files</a><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <span class="el_package">com.project.auth.presentation.auth.mapper</span></div><h1>com.project.auth.presentation.auth.mapper</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td><td class="sortable ctr1" id="l" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="m" onclick="toggleSort(this)">Classes</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">0 of 18</td><td class="ctr2">100%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">0</td><td class="ctr2">2</td><td class="ctr1">0</td><td class="ctr2">7</td><td class="ctr1">0</td><td class="ctr2">2</td><td class="ctr1">0</td><td class="ctr2">1</td></tr></tfoot><tbody><tr><td id="a0"><a href="AuthenticatedUserPresentationMapper.html" class="el_class">AuthenticatedUserPresentationMapper</a></td><td class="bar" id="b0"><img src="../jacoco-resources/greenbar.gif" width="120" height="10" title="18" alt="18"/></td><td class="ctr2" id="c0">100%</td><td class="bar" id="d0"/><td class="ctr2" id="e0">n/a</td><td class="ctr1" id="f0">0</td><td class="ctr2" id="g0">2</td><td class="ctr1" id="h0">0</td><td class="ctr2" id="i0">7</td><td class="ctr1" id="j0">0</td><td class="ctr2" id="k0">2</td><td class="ctr1" id="l0">0</td><td class="ctr2" id="m0">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>com.project.auth.presentation.auth.mapper</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb', 'coveragetable'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="index.html" class="el_class">Classes</a><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <span class="el_package">com.project.auth.presentation.auth.mapper</span></div><h1>com.project.auth.presentation.auth.mapper</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td><td class="sortable ctr1" id="l" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="m" onclick="toggleSort(this)">Classes</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">0 of 18</td><td class="ctr2">100%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">0</td><td class="ctr2">2</td><td class="ctr1">0</td><td class="ctr2">7</td><td class="ctr1">0</td><td class="ctr2">2</td><td class="ctr1">0</td><td class="ctr2">1</td></tr></tfoot><tbody><tr><td id="a0"><a href="AuthenticatedUserPresentationMapper.java.html" class="el_source">AuthenticatedUserPresentationMapper.java</a></td><td class="bar" id="b0"><img src="../jacoco-resources/greenbar.gif" width="120" height="10" title="18" alt="18"/></td><td class="ctr2" id="c0">100%</td><td class="bar" id="d0"/><td class="ctr2" id="e0">n/a</td><td class="ctr1" id="f0">0</td><td class="ctr2" id="g0">2</td><td class="ctr1" id="h0">0</td><td class="ctr2" id="i0">7</td><td class="ctr1" id="j0">0</td><td class="ctr2" id="k0">2</td><td class="ctr1" id="l0">0</td><td class="ctr2" id="m0">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>ApiErrorHttpStatusMapper.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <a href="index.source.html" class="el_package">com.project.auth.presentation.support.exception</a> &gt; <span class="el_source">ApiErrorHttpStatusMapper.java</span></div><h1>ApiErrorHttpStatusMapper.java</h1><pre class="source lang-java linenums">package com.project.auth.presentation.support.exception;
import com.project.auth.application.support.exception.AuthErrorCode;
import com.project.auth.application.support.exception.ClientFacingErrorCode;
import com.project.auth.application.support.exception.CommonErrorCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
public final class ApiErrorHttpStatusMapper {
<span class="fc" id="L12"> private static final Logger log = LoggerFactory.getLogger(ApiErrorHttpStatusMapper.class);</span>
private ApiErrorHttpStatusMapper() {
}
/**
* default 분기가 존재하는 이유: {@link ClientFacingErrorCode}가 non-sealed이므로
* (application/presentation 외 모듈도 레이어 경계를 넘지 않고 자체 구현을 추가할 수 있다)
* 컴파일러가 exhaustiveness를 강제할 수 없다. 새로운 구현이 매핑 테이블에 누락된 채
* 들어오면 조용히 500이 되는 대신 WARN 로그로 드러내어 운영 대시보드에서 식별 가능하게 한다.
*
* &quot;새 ClientFacingErrorCode 구현은 반드시 매핑 테이블에 등록해야 한다&quot;는 아키텍처 차원의
* 게이트는 ApiErrorHttpStatusMapperClientFacingCoverageTest에 있다.
*/
public static HttpStatus map(ClientFacingErrorCode errorCode) {
<span class="fc bfc" id="L27" title="All 4 branches covered."> return switch (errorCode) {</span>
<span class="fc" id="L28"> case CommonErrorCode commonErrorCode -&gt; mapCommon(commonErrorCode);</span>
<span class="fc" id="L29"> case AuthErrorCode authErrorCode -&gt; mapAuth(authErrorCode);</span>
<span class="fc" id="L30"> case PresentationErrorCode presentationErrorCode -&gt; mapPresentation(presentationErrorCode);</span>
default -&gt; {
<span class="fc" id="L32"> log.warn(&quot;Unmapped ClientFacingErrorCode reached default branch. type={} code={} -&gt; falling back to 500&quot;,</span>
<span class="fc" id="L33"> errorCode.getClass().getName(), errorCode.code());</span>
<span class="fc" id="L34"> yield HttpStatus.INTERNAL_SERVER_ERROR;</span>
}
};
}
private static HttpStatus mapCommon(CommonErrorCode errorCode) {
<span class="fc" id="L40"> return switch (errorCode) {</span>
<span class="fc" id="L41"> case INTERNAL_SERVER_ERROR -&gt; HttpStatus.INTERNAL_SERVER_ERROR;</span>
};
}
private static HttpStatus mapPresentation(PresentationErrorCode errorCode) {
<span class="fc bfc" id="L46" title="All 8 branches covered."> return switch (errorCode) {</span>
<span class="fc" id="L47"> case INVALID_INPUT, INVALID_REQUEST_BODY, MISSING_PARAMETER, CONSTRAINT_VIOLATION, MISSING_HEADER, REQUEST_BINDING_FAILED, TYPE_MISMATCH, INVALID_PARAMETER -&gt; HttpStatus.BAD_REQUEST;</span>
<span class="fc" id="L48"> case METHOD_NOT_ALLOWED -&gt; HttpStatus.METHOD_NOT_ALLOWED;</span>
<span class="fc" id="L49"> case RESOURCE_NOT_FOUND -&gt; HttpStatus.NOT_FOUND;</span>
<span class="fc" id="L50"> case UNSUPPORTED_MEDIA_TYPE -&gt; HttpStatus.UNSUPPORTED_MEDIA_TYPE;</span>
<span class="fc" id="L51"> case NOT_ACCEPTABLE -&gt; HttpStatus.NOT_ACCEPTABLE;</span>
<span class="fc" id="L52"> case PAYLOAD_TOO_LARGE -&gt; HttpStatus.CONTENT_TOO_LARGE;</span>
<span class="fc" id="L53"> case MESSAGE_NOT_WRITABLE -&gt; HttpStatus.INTERNAL_SERVER_ERROR;</span>
<span class="fc" id="L54"> case UNHANDLED_CLIENT_ERROR -&gt; HttpStatus.BAD_REQUEST;</span>
};
}
private static HttpStatus mapAuth(AuthErrorCode errorCode) {
<span class="fc bfc" id="L59" title="All 4 branches covered."> return switch (errorCode) {</span>
<span class="fc" id="L60"> case AUTHENTICATION_REQUIRED -&gt; HttpStatus.UNAUTHORIZED;</span>
<span class="fc" id="L61"> case ACCESS_DENIED -&gt; HttpStatus.FORBIDDEN;</span>
<span class="fc" id="L62"> case KEYCLOAK_CLAIMS_INVALID -&gt; HttpStatus.BAD_REQUEST;</span>
<span class="fc" id="L63"> case KEYCLOAK_USER_NOT_FOUND -&gt; HttpStatus.NOT_FOUND;</span>
};
}
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
@@ -0,0 +1,116 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>ApplicationExceptionHandler.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <a href="index.source.html" class="el_package">com.project.auth.presentation.support.exception</a> &gt; <span class="el_source">ApplicationExceptionHandler.java</span></div><h1>ApplicationExceptionHandler.java</h1><pre class="source lang-java linenums">package com.project.auth.presentation.support.exception;
import com.project.auth.application.support.exception.BusinessException;
import com.project.auth.application.support.exception.CommonErrorCode;
import com.project.auth.application.support.logging.LogSanitizer;
import com.project.auth.presentation.support.response.ApiResult;
import com.project.auth.presentation.support.response.ApiResultFactory;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
@Order(Ordered.LOWEST_PRECEDENCE)
public class ApplicationExceptionHandler {
<span class="fc" id="L24"> private static final Logger log = LoggerFactory.getLogger(ApplicationExceptionHandler.class);</span>
private final ApiResultFactory apiResultFactory;
<span class="fc" id="L28"> public ApplicationExceptionHandler(ApiResultFactory apiResultFactory) {</span>
<span class="fc" id="L29"> this.apiResultFactory = apiResultFactory;</span>
<span class="fc" id="L30"> }</span>
@ExceptionHandler(BusinessException.class)
public ResponseEntity&lt;ApiResult&lt;Void&gt;&gt; handleBusinessException(
BusinessException exception,
HttpServletRequest request
) {
<span class="fc" id="L37"> log.warn(</span>
&quot;Business exception. exceptionType={} errorCode={} method={} requestPath={}&quot;,
<span class="fc" id="L39"> exception.getClass().getSimpleName(),</span>
<span class="fc" id="L40"> exception.getErrorCode().code(),</span>
<span class="fc" id="L41"> request.getMethod(),</span>
<span class="fc" id="L42"> LogSanitizer.requestPath(request.getRequestURI())</span>
);
<span class="fc" id="L45"> return ResponseEntity.status(ApiErrorHttpStatusMapper.map(exception.getErrorCode()))</span>
<span class="fc" id="L46"> .body(apiResultFactory.failure(exception.getErrorCode().code(), exception.getErrorCode().message()));</span>
}
/**
* 응답 직렬화 실패에 대한 정직한 처리.
*
* 응답이 이미 커밋된 상태(이미 바이트가 wire에 나간 상태)라면 회복 경로가 없다.
* 같은 직렬화 경로로 본문을 또 쓰려고 하면 동일한 실패가 재발하거나 무시된다.
* 이때는 본문 없는 빈 ResponseEntity(500)를 반환한다 — @ExceptionHandler가 null을
* 반환하면 Spring은 &quot;응답이 작성되지 않음&quot;으로 해석해 리졸버 체인으로 재진입할 수 있고,
* 우리가 막으려는 재귀 실패가 바로 그것이다.
*
* 응답이 아직 커밋되지 않았다면 표준 ApiResult 본문을 시도한다. 직렬화 실패가
* 구조적인 원인이면 2차 시도도 같은 이유로 실패할 수 있는데, 그때는
* @ExceptionHandler(Exception.class) 안전망이 다시 잡아낸다.
*/
@ExceptionHandler(HttpMessageNotWritableException.class)
public ResponseEntity&lt;ApiResult&lt;Void&gt;&gt; handleMessageNotWritableException(
HttpMessageNotWritableException exception,
HttpServletRequest request,
HttpServletResponse response
) {
<span class="fc" id="L68"> log.error(</span>
&quot;Response body not writable. committed={} method={} requestPath={}&quot;,
<span class="fc" id="L70"> response.isCommitted(),</span>
<span class="fc" id="L71"> request.getMethod(),</span>
<span class="fc" id="L72"> LogSanitizer.requestPath(request.getRequestURI()),</span>
exception
);
<span class="fc bfc" id="L76" title="All 2 branches covered."> if (response.isCommitted()) {</span>
<span class="fc" id="L77"> return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();</span>
}
<span class="fc" id="L80"> return ResponseEntity.status(ApiErrorHttpStatusMapper.map(PresentationErrorCode.MESSAGE_NOT_WRITABLE))</span>
<span class="fc" id="L81"> .body(apiResultFactory.failure(</span>
<span class="fc" id="L82"> PresentationErrorCode.MESSAGE_NOT_WRITABLE.code(),</span>
<span class="fc" id="L83"> PresentationErrorCode.MESSAGE_NOT_WRITABLE.message()</span>
));
}
/**
* 더 구체적인 @ExceptionHandler에 매칭되지 않은 모든 예외에 대한 최후의 안전망.
*
* 이 핸들러가 없으면 매칭되지 않은 예외는 advice를 우회해 {@code /error}로 흘러가고,
* Spring Boot 기본 응답 형태가 반환되어 {@link ApiResult} 계약이 깨진다.
*
* 항상 500 + COMMON-999를 반환하고, 알 수 없는 장애 모드를 운영이 식별할 수 있도록
* ERROR 레벨로 전체 스택트레이스를 남긴다.
*/
@ExceptionHandler(Exception.class)
public ResponseEntity&lt;ApiResult&lt;Void&gt;&gt; handleUncaughtException(
Exception exception,
HttpServletRequest request
) {
<span class="fc" id="L101"> log.error(</span>
&quot;Uncaught exception reached @ExceptionHandler safety net. exceptionType={} method={} requestPath={}&quot;,
<span class="fc" id="L103"> exception.getClass().getName(),</span>
<span class="fc" id="L104"> request.getMethod(),</span>
<span class="fc" id="L105"> LogSanitizer.requestPath(request.getRequestURI()),</span>
exception
);
<span class="fc" id="L109"> return ResponseEntity.status(ApiErrorHttpStatusMapper.map(CommonErrorCode.INTERNAL_SERVER_ERROR))</span>
<span class="fc" id="L110"> .body(apiResultFactory.failure(</span>
<span class="fc" id="L111"> CommonErrorCode.INTERNAL_SERVER_ERROR.code(),</span>
<span class="fc" id="L112"> CommonErrorCode.INTERNAL_SERVER_ERROR.message()</span>
));
}
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>PresentationErrorCode</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <a href="index.html" class="el_package">com.project.auth.presentation.support.exception</a> &gt; <span class="el_class">PresentationErrorCode</span></div><h1>PresentationErrorCode</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">0 of 140</td><td class="ctr2">100%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">0</td><td class="ctr2">4</td><td class="ctr1">0</td><td class="ctr2">22</td><td class="ctr1">0</td><td class="ctr2">4</td></tr></tfoot><tbody><tr><td id="a3"><a href="PresentationErrorCode.java.html#L37" class="el_method">static {...}</a></td><td class="bar" id="b0"><img src="../jacoco-resources/greenbar.gif" width="120" height="10" title="123" alt="123"/></td><td class="ctr2" id="c0">100%</td><td class="bar" id="d0"/><td class="ctr2" id="e0">n/a</td><td class="ctr1" id="f0">0</td><td class="ctr2" id="g0">1</td><td class="ctr1" id="h0">0</td><td class="ctr2" id="i0">16</td><td class="ctr1" id="j0">0</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a2"><a href="PresentationErrorCode.java.html#L57" class="el_method">PresentationErrorCode(String, int, String, String)</a></td><td class="bar" id="b1"><img src="../jacoco-resources/greenbar.gif" width="10" height="10" title="11" alt="11"/></td><td class="ctr2" id="c1">100%</td><td class="bar" id="d1"/><td class="ctr2" id="e1">n/a</td><td class="ctr1" id="f1">0</td><td class="ctr2" id="g1">1</td><td class="ctr1" id="h1">0</td><td class="ctr2" id="i1">4</td><td class="ctr1" id="j1">0</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a0"><a href="PresentationErrorCode.java.html#L64" class="el_method">code()</a></td><td class="bar" id="b2"><img src="../jacoco-resources/greenbar.gif" width="2" height="10" title="3" alt="3"/></td><td class="ctr2" id="c2">100%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">0</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">0</td><td class="ctr2" id="i2">1</td><td class="ctr1" id="j2">0</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a1"><a href="PresentationErrorCode.java.html#L69" class="el_method">message()</a></td><td class="bar" id="b3"><img src="../jacoco-resources/greenbar.gif" width="2" height="10" title="3" alt="3"/></td><td class="ctr2" id="c3">100%</td><td class="bar" id="d3"/><td class="ctr2" id="e3">n/a</td><td class="ctr1" id="f3">0</td><td class="ctr2" id="g3">1</td><td class="ctr1" id="h3">0</td><td class="ctr2" id="i3">1</td><td class="ctr1" id="j3">0</td><td class="ctr2" id="k3">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>PresentationErrorCode.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <a href="index.source.html" class="el_package">com.project.auth.presentation.support.exception</a> &gt; <span class="el_source">PresentationErrorCode.java</span></div><h1>PresentationErrorCode.java</h1><pre class="source lang-java linenums">package com.project.auth.presentation.support.exception;
import com.project.auth.application.support.exception.ClientFacingErrorCode;
/**
* 클라이언트에 반환되는 presentation 계층 에러 코드.
*
* 클라이언트 SDK가 원인별로 분기 로직을 짤 수 있도록 트리거별로 의도적으로 코드를 분리했다.
* &lt;ul&gt;
* &lt;li&gt;{@link #INVALID_INPUT} — 요청 본문 빈 검증 실패
* ({@code @Valid @RequestBody}, MethodArgumentNotValidException).&lt;/li&gt;
* &lt;li&gt;{@link #INVALID_REQUEST_BODY} — 요청 본문 파싱 실패
* (HttpMessageNotReadableException, 예: 잘못된 JSON).&lt;/li&gt;
* &lt;li&gt;{@link #MISSING_PARAMETER} — 필수 query/form 파라미터 누락
* (MissingServletRequestParameterException).&lt;/li&gt;
* &lt;li&gt;{@link #CONSTRAINT_VIOLATION} — 컨트롤러 메서드 인자 범위 밖에서 트리거된
* Jakarta Bean Validation (ConstraintViolationException, 주로 @Validated 서비스
* 또는 @RequestParam 제약).&lt;/li&gt;
* &lt;li&gt;{@link #TYPE_MISMATCH} — query/path/form 값을 대상 타입으로 변환 실패
* (TypeMismatchException, 예: Long에 {@code id=abc}).&lt;/li&gt;
* &lt;li&gt;{@link #INVALID_PARAMETER} — 핸들러 메서드 레벨 검증 실패
* (HandlerMethodValidationException, 예: {@code @RequestParam @Size}).&lt;/li&gt;
* &lt;li&gt;{@link #MISSING_HEADER} — 필수 @RequestHeader 누락.&lt;/li&gt;
* &lt;li&gt;{@link #REQUEST_BINDING_FAILED} — 더 구체적인 코드로 분류되지 않은
* 일반 ServletRequestBindingException.&lt;/li&gt;
* &lt;li&gt;{@link #METHOD_NOT_ALLOWED} — 라우트가 지원하지 않는 HTTP 메서드.&lt;/li&gt;
* &lt;li&gt;{@link #RESOURCE_NOT_FOUND} — 요청 경로에 매칭되는 라우트/정적 리소스 없음.&lt;/li&gt;
* &lt;li&gt;{@link #UNSUPPORTED_MEDIA_TYPE} — 라우트가 수용하지 않는 Content-Type.&lt;/li&gt;
* &lt;li&gt;{@link #NOT_ACCEPTABLE} — Accept 헤더를 만족시킬 수 없음.&lt;/li&gt;
* &lt;li&gt;{@link #PAYLOAD_TOO_LARGE} — multipart 업로드가 허용 한도 초과.&lt;/li&gt;
* &lt;li&gt;{@link #MESSAGE_NOT_WRITABLE} — 응답 직렬화 실패 (5xx).&lt;/li&gt;
* &lt;li&gt;{@link #UNHANDLED_CLIENT_ERROR} — 더 구체적인 매핑이 없는 4xx 상태 캐리어
* (ResponseStatusException, ErrorResponseException) 또는 컨테이너 레벨 4xx 응답에
* 대한 폴백.&lt;/li&gt;
* &lt;/ul&gt;
*/
<span class="fc" id="L37">public enum PresentationErrorCode implements ClientFacingErrorCode {</span>
<span class="fc" id="L38"> INVALID_INPUT(&quot;PRES-001&quot;, &quot;요청 값이 올바르지 않습니다.&quot;),</span>
<span class="fc" id="L39"> INVALID_REQUEST_BODY(&quot;PRES-002&quot;, &quot;요청 본문을 읽을 수 없습니다.&quot;),</span>
<span class="fc" id="L40"> METHOD_NOT_ALLOWED(&quot;PRES-003&quot;, &quot;지원하지 않는 HTTP 메서드입니다.&quot;),</span>
<span class="fc" id="L41"> MISSING_PARAMETER(&quot;PRES-004&quot;, &quot;필수 요청 파라미터가 누락되었습니다.&quot;),</span>
<span class="fc" id="L42"> RESOURCE_NOT_FOUND(&quot;PRES-005&quot;, &quot;요청한 리소스를 찾을 수 없습니다.&quot;),</span>
<span class="fc" id="L43"> CONSTRAINT_VIOLATION(&quot;PRES-006&quot;, &quot;요청 값이 제약 조건을 위반했습니다.&quot;),</span>
<span class="fc" id="L44"> UNSUPPORTED_MEDIA_TYPE(&quot;PRES-007&quot;, &quot;지원하지 않는 Content-Type입니다.&quot;),</span>
<span class="fc" id="L45"> NOT_ACCEPTABLE(&quot;PRES-008&quot;, &quot;요청한 응답 형식을 제공할 수 없습니다.&quot;),</span>
<span class="fc" id="L46"> MISSING_HEADER(&quot;PRES-009&quot;, &quot;필수 요청 헤더가 누락되었습니다.&quot;),</span>
<span class="fc" id="L47"> REQUEST_BINDING_FAILED(&quot;PRES-010&quot;, &quot;요청 바인딩에 실패했습니다.&quot;),</span>
<span class="fc" id="L48"> MESSAGE_NOT_WRITABLE(&quot;PRES-011&quot;, &quot;응답 데이터를 처리할 수 없습니다.&quot;),</span>
<span class="fc" id="L49"> PAYLOAD_TOO_LARGE(&quot;PRES-012&quot;, &quot;요청 본문 크기가 허용 한도를 초과했습니다.&quot;),</span>
<span class="fc" id="L50"> UNHANDLED_CLIENT_ERROR(&quot;PRES-013&quot;, &quot;처리하지 못한 클라이언트 오류입니다.&quot;),</span>
<span class="fc" id="L51"> TYPE_MISMATCH(&quot;PRES-014&quot;, &quot;요청 파라미터 타입이 올바르지 않습니다.&quot;),</span>
<span class="fc" id="L52"> INVALID_PARAMETER(&quot;PRES-015&quot;, &quot;요청 파라미터 검증에 실패했습니다.&quot;);</span>
private final String code;
private final String message;
<span class="fc" id="L57"> PresentationErrorCode(String code, String message) {</span>
<span class="fc" id="L58"> this.code = code;</span>
<span class="fc" id="L59"> this.message = message;</span>
<span class="fc" id="L60"> }</span>
@Override
public String code() {
<span class="fc" id="L64"> return code;</span>
}
@Override
public String message() {
<span class="fc" id="L69"> return message;</span>
}
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
@@ -0,0 +1,266 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>RequestExceptionHandler.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <a href="index.source.html" class="el_package">com.project.auth.presentation.support.exception</a> &gt; <span class="el_source">RequestExceptionHandler.java</span></div><h1>RequestExceptionHandler.java</h1><pre class="source lang-java linenums">package com.project.auth.presentation.support.exception;
import com.project.auth.application.support.exception.CommonErrorCode;
import com.project.auth.application.support.logging.LogSanitizer;
import com.project.auth.presentation.support.response.ApiResult;
import com.project.auth.presentation.support.response.ApiResultFactory;
import jakarta.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.beans.TypeMismatchException;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.ErrorResponse;
import org.springframework.web.ErrorResponseException;
import org.springframework.web.HttpMediaTypeNotAcceptableException;
import org.springframework.web.HttpMediaTypeNotSupportedException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.MissingRequestHeaderException;
import org.springframework.web.bind.ServletRequestBindingException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.server.ResponseStatusException;
import org.springframework.web.servlet.resource.NoResourceFoundException;
@RestControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE + 20)
public class RequestExceptionHandler {
<span class="fc" id="L34"> private static final Logger log = LoggerFactory.getLogger(RequestExceptionHandler.class);</span>
private final ApiResultFactory apiResultFactory;
<span class="fc" id="L38"> public RequestExceptionHandler(ApiResultFactory apiResultFactory) {</span>
<span class="fc" id="L39"> this.apiResultFactory = apiResultFactory;</span>
<span class="fc" id="L40"> }</span>
@ExceptionHandler(HttpMessageNotReadableException.class)
public ResponseEntity&lt;ApiResult&lt;Void&gt;&gt; handleMessageNotReadableException(
HttpMessageNotReadableException exception,
HttpServletRequest request
) {
<span class="fc" id="L47"> log.warn(&quot;Request body not readable. method={} requestPath={} errorCode={}&quot;,</span>
<span class="fc" id="L48"> request.getMethod(),</span>
<span class="fc" id="L49"> LogSanitizer.requestPath(request.getRequestURI()),</span>
<span class="fc" id="L50"> PresentationErrorCode.INVALID_REQUEST_BODY.code());</span>
<span class="fc" id="L52"> return ResponseEntity.status(ApiErrorHttpStatusMapper.map(PresentationErrorCode.INVALID_REQUEST_BODY))</span>
<span class="fc" id="L53"> .body(apiResultFactory.failure(</span>
<span class="fc" id="L54"> PresentationErrorCode.INVALID_REQUEST_BODY.code(),</span>
<span class="fc" id="L55"> PresentationErrorCode.INVALID_REQUEST_BODY.message()</span>
));
}
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public ResponseEntity&lt;ApiResult&lt;Void&gt;&gt; handleMethodNotSupportedException(
HttpRequestMethodNotSupportedException exception,
HttpServletRequest request
) {
<span class="fc" id="L64"> log.warn(&quot;Method not supported. method={} requestPath={} attemptedMethod={} errorCode={}&quot;,</span>
<span class="fc" id="L65"> request.getMethod(),</span>
<span class="fc" id="L66"> LogSanitizer.requestPath(request.getRequestURI()),</span>
<span class="fc" id="L67"> LogSanitizer.normalize(exception.getMethod()),</span>
<span class="fc" id="L68"> PresentationErrorCode.METHOD_NOT_ALLOWED.code());</span>
<span class="fc" id="L70"> return ResponseEntity.status(ApiErrorHttpStatusMapper.map(PresentationErrorCode.METHOD_NOT_ALLOWED))</span>
<span class="fc" id="L71"> .body(apiResultFactory.failure(</span>
<span class="fc" id="L72"> PresentationErrorCode.METHOD_NOT_ALLOWED.code(),</span>
<span class="fc" id="L73"> PresentationErrorCode.METHOD_NOT_ALLOWED.message()</span>
));
}
@ExceptionHandler(MissingServletRequestParameterException.class)
public ResponseEntity&lt;ApiResult&lt;Void&gt;&gt; handleMissingParameterException(
MissingServletRequestParameterException exception,
HttpServletRequest request
) {
<span class="fc" id="L82"> log.warn(&quot;Missing request parameter. method={} requestPath={} parameter={} errorCode={}&quot;,</span>
<span class="fc" id="L83"> request.getMethod(),</span>
<span class="fc" id="L84"> LogSanitizer.requestPath(request.getRequestURI()),</span>
<span class="fc" id="L85"> LogSanitizer.normalize(exception.getParameterName()),</span>
<span class="fc" id="L86"> PresentationErrorCode.MISSING_PARAMETER.code());</span>
<span class="fc" id="L88"> return ResponseEntity.status(ApiErrorHttpStatusMapper.map(PresentationErrorCode.MISSING_PARAMETER))</span>
<span class="fc" id="L89"> .body(apiResultFactory.failure(</span>
<span class="fc" id="L90"> PresentationErrorCode.MISSING_PARAMETER.code(),</span>
<span class="fc" id="L91"> PresentationErrorCode.MISSING_PARAMETER.message()</span>
));
}
@ExceptionHandler(TypeMismatchException.class)
public ResponseEntity&lt;ApiResult&lt;Void&gt;&gt; handleTypeMismatchException(
TypeMismatchException exception,
HttpServletRequest request
) {
<span class="fc" id="L100"> log.warn(&quot;Type mismatch for parameter. method={} requestPath={} parameter={} errorCode={}&quot;,</span>
<span class="fc" id="L101"> request.getMethod(),</span>
<span class="fc" id="L102"> LogSanitizer.requestPath(request.getRequestURI()),</span>
<span class="fc" id="L103"> LogSanitizer.normalize(exception.getPropertyName()),</span>
<span class="fc" id="L104"> PresentationErrorCode.TYPE_MISMATCH.code());</span>
<span class="fc" id="L106"> return ResponseEntity.status(ApiErrorHttpStatusMapper.map(PresentationErrorCode.TYPE_MISMATCH))</span>
<span class="fc" id="L107"> .body(apiResultFactory.failure(</span>
<span class="fc" id="L108"> PresentationErrorCode.TYPE_MISMATCH.code(),</span>
<span class="fc" id="L109"> PresentationErrorCode.TYPE_MISMATCH.message()</span>
));
}
@ExceptionHandler(HttpMediaTypeNotSupportedException.class)
public ResponseEntity&lt;ApiResult&lt;Void&gt;&gt; handleMediaTypeNotSupportedException(
HttpMediaTypeNotSupportedException exception,
HttpServletRequest request
) {
<span class="fc" id="L118"> log.warn(&quot;Unsupported media type. method={} requestPath={} contentType={} errorCode={}&quot;,</span>
<span class="fc" id="L119"> request.getMethod(),</span>
<span class="fc" id="L120"> LogSanitizer.requestPath(request.getRequestURI()),</span>
<span class="fc" id="L121"> LogSanitizer.normalize(String.valueOf(exception.getContentType())),</span>
<span class="fc" id="L122"> PresentationErrorCode.UNSUPPORTED_MEDIA_TYPE.code());</span>
<span class="fc" id="L124"> return ResponseEntity.status(ApiErrorHttpStatusMapper.map(PresentationErrorCode.UNSUPPORTED_MEDIA_TYPE))</span>
<span class="fc" id="L125"> .body(apiResultFactory.failure(</span>
<span class="fc" id="L126"> PresentationErrorCode.UNSUPPORTED_MEDIA_TYPE.code(),</span>
<span class="fc" id="L127"> PresentationErrorCode.UNSUPPORTED_MEDIA_TYPE.message()</span>
));
}
@ExceptionHandler(HttpMediaTypeNotAcceptableException.class)
public ResponseEntity&lt;ApiResult&lt;Void&gt;&gt; handleMediaTypeNotAcceptableException(
HttpMediaTypeNotAcceptableException exception,
HttpServletRequest request
) {
<span class="fc" id="L136"> log.warn(&quot;Not acceptable media type. method={} requestPath={} errorCode={}&quot;,</span>
<span class="fc" id="L137"> request.getMethod(),</span>
<span class="fc" id="L138"> LogSanitizer.requestPath(request.getRequestURI()),</span>
<span class="fc" id="L139"> PresentationErrorCode.NOT_ACCEPTABLE.code());</span>
<span class="fc" id="L141"> return ResponseEntity.status(ApiErrorHttpStatusMapper.map(PresentationErrorCode.NOT_ACCEPTABLE))</span>
<span class="fc" id="L142"> .body(apiResultFactory.failure(</span>
<span class="fc" id="L143"> PresentationErrorCode.NOT_ACCEPTABLE.code(),</span>
<span class="fc" id="L144"> PresentationErrorCode.NOT_ACCEPTABLE.message()</span>
));
}
@ExceptionHandler(MissingRequestHeaderException.class)
public ResponseEntity&lt;ApiResult&lt;Void&gt;&gt; handleMissingRequestHeaderException(
MissingRequestHeaderException exception,
HttpServletRequest request
) {
<span class="fc" id="L153"> log.warn(&quot;Missing request header. method={} requestPath={} header={} errorCode={}&quot;,</span>
<span class="fc" id="L154"> request.getMethod(),</span>
<span class="fc" id="L155"> LogSanitizer.requestPath(request.getRequestURI()),</span>
<span class="fc" id="L156"> LogSanitizer.normalize(exception.getHeaderName()),</span>
<span class="fc" id="L157"> PresentationErrorCode.MISSING_HEADER.code());</span>
<span class="fc" id="L159"> return ResponseEntity.status(ApiErrorHttpStatusMapper.map(PresentationErrorCode.MISSING_HEADER))</span>
<span class="fc" id="L160"> .body(apiResultFactory.failure(</span>
<span class="fc" id="L161"> PresentationErrorCode.MISSING_HEADER.code(),</span>
<span class="fc" id="L162"> PresentationErrorCode.MISSING_HEADER.message()</span>
));
}
@ExceptionHandler(ServletRequestBindingException.class)
public ResponseEntity&lt;ApiResult&lt;Void&gt;&gt; handleServletRequestBindingException(
ServletRequestBindingException exception,
HttpServletRequest request
) {
<span class="fc" id="L171"> log.warn(&quot;Request binding failed. method={} requestPath={} errorCode={}&quot;,</span>
<span class="fc" id="L172"> request.getMethod(),</span>
<span class="fc" id="L173"> LogSanitizer.requestPath(request.getRequestURI()),</span>
<span class="fc" id="L174"> PresentationErrorCode.REQUEST_BINDING_FAILED.code());</span>
<span class="fc" id="L176"> return ResponseEntity.status(ApiErrorHttpStatusMapper.map(PresentationErrorCode.REQUEST_BINDING_FAILED))</span>
<span class="fc" id="L177"> .body(apiResultFactory.failure(</span>
<span class="fc" id="L178"> PresentationErrorCode.REQUEST_BINDING_FAILED.code(),</span>
<span class="fc" id="L179"> PresentationErrorCode.REQUEST_BINDING_FAILED.message()</span>
));
}
@ExceptionHandler(NoResourceFoundException.class)
public ResponseEntity&lt;ApiResult&lt;Void&gt;&gt; handleNoResourceFoundException(
NoResourceFoundException exception,
HttpServletRequest request
) {
<span class="fc" id="L188"> log.warn(&quot;No resource found. method={} requestPath={} resourcePath={} errorCode={}&quot;,</span>
<span class="fc" id="L189"> request.getMethod(),</span>
<span class="fc" id="L190"> LogSanitizer.requestPath(request.getRequestURI()),</span>
<span class="fc" id="L191"> LogSanitizer.requestPath(exception.getResourcePath()),</span>
<span class="fc" id="L192"> PresentationErrorCode.RESOURCE_NOT_FOUND.code());</span>
<span class="fc" id="L194"> return ResponseEntity.status(ApiErrorHttpStatusMapper.map(PresentationErrorCode.RESOURCE_NOT_FOUND))</span>
<span class="fc" id="L195"> .body(apiResultFactory.failure(</span>
<span class="fc" id="L196"> PresentationErrorCode.RESOURCE_NOT_FOUND.code(),</span>
<span class="fc" id="L197"> PresentationErrorCode.RESOURCE_NOT_FOUND.message()</span>
));
}
@ExceptionHandler(MaxUploadSizeExceededException.class)
public ResponseEntity&lt;ApiResult&lt;Void&gt;&gt; handleMaxUploadSizeExceededException(
MaxUploadSizeExceededException exception,
HttpServletRequest request
) {
<span class="fc" id="L206"> log.warn(&quot;Upload payload too large. method={} requestPath={} maxBytes={} errorCode={}&quot;,</span>
<span class="fc" id="L207"> request.getMethod(),</span>
<span class="fc" id="L208"> LogSanitizer.requestPath(request.getRequestURI()),</span>
<span class="fc" id="L209"> exception.getMaxUploadSize(),</span>
<span class="fc" id="L210"> PresentationErrorCode.PAYLOAD_TOO_LARGE.code());</span>
<span class="fc" id="L212"> return ResponseEntity.status(ApiErrorHttpStatusMapper.map(PresentationErrorCode.PAYLOAD_TOO_LARGE))</span>
<span class="fc" id="L213"> .body(apiResultFactory.failure(</span>
<span class="fc" id="L214"> PresentationErrorCode.PAYLOAD_TOO_LARGE.code(),</span>
<span class="fc" id="L215"> PresentationErrorCode.PAYLOAD_TOO_LARGE.message()</span>
));
}
/**
* 더 구체적인 핸들러로 잡히지 않은, 프레임워크가 직접 던진 상태 캐리어 예외 처리.
* 상위에서 결정된 4xx vs 5xx 분기가 클라이언트까지 보존되도록 carriedStatus를 그대로 사용한다.
*
* 본문 분류: 5xx는 내부 분류 노출을 막기 위해 COMMON-999로 정규화하고, 4xx는
* UNHANDLED_CLIENT_ERROR로 폴백한다. 클라이언트 SDK가 &quot;요청 잘못&quot; vs &quot;서버 결함&quot;
* 여전히 구분할 수 있게 하기 위함이다.
*
* ResponseStatusException과 ErrorResponseException은 둘 다 {@link ErrorResponse}를 구현하면서
* 동시에 {@link Throwable}을 상속하므로 로그 호출부의 (Throwable) 캐스트가 안전하다.
* 향후 Throwable이 아닌 ErrorResponse 구현체를 이 @ExceptionHandler 목록에 추가하면
* 런타임 ClassCastException이 발생하므로, 이 핸들러는 명시한 두 예외 타입으로만 한정한다.
*/
@ExceptionHandler({ResponseStatusException.class, ErrorResponseException.class})
public ResponseEntity&lt;ApiResult&lt;Void&gt;&gt; handleErrorResponseException(
ErrorResponse exception,
HttpServletRequest request
) {
<span class="fc" id="L237"> HttpStatusCode carriedStatus = exception.getStatusCode();</span>
<span class="fc" id="L238"> int statusValue = carriedStatus.value();</span>
<span class="fc bfc" id="L240" title="All 2 branches covered."> if (statusValue &gt;= 500) {</span>
<span class="fc" id="L241"> log.error(&quot;Framework-thrown 5xx status. method={} requestPath={} status={}&quot;,</span>
<span class="fc" id="L242"> request.getMethod(),</span>
<span class="fc" id="L243"> LogSanitizer.requestPath(request.getRequestURI()),</span>
<span class="fc" id="L244"> statusValue,</span>
(Throwable) exception);
<span class="fc" id="L246"> return ResponseEntity.status(carriedStatus)</span>
<span class="fc" id="L247"> .body(apiResultFactory.failure(</span>
<span class="fc" id="L248"> CommonErrorCode.INTERNAL_SERVER_ERROR.code(),</span>
<span class="fc" id="L249"> CommonErrorCode.INTERNAL_SERVER_ERROR.message()</span>
));
}
<span class="fc" id="L253"> log.warn(&quot;Framework-thrown 4xx status. method={} requestPath={} status={} errorCode={}&quot;,</span>
<span class="fc" id="L254"> request.getMethod(),</span>
<span class="fc" id="L255"> LogSanitizer.requestPath(request.getRequestURI()),</span>
<span class="fc" id="L256"> statusValue,</span>
<span class="fc" id="L257"> PresentationErrorCode.UNHANDLED_CLIENT_ERROR.code());</span>
<span class="fc" id="L258"> return ResponseEntity.status(carriedStatus)</span>
<span class="fc" id="L259"> .body(apiResultFactory.failure(</span>
<span class="fc" id="L260"> PresentationErrorCode.UNHANDLED_CLIENT_ERROR.code(),</span>
<span class="fc" id="L261"> PresentationErrorCode.UNHANDLED_CLIENT_ERROR.message()</span>
));
}
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
@@ -0,0 +1,230 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>ValidationExceptionHandler.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <a href="index.source.html" class="el_package">com.project.auth.presentation.support.exception</a> &gt; <span class="el_source">ValidationExceptionHandler.java</span></div><h1>ValidationExceptionHandler.java</h1><pre class="source lang-java linenums">package com.project.auth.presentation.support.exception;
import com.project.auth.presentation.support.response.ApiResult;
import com.project.auth.presentation.support.response.ApiResultFactory;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import jakarta.validation.Path;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.context.MessageSourceResolvable;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.HandlerMethodValidationException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@RestControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE + 10)
public class ValidationExceptionHandler {
/**
* 필드와 연결되지 않은 클래스 레벨/cross-field 검증 실패(예: DTO의 {@code @AssertTrue},
* 커스텀 클래스 레벨 {@code ConstraintValidator})를 담는 버킷 키.
*
* 이 버킷이 없으면 ObjectError가 조용히 폐기되어 클라이언트는 {@code errors: {}}만 받고
* 어디가 잘못됐는지 알 수 없다.
*/
public static final String GLOBAL_ERROR_KEY = &quot;__global__&quot;;
/**
* {@code getDefaultMessage()}와 {@code error.code()}가 모두 null/공백인 경우의 폴백 메시지.
*
* Bean Validation은 MessageSource로 해석되는 메시지 코드만 정의된 케이스를 허용하며,
* 이때 getDefaultMessage()는 null을 반환할 수 있다. 이 sentinel이 없으면 응답 errors에
* {@code [null]} 항목이 그대로 들어간다.
*/
static final String UNRESOLVED_VIOLATION_MESSAGE = &quot;validation failed&quot;;
<span class="fc" id="L48"> private static final Logger log = LoggerFactory.getLogger(ValidationExceptionHandler.class);</span>
private final ApiResultFactory apiResultFactory;
<span class="fc" id="L52"> public ValidationExceptionHandler(ApiResultFactory apiResultFactory) {</span>
<span class="fc" id="L53"> this.apiResultFactory = apiResultFactory;</span>
<span class="fc" id="L54"> }</span>
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity&lt;ApiResult&lt;Void&gt;&gt; handleValidationException(
MethodArgumentNotValidException exception
) {
<span class="fc" id="L60"> Map&lt;String, List&lt;String&gt;&gt; errors = new LinkedHashMap&lt;&gt;();</span>
<span class="fc bfc" id="L61" title="All 2 branches covered."> for (FieldError fieldError : exception.getBindingResult().getFieldErrors()) {</span>
<span class="fc" id="L62"> errors.computeIfAbsent(fieldFieldToJsonPointer(fieldError.getField()), k -&gt; new ArrayList&lt;&gt;())</span>
<span class="fc" id="L63"> .add(resolveMessage(fieldError.getDefaultMessage(), fieldError.getCode()));</span>
<span class="fc" id="L64"> }</span>
<span class="fc bfc" id="L65" title="All 2 branches covered."> for (ObjectError globalError : exception.getBindingResult().getGlobalErrors()) {</span>
<span class="fc" id="L66"> errors.computeIfAbsent(GLOBAL_ERROR_KEY, k -&gt; new ArrayList&lt;&gt;())</span>
<span class="fc" id="L67"> .add(resolveMessage(globalError.getDefaultMessage(), globalError.getCode()));</span>
<span class="fc" id="L68"> }</span>
<span class="fc" id="L70"> log.warn(&quot;Validation failed: {}&quot;, errors);</span>
<span class="fc" id="L72"> return ResponseEntity.status(ApiErrorHttpStatusMapper.map(PresentationErrorCode.INVALID_INPUT))</span>
<span class="fc" id="L73"> .body(apiResultFactory.failure(</span>
<span class="fc" id="L74"> PresentationErrorCode.INVALID_INPUT.code(),</span>
<span class="fc" id="L75"> PresentationErrorCode.INVALID_INPUT.message(),</span>
errors
));
}
@ExceptionHandler(ConstraintViolationException.class)
public ResponseEntity&lt;ApiResult&lt;Void&gt;&gt; handleConstraintViolationException(
ConstraintViolationException exception
) {
<span class="fc" id="L84"> Map&lt;String, List&lt;String&gt;&gt; errors = new LinkedHashMap&lt;&gt;();</span>
<span class="fc bfc" id="L85" title="All 2 branches covered."> for (ConstraintViolation&lt;?&gt; violation : exception.getConstraintViolations()) {</span>
<span class="fc" id="L86"> String pointer = toJsonPointer(violation.getPropertyPath());</span>
<span class="fc" id="L87"> errors.computeIfAbsent(pointer, k -&gt; new ArrayList&lt;&gt;())</span>
<span class="fc" id="L88"> .add(resolveMessage(violation.getMessage(), null));</span>
<span class="fc" id="L89"> }</span>
<span class="fc" id="L91"> log.warn(&quot;Constraint violation: {}&quot;, errors);</span>
<span class="fc" id="L93"> return ResponseEntity.status(ApiErrorHttpStatusMapper.map(PresentationErrorCode.CONSTRAINT_VIOLATION))</span>
<span class="fc" id="L94"> .body(apiResultFactory.failure(</span>
<span class="fc" id="L95"> PresentationErrorCode.CONSTRAINT_VIOLATION.code(),</span>
<span class="fc" id="L96"> PresentationErrorCode.CONSTRAINT_VIOLATION.message(),</span>
errors
));
}
@ExceptionHandler(HandlerMethodValidationException.class)
public ResponseEntity&lt;ApiResult&lt;Void&gt;&gt; handleHandlerMethodValidationException(
HandlerMethodValidationException exception
) {
<span class="fc" id="L105"> Map&lt;String, List&lt;String&gt;&gt; errors = new LinkedHashMap&lt;&gt;();</span>
<span class="fc" id="L106"> int unnamedCounter = 0;</span>
<span class="fc bfc" id="L107" title="All 2 branches covered."> for (var result : exception.getValueResults()) {</span>
<span class="fc" id="L108"> String paramName = result.getMethodParameter().getParameterName();</span>
String key;
<span class="fc bfc" id="L110" title="All 2 branches covered."> if (paramName != null) {</span>
<span class="fc" id="L111"> key = fieldFieldToJsonPointer(paramName);</span>
} else {
<span class="fc" id="L113"> key = fieldFieldToJsonPointer(&quot;unknown_&quot; + result.getMethodParameter().getParameterIndex());</span>
<span class="fc" id="L114"> unnamedCounter++;</span>
}
<span class="fc bfc" id="L116" title="All 2 branches covered."> for (MessageSourceResolvable error : result.getResolvableErrors()) {</span>
<span class="fc" id="L117"> String[] codes = error.getCodes();</span>
<span class="pc bpc" id="L118" title="2 of 4 branches missed."> String firstCode = codes != null &amp;&amp; codes.length &gt; 0 ? codes[0] : null;</span>
<span class="fc" id="L119"> errors.computeIfAbsent(key, k -&gt; new ArrayList&lt;&gt;())</span>
<span class="fc" id="L120"> .add(resolveMessage(error.getDefaultMessage(), firstCode));</span>
<span class="fc" id="L121"> }</span>
<span class="fc" id="L122"> }</span>
<span class="fc bfc" id="L123" title="All 2 branches covered."> if (unnamedCounter &gt; 0) {</span>
<span class="fc" id="L124"> log.warn(&quot;Handler method validation: {} unnamed parameter(s); compile with -parameters to recover names&quot;,</span>
<span class="fc" id="L125"> unnamedCounter);</span>
}
<span class="fc" id="L128"> log.warn(&quot;Handler method validation failed: {}&quot;, errors);</span>
<span class="fc" id="L130"> return ResponseEntity.status(ApiErrorHttpStatusMapper.map(PresentationErrorCode.INVALID_PARAMETER))</span>
<span class="fc" id="L131"> .body(apiResultFactory.failure(</span>
<span class="fc" id="L132"> PresentationErrorCode.INVALID_PARAMETER.code(),</span>
<span class="fc" id="L133"> PresentationErrorCode.INVALID_PARAMETER.message(),</span>
errors
));
}
/**
* Bean Validation의 propertyPath를 JSON Pointer(RFC 6901) 형식으로 변환한다.
* 예) {@code users[0].email} -&gt; {@code /users/0/email}
*
* 서로 다른 파라미터가 우연히 같은 필드명으로 끝나도 충돌이 발생하지 않으며,
* 클라이언트 입장에서 모호함이 없는 형식이다.
* 메서드 파라미터 접두사(예: {@code findUser.id})는 출처 파라미터를 식별하므로
* 첫 pointer 세그먼트로 보존한다.
*/
private static String toJsonPointer(Path path) {
<span class="fc" id="L148"> StringBuilder builder = new StringBuilder();</span>
<span class="fc bfc" id="L149" title="All 2 branches covered."> for (Path.Node node : path) {</span>
<span class="fc" id="L150"> String name = node.getName();</span>
<span class="pc bpc" id="L151" title="1 of 2 branches missed."> if (name == null) {</span>
<span class="nc" id="L152"> continue;</span>
}
<span class="fc" id="L154"> builder.append('/').append(escapeJsonPointerSegment(name));</span>
<span class="fc" id="L155"> Integer index = node.getIndex();</span>
<span class="pc bpc" id="L156" title="1 of 2 branches missed."> if (index != null) {</span>
<span class="nc" id="L157"> builder.append('/').append(index);</span>
<span class="pc bpc" id="L158" title="1 of 2 branches missed."> } else if (node.getKey() != null) {</span>
<span class="nc" id="L159"> builder.append('/').append(escapeJsonPointerSegment(String.valueOf(node.getKey())));</span>
}
<span class="fc" id="L161"> }</span>
<span class="pc bpc" id="L162" title="1 of 2 branches missed."> return builder.length() == 0 ? &quot;/&quot; : builder.toString();</span>
}
private static String escapeJsonPointerSegment(String segment) {
<span class="fc" id="L166"> return segment.replace(&quot;~&quot;, &quot;~0&quot;).replace(&quot;/&quot;, &quot;~1&quot;);</span>
}
/**
* Spring {@code BindingResult.FieldError#getField()} 형식(예: {@code user.email},
* {@code items[0].name})을 JSON Pointer(RFC 6901)로 변환한다.
* ConstraintViolationException 핸들러와 키 형식을 통일하여, 응답 errors 맵의 키 규약을
* 단일화한다(클라이언트가 두 가지 형식을 분기 처리할 필요가 없게 한다).
*/
static String fieldFieldToJsonPointer(String field) {
<span class="fc bfc" id="L176" title="All 4 branches covered."> if (field == null || field.isEmpty()) {</span>
<span class="fc" id="L177"> return &quot;/&quot;;</span>
}
<span class="fc" id="L179"> StringBuilder builder = new StringBuilder();</span>
<span class="fc" id="L180"> int index = 0;</span>
<span class="fc" id="L181"> int length = field.length();</span>
<span class="fc bfc" id="L182" title="All 2 branches covered."> while (index &lt; length) {</span>
<span class="fc" id="L183"> char ch = field.charAt(index);</span>
<span class="fc bfc" id="L184" title="All 2 branches covered."> if (ch == '.') {</span>
<span class="fc" id="L185"> index++;</span>
<span class="fc" id="L186"> continue;</span>
}
<span class="fc bfc" id="L188" title="All 2 branches covered."> if (ch == '[') {</span>
<span class="fc" id="L189"> int end = field.indexOf(']', index);</span>
<span class="pc bpc" id="L190" title="1 of 2 branches missed."> if (end == -1) {</span>
<span class="nc" id="L191"> builder.append('/').append(escapeJsonPointerSegment(field.substring(index)));</span>
<span class="nc" id="L192"> break;</span>
}
<span class="fc" id="L194"> builder.append('/').append(escapeJsonPointerSegment(field.substring(index + 1, end)));</span>
<span class="fc" id="L195"> index = end + 1;</span>
<span class="fc" id="L196"> continue;</span>
}
<span class="fc" id="L198"> int nextDot = field.indexOf('.', index);</span>
<span class="fc" id="L199"> int nextBracket = field.indexOf('[', index);</span>
<span class="fc" id="L200"> int next = minNonNegative(nextDot, nextBracket);</span>
<span class="fc bfc" id="L201" title="All 2 branches covered."> if (next == -1) {</span>
<span class="fc" id="L202"> next = length;</span>
}
<span class="fc" id="L204"> builder.append('/').append(escapeJsonPointerSegment(field.substring(index, next)));</span>
<span class="fc" id="L205"> index = next;</span>
<span class="fc" id="L206"> }</span>
<span class="pc bpc" id="L207" title="1 of 2 branches missed."> return builder.length() == 0 ? &quot;/&quot; : builder.toString();</span>
}
private static int minNonNegative(int a, int b) {
<span class="fc bfc" id="L211" title="All 2 branches covered."> if (a &lt; 0) {</span>
<span class="fc" id="L212"> return b;</span>
}
<span class="fc bfc" id="L214" title="All 2 branches covered."> if (b &lt; 0) {</span>
<span class="fc" id="L215"> return a;</span>
}
<span class="fc" id="L217"> return Math.min(a, b);</span>
}
private static String resolveMessage(String defaultMessage, String fallbackCode) {
<span class="pc bpc" id="L221" title="1 of 4 branches missed."> if (defaultMessage != null &amp;&amp; !defaultMessage.isBlank()) {</span>
<span class="fc" id="L222"> return defaultMessage;</span>
}
<span class="pc bpc" id="L224" title="2 of 4 branches missed."> if (fallbackCode != null &amp;&amp; !fallbackCode.isBlank()) {</span>
<span class="fc" id="L225"> return fallbackCode;</span>
}
<span class="nc" id="L227"> return UNRESOLVED_VIOLATION_MESSAGE;</span>
}
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>ApiResult</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <a href="index.html" class="el_package">com.project.auth.presentation.support.response</a> &gt; <span class="el_class">ApiResult</span></div><h1>ApiResult</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">0 of 24</td><td class="ctr2">100%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">0</td><td class="ctr2">1</td><td class="ctr1">0</td><td class="ctr2">1</td><td class="ctr1">0</td><td class="ctr2">1</td></tr></tfoot><tbody><tr><td id="a0"><a href="ApiResult.java.html#L22" class="el_method">ApiResult(boolean, String, String, Object, Map, String, String)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/greenbar.gif" width="120" height="10" title="24" alt="24"/></td><td class="ctr2" id="c0">100%</td><td class="bar" id="d0"/><td class="ctr2" id="e0">n/a</td><td class="ctr1" id="f0">0</td><td class="ctr2" id="g0">1</td><td class="ctr1" id="h0">0</td><td class="ctr2" id="i0">1</td><td class="ctr1" id="j0">0</td><td class="ctr2" id="k0">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>ApiResult.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <a href="index.source.html" class="el_package">com.project.auth.presentation.support.response</a> &gt; <span class="el_source">ApiResult.java</span></div><h1>ApiResult.java</h1><pre class="source lang-java linenums">package com.project.auth.presentation.support.response;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.util.List;
import java.util.Map;
/**
* 모든 API 응답의 통일된 응답 봉투(envelope).
*
* &lt;ul&gt;
* &lt;li&gt;{@code data}: 성공 응답의 페이로드. 실패 시에는 null.&lt;/li&gt;
* &lt;li&gt;{@code errors}: 검증/cross-field 에러 메시지의 키-리스트 맵. 검증 실패에서만
* 채워진다. 필드 레벨 진단이 없으면 null. {@code data}와 분리해서 OpenAPI 스펙이
* {@code data}를 도메인 타입과 에러 맵의 oneOf로 모델링할 필요가 없게 한다.&lt;/li&gt;
* &lt;/ul&gt;
*
* null 필드는 JSON 직렬화 시 제외하여, 성공 응답에 {@code &quot;errors&quot;: null} 잡음이나
* 실패 응답에 {@code &quot;data&quot;: null}이 따라붙지 않도록 한다.
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
<span class="fc" id="L22">public record ApiResult&lt;T&gt;(</span>
boolean success,
String code,
String message,
T data,
Map&lt;String, List&lt;String&gt;&gt; errors,
String traceId,
String timestamp
) {
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>ApiSuccessCode</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <a href="index.html" class="el_package">com.project.auth.presentation.support.response</a> &gt; <span class="el_class">ApiSuccessCode</span></div><h1>ApiSuccessCode</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">28 of 28</td><td class="ctr2">0%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">4</td><td class="ctr2">4</td><td class="ctr1">8</td><td class="ctr2">8</td><td class="ctr1">4</td><td class="ctr2">4</td></tr></tfoot><tbody><tr><td id="a0"><a href="ApiSuccessCode.java.html#L9" class="el_method">ApiSuccessCode(String, int, String, String)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="11" alt="11"/></td><td class="ctr2" id="c0">0%</td><td class="bar" id="d0"/><td class="ctr2" id="e0">n/a</td><td class="ctr1" id="f0">1</td><td class="ctr2" id="g0">1</td><td class="ctr1" id="h0">4</td><td class="ctr2" id="i0">4</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a3"><a href="ApiSuccessCode.java.html#L3" class="el_method">static {...}</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="11" alt="11"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d1"/><td class="ctr2" id="e1">n/a</td><td class="ctr1" id="f1">1</td><td class="ctr2" id="g1">1</td><td class="ctr1" id="h1">2</td><td class="ctr2" id="i1">2</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a1"><a href="ApiSuccessCode.java.html#L15" class="el_method">code()</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="32" height="10" title="3" alt="3"/></td><td class="ctr2" id="c2">0%</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">1</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">1</td><td class="ctr2" id="i2">1</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a2"><a href="ApiSuccessCode.java.html#L19" class="el_method">message()</a></td><td class="bar" id="b3"><img src="../jacoco-resources/redbar.gif" width="32" height="10" title="3" alt="3"/></td><td class="ctr2" id="c3">0%</td><td class="bar" id="d3"/><td class="ctr2" id="e3">n/a</td><td class="ctr1" id="f3">1</td><td class="ctr2" id="g3">1</td><td class="ctr1" id="h3">1</td><td class="ctr2" id="i3">1</td><td class="ctr1" id="j3">1</td><td class="ctr2" id="k3">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>ApiSuccessCode.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <a href="index.source.html" class="el_package">com.project.auth.presentation.support.response</a> &gt; <span class="el_source">ApiSuccessCode.java</span></div><h1>ApiSuccessCode.java</h1><pre class="source lang-java linenums">package com.project.auth.presentation.support.response;
<span class="nc" id="L3">public enum ApiSuccessCode {</span>
<span class="nc" id="L4"> AUTHENTICATED_USER_LOADED(&quot;AUTHENTICATED_USER_LOADED&quot;, &quot;현재 사용자 조회가 완료되었습니다.&quot;);</span>
private final String code;
private final String message;
<span class="nc" id="L9"> ApiSuccessCode(String code, String message) {</span>
<span class="nc" id="L10"> this.code = code;</span>
<span class="nc" id="L11"> this.message = message;</span>
<span class="nc" id="L12"> }</span>
public String code() {
<span class="nc" id="L15"> return code;</span>
}
public String message() {
<span class="nc" id="L19"> return message;</span>
}
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>com.project.auth.presentation.support.response</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb', 'coveragetable'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="index.source.html" class="el_source">Source Files</a><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <span class="el_package">com.project.auth.presentation.support.response</span></div><h1>com.project.auth.presentation.support.response</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td><td class="sortable ctr1" id="l" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="m" onclick="toggleSort(this)">Classes</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">28 of 52</td><td class="ctr2">46%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">4</td><td class="ctr2">5</td><td class="ctr1">8</td><td class="ctr2">9</td><td class="ctr1">4</td><td class="ctr2">5</td><td class="ctr1">1</td><td class="ctr2">2</td></tr></tfoot><tbody><tr><td id="a1"><a href="ApiSuccessCode.html" class="el_class">ApiSuccessCode</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="28" alt="28"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d0"/><td class="ctr2" id="e0">n/a</td><td class="ctr1" id="f0">4</td><td class="ctr2" id="g0">4</td><td class="ctr1" id="h0">8</td><td class="ctr2" id="i0">8</td><td class="ctr1" id="j0">4</td><td class="ctr2" id="k0">4</td><td class="ctr1" id="l0">1</td><td class="ctr2" id="m0">1</td></tr><tr><td id="a0"><a href="ApiResult.html" class="el_class">ApiResult</a></td><td class="bar" id="b1"><img src="../jacoco-resources/greenbar.gif" width="102" height="10" title="24" alt="24"/></td><td class="ctr2" id="c0">100%</td><td class="bar" id="d1"/><td class="ctr2" id="e1">n/a</td><td class="ctr1" id="f1">0</td><td class="ctr2" id="g1">1</td><td class="ctr1" id="h1">0</td><td class="ctr2" id="i1">1</td><td class="ctr1" id="j1">0</td><td class="ctr2" id="k1">1</td><td class="ctr1" id="l1">0</td><td class="ctr2" id="m1">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>com.project.auth.presentation.support.response</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb', 'coveragetable'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="index.html" class="el_class">Classes</a><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">presentation</a> &gt; <span class="el_package">com.project.auth.presentation.support.response</span></div><h1>com.project.auth.presentation.support.response</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td><td class="sortable ctr1" id="l" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="m" onclick="toggleSort(this)">Classes</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">28 of 52</td><td class="ctr2">46%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">4</td><td class="ctr2">5</td><td class="ctr1">8</td><td class="ctr2">9</td><td class="ctr1">4</td><td class="ctr2">5</td><td class="ctr1">1</td><td class="ctr2">2</td></tr></tfoot><tbody><tr><td id="a1"><a href="ApiSuccessCode.java.html" class="el_source">ApiSuccessCode.java</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="120" height="10" title="28" alt="28"/></td><td class="ctr2" id="c1">0%</td><td class="bar" id="d0"/><td class="ctr2" id="e0">n/a</td><td class="ctr1" id="f0">4</td><td class="ctr2" id="g0">4</td><td class="ctr1" id="h0">8</td><td class="ctr2" id="i0">8</td><td class="ctr1" id="j0">4</td><td class="ctr2" id="k0">4</td><td class="ctr1" id="l0">1</td><td class="ctr2" id="m0">1</td></tr><tr><td id="a0"><a href="ApiResult.java.html" class="el_source">ApiResult.java</a></td><td class="bar" id="b1"><img src="../jacoco-resources/greenbar.gif" width="102" height="10" title="24" alt="24"/></td><td class="ctr2" id="c0">100%</td><td class="bar" id="d1"/><td class="ctr2" id="e1">n/a</td><td class="ctr1" id="f1">0</td><td class="ctr2" id="g1">1</td><td class="ctr1" id="h1">0</td><td class="ctr2" id="i1">1</td><td class="ctr1" id="j1">0</td><td class="ctr2" id="k1">1</td><td class="ctr1" id="l1">0</td><td class="ctr2" id="m1">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html>
File diff suppressed because one or more lines are too long
@@ -0,0 +1,13 @@
/* Pretty printing styles. Used with prettify.js. */
.str { color: #2A00FF; }
.kwd { color: #7F0055; font-weight:bold; }
.com { color: #3F5FBF; }
.typ { color: #606; }
.lit { color: #066; }
.pun { color: #660; }
.pln { color: #000; }
.tag { color: #008; }
.atn { color: #606; }
.atv { color: #080; }
.dec { color: #606; }
@@ -0,0 +1,243 @@
body, td {
font-family:sans-serif;
font-size:10pt;
}
h1 {
font-weight:bold;
font-size:18pt;
}
.breadcrumb {
border:#d6d3ce 1px solid;
padding:2px 4px 2px 4px;
}
.breadcrumb .info {
float:right;
}
.breadcrumb .info a {
margin-left:8px;
}
.el_report {
padding-left:18px;
background-image:url(report.gif);
background-position:left center;
background-repeat:no-repeat;
}
.el_group {
padding-left:18px;
background-image:url(group.gif);
background-position:left center;
background-repeat:no-repeat;
}
.el_bundle {
padding-left:18px;
background-image:url(bundle.gif);
background-position:left center;
background-repeat:no-repeat;
}
.el_package {
padding-left:18px;
background-image:url(package.gif);
background-position:left center;
background-repeat:no-repeat;
}
.el_class {
padding-left:18px;
background-image:url(class.gif);
background-position:left center;
background-repeat:no-repeat;
}
.el_source {
padding-left:18px;
background-image:url(source.gif);
background-position:left center;
background-repeat:no-repeat;
}
.el_method {
padding-left:18px;
background-image:url(method.gif);
background-position:left center;
background-repeat:no-repeat;
}
.el_session {
padding-left:18px;
background-image:url(session.gif);
background-position:left center;
background-repeat:no-repeat;
}
pre.source {
border:#d6d3ce 1px solid;
font-family:monospace;
}
pre.source ol {
margin-bottom: 0px;
margin-top: 0px;
}
pre.source li {
border-left: 1px solid #D6D3CE;
color: #A0A0A0;
padding-left: 0px;
}
pre.source span.fc {
background-color:#ccffcc;
}
pre.source span.nc {
background-color:#ffaaaa;
}
pre.source span.pc {
background-color:#ffffcc;
}
pre.source span.bfc {
background-image: url(branchfc.gif);
background-repeat: no-repeat;
background-position: 2px center;
}
pre.source span.bfc:hover {
background-color:#80ff80;
}
pre.source span.bnc {
background-image: url(branchnc.gif);
background-repeat: no-repeat;
background-position: 2px center;
}
pre.source span.bnc:hover {
background-color:#ff8080;
}
pre.source span.bpc {
background-image: url(branchpc.gif);
background-repeat: no-repeat;
background-position: 2px center;
}
pre.source span.bpc:hover {
background-color:#ffff80;
}
table.coverage {
empty-cells:show;
border-collapse:collapse;
}
table.coverage thead {
background-color:#e0e0e0;
}
table.coverage thead td {
white-space:nowrap;
padding:2px 14px 0px 6px;
border-bottom:#b0b0b0 1px solid;
}
table.coverage thead td.bar {
border-left:#cccccc 1px solid;
}
table.coverage thead td.ctr1 {
text-align:right;
border-left:#cccccc 1px solid;
}
table.coverage thead td.ctr2 {
text-align:right;
padding-left:2px;
}
table.coverage thead td.sortable {
cursor:pointer;
background-image:url(sort.gif);
background-position:right center;
background-repeat:no-repeat;
}
table.coverage thead td.up {
background-image:url(up.gif);
}
table.coverage thead td.down {
background-image:url(down.gif);
}
table.coverage tbody td {
white-space:nowrap;
padding:2px 6px 2px 6px;
border-bottom:#d6d3ce 1px solid;
}
table.coverage tbody tr:hover {
background: #f0f0d0 !important;
}
table.coverage tbody td.bar {
border-left:#e8e8e8 1px solid;
}
table.coverage tbody td.ctr1 {
text-align:right;
padding-right:14px;
border-left:#e8e8e8 1px solid;
}
table.coverage tbody td.ctr2 {
text-align:right;
padding-right:14px;
padding-left:2px;
}
table.coverage tfoot td {
white-space:nowrap;
padding:2px 6px 2px 6px;
}
table.coverage tfoot td.bar {
border-left:#e8e8e8 1px solid;
}
table.coverage tfoot td.ctr1 {
text-align:right;
padding-right:14px;
border-left:#e8e8e8 1px solid;
}
table.coverage tfoot td.ctr2 {
text-align:right;
padding-right:14px;
padding-left:2px;
}
.footer {
margin-top:20px;
border-top:#d6d3ce 1px solid;
padding-top:2px;
font-size:8pt;
color:#a0a0a0;
}
.footer a {
color:#a0a0a0;
}
.right {
float:right;
}
@@ -0,0 +1,148 @@
/*******************************************************************************
* Copyright (c) 2009, 2025 Mountainminds GmbH & Co. KG and Contributors
* This program and the accompanying materials are made available under
* the terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Marc R. Hoffmann - initial API and implementation
*
*******************************************************************************/
(function () {
/**
* Sets the initial sorting derived from the hash.
*
* @param linkelementids
* list of element ids to search for links to add sort inidcator
* hash links
*/
function initialSort(linkelementids) {
window.linkelementids = linkelementids;
var hash = window.location.hash;
if (hash) {
var m = hash.match(/up-./);
if (m) {
var header = window.document.getElementById(m[0].charAt(3));
if (header) {
sortColumn(header, true);
}
return;
}
var m = hash.match(/dn-./);
if (m) {
var header = window.document.getElementById(m[0].charAt(3));
if (header) {
sortColumn(header, false);
}
return
}
}
}
/**
* Sorts the columns with the given header dependening on the current sort state.
*/
function toggleSort(header) {
var sortup = header.className.indexOf('down ') == 0;
sortColumn(header, sortup);
}
/**
* Sorts the columns with the given header in the given direction.
*/
function sortColumn(header, sortup) {
var table = header.parentNode.parentNode.parentNode;
var body = table.tBodies[0];
var colidx = getNodePosition(header);
resetSortedStyle(table);
var rows = body.rows;
var sortedrows = [];
for (var i = 0; i < rows.length; i++) {
r = rows[i];
sortedrows[parseInt(r.childNodes[colidx].id.slice(1))] = r;
}
var hash;
if (sortup) {
for (var i = sortedrows.length - 1; i >= 0; i--) {
body.appendChild(sortedrows[i]);
}
header.className = 'up ' + header.className;
hash = 'up-' + header.id;
} else {
for (var i = 0; i < sortedrows.length; i++) {
body.appendChild(sortedrows[i]);
}
header.className = 'down ' + header.className;
hash = 'dn-' + header.id;
}
setHash(hash);
}
/**
* Adds the sort indicator as a hash to the document URL and all links.
*/
function setHash(hash) {
window.document.location.hash = hash;
ids = window.linkelementids;
for (var i = 0; i < ids.length; i++) {
setHashOnAllLinks(document.getElementById(ids[i]), hash);
}
}
/**
* Extend all links within the given tag with the given hash.
*/
function setHashOnAllLinks(tag, hash) {
links = tag.getElementsByTagName("a");
for (var i = 0; i < links.length; i++) {
var a = links[i];
var href = a.href;
var hashpos = href.indexOf("#");
if (hashpos != -1) {
href = href.substring(0, hashpos);
}
a.href = href + "#" + hash;
}
}
/**
* Calculates the position of a element within its parent.
*/
function getNodePosition(element) {
var pos = -1;
while (element) {
element = element.previousSibling;
pos++;
}
return pos;
}
/**
* Remove the sorting indicator style from all headers.
*/
function resetSortedStyle(table) {
for (var c = table.tHead.firstChild.firstChild; c; c = c.nextSibling) {
if (c.className) {
if (c.className.indexOf('down ') == 0) {
c.className = c.className.slice(5);
}
if (c.className.indexOf('up ') == 0) {
c.className = c.className.slice(3);
}
}
}
}
window['initialSort'] = initialSort;
window['toggleSort'] = toggleSort;
})();
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,90 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../style.css">
</head>
<body>
<h1>Pit Test Coverage Report</h1>
<h2>Package Summary</h2>
<h3>com.project.auth.presentation.support.exception</h3>
<table>
<thead>
<tr>
<th>Number of Classes</th>
<th>Line Coverage</th>
<th>Mutation Coverage</th>
<th>Test Strength</th>
</tr>
</thead>
<tbody>
<tr>
<td>5</td>
<td>97% <div class="coverage_bar"><div class="coverage_complete width-97"></div><div class="coverage_legend">283/291</div></div></td>
<td>79% <div class="coverage_bar"><div class="coverage_complete width-79"></div><div class="coverage_legend">58/73</div></div></td>
<td>81% <div class="coverage_bar"><div class="coverage_complete width-81"></div><div class="coverage_legend">58/72</div></div></td>
</tr>
</tbody>
</table>
<h3>Breakdown by Class</h3>
<table>
<thead>
<tr>
<th>Name</th>
<th>Line Coverage</th>
<th>Mutation Coverage</th>
<th>Test Strength</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="./ApiErrorHttpStatusMapper.java.html">ApiErrorHttpStatusMapper.java</a></td>
<td><div class="coverage_percentage">92% </div><div class="coverage_bar"><div class="coverage_complete width-92"></div><div class="coverage_legend">24/26</div></div></td>
<td><div class="coverage_percentage">100% </div><div class="coverage_bar"><div class="coverage_complete width-100"></div><div class="coverage_legend">4/4</div></div></td>
<td><div class="coverage_percentage">100% </div><div class="coverage_bar"><div class="coverage_complete width-100"></div><div class="coverage_legend">4/4</div></div></td>
</tr>
<tr>
<td><a href="./ApplicationExceptionHandler.java.html">ApplicationExceptionHandler.java</a></td>
<td><div class="coverage_percentage">100% </div><div class="coverage_bar"><div class="coverage_complete width-100"></div><div class="coverage_legend">29/29</div></div></td>
<td><div class="coverage_percentage">100% </div><div class="coverage_bar"><div class="coverage_complete width-100"></div><div class="coverage_legend">5/5</div></div></td>
<td><div class="coverage_percentage">100% </div><div class="coverage_bar"><div class="coverage_complete width-100"></div><div class="coverage_legend">5/5</div></div></td>
</tr>
<tr>
<td><a href="./PresentationErrorCode.java.html">PresentationErrorCode.java</a></td>
<td><div class="coverage_percentage">100% </div><div class="coverage_bar"><div class="coverage_complete width-100"></div><div class="coverage_legend">22/22</div></div></td>
<td><div class="coverage_percentage">0% </div><div class="coverage_bar"><div class="coverage_complete width-0"></div><div class="coverage_legend">0/2</div></div></td>
<td><div class="coverage_percentage">0% </div><div class="coverage_bar"><div class="coverage_complete width-0"></div><div class="coverage_legend">0/2</div></div></td>
</tr>
<tr>
<td><a href="./RequestExceptionHandler.java.html">RequestExceptionHandler.java</a></td>
<td><div class="coverage_percentage">100% </div><div class="coverage_bar"><div class="coverage_complete width-100"></div><div class="coverage_legend">111/111</div></div></td>
<td><div class="coverage_percentage">93% </div><div class="coverage_bar"><div class="coverage_complete width-93"></div><div class="coverage_legend">13/14</div></div></td>
<td><div class="coverage_percentage">93% </div><div class="coverage_bar"><div class="coverage_complete width-93"></div><div class="coverage_legend">13/14</div></div></td>
</tr>
<tr>
<td><a href="./ValidationExceptionHandler.java.html">ValidationExceptionHandler.java</a></td>
<td><div class="coverage_percentage">94% </div><div class="coverage_bar"><div class="coverage_complete width-94"></div><div class="coverage_legend">97/103</div></div></td>
<td><div class="coverage_percentage">75% </div><div class="coverage_bar"><div class="coverage_complete width-75"></div><div class="coverage_legend">36/48</div></div></td>
<td><div class="coverage_percentage">77% </div><div class="coverage_bar"><div class="coverage_complete width-77"></div><div class="coverage_legend">36/47</div></div></td>
</tr>
</tbody>
</table>
<br/>
<hr/>
Report generated by <a href='https://pitest.org'>PIT</a> 1.19.1
</body>
</html>
@@ -0,0 +1,368 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../style.css">
</head>
<body>
<h1>ApiSuccessCode.java</h1>
<table class="src">
<tr>
<td class='na'>
<a name='org.pitest.mutationtest.report.html.SourceFile@44ea608c_1'/>
1
</td>
<td class=''>
<span class='pop'>
<a href='#grouporg.pitest.mutationtest.report.html.SourceFile@44ea608c_1'></a>
<span>
</span>
</span>
</td>
<td class=''><pre><span class=''>package com.project.auth.presentation.support.response;</span></pre></td></tr>
<tr>
<td class='na'>
<a name='org.pitest.mutationtest.report.html.SourceFile@44ea608c_2'/>
2
</td>
<td class=''>
<span class='pop'>
<a href='#grouporg.pitest.mutationtest.report.html.SourceFile@44ea608c_2'></a>
<span>
</span>
</span>
</td>
<td class=''><pre><span class=''></span></pre></td></tr>
<tr>
<td class='uncovered'>
<a name='org.pitest.mutationtest.report.html.SourceFile@44ea608c_3'/>
3
</td>
<td class=''>
<span class='pop'>
<a href='#grouporg.pitest.mutationtest.report.html.SourceFile@44ea608c_3'></a>
<span>
</span>
</span>
</td>
<td class='uncovered'><pre><span class=''>public enum ApiSuccessCode {</span></pre></td></tr>
<tr>
<td class='uncovered'>
<a name='org.pitest.mutationtest.report.html.SourceFile@44ea608c_4'/>
4
</td>
<td class=''>
<span class='pop'>
<a href='#grouporg.pitest.mutationtest.report.html.SourceFile@44ea608c_4'></a>
<span>
</span>
</span>
</td>
<td class='uncovered'><pre><span class=''> AUTHENTICATED_USER_LOADED(&#34;AUTHENTICATED_USER_LOADED&#34;, &#34;&#54788;&#51116; &#49324;&#50857;&#51088; &#51312;&#54924;&#44032; &#50756;&#47308;&#46104;&#50632;&#49845;&#45768;&#45796;.&#34;);</span></pre></td></tr>
<tr>
<td class='na'>
<a name='org.pitest.mutationtest.report.html.SourceFile@44ea608c_5'/>
5
</td>
<td class=''>
<span class='pop'>
<a href='#grouporg.pitest.mutationtest.report.html.SourceFile@44ea608c_5'></a>
<span>
</span>
</span>
</td>
<td class=''><pre><span class=''></span></pre></td></tr>
<tr>
<td class='na'>
<a name='org.pitest.mutationtest.report.html.SourceFile@44ea608c_6'/>
6
</td>
<td class=''>
<span class='pop'>
<a href='#grouporg.pitest.mutationtest.report.html.SourceFile@44ea608c_6'></a>
<span>
</span>
</span>
</td>
<td class=''><pre><span class=''> private final String code;</span></pre></td></tr>
<tr>
<td class='na'>
<a name='org.pitest.mutationtest.report.html.SourceFile@44ea608c_7'/>
7
</td>
<td class=''>
<span class='pop'>
<a href='#grouporg.pitest.mutationtest.report.html.SourceFile@44ea608c_7'></a>
<span>
</span>
</span>
</td>
<td class=''><pre><span class=''> private final String message;</span></pre></td></tr>
<tr>
<td class='na'>
<a name='org.pitest.mutationtest.report.html.SourceFile@44ea608c_8'/>
8
</td>
<td class=''>
<span class='pop'>
<a href='#grouporg.pitest.mutationtest.report.html.SourceFile@44ea608c_8'></a>
<span>
</span>
</span>
</td>
<td class=''><pre><span class=''></span></pre></td></tr>
<tr>
<td class='uncovered'>
<a name='org.pitest.mutationtest.report.html.SourceFile@44ea608c_9'/>
9
</td>
<td class=''>
<span class='pop'>
<a href='#grouporg.pitest.mutationtest.report.html.SourceFile@44ea608c_9'></a>
<span>
</span>
</span>
</td>
<td class='uncovered'><pre><span class=''> ApiSuccessCode(String code, String message) {</span></pre></td></tr>
<tr>
<td class='uncovered'>
<a name='org.pitest.mutationtest.report.html.SourceFile@44ea608c_10'/>
10
</td>
<td class=''>
<span class='pop'>
<a href='#grouporg.pitest.mutationtest.report.html.SourceFile@44ea608c_10'></a>
<span>
</span>
</span>
</td>
<td class='uncovered'><pre><span class=''> this.code = code;</span></pre></td></tr>
<tr>
<td class='uncovered'>
<a name='org.pitest.mutationtest.report.html.SourceFile@44ea608c_11'/>
11
</td>
<td class=''>
<span class='pop'>
<a href='#grouporg.pitest.mutationtest.report.html.SourceFile@44ea608c_11'></a>
<span>
</span>
</span>
</td>
<td class='uncovered'><pre><span class=''> this.message = message;</span></pre></td></tr>
<tr>
<td class='uncovered'>
<a name='org.pitest.mutationtest.report.html.SourceFile@44ea608c_12'/>
12
</td>
<td class=''>
<span class='pop'>
<a href='#grouporg.pitest.mutationtest.report.html.SourceFile@44ea608c_12'></a>
<span>
</span>
</span>
</td>
<td class='uncovered'><pre><span class=''> }</span></pre></td></tr>
<tr>
<td class='na'>
<a name='org.pitest.mutationtest.report.html.SourceFile@44ea608c_13'/>
13
</td>
<td class=''>
<span class='pop'>
<a href='#grouporg.pitest.mutationtest.report.html.SourceFile@44ea608c_13'></a>
<span>
</span>
</span>
</td>
<td class=''><pre><span class=''></span></pre></td></tr>
<tr>
<td class='na'>
<a name='org.pitest.mutationtest.report.html.SourceFile@44ea608c_14'/>
14
</td>
<td class=''>
<span class='pop'>
<a href='#grouporg.pitest.mutationtest.report.html.SourceFile@44ea608c_14'></a>
<span>
</span>
</span>
</td>
<td class=''><pre><span class=''> public String code() {</span></pre></td></tr>
<tr>
<td class='uncovered'>
<a name='org.pitest.mutationtest.report.html.SourceFile@44ea608c_15'/>
15
</td>
<td class='survived'>
<span class='pop'>
<a href='#grouporg.pitest.mutationtest.report.html.SourceFile@44ea608c_15'>1</a>
<span>
1. code : replaced return value with &#34;&#34; for com/project/auth/presentation/support/response/ApiSuccessCode::code &rarr; NO_COVERAGE<br/>
</span>
</span>
</td>
<td class='uncovered'><pre><span class='survived'> return code;</span></pre></td></tr>
<tr>
<td class='na'>
<a name='org.pitest.mutationtest.report.html.SourceFile@44ea608c_16'/>
16
</td>
<td class=''>
<span class='pop'>
<a href='#grouporg.pitest.mutationtest.report.html.SourceFile@44ea608c_16'></a>
<span>
</span>
</span>
</td>
<td class=''><pre><span class=''> }</span></pre></td></tr>
<tr>
<td class='na'>
<a name='org.pitest.mutationtest.report.html.SourceFile@44ea608c_17'/>
17
</td>
<td class=''>
<span class='pop'>
<a href='#grouporg.pitest.mutationtest.report.html.SourceFile@44ea608c_17'></a>
<span>
</span>
</span>
</td>
<td class=''><pre><span class=''></span></pre></td></tr>
<tr>
<td class='na'>
<a name='org.pitest.mutationtest.report.html.SourceFile@44ea608c_18'/>
18
</td>
<td class=''>
<span class='pop'>
<a href='#grouporg.pitest.mutationtest.report.html.SourceFile@44ea608c_18'></a>
<span>
</span>
</span>
</td>
<td class=''><pre><span class=''> public String message() {</span></pre></td></tr>
<tr>
<td class='uncovered'>
<a name='org.pitest.mutationtest.report.html.SourceFile@44ea608c_19'/>
19
</td>
<td class='survived'>
<span class='pop'>
<a href='#grouporg.pitest.mutationtest.report.html.SourceFile@44ea608c_19'>1</a>
<span>
1. message : replaced return value with &#34;&#34; for com/project/auth/presentation/support/response/ApiSuccessCode::message &rarr; NO_COVERAGE<br/>
</span>
</span>
</td>
<td class='uncovered'><pre><span class='survived'> return message;</span></pre></td></tr>
<tr>
<td class='na'>
<a name='org.pitest.mutationtest.report.html.SourceFile@44ea608c_20'/>
20
</td>
<td class=''>
<span class='pop'>
<a href='#grouporg.pitest.mutationtest.report.html.SourceFile@44ea608c_20'></a>
<span>
</span>
</span>
</td>
<td class=''><pre><span class=''> }</span></pre></td></tr>
<tr>
<td class='na'>
<a name='org.pitest.mutationtest.report.html.SourceFile@44ea608c_21'/>
21
</td>
<td class=''>
<span class='pop'>
<a href='#grouporg.pitest.mutationtest.report.html.SourceFile@44ea608c_21'></a>
<span>
</span>
</span>
</td>
<td class=''><pre><span class=''>}</span></pre></td></tr>
<tr><td></td><td></td><td><h2>Mutations</h2></td></tr>
<tr>
<td><a href='#org.pitest.mutationtest.report.html.SourceFile@44ea608c_15'>15</a></td>
<td></td>
<td>
<a name='grouporg.pitest.mutationtest.report.html.SourceFile@44ea608c_15'/>
<p class='NO_COVERAGE'><span class='pop'>1.<span><b>1</b><br/><b>Location : </b>code<br/><b>Killed by : </b>none</span></span> replaced return value with &#34;&#34; for com/project/auth/presentation/support/response/ApiSuccessCode::code &rarr; NO_COVERAGE</span>
</div>
</td>
</tr>
<tr>
<td><a href='#org.pitest.mutationtest.report.html.SourceFile@44ea608c_19'>19</a></td>
<td></td>
<td>
<a name='grouporg.pitest.mutationtest.report.html.SourceFile@44ea608c_19'/>
<p class='NO_COVERAGE'><span class='pop'>1.<span><b>1</b><br/><b>Location : </b>message<br/><b>Killed by : </b>none</span></span> replaced return value with &#34;&#34; for com/project/auth/presentation/support/response/ApiSuccessCode::message &rarr; NO_COVERAGE</span>
</div>
</td>
</tr>
</table>
<h2>Active mutators</h2>
<ul>
<li class='mutator'>CONDITIONALS_BOUNDARY</li>
<li class='mutator'>EMPTY_RETURNS</li>
<li class='mutator'>FALSE_RETURNS</li>
<li class='mutator'>INCREMENTS</li>
<li class='mutator'>INVERT_NEGS</li>
<li class='mutator'>MATH</li>
<li class='mutator'>NEGATE_CONDITIONALS</li>
<li class='mutator'>NULL_RETURNS</li>
<li class='mutator'>PRIMITIVE_RETURNS</li>
<li class='mutator'>TRUE_RETURNS</li>
<li class='mutator'>VOID_METHOD_CALLS</li>
</ul>
<h2>Tests examined</h2>
<ul>
</ul>
<br/>
Report generated by <a href='https://pitest.org'>PIT</a> 1.19.1
</body>
</html>
@@ -0,0 +1,62 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../style.css">
</head>
<body>
<h1>Pit Test Coverage Report</h1>
<h2>Package Summary</h2>
<h3>com.project.auth.presentation.support.response</h3>
<table>
<thead>
<tr>
<th>Number of Classes</th>
<th>Line Coverage</th>
<th>Mutation Coverage</th>
<th>Test Strength</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>0% <div class="coverage_bar"><div class="coverage_complete width-0"></div><div class="coverage_legend">0/8</div></div></td>
<td>0% <div class="coverage_bar"><div class="coverage_complete width-0"></div><div class="coverage_legend">0/2</div></div></td>
<td>100% <div class="coverage_bar"><div class="coverage_complete width-100"></div><div class="coverage_legend">0/0</div></div></td>
</tr>
</tbody>
</table>
<h3>Breakdown by Class</h3>
<table>
<thead>
<tr>
<th>Name</th>
<th>Line Coverage</th>
<th>Mutation Coverage</th>
<th>Test Strength</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="./ApiSuccessCode.java.html">ApiSuccessCode.java</a></td>
<td><div class="coverage_percentage">0% </div><div class="coverage_bar"><div class="coverage_complete width-0"></div><div class="coverage_legend">0/8</div></div></td>
<td><div class="coverage_percentage">0% </div><div class="coverage_bar"><div class="coverage_complete width-0"></div><div class="coverage_legend">0/2</div></div></td>
<td><div class="coverage_percentage">100% </div><div class="coverage_bar"><div class="coverage_complete width-100"></div><div class="coverage_legend">0/0</div></div></td>
</tr>
</tbody>
</table>
<br/>
<hr/>
Report generated by <a href='https://pitest.org'>PIT</a> 1.19.1
</body>
</html>
@@ -0,0 +1,82 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<h1>Pit Test Coverage Report</h1>
<h3>Project Summary</h3>
<table>
<thead>
<tr>
<th>Number of Classes</th>
<th>Line Coverage</th>
<th>Mutation Coverage</th>
<th>Test Strength</th>
</tr>
</thead>
<tbody>
<tr>
<td>6</td>
<td>95% <div class="coverage_bar"><div class="coverage_complete width-95"></div><div class="coverage_legend">283/299</div></div></td>
<td>77% <div class="coverage_bar"><div class="coverage_complete width-77"></div><div class="coverage_legend">58/75</div></div></td>
<td>81% <div class="coverage_bar"><div class="coverage_complete width-81"></div><div class="coverage_legend">58/72</div></div></td>
</tr>
</tbody>
</table>
<h3>Breakdown by Package</h3>
<table>
<thead>
<tr>
<th>Name</th>
<th>Number of Classes</th>
<th>Line Coverage</th>
<th>Mutation Coverage</th>
<th>Test Strength</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="./com.project.auth.presentation.support.exception/index.html">com.project.auth.presentation.support.exception</a></td>
<td>5</td>
<td><div class="coverage_percentage">97% </div><div class="coverage_bar"><div class="coverage_complete width-97"></div><div class="coverage_legend">283/291</div></div></td>
<td><div class="coverage_percentage">79% </div><div class="coverage_bar"><div class="coverage_complete width-79"></div><div class="coverage_legend">58/73</div></div></td>
<td><div class="coverage_percentage">81% </div><div class="coverage_bar"><div class="coverage_complete width-81"></div><div class="coverage_legend">58/72</div></div></td>
</tr>
<tr>
<td><a href="./com.project.auth.presentation.support.response/index.html">com.project.auth.presentation.support.response</a></td>
<td>1</td>
<td><div class="coverage_percentage">0% </div><div class="coverage_bar"><div class="coverage_complete width-0"></div><div class="coverage_legend">0/8</div></div></td>
<td><div class="coverage_percentage">0% </div><div class="coverage_bar"><div class="coverage_complete width-0"></div><div class="coverage_legend">0/2</div></div></td>
<td><div class="coverage_percentage">100% </div><div class="coverage_bar"><div class="coverage_complete width-100"></div><div class="coverage_legend">0/0</div></div></td>
</tr>
</tbody>
</table>
<br/>
<hr/>
<ul>
<li><a href="https://docs.arcmutate.com/docs/spring.html">Project uses Spring, but the Arcmutate Spring plugin is not present.</a>
</ul>
Report generated by <a href='https://pitest.org'>PIT</a> 1.19.1
<br/>
<br/>
Enhanced functionality available at <a href='https://www.arcmutate.com/'>arcmutate.com</a>
</body>
</html>
@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<mutations partial="true">
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>escapeJsonPointerSegment</mutatedMethod><methodDescription>(Ljava/lang/String;)Ljava/lang/String;</methodDescription><lineNumber>166</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator</mutator><indexes><index>10</index></indexes><blocks><block>2</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleValidationException_collects_field_errors_under_json_pointer_keys()]</killingTest><description>replaced return value with &quot;&quot; for com/project/auth/presentation/support/exception/ValidationExceptionHandler::escapeJsonPointerSegment</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>fieldFieldToJsonPointer</mutatedMethod><methodDescription>(Ljava/lang/String;)Ljava/lang/String;</methodDescription><lineNumber>182</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.ConditionalsBoundaryMutator</mutator><indexes><index>34</index></indexes><blocks><block>7</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleValidationException_collects_field_errors_under_json_pointer_keys()]</killingTest><description>changed conditional boundary</description></mutation>
<mutation detected='true' status='TIMED_OUT' numberOfTestsRun='0'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>fieldFieldToJsonPointer</mutatedMethod><methodDescription>(Ljava/lang/String;)Ljava/lang/String;</methodDescription><lineNumber>185</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.IncrementsMutator</mutator><indexes><index>48</index></indexes><blocks><block>10</block></blocks><killingTest/><description>Changed increment from 1 to -1</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>fieldFieldToJsonPointer</mutatedMethod><methodDescription>(Ljava/lang/String;)Ljava/lang/String;</methodDescription><lineNumber>194</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.MathMutator</mutator><indexes><index>93</index></indexes><blocks><block>20</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleValidationException_collects_field_errors_under_json_pointer_keys()]</killingTest><description>Replaced integer addition with subtraction</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>fieldFieldToJsonPointer</mutatedMethod><methodDescription>(Ljava/lang/String;)Ljava/lang/String;</methodDescription><lineNumber>195</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.MathMutator</mutator><indexes><index>103</index></indexes><blocks><block>23</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleValidationException_collects_field_errors_under_json_pointer_keys()]</killingTest><description>Replaced integer addition with subtraction</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>fieldFieldToJsonPointer</mutatedMethod><methodDescription>(Ljava/lang/String;)Ljava/lang/String;</methodDescription><lineNumber>176</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>4</index></indexes><blocks><block>0</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleValidationException_collects_field_errors_under_json_pointer_keys()]</killingTest><description>negated conditional</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>fieldFieldToJsonPointer</mutatedMethod><methodDescription>(Ljava/lang/String;)Ljava/lang/String;</methodDescription><lineNumber>176</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>7</index></indexes><blocks><block>2</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleValidationException_collects_field_errors_under_json_pointer_keys()]</killingTest><description>negated conditional</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>fieldFieldToJsonPointer</mutatedMethod><methodDescription>(Ljava/lang/String;)Ljava/lang/String;</methodDescription><lineNumber>182</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>34</index></indexes><blocks><block>7</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleValidationException_collects_field_errors_under_json_pointer_keys()]</killingTest><description>negated conditional</description></mutation>
<mutation detected='true' status='TIMED_OUT' numberOfTestsRun='0'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>fieldFieldToJsonPointer</mutatedMethod><methodDescription>(Ljava/lang/String;)Ljava/lang/String;</methodDescription><lineNumber>184</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>45</index></indexes><blocks><block>9</block></blocks><killingTest/><description>negated conditional</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>fieldFieldToJsonPointer</mutatedMethod><methodDescription>(Ljava/lang/String;)Ljava/lang/String;</methodDescription><lineNumber>188</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>57</index></indexes><blocks><block>11</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleValidationException_collects_field_errors_under_json_pointer_keys()]</killingTest><description>negated conditional</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>fieldFieldToJsonPointer</mutatedMethod><methodDescription>(Ljava/lang/String;)Ljava/lang/String;</methodDescription><lineNumber>190</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>69</index></indexes><blocks><block>13</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleValidationException_collects_field_errors_under_json_pointer_keys()]</killingTest><description>negated conditional</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>fieldFieldToJsonPointer</mutatedMethod><methodDescription>(Ljava/lang/String;)Ljava/lang/String;</methodDescription><lineNumber>201</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>133</index></indexes><blocks><block>27</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleValidationException_collects_field_errors_under_json_pointer_keys()]</killingTest><description>negated conditional</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>fieldFieldToJsonPointer</mutatedMethod><methodDescription>(Ljava/lang/String;)Ljava/lang/String;</methodDescription><lineNumber>207</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>163</index></indexes><blocks><block>35</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleValidationException_collects_field_errors_under_json_pointer_keys()]</killingTest><description>negated conditional</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>fieldFieldToJsonPointer</mutatedMethod><methodDescription>(Ljava/lang/String;)Ljava/lang/String;</methodDescription><lineNumber>177</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator</mutator><indexes><index>12</index></indexes><blocks><block>3</block></blocks><killingTest>com.project.auth.presentation.support.exception.JsonPointerConversionPropertyTest.[engine:jqwik]/[class:com.project.auth.presentation.support.exception.JsonPointerConversionPropertyTest]/[property:empty_or_null_returns_root_pointer(java.lang.String)]</killingTest><description>replaced return value with &quot;&quot; for com/project/auth/presentation/support/exception/ValidationExceptionHandler::fieldFieldToJsonPointer</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>fieldFieldToJsonPointer</mutatedMethod><methodDescription>(Ljava/lang/String;)Ljava/lang/String;</methodDescription><lineNumber>207</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator</mutator><indexes><index>172</index></indexes><blocks><block>38</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleValidationException_collects_field_errors_under_json_pointer_keys()]</killingTest><description>replaced return value with &quot;&quot; for com/project/auth/presentation/support/exception/ValidationExceptionHandler::fieldFieldToJsonPointer</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>handleConstraintViolationException</mutatedMethod><methodDescription>(Ljakarta/validation/ConstraintViolationException;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>93</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator</mutator><indexes><index>75</index></indexes><blocks><block>21</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleConstraintViolationException_uses_json_pointer_keys()]</killingTest><description>replaced return value with null for com/project/auth/presentation/support/exception/ValidationExceptionHandler::handleConstraintViolationException</description></mutation>
<mutation detected='false' status='SURVIVED' numberOfTestsRun='2'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>handleHandlerMethodValidationException</mutatedMethod><methodDescription>(Lorg/springframework/web/method/annotation/HandlerMethodValidationException;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>118</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.ConditionalsBoundaryMutator</mutator><indexes><index>82</index></indexes><blocks><block>24</block></blocks><killingTest/><description>changed conditional boundary</description></mutation>
<mutation detected='false' status='SURVIVED' numberOfTestsRun='2'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>handleHandlerMethodValidationException</mutatedMethod><methodDescription>(Lorg/springframework/web/method/annotation/HandlerMethodValidationException;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>123</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.ConditionalsBoundaryMutator</mutator><indexes><index>119</index></indexes><blocks><block>33</block></blocks><killingTest/><description>changed conditional boundary</description></mutation>
<mutation detected='false' status='SURVIVED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>handleHandlerMethodValidationException</mutatedMethod><methodDescription>(Lorg/springframework/web/method/annotation/HandlerMethodValidationException;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>114</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.IncrementsMutator</mutator><indexes><index>54</index></indexes><blocks><block>15</block></blocks><killingTest/><description>Changed increment from 1 to -1</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>handleHandlerMethodValidationException</mutatedMethod><methodDescription>(Lorg/springframework/web/method/annotation/HandlerMethodValidationException;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>110</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>35</index></indexes><blocks><block>9</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleHandlerMethodValidationException_falls_back_to_indexed_unknown_when_paramname_null()]</killingTest><description>negated conditional</description></mutation>
<mutation detected='false' status='SURVIVED' numberOfTestsRun='2'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>handleHandlerMethodValidationException</mutatedMethod><methodDescription>(Lorg/springframework/web/method/annotation/HandlerMethodValidationException;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>118</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>79</index></indexes><blocks><block>23</block></blocks><killingTest/><description>negated conditional</description></mutation>
<mutation detected='false' status='SURVIVED' numberOfTestsRun='2'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>handleHandlerMethodValidationException</mutatedMethod><methodDescription>(Lorg/springframework/web/method/annotation/HandlerMethodValidationException;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>118</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>82</index></indexes><blocks><block>24</block></blocks><killingTest/><description>negated conditional</description></mutation>
<mutation detected='false' status='SURVIVED' numberOfTestsRun='2'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>handleHandlerMethodValidationException</mutatedMethod><methodDescription>(Lorg/springframework/web/method/annotation/HandlerMethodValidationException;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>123</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>119</index></indexes><blocks><block>33</block></blocks><killingTest/><description>negated conditional</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>handleHandlerMethodValidationException</mutatedMethod><methodDescription>(Lorg/springframework/web/method/annotation/HandlerMethodValidationException;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>130</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator</mutator><indexes><index>160</index></indexes><blocks><block>43</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleHandlerMethodValidationException_falls_back_to_indexed_unknown_when_paramname_null()]</killingTest><description>replaced return value with null for com/project/auth/presentation/support/exception/ValidationExceptionHandler::handleHandlerMethodValidationException</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>handleValidationException</mutatedMethod><methodDescription>(Lorg/springframework/web/bind/MethodArgumentNotValidException;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>72</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator</mutator><indexes><index>109</index></indexes><blocks><block>36</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleValidationException_collects_field_errors_under_json_pointer_keys()]</killingTest><description>replaced return value with null for com/project/auth/presentation/support/exception/ValidationExceptionHandler::handleValidationException</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>lambda$handleConstraintViolationException$2</mutatedMethod><methodDescription>(Ljava/lang/String;)Ljava/util/List;</methodDescription><lineNumber>87</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator</mutator><indexes><index>6</index></indexes><blocks><block>1</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleConstraintViolationException_uses_json_pointer_keys()]</killingTest><description>replaced return value with Collections.emptyList for com/project/auth/presentation/support/exception/ValidationExceptionHandler::lambda$handleConstraintViolationException$2</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>lambda$handleHandlerMethodValidationException$3</mutatedMethod><methodDescription>(Ljava/lang/String;)Ljava/util/List;</methodDescription><lineNumber>119</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator</mutator><indexes><index>6</index></indexes><blocks><block>1</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleHandlerMethodValidationException_falls_back_to_indexed_unknown_when_paramname_null()]</killingTest><description>replaced return value with Collections.emptyList for com/project/auth/presentation/support/exception/ValidationExceptionHandler::lambda$handleHandlerMethodValidationException$3</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>lambda$handleValidationException$0</mutatedMethod><methodDescription>(Ljava/lang/String;)Ljava/util/List;</methodDescription><lineNumber>62</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator</mutator><indexes><index>6</index></indexes><blocks><block>1</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleValidationException_collects_field_errors_under_json_pointer_keys()]</killingTest><description>replaced return value with Collections.emptyList for com/project/auth/presentation/support/exception/ValidationExceptionHandler::lambda$handleValidationException$0</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>lambda$handleValidationException$1</mutatedMethod><methodDescription>(Ljava/lang/String;)Ljava/util/List;</methodDescription><lineNumber>66</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator</mutator><indexes><index>6</index></indexes><blocks><block>1</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleValidationException_global_errors_go_to_global_bucket()]</killingTest><description>replaced return value with Collections.emptyList for com/project/auth/presentation/support/exception/ValidationExceptionHandler::lambda$handleValidationException$1</description></mutation>
<mutation detected='false' status='SURVIVED' numberOfTestsRun='11'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>minNonNegative</mutatedMethod><methodDescription>(II)I</methodDescription><lineNumber>211</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.ConditionalsBoundaryMutator</mutator><indexes><index>4</index></indexes><blocks><block>0</block></blocks><killingTest/><description>changed conditional boundary</description></mutation>
<mutation detected='false' status='SURVIVED' numberOfTestsRun='5'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>minNonNegative</mutatedMethod><methodDescription>(II)I</methodDescription><lineNumber>214</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.ConditionalsBoundaryMutator</mutator><indexes><index>13</index></indexes><blocks><block>2</block></blocks><killingTest/><description>changed conditional boundary</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>minNonNegative</mutatedMethod><methodDescription>(II)I</methodDescription><lineNumber>211</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>4</index></indexes><blocks><block>0</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleValidationException_collects_field_errors_under_json_pointer_keys()]</killingTest><description>negated conditional</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>minNonNegative</mutatedMethod><methodDescription>(II)I</methodDescription><lineNumber>214</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>13</index></indexes><blocks><block>2</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleValidationException_collects_field_errors_under_json_pointer_keys()]</killingTest><description>negated conditional</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>minNonNegative</mutatedMethod><methodDescription>(II)I</methodDescription><lineNumber>212</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.PrimitiveReturnsMutator</mutator><indexes><index>8</index></indexes><blocks><block>1</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleValidationException_collects_field_errors_under_json_pointer_keys()]</killingTest><description>replaced int return with 0 for com/project/auth/presentation/support/exception/ValidationExceptionHandler::minNonNegative</description></mutation>
<mutation detected='true' status='TIMED_OUT' numberOfTestsRun='0'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>minNonNegative</mutatedMethod><methodDescription>(II)I</methodDescription><lineNumber>215</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.PrimitiveReturnsMutator</mutator><indexes><index>17</index></indexes><blocks><block>3</block></blocks><killingTest/><description>replaced int return with 0 for com/project/auth/presentation/support/exception/ValidationExceptionHandler::minNonNegative</description></mutation>
<mutation detected='true' status='TIMED_OUT' numberOfTestsRun='0'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>minNonNegative</mutatedMethod><methodDescription>(II)I</methodDescription><lineNumber>217</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.PrimitiveReturnsMutator</mutator><indexes><index>24</index></indexes><blocks><block>5</block></blocks><killingTest/><description>replaced int return with 0 for com/project/auth/presentation/support/exception/ValidationExceptionHandler::minNonNegative</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='2'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>resolveMessage</mutatedMethod><methodDescription>(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;</methodDescription><lineNumber>221</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>4</index></indexes><blocks><block>0</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleValidationException_global_errors_go_to_global_bucket()]</killingTest><description>negated conditional</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='2'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>resolveMessage</mutatedMethod><methodDescription>(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;</methodDescription><lineNumber>221</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>7</index></indexes><blocks><block>2</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleValidationException_global_errors_go_to_global_bucket()]</killingTest><description>negated conditional</description></mutation>
<mutation detected='false' status='SURVIVED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>resolveMessage</mutatedMethod><methodDescription>(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;</methodDescription><lineNumber>224</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>16</index></indexes><blocks><block>4</block></blocks><killingTest/><description>negated conditional</description></mutation>
<mutation detected='false' status='SURVIVED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>resolveMessage</mutatedMethod><methodDescription>(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;</methodDescription><lineNumber>224</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>19</index></indexes><blocks><block>6</block></blocks><killingTest/><description>negated conditional</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='2'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>resolveMessage</mutatedMethod><methodDescription>(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;</methodDescription><lineNumber>222</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator</mutator><indexes><index>11</index></indexes><blocks><block>3</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleValidationException_global_errors_go_to_global_bucket()]</killingTest><description>replaced return value with &quot;&quot; for com/project/auth/presentation/support/exception/ValidationExceptionHandler::resolveMessage</description></mutation>
<mutation detected='false' status='SURVIVED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>resolveMessage</mutatedMethod><methodDescription>(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;</methodDescription><lineNumber>225</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator</mutator><indexes><index>23</index></indexes><blocks><block>7</block></blocks><killingTest/><description>replaced return value with &quot;&quot; for com/project/auth/presentation/support/exception/ValidationExceptionHandler::resolveMessage</description></mutation>
<mutation detected='false' status='NO_COVERAGE' numberOfTestsRun='0'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>resolveMessage</mutatedMethod><methodDescription>(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;</methodDescription><lineNumber>227</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator</mutator><indexes><index>28</index></indexes><blocks><block>8</block></blocks><killingTest/><description>replaced return value with &quot;&quot; for com/project/auth/presentation/support/exception/ValidationExceptionHandler::resolveMessage</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>toJsonPointer</mutatedMethod><methodDescription>(Ljakarta/validation/Path;)Ljava/lang/String;</methodDescription><lineNumber>151</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>29</index></indexes><blocks><block>7</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleConstraintViolationException_uses_json_pointer_keys()]</killingTest><description>negated conditional</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>toJsonPointer</mutatedMethod><methodDescription>(Ljakarta/validation/Path;)Ljava/lang/String;</methodDescription><lineNumber>156</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>51</index></indexes><blocks><block>13</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleConstraintViolationException_uses_json_pointer_keys()]</killingTest><description>negated conditional</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>toJsonPointer</mutatedMethod><methodDescription>(Ljakarta/validation/Path;)Ljava/lang/String;</methodDescription><lineNumber>158</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>66</index></indexes><blocks><block>18</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleConstraintViolationException_uses_json_pointer_keys()]</killingTest><description>negated conditional</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>toJsonPointer</mutatedMethod><methodDescription>(Ljakarta/validation/Path;)Ljava/lang/String;</methodDescription><lineNumber>162</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>87</index></indexes><blocks><block>27</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleConstraintViolationException_uses_json_pointer_keys()]</killingTest><description>negated conditional</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ValidationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ValidationExceptionHandler</mutatedClass><mutatedMethod>toJsonPointer</mutatedMethod><methodDescription>(Ljakarta/validation/Path;)Ljava/lang/String;</methodDescription><lineNumber>162</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator</mutator><indexes><index>96</index></indexes><blocks><block>30</block></blocks><killingTest>com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ValidationExceptionHandlerTest]/[method:handleConstraintViolationException_uses_json_pointer_keys()]</killingTest><description>replaced return value with &quot;&quot; for com/project/auth/presentation/support/exception/ValidationExceptionHandler::toJsonPointer</description></mutation>
<mutation detected='false' status='SURVIVED' numberOfTestsRun='3'><sourceFile>RequestExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.RequestExceptionHandler</mutatedClass><mutatedMethod>handleErrorResponseException</mutatedMethod><methodDescription>(Lorg/springframework/web/ErrorResponse;Ljakarta/servlet/http/HttpServletRequest;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>240</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.ConditionalsBoundaryMutator</mutator><indexes><index>15</index></indexes><blocks><block>2</block></blocks><killingTest/><description>changed conditional boundary</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>RequestExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.RequestExceptionHandler</mutatedClass><mutatedMethod>handleErrorResponseException</mutatedMethod><methodDescription>(Lorg/springframework/web/ErrorResponse;Ljakarta/servlet/http/HttpServletRequest;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>240</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>15</index></indexes><blocks><block>2</block></blocks><killingTest>com.project.auth.presentation.support.exception.RequestExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.RequestExceptionHandlerTest]/[method:handleErrorResponseException_preserves_4xx_status_with_unhandled_client_error()]</killingTest><description>negated conditional</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>RequestExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.RequestExceptionHandler</mutatedClass><mutatedMethod>handleErrorResponseException</mutatedMethod><methodDescription>(Lorg/springframework/web/ErrorResponse;Ljakarta/servlet/http/HttpServletRequest;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>246</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator</mutator><indexes><index>72</index></indexes><blocks><block>13</block></blocks><killingTest>com.project.auth.presentation.support.exception.RequestExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.RequestExceptionHandlerTest]/[method:handleErrorResponseException_collapses_5xx_to_common_999()]</killingTest><description>replaced return value with null for com/project/auth/presentation/support/exception/RequestExceptionHandler::handleErrorResponseException</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>RequestExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.RequestExceptionHandler</mutatedClass><mutatedMethod>handleErrorResponseException</mutatedMethod><methodDescription>(Lorg/springframework/web/ErrorResponse;Ljakarta/servlet/http/HttpServletRequest;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>258</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator</mutator><indexes><index>132</index></indexes><blocks><block>25</block></blocks><killingTest>com.project.auth.presentation.support.exception.RequestExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.RequestExceptionHandlerTest]/[method:handleErrorResponseException_preserves_4xx_status_with_unhandled_client_error()]</killingTest><description>replaced return value with null for com/project/auth/presentation/support/exception/RequestExceptionHandler::handleErrorResponseException</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>RequestExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.RequestExceptionHandler</mutatedClass><mutatedMethod>handleMaxUploadSizeExceededException</mutatedMethod><methodDescription>(Lorg/springframework/web/multipart/MaxUploadSizeExceededException;Ljakarta/servlet/http/HttpServletRequest;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>212</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator</mutator><indexes><index>61</index></indexes><blocks><block>13</block></blocks><killingTest>com.project.auth.presentation.support.exception.RequestExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.RequestExceptionHandlerTest]/[method:handleMaxUploadSizeExceededException_returns_413_payload_too_large()]</killingTest><description>replaced return value with null for com/project/auth/presentation/support/exception/RequestExceptionHandler::handleMaxUploadSizeExceededException</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>RequestExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.RequestExceptionHandler</mutatedClass><mutatedMethod>handleMediaTypeNotAcceptableException</mutatedMethod><methodDescription>(Lorg/springframework/web/HttpMediaTypeNotAcceptableException;Ljakarta/servlet/http/HttpServletRequest;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>141</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator</mutator><indexes><index>53</index></indexes><blocks><block>11</block></blocks><killingTest>com.project.auth.presentation.support.exception.RequestExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.RequestExceptionHandlerTest]/[method:handleMediaTypeNotAcceptableException_returns_406()]</killingTest><description>replaced return value with null for com/project/auth/presentation/support/exception/RequestExceptionHandler::handleMediaTypeNotAcceptableException</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>RequestExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.RequestExceptionHandler</mutatedClass><mutatedMethod>handleMediaTypeNotSupportedException</mutatedMethod><methodDescription>(Lorg/springframework/web/HttpMediaTypeNotSupportedException;Ljakarta/servlet/http/HttpServletRequest;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>124</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator</mutator><indexes><index>62</index></indexes><blocks><block>14</block></blocks><killingTest>com.project.auth.presentation.support.exception.RequestExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.RequestExceptionHandlerTest]/[method:handleMediaTypeNotSupportedException_returns_415()]</killingTest><description>replaced return value with null for com/project/auth/presentation/support/exception/RequestExceptionHandler::handleMediaTypeNotSupportedException</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>RequestExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.RequestExceptionHandler</mutatedClass><mutatedMethod>handleMessageNotReadableException</mutatedMethod><methodDescription>(Lorg/springframework/http/converter/HttpMessageNotReadableException;Ljakarta/servlet/http/HttpServletRequest;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>52</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator</mutator><indexes><index>53</index></indexes><blocks><block>11</block></blocks><killingTest>com.project.auth.presentation.support.exception.RequestExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.RequestExceptionHandlerTest]/[method:handleMessageNotReadableException_returns_400_invalid_request_body()]</killingTest><description>replaced return value with null for com/project/auth/presentation/support/exception/RequestExceptionHandler::handleMessageNotReadableException</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>RequestExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.RequestExceptionHandler</mutatedClass><mutatedMethod>handleMethodNotSupportedException</mutatedMethod><methodDescription>(Lorg/springframework/web/HttpRequestMethodNotSupportedException;Ljakarta/servlet/http/HttpServletRequest;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>70</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator</mutator><indexes><index>61</index></indexes><blocks><block>13</block></blocks><killingTest>com.project.auth.presentation.support.exception.RequestExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.RequestExceptionHandlerTest]/[method:handleMethodNotSupportedException_returns_405()]</killingTest><description>replaced return value with null for com/project/auth/presentation/support/exception/RequestExceptionHandler::handleMethodNotSupportedException</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>RequestExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.RequestExceptionHandler</mutatedClass><mutatedMethod>handleMissingParameterException</mutatedMethod><methodDescription>(Lorg/springframework/web/bind/MissingServletRequestParameterException;Ljakarta/servlet/http/HttpServletRequest;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>88</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator</mutator><indexes><index>61</index></indexes><blocks><block>13</block></blocks><killingTest>com.project.auth.presentation.support.exception.RequestExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.RequestExceptionHandlerTest]/[method:handleMissingParameterException_returns_400_missing_parameter()]</killingTest><description>replaced return value with null for com/project/auth/presentation/support/exception/RequestExceptionHandler::handleMissingParameterException</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>RequestExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.RequestExceptionHandler</mutatedClass><mutatedMethod>handleMissingRequestHeaderException</mutatedMethod><methodDescription>(Lorg/springframework/web/bind/MissingRequestHeaderException;Ljakarta/servlet/http/HttpServletRequest;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>159</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator</mutator><indexes><index>61</index></indexes><blocks><block>13</block></blocks><killingTest>com.project.auth.presentation.support.exception.RequestExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.RequestExceptionHandlerTest]/[method:handleMissingRequestHeaderException_returns_400_missing_header()]</killingTest><description>replaced return value with null for com/project/auth/presentation/support/exception/RequestExceptionHandler::handleMissingRequestHeaderException</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>RequestExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.RequestExceptionHandler</mutatedClass><mutatedMethod>handleNoResourceFoundException</mutatedMethod><methodDescription>(Lorg/springframework/web/servlet/resource/NoResourceFoundException;Ljakarta/servlet/http/HttpServletRequest;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>194</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator</mutator><indexes><index>61</index></indexes><blocks><block>13</block></blocks><killingTest>com.project.auth.presentation.support.exception.RequestExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.RequestExceptionHandlerTest]/[method:handleNoResourceFoundException_returns_404_resource_not_found()]</killingTest><description>replaced return value with null for com/project/auth/presentation/support/exception/RequestExceptionHandler::handleNoResourceFoundException</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>RequestExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.RequestExceptionHandler</mutatedClass><mutatedMethod>handleServletRequestBindingException</mutatedMethod><methodDescription>(Lorg/springframework/web/bind/ServletRequestBindingException;Ljakarta/servlet/http/HttpServletRequest;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>176</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator</mutator><indexes><index>53</index></indexes><blocks><block>11</block></blocks><killingTest>com.project.auth.presentation.support.exception.RequestExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.RequestExceptionHandlerTest]/[method:handleServletRequestBindingException_returns_400_request_binding_failed()]</killingTest><description>replaced return value with null for com/project/auth/presentation/support/exception/RequestExceptionHandler::handleServletRequestBindingException</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>RequestExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.RequestExceptionHandler</mutatedClass><mutatedMethod>handleTypeMismatchException</mutatedMethod><methodDescription>(Lorg/springframework/beans/TypeMismatchException;Ljakarta/servlet/http/HttpServletRequest;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>106</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator</mutator><indexes><index>61</index></indexes><blocks><block>13</block></blocks><killingTest>com.project.auth.presentation.support.exception.RequestExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.RequestExceptionHandlerTest]/[method:handleTypeMismatchException_returns_400_type_mismatch()]</killingTest><description>replaced return value with null for com/project/auth/presentation/support/exception/RequestExceptionHandler::handleTypeMismatchException</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ApplicationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ApplicationExceptionHandler</mutatedClass><mutatedMethod>handleBusinessException</mutatedMethod><methodDescription>(Lcom/project/auth/application/support/exception/BusinessException;Ljakarta/servlet/http/HttpServletRequest;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>45</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator</mutator><indexes><index>61</index></indexes><blocks><block>17</block></blocks><killingTest>com.project.auth.presentation.support.exception.ApplicationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ApplicationExceptionHandlerTest]/[method:handleBusinessException_maps_business_error_code_to_status_and_body()]</killingTest><description>replaced return value with null for com/project/auth/presentation/support/exception/ApplicationExceptionHandler::handleBusinessException</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ApplicationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ApplicationExceptionHandler</mutatedClass><mutatedMethod>handleMessageNotWritableException</mutatedMethod><methodDescription>(Lorg/springframework/http/converter/HttpMessageNotWritableException;Ljakarta/servlet/http/HttpServletRequest;Ljakarta/servlet/http/HttpServletResponse;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>76</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.NegateConditionalsMutator</mutator><indexes><index>41</index></indexes><blocks><block>7</block></blocks><killingTest>com.project.auth.presentation.support.exception.ApplicationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ApplicationExceptionHandlerTest]/[method:handleMessageNotWritableException_returns_500_when_response_not_committed()]</killingTest><description>negated conditional</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ApplicationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ApplicationExceptionHandler</mutatedClass><mutatedMethod>handleMessageNotWritableException</mutatedMethod><methodDescription>(Lorg/springframework/http/converter/HttpMessageNotWritableException;Ljakarta/servlet/http/HttpServletRequest;Ljakarta/servlet/http/HttpServletResponse;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>77</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator</mutator><indexes><index>47</index></indexes><blocks><block>10</block></blocks><killingTest>com.project.auth.presentation.support.exception.ApplicationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ApplicationExceptionHandlerTest]/[method:handleMessageNotWritableException_returns_empty_500_when_response_committed()]</killingTest><description>replaced return value with null for com/project/auth/presentation/support/exception/ApplicationExceptionHandler::handleMessageNotWritableException</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ApplicationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ApplicationExceptionHandler</mutatedClass><mutatedMethod>handleMessageNotWritableException</mutatedMethod><methodDescription>(Lorg/springframework/http/converter/HttpMessageNotWritableException;Ljakarta/servlet/http/HttpServletRequest;Ljakarta/servlet/http/HttpServletResponse;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>80</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator</mutator><indexes><index>70</index></indexes><blocks><block>17</block></blocks><killingTest>com.project.auth.presentation.support.exception.ApplicationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ApplicationExceptionHandlerTest]/[method:handleMessageNotWritableException_returns_500_when_response_not_committed()]</killingTest><description>replaced return value with null for com/project/auth/presentation/support/exception/ApplicationExceptionHandler::handleMessageNotWritableException</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ApplicationExceptionHandler.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ApplicationExceptionHandler</mutatedClass><mutatedMethod>handleUncaughtException</mutatedMethod><methodDescription>(Ljava/lang/Exception;Ljakarta/servlet/http/HttpServletRequest;)Lorg/springframework/http/ResponseEntity;</methodDescription><lineNumber>109</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator</mutator><indexes><index>58</index></indexes><blocks><block>12</block></blocks><killingTest>com.project.auth.presentation.support.exception.ApplicationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ApplicationExceptionHandlerTest]/[method:handleUncaughtException_always_returns_500_common_999()]</killingTest><description>replaced return value with null for com/project/auth/presentation/support/exception/ApplicationExceptionHandler::handleUncaughtException</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ApiErrorHttpStatusMapper.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ApiErrorHttpStatusMapper</mutatedClass><mutatedMethod>map</mutatedMethod><methodDescription>(Lcom/project/auth/application/support/exception/ClientFacingErrorCode;)Lorg/springframework/http/HttpStatus;</methodDescription><lineNumber>27</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator</mutator><indexes><index>67</index></indexes><blocks><block>13</block></blocks><killingTest>com.project.auth.presentation.support.exception.ApiErrorHttpStatusMapperPropertyTest.[engine:jqwik]/[class:com.project.auth.presentation.support.exception.ApiErrorHttpStatusMapperPropertyTest]/[property:authentication_required_is_always_401(com.project.auth.application.support.exception.AuthErrorCode)]</killingTest><description>replaced return value with null for com/project/auth/presentation/support/exception/ApiErrorHttpStatusMapper::map</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ApiErrorHttpStatusMapper.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ApiErrorHttpStatusMapper</mutatedClass><mutatedMethod>mapAuth</mutatedMethod><methodDescription>(Lcom/project/auth/application/support/exception/AuthErrorCode;)Lorg/springframework/http/HttpStatus;</methodDescription><lineNumber>59</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator</mutator><indexes><index>38</index></indexes><blocks><block>8</block></blocks><killingTest>com.project.auth.presentation.support.exception.ApiErrorHttpStatusMapperPropertyTest.[engine:jqwik]/[class:com.project.auth.presentation.support.exception.ApiErrorHttpStatusMapperPropertyTest]/[property:authentication_required_is_always_401(com.project.auth.application.support.exception.AuthErrorCode)]</killingTest><description>replaced return value with null for com/project/auth/presentation/support/exception/ApiErrorHttpStatusMapper::mapAuth</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='1'><sourceFile>ApiErrorHttpStatusMapper.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ApiErrorHttpStatusMapper</mutatedClass><mutatedMethod>mapCommon</mutatedMethod><methodDescription>(Lcom/project/auth/application/support/exception/CommonErrorCode;)Lorg/springframework/http/HttpStatus;</methodDescription><lineNumber>40</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator</mutator><indexes><index>22</index></indexes><blocks><block>4</block></blocks><killingTest>com.project.auth.presentation.support.exception.ApplicationExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.ApplicationExceptionHandlerTest]/[method:handleUncaughtException_always_returns_500_common_999()]</killingTest><description>replaced return value with null for com/project/auth/presentation/support/exception/ApiErrorHttpStatusMapper::mapCommon</description></mutation>
<mutation detected='true' status='KILLED' numberOfTestsRun='2'><sourceFile>ApiErrorHttpStatusMapper.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.ApiErrorHttpStatusMapper</mutatedClass><mutatedMethod>mapPresentation</mutatedMethod><methodDescription>(Lcom/project/auth/presentation/support/exception/PresentationErrorCode;)Lorg/springframework/http/HttpStatus;</methodDescription><lineNumber>46</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.NullReturnValsMutator</mutator><indexes><index>58</index></indexes><blocks><block>12</block></blocks><killingTest>com.project.auth.presentation.support.exception.RequestExceptionHandlerTest.[engine:junit-jupiter]/[class:com.project.auth.presentation.support.exception.RequestExceptionHandlerTest]/[method:handleMediaTypeNotAcceptableException_returns_406()]</killingTest><description>replaced return value with null for com/project/auth/presentation/support/exception/ApiErrorHttpStatusMapper::mapPresentation</description></mutation>
<mutation detected='false' status='SURVIVED' numberOfTestsRun='19'><sourceFile>PresentationErrorCode.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.PresentationErrorCode</mutatedClass><mutatedMethod>code</mutatedMethod><methodDescription>()Ljava/lang/String;</methodDescription><lineNumber>64</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator</mutator><indexes><index>5</index></indexes><blocks><block>0</block></blocks><killingTest/><description>replaced return value with &quot;&quot; for com/project/auth/presentation/support/exception/PresentationErrorCode::code</description></mutation>
<mutation detected='false' status='SURVIVED' numberOfTestsRun='19'><sourceFile>PresentationErrorCode.java</sourceFile><mutatedClass>com.project.auth.presentation.support.exception.PresentationErrorCode</mutatedClass><mutatedMethod>message</mutatedMethod><methodDescription>()Ljava/lang/String;</methodDescription><lineNumber>69</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator</mutator><indexes><index>5</index></indexes><blocks><block>0</block></blocks><killingTest/><description>replaced return value with &quot;&quot; for com/project/auth/presentation/support/exception/PresentationErrorCode::message</description></mutation>
<mutation detected='false' status='NO_COVERAGE' numberOfTestsRun='0'><sourceFile>ApiSuccessCode.java</sourceFile><mutatedClass>com.project.auth.presentation.support.response.ApiSuccessCode</mutatedClass><mutatedMethod>code</mutatedMethod><methodDescription>()Ljava/lang/String;</methodDescription><lineNumber>15</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator</mutator><indexes><index>5</index></indexes><blocks><block>0</block></blocks><killingTest/><description>replaced return value with &quot;&quot; for com/project/auth/presentation/support/response/ApiSuccessCode::code</description></mutation>
<mutation detected='false' status='NO_COVERAGE' numberOfTestsRun='0'><sourceFile>ApiSuccessCode.java</sourceFile><mutatedClass>com.project.auth.presentation.support.response.ApiSuccessCode</mutatedClass><mutatedMethod>message</mutatedMethod><methodDescription>()Ljava/lang/String;</methodDescription><lineNumber>19</lineNumber><mutator>org.pitest.mutationtest.engine.gregor.mutators.returns.EmptyObjectReturnValsMutator</mutator><indexes><index>5</index></indexes><blocks><block>0</block></blocks><killingTest/><description>replaced return value with &quot;&quot; for com/project/auth/presentation/support/response/ApiSuccessCode::message</description></mutation>
</mutations>
@@ -0,0 +1,574 @@
html, body, div, span, p, blockquote, pre {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-weight: inherit;
font-style: inherit;
font-size: 100%;
font-family: inherit;
vertical-align: baseline;
}
body{
line-height: 1;
color: black;
background: white;
margin-left: 20px;
}
.src {
border: 1px solid #dddddd;
padding-top: 10px;
padding-right: 5px;
padding-left: 5px;
font-family: Consolas, Courier, monospace;
}
.covered, .COVERED {
background-color: #ddffdd;
}
.uncovered, .UNCOVERED {
background-color: #ffdddd;
}
.killed, .KILLED {
background-color: #aaffaa;
}
.survived, .SURVIVED {
background-color: #ffaaaa;
}
.uncertain, .UNCERTAIN {
background-color: #dde7ef;
}
.run_error, .RUN_ERROR {
background-color: #dde7ef;
}
.na {
background-color: #eeeeee;
}
.timed_out, .TIMED_OUT {
background-color: #dde7ef;
}
.non_viable, .NON_VIABLE {
background-color: #aaffaa;
}
.memory_error, .MEMORY_ERROR {
background-color: #dde7ef;
}
.not_started, .NO_STARTED {
background-color: #dde7ef; color : red
}
.no_coverage, .NO_COVERAGE {
background-color: #ffaaaa;
}
.tests {
width: 50%;
float: left;
}
.mutees {
float: right;
width: 50%;
}
.unit {
padding-top: 20px;
clear: both;
}
.coverage_bar {
display: inline-block;
height: 1.1em;
width: 130px;
background: #FAA;
margin: 0 5px;
vertical-align: middle;
border: 1px solid #AAA;
position: relative;
}
.coverage_complete {
display: inline-block;
height: 100%;
background: #DFD;
float: left;
}
.coverage_legend {
position: absolute;
height: 100%;
width: 100%;
left: 0;
top: 0;
text-align: center;
}
.line, .mut {
vertical-align: middle;
}
.coverage_percentage {
display: inline-block;
width: 3em;
text-align: right;
}
.pop {
outline:none;
}
.pop strong {
line-height: 30px;
}
.pop {
text-decoration: none;
}
.pop span {
z-index: 10;
display: none;
padding: 14px 20px;
margin-top: -30px;
margin-left: 28px;
width: 800px;
line-height: 16px;
word-wrap: break-word;
border-radius: 4px;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
-moz-box-shadow: 5px 5px 8px #CCC;
-webkit-box-shadow: 5px 5px 8px #CCC;
box-shadow: 5px 5px 8px #CCC;
}
.pop:hover span {
display: inline;
position: absolute;
color: #111;
border: 1px solid #DCA;
background: #fffAF0;
}
.width-1 {
width: 1%;
}
.width-2 {
width: 2%;
}
.width-3 {
width: 3%;
}
.width-4 {
width: 4%;
}
.width-5 {
width: 5%;
}
.width-6 {
width: 6%;
}
.width-7 {
width: 7%;
}
.width-8 {
width: 8%;
}
.width-9 {
width: 9%;
}
.width-10 {
width: 10%;
}
.width-11 {
width: 11%;
}
.width-12 {
width: 12%;
}
.width-13 {
width: 13%;
}
.width-14 {
width: 14%;
}
.width-15 {
width: 15%;
}
.width-16 {
width: 16%;
}
.width-17 {
width: 17%;
}
.width-18 {
width: 18%;
}
.width-19 {
width: 19%;
}
.width-20 {
width: 20%;
}
.width-21 {
width: 21%;
}
.width-22 {
width: 22%;
}
.width-23 {
width: 23%;
}
.width-24 {
width: 24%;
}
.width-25 {
width: 25%;
}
.width-26 {
width: 26%;
}
.width-27 {
width: 27%;
}
.width-28 {
width: 28%;
}
.width-29 {
width: 29%;
}
.width-30 {
width: 30%;
}
.width-31 {
width: 31%;
}
.width-32 {
width: 32%;
}
.width-33 {
width: 33%;
}
.width-34 {
width: 34%;
}
.width-35 {
width: 35%;
}
.width-36 {
width: 36%;
}
.width-37 {
width: 37%;
}
.width-38 {
width: 38%;
}
.width-39 {
width: 39%;
}
.width-40 {
width: 40%;
}
.width-41 {
width: 41%;
}
.width-42 {
width: 42%;
}
.width-43 {
width: 43%;
}
.width-44 {
width: 44%;
}
.width-45 {
width: 45%;
}
.width-46 {
width: 46%;
}
.width-47 {
width: 47%;
}
.width-48 {
width: 48%;
}
.width-49 {
width: 49%;
}
.width-50 {
width: 50%;
}
.width-51 {
width: 51%;
}
.width-52 {
width: 52%;
}
.width-53 {
width: 53%;
}
.width-54 {
width: 54%;
}
.width-55 {
width: 55%;
}
.width-56 {
width: 56%;
}
.width-57 {
width: 57%;
}
.width-58 {
width: 58%;
}
.width-59 {
width: 59%;
}
.width-60 {
width: 60%;
}
.width-61 {
width: 61%;
}
.width-62 {
width: 62%;
}
.width-63 {
width: 63%;
}
.width-64 {
width: 64%;
}
.width-65 {
width: 65%;
}
.width-66 {
width: 66%;
}
.width-67 {
width: 67%;
}
.width-68 {
width: 68%;
}
.width-69 {
width: 69%;
}
.width-70 {
width: 70%;
}
.width-71 {
width: 71%;
}
.width-72 {
width: 72%;
}
.width-73 {
width: 73%;
}
.width-74 {
width: 74%;
}
.width-75 {
width: 75%;
}
.width-76 {
width: 76%;
}
.width-77 {
width: 77%;
}
.width-78 {
width: 78%;
}
.width-79 {
width: 79%;
}
.width-80 {
width: 80%;
}
.width-81 {
width: 81%;
}
.width-82 {
width: 82%;
}
.width-83 {
width: 83%;
}
.width-84 {
width: 84%;
}
.width-85 {
width: 85%;
}
.width-86 {
width: 86%;
}
.width-87 {
width: 87%;
}
.width-88 {
width: 88%;
}
.width-89 {
width: 89%;
}
.width-90 {
width: 90%;
}
.width-91 {
width: 91%;
}
.width-92 {
width: 92%;
}
.width-93 {
width: 93%;
}
.width-94 {
width: 94%;
}
.width-95 {
width: 95%;
}
.width-96 {
width: 96%;
}
.width-97 {
width: 97%;
}
.width-98 {
width: 98%;
}
.width-99 {
width: 99%;
}
.width-100 {
width: 100%;
}
.view-covered-by-tests{
cursor:pointer;
color:blue;
text-decoration:underline;
}
.view-covered-by-tests:hover{
text-decoration:none;
text-shadow: 1px 1px 1px #555;
}