init: 클린 기반 auth 서버 설계
@@ -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> > <a href="index.html" class="el_package">com.project.auth.presentation.auth.controller</a> > <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> > <a href="index.source.html" class="el_package">com.project.auth.presentation.auth.controller</a> > <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("/api/v1/auth")
|
||||
@Tag(name = "Auth", description = "Keycloak 토큰 기반 인증 API")
|
||||
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("/me")
|
||||
public ApiResult<AuthenticatedUserResponse> 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> > <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> > <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> > <a href="index.html" class="el_package">com.project.auth.presentation.auth.current</a> > <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> > <a href="index.source.html" class="el_package">com.project.auth.presentation.auth.current</a> > <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<String> 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> > <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> > <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> > <a href="index.html" class="el_package">com.project.auth.presentation.auth.mapper</a> > <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> > <a href="index.source.html" class="el_package">com.project.auth.presentation.auth.mapper</a> > <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<String> 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> > <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> > <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> > <a href="index.source.html" class="el_package">com.project.auth.presentation.support.exception</a> > <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 로그로 드러내어 운영 대시보드에서 식별 가능하게 한다.
|
||||
*
|
||||
* "새 ClientFacingErrorCode 구현은 반드시 매핑 테이블에 등록해야 한다"는 아키텍처 차원의
|
||||
* 게이트는 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 -> mapCommon(commonErrorCode);</span>
|
||||
<span class="fc" id="L29"> case AuthErrorCode authErrorCode -> mapAuth(authErrorCode);</span>
|
||||
<span class="fc" id="L30"> case PresentationErrorCode presentationErrorCode -> mapPresentation(presentationErrorCode);</span>
|
||||
default -> {
|
||||
<span class="fc" id="L32"> log.warn("Unmapped ClientFacingErrorCode reached default branch. type={} code={} -> falling back to 500",</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 -> 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 -> HttpStatus.BAD_REQUEST;</span>
|
||||
<span class="fc" id="L48"> case METHOD_NOT_ALLOWED -> HttpStatus.METHOD_NOT_ALLOWED;</span>
|
||||
<span class="fc" id="L49"> case RESOURCE_NOT_FOUND -> HttpStatus.NOT_FOUND;</span>
|
||||
<span class="fc" id="L50"> case UNSUPPORTED_MEDIA_TYPE -> HttpStatus.UNSUPPORTED_MEDIA_TYPE;</span>
|
||||
<span class="fc" id="L51"> case NOT_ACCEPTABLE -> HttpStatus.NOT_ACCEPTABLE;</span>
|
||||
<span class="fc" id="L52"> case PAYLOAD_TOO_LARGE -> HttpStatus.CONTENT_TOO_LARGE;</span>
|
||||
<span class="fc" id="L53"> case MESSAGE_NOT_WRITABLE -> HttpStatus.INTERNAL_SERVER_ERROR;</span>
|
||||
<span class="fc" id="L54"> case UNHANDLED_CLIENT_ERROR -> 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 -> HttpStatus.UNAUTHORIZED;</span>
|
||||
<span class="fc" id="L61"> case ACCESS_DENIED -> HttpStatus.FORBIDDEN;</span>
|
||||
<span class="fc" id="L62"> case KEYCLOAK_CLAIMS_INVALID -> HttpStatus.BAD_REQUEST;</span>
|
||||
<span class="fc" id="L63"> case KEYCLOAK_USER_NOT_FOUND -> 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> > <a href="index.source.html" class="el_package">com.project.auth.presentation.support.exception</a> > <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<ApiResult<Void>> handleBusinessException(
|
||||
BusinessException exception,
|
||||
HttpServletRequest request
|
||||
) {
|
||||
<span class="fc" id="L37"> log.warn(</span>
|
||||
"Business exception. exceptionType={} errorCode={} method={} requestPath={}",
|
||||
<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은 "응답이 작성되지 않음"으로 해석해 리졸버 체인으로 재진입할 수 있고,
|
||||
* 우리가 막으려는 재귀 실패가 바로 그것이다.
|
||||
*
|
||||
* 응답이 아직 커밋되지 않았다면 표준 ApiResult 본문을 시도한다. 직렬화 실패가
|
||||
* 구조적인 원인이면 2차 시도도 같은 이유로 실패할 수 있는데, 그때는
|
||||
* @ExceptionHandler(Exception.class) 안전망이 다시 잡아낸다.
|
||||
*/
|
||||
@ExceptionHandler(HttpMessageNotWritableException.class)
|
||||
public ResponseEntity<ApiResult<Void>> handleMessageNotWritableException(
|
||||
HttpMessageNotWritableException exception,
|
||||
HttpServletRequest request,
|
||||
HttpServletResponse response
|
||||
) {
|
||||
<span class="fc" id="L68"> log.error(</span>
|
||||
"Response body not writable. committed={} method={} requestPath={}",
|
||||
<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<ApiResult<Void>> handleUncaughtException(
|
||||
Exception exception,
|
||||
HttpServletRequest request
|
||||
) {
|
||||
<span class="fc" id="L101"> log.error(</span>
|
||||
"Uncaught exception reached @ExceptionHandler safety net. exceptionType={} method={} requestPath={}",
|
||||
<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> > <a href="index.html" class="el_package">com.project.auth.presentation.support.exception</a> > <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> > <a href="index.source.html" class="el_package">com.project.auth.presentation.support.exception</a> > <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가 원인별로 분기 로직을 짤 수 있도록 트리거별로 의도적으로 코드를 분리했다.
|
||||
* <ul>
|
||||
* <li>{@link #INVALID_INPUT} — 요청 본문 빈 검증 실패
|
||||
* ({@code @Valid @RequestBody}, MethodArgumentNotValidException).</li>
|
||||
* <li>{@link #INVALID_REQUEST_BODY} — 요청 본문 파싱 실패
|
||||
* (HttpMessageNotReadableException, 예: 잘못된 JSON).</li>
|
||||
* <li>{@link #MISSING_PARAMETER} — 필수 query/form 파라미터 누락
|
||||
* (MissingServletRequestParameterException).</li>
|
||||
* <li>{@link #CONSTRAINT_VIOLATION} — 컨트롤러 메서드 인자 범위 밖에서 트리거된
|
||||
* Jakarta Bean Validation (ConstraintViolationException, 주로 @Validated 서비스
|
||||
* 또는 @RequestParam 제약).</li>
|
||||
* <li>{@link #TYPE_MISMATCH} — query/path/form 값을 대상 타입으로 변환 실패
|
||||
* (TypeMismatchException, 예: Long에 {@code id=abc}).</li>
|
||||
* <li>{@link #INVALID_PARAMETER} — 핸들러 메서드 레벨 검증 실패
|
||||
* (HandlerMethodValidationException, 예: {@code @RequestParam @Size}).</li>
|
||||
* <li>{@link #MISSING_HEADER} — 필수 @RequestHeader 누락.</li>
|
||||
* <li>{@link #REQUEST_BINDING_FAILED} — 더 구체적인 코드로 분류되지 않은
|
||||
* 일반 ServletRequestBindingException.</li>
|
||||
* <li>{@link #METHOD_NOT_ALLOWED} — 라우트가 지원하지 않는 HTTP 메서드.</li>
|
||||
* <li>{@link #RESOURCE_NOT_FOUND} — 요청 경로에 매칭되는 라우트/정적 리소스 없음.</li>
|
||||
* <li>{@link #UNSUPPORTED_MEDIA_TYPE} — 라우트가 수용하지 않는 Content-Type.</li>
|
||||
* <li>{@link #NOT_ACCEPTABLE} — Accept 헤더를 만족시킬 수 없음.</li>
|
||||
* <li>{@link #PAYLOAD_TOO_LARGE} — multipart 업로드가 허용 한도 초과.</li>
|
||||
* <li>{@link #MESSAGE_NOT_WRITABLE} — 응답 직렬화 실패 (5xx).</li>
|
||||
* <li>{@link #UNHANDLED_CLIENT_ERROR} — 더 구체적인 매핑이 없는 4xx 상태 캐리어
|
||||
* (ResponseStatusException, ErrorResponseException) 또는 컨테이너 레벨 4xx 응답에
|
||||
* 대한 폴백.</li>
|
||||
* </ul>
|
||||
*/
|
||||
<span class="fc" id="L37">public enum PresentationErrorCode implements ClientFacingErrorCode {</span>
|
||||
<span class="fc" id="L38"> INVALID_INPUT("PRES-001", "요청 값이 올바르지 않습니다."),</span>
|
||||
<span class="fc" id="L39"> INVALID_REQUEST_BODY("PRES-002", "요청 본문을 읽을 수 없습니다."),</span>
|
||||
<span class="fc" id="L40"> METHOD_NOT_ALLOWED("PRES-003", "지원하지 않는 HTTP 메서드입니다."),</span>
|
||||
<span class="fc" id="L41"> MISSING_PARAMETER("PRES-004", "필수 요청 파라미터가 누락되었습니다."),</span>
|
||||
<span class="fc" id="L42"> RESOURCE_NOT_FOUND("PRES-005", "요청한 리소스를 찾을 수 없습니다."),</span>
|
||||
<span class="fc" id="L43"> CONSTRAINT_VIOLATION("PRES-006", "요청 값이 제약 조건을 위반했습니다."),</span>
|
||||
<span class="fc" id="L44"> UNSUPPORTED_MEDIA_TYPE("PRES-007", "지원하지 않는 Content-Type입니다."),</span>
|
||||
<span class="fc" id="L45"> NOT_ACCEPTABLE("PRES-008", "요청한 응답 형식을 제공할 수 없습니다."),</span>
|
||||
<span class="fc" id="L46"> MISSING_HEADER("PRES-009", "필수 요청 헤더가 누락되었습니다."),</span>
|
||||
<span class="fc" id="L47"> REQUEST_BINDING_FAILED("PRES-010", "요청 바인딩에 실패했습니다."),</span>
|
||||
<span class="fc" id="L48"> MESSAGE_NOT_WRITABLE("PRES-011", "응답 데이터를 처리할 수 없습니다."),</span>
|
||||
<span class="fc" id="L49"> PAYLOAD_TOO_LARGE("PRES-012", "요청 본문 크기가 허용 한도를 초과했습니다."),</span>
|
||||
<span class="fc" id="L50"> UNHANDLED_CLIENT_ERROR("PRES-013", "처리하지 못한 클라이언트 오류입니다."),</span>
|
||||
<span class="fc" id="L51"> TYPE_MISMATCH("PRES-014", "요청 파라미터 타입이 올바르지 않습니다."),</span>
|
||||
<span class="fc" id="L52"> INVALID_PARAMETER("PRES-015", "요청 파라미터 검증에 실패했습니다.");</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> > <a href="index.source.html" class="el_package">com.project.auth.presentation.support.exception</a> > <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<ApiResult<Void>> handleMessageNotReadableException(
|
||||
HttpMessageNotReadableException exception,
|
||||
HttpServletRequest request
|
||||
) {
|
||||
<span class="fc" id="L47"> log.warn("Request body not readable. method={} requestPath={} errorCode={}",</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<ApiResult<Void>> handleMethodNotSupportedException(
|
||||
HttpRequestMethodNotSupportedException exception,
|
||||
HttpServletRequest request
|
||||
) {
|
||||
<span class="fc" id="L64"> log.warn("Method not supported. method={} requestPath={} attemptedMethod={} errorCode={}",</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<ApiResult<Void>> handleMissingParameterException(
|
||||
MissingServletRequestParameterException exception,
|
||||
HttpServletRequest request
|
||||
) {
|
||||
<span class="fc" id="L82"> log.warn("Missing request parameter. method={} requestPath={} parameter={} errorCode={}",</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<ApiResult<Void>> handleTypeMismatchException(
|
||||
TypeMismatchException exception,
|
||||
HttpServletRequest request
|
||||
) {
|
||||
<span class="fc" id="L100"> log.warn("Type mismatch for parameter. method={} requestPath={} parameter={} errorCode={}",</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<ApiResult<Void>> handleMediaTypeNotSupportedException(
|
||||
HttpMediaTypeNotSupportedException exception,
|
||||
HttpServletRequest request
|
||||
) {
|
||||
<span class="fc" id="L118"> log.warn("Unsupported media type. method={} requestPath={} contentType={} errorCode={}",</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<ApiResult<Void>> handleMediaTypeNotAcceptableException(
|
||||
HttpMediaTypeNotAcceptableException exception,
|
||||
HttpServletRequest request
|
||||
) {
|
||||
<span class="fc" id="L136"> log.warn("Not acceptable media type. method={} requestPath={} errorCode={}",</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<ApiResult<Void>> handleMissingRequestHeaderException(
|
||||
MissingRequestHeaderException exception,
|
||||
HttpServletRequest request
|
||||
) {
|
||||
<span class="fc" id="L153"> log.warn("Missing request header. method={} requestPath={} header={} errorCode={}",</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<ApiResult<Void>> handleServletRequestBindingException(
|
||||
ServletRequestBindingException exception,
|
||||
HttpServletRequest request
|
||||
) {
|
||||
<span class="fc" id="L171"> log.warn("Request binding failed. method={} requestPath={} errorCode={}",</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<ApiResult<Void>> handleNoResourceFoundException(
|
||||
NoResourceFoundException exception,
|
||||
HttpServletRequest request
|
||||
) {
|
||||
<span class="fc" id="L188"> log.warn("No resource found. method={} requestPath={} resourcePath={} errorCode={}",</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<ApiResult<Void>> handleMaxUploadSizeExceededException(
|
||||
MaxUploadSizeExceededException exception,
|
||||
HttpServletRequest request
|
||||
) {
|
||||
<span class="fc" id="L206"> log.warn("Upload payload too large. method={} requestPath={} maxBytes={} errorCode={}",</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가 "요청 잘못" vs "서버 결함"을
|
||||
* 여전히 구분할 수 있게 하기 위함이다.
|
||||
*
|
||||
* ResponseStatusException과 ErrorResponseException은 둘 다 {@link ErrorResponse}를 구현하면서
|
||||
* 동시에 {@link Throwable}을 상속하므로 로그 호출부의 (Throwable) 캐스트가 안전하다.
|
||||
* 향후 Throwable이 아닌 ErrorResponse 구현체를 이 @ExceptionHandler 목록에 추가하면
|
||||
* 런타임 ClassCastException이 발생하므로, 이 핸들러는 명시한 두 예외 타입으로만 한정한다.
|
||||
*/
|
||||
@ExceptionHandler({ResponseStatusException.class, ErrorResponseException.class})
|
||||
public ResponseEntity<ApiResult<Void>> 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 >= 500) {</span>
|
||||
<span class="fc" id="L241"> log.error("Framework-thrown 5xx status. method={} requestPath={} status={}",</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("Framework-thrown 4xx status. method={} requestPath={} status={} errorCode={}",</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> > <a href="index.source.html" class="el_package">com.project.auth.presentation.support.exception</a> > <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 = "__global__";
|
||||
|
||||
/**
|
||||
* {@code getDefaultMessage()}와 {@code error.code()}가 모두 null/공백인 경우의 폴백 메시지.
|
||||
*
|
||||
* Bean Validation은 MessageSource로 해석되는 메시지 코드만 정의된 케이스를 허용하며,
|
||||
* 이때 getDefaultMessage()는 null을 반환할 수 있다. 이 sentinel이 없으면 응답 errors에
|
||||
* {@code [null]} 항목이 그대로 들어간다.
|
||||
*/
|
||||
static final String UNRESOLVED_VIOLATION_MESSAGE = "validation failed";
|
||||
|
||||
<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<ApiResult<Void>> handleValidationException(
|
||||
MethodArgumentNotValidException exception
|
||||
) {
|
||||
<span class="fc" id="L60"> Map<String, List<String>> errors = new LinkedHashMap<>();</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 -> new ArrayList<>())</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 -> new ArrayList<>())</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("Validation failed: {}", 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<ApiResult<Void>> handleConstraintViolationException(
|
||||
ConstraintViolationException exception
|
||||
) {
|
||||
<span class="fc" id="L84"> Map<String, List<String>> errors = new LinkedHashMap<>();</span>
|
||||
<span class="fc bfc" id="L85" title="All 2 branches covered."> for (ConstraintViolation<?> violation : exception.getConstraintViolations()) {</span>
|
||||
<span class="fc" id="L86"> String pointer = toJsonPointer(violation.getPropertyPath());</span>
|
||||
<span class="fc" id="L87"> errors.computeIfAbsent(pointer, k -> new ArrayList<>())</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("Constraint violation: {}", 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<ApiResult<Void>> handleHandlerMethodValidationException(
|
||||
HandlerMethodValidationException exception
|
||||
) {
|
||||
<span class="fc" id="L105"> Map<String, List<String>> errors = new LinkedHashMap<>();</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("unknown_" + 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 && codes.length > 0 ? codes[0] : null;</span>
|
||||
<span class="fc" id="L119"> errors.computeIfAbsent(key, k -> new ArrayList<>())</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 > 0) {</span>
|
||||
<span class="fc" id="L124"> log.warn("Handler method validation: {} unnamed parameter(s); compile with -parameters to recover names",</span>
|
||||
<span class="fc" id="L125"> unnamedCounter);</span>
|
||||
}
|
||||
|
||||
<span class="fc" id="L128"> log.warn("Handler method validation failed: {}", 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} -> {@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 ? "/" : builder.toString();</span>
|
||||
}
|
||||
|
||||
private static String escapeJsonPointerSegment(String segment) {
|
||||
<span class="fc" id="L166"> return segment.replace("~", "~0").replace("/", "~1");</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 "/";</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 < 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 ? "/" : builder.toString();</span>
|
||||
}
|
||||
|
||||
private static int minNonNegative(int a, int b) {
|
||||
<span class="fc bfc" id="L211" title="All 2 branches covered."> if (a < 0) {</span>
|
||||
<span class="fc" id="L212"> return b;</span>
|
||||
}
|
||||
<span class="fc bfc" id="L214" title="All 2 branches covered."> if (b < 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 && !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 && !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> > <a href="index.html" class="el_package">com.project.auth.presentation.support.response</a> > <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> > <a href="index.source.html" class="el_package">com.project.auth.presentation.support.response</a> > <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).
|
||||
*
|
||||
* <ul>
|
||||
* <li>{@code data}: 성공 응답의 페이로드. 실패 시에는 null.</li>
|
||||
* <li>{@code errors}: 검증/cross-field 에러 메시지의 키-리스트 맵. 검증 실패에서만
|
||||
* 채워진다. 필드 레벨 진단이 없으면 null. {@code data}와 분리해서 OpenAPI 스펙이
|
||||
* {@code data}를 도메인 타입과 에러 맵의 oneOf로 모델링할 필요가 없게 한다.</li>
|
||||
* </ul>
|
||||
*
|
||||
* null 필드는 JSON 직렬화 시 제외하여, 성공 응답에 {@code "errors": null} 잡음이나
|
||||
* 실패 응답에 {@code "data": null}이 따라붙지 않도록 한다.
|
||||
*/
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
<span class="fc" id="L22">public record ApiResult<T>(</span>
|
||||
boolean success,
|
||||
String code,
|
||||
String message,
|
||||
T data,
|
||||
Map<String, List<String>> 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> > <a href="index.html" class="el_package">com.project.auth.presentation.support.response</a> > <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> > <a href="index.source.html" class="el_package">com.project.auth.presentation.support.response</a> > <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("AUTHENTICATED_USER_LOADED", "현재 사용자 조회가 완료되었습니다.");</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> > <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> > <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>
|
||||
|
After Width: | Height: | Size: 91 B |
|
After Width: | Height: | Size: 91 B |
|
After Width: | Height: | Size: 91 B |
|
After Width: | Height: | Size: 709 B |
|
After Width: | Height: | Size: 586 B |
|
After Width: | Height: | Size: 67 B |
|
After Width: | Height: | Size: 91 B |
|
After Width: | Height: | Size: 351 B |
|
After Width: | Height: | Size: 193 B |
|
After Width: | Height: | Size: 227 B |
@@ -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; }
|
||||
|
After Width: | Height: | Size: 91 B |
@@ -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;
|
||||
}
|
||||
|
After Width: | Height: | Size: 363 B |
|
After Width: | Height: | Size: 213 B |
|
After Width: | Height: | Size: 58 B |
@@ -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;
|
||||
|
||||
})();
|
||||
|
After Width: | Height: | Size: 354 B |
|
After Width: | Height: | Size: 67 B |
@@ -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("AUTHENTICATED_USER_LOADED", "현재 사용자 조회가 완료되었습니다.");</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 "" for com/project/auth/presentation/support/response/ApiSuccessCode::code → 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 "" for com/project/auth/presentation/support/response/ApiSuccessCode::message → 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 "" for com/project/auth/presentation/support/response/ApiSuccessCode::code → 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 "" for com/project/auth/presentation/support/response/ApiSuccessCode::message → 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 "" 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 "" 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 "" 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 "" 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 "" 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 "" 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 "" 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 "" 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 "" 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 "" 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 "" 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;
|
||||
}
|
||||