init: 클린 기반 auth 서버 설계
@@ -0,0 +1,66 @@
|
||||
# infrastructure AGENTS
|
||||
|
||||
Role:
|
||||
- implement persistence and external integrations
|
||||
- own JPA/repository/external client/token-security technical details
|
||||
|
||||
Allowed:
|
||||
- JPA entity/repository
|
||||
- persistence mapper
|
||||
- external API client
|
||||
- serializer/deserializer usage
|
||||
- infrastructure exception
|
||||
- output port implementation
|
||||
|
||||
Forbidden:
|
||||
- ResponseEntity/API response decision
|
||||
- client-facing error policy
|
||||
- controller semantics
|
||||
- business workflow ownership
|
||||
|
||||
Rules:
|
||||
- translate technical failures into infrastructure exception
|
||||
- no inline remote-call code outside dedicated client/adapter
|
||||
- prefer typed request/response models over ad-hoc maps
|
||||
- do not ignore invalid persisted state; translate explicitly
|
||||
- choose fetch strategy deliberately
|
||||
- avoid N+1 by design, not after the fact
|
||||
- validate slow query with EXPLAIN ANALYZE
|
||||
- do not hold DB transaction across remote call
|
||||
- PostgreSQL constraints are mandatory, not optional
|
||||
|
||||
Read first:
|
||||
- `/docs/architecture/README.md`
|
||||
- `/docs/standards/design/mapper-separation.md`
|
||||
- `/docs/standards/integration/external-api-client-structure.md`
|
||||
- `/docs/standards/integration/timeout.md`
|
||||
- `/docs/standards/integration/retry.md`
|
||||
- `/docs/standards/integration/serialization-deserialization.md`
|
||||
- `/docs/standards/observability/exception-log.md`
|
||||
- `/docs/standards/db/schema-structure.md`
|
||||
- `/docs/standards/db/column-types.md`
|
||||
- `/docs/standards/db/pk-fk-unique-check.md`
|
||||
- `/docs/standards/db/audit-columns.md`
|
||||
- `/docs/standards/db/index.md`
|
||||
- `/docs/standards/db/query.md`
|
||||
- `/docs/standards/db/pagination-query.md`
|
||||
- `/docs/standards/db/jpa-fetch-strategy.md`
|
||||
- `/docs/standards/db/n-plus-one.md`
|
||||
- `/docs/standards/db/transaction.md`
|
||||
- `/docs/standards/db/isolation.md`
|
||||
- `/docs/standards/db/lock.md`
|
||||
- `/docs/standards/db/concurrency.md`
|
||||
- `/docs/standards/db/soft-delete.md`
|
||||
- `/docs/standards/db/migration.md`
|
||||
- `/docs/standards/testing/repository-test.md`
|
||||
- `/docs/standards/testing/fixture-factory.md`
|
||||
|
||||
Examples:
|
||||
- `/docs/examples/design/mapper-separation.md`
|
||||
- `/docs/examples/integration/external-api-client-structure.md`
|
||||
- `/docs/examples/integration/timeout.md`
|
||||
- `/docs/examples/integration/retry.md`
|
||||
- `/docs/examples/integration/serialization-deserialization.md`
|
||||
- `/docs/examples/db/**`
|
||||
- `/docs/examples/testing/repository-test.md`
|
||||
- `/docs/examples/testing/fixture-factory.md`
|
||||
@@ -0,0 +1,13 @@
|
||||
dependencies {
|
||||
implementation project(':application')
|
||||
implementation project(':domain')
|
||||
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
|
||||
implementation 'org.springframework:spring-web'
|
||||
implementation 'org.flywaydb:flyway-core'
|
||||
implementation 'org.flywaydb:flyway-database-postgresql'
|
||||
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
||||
testImplementation 'org.springframework.boot:spring-boot-data-jpa-test'
|
||||
testImplementation 'org.testcontainers:junit-jupiter:1.20.4'
|
||||
testImplementation 'org.testcontainers:postgresql:1.20.4'
|
||||
testRuntimeOnly 'org.postgresql:postgresql'
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
<?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>UserJpaEntity.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">infrastructure</a> > <a href="index.source.html" class="el_package">com.project.auth.infrastructure.persistence.user.entity</a> > <span class="el_source">UserJpaEntity.java</span></div><h1>UserJpaEntity.java</h1><pre class="source lang-java linenums">package com.project.auth.infrastructure.persistence.user.entity;
|
||||
|
||||
import com.project.auth.domain.user.model.AuthProvider;
|
||||
import jakarta.persistence.Column;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.EnumType;
|
||||
import jakarta.persistence.Enumerated;
|
||||
import jakarta.persistence.Id;
|
||||
import jakarta.persistence.Table;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.util.Objects;
|
||||
import java.util.UUID;
|
||||
|
||||
@Entity
|
||||
@Table(name = "users")
|
||||
public class UserJpaEntity {
|
||||
|
||||
@Id
|
||||
@Column(name = "id", nullable = false, updatable = false)
|
||||
private UUID id;
|
||||
|
||||
@Column(name = "email", nullable = false, columnDefinition = "text")
|
||||
private String email;
|
||||
|
||||
@Column(name = "name", nullable = false, columnDefinition = "text")
|
||||
private String name;
|
||||
|
||||
@Enumerated(EnumType.STRING)
|
||||
@Column(name = "provider", nullable = false, columnDefinition = "text")
|
||||
private AuthProvider provider;
|
||||
|
||||
@Column(name = "provider_subject", nullable = false, columnDefinition = "text")
|
||||
private String providerSubject;
|
||||
|
||||
@Column(name = "created_at", nullable = false, updatable = false)
|
||||
private Instant createdAt;
|
||||
|
||||
@Column(name = "updated_at", nullable = false, insertable = false, updatable = false)
|
||||
private Instant updatedAt;
|
||||
|
||||
<span class="fc" id="L42"> protected UserJpaEntity() {</span>
|
||||
<span class="fc" id="L43"> }</span>
|
||||
|
||||
private UserJpaEntity(
|
||||
UUID id,
|
||||
String email,
|
||||
String name,
|
||||
AuthProvider provider,
|
||||
String providerSubject,
|
||||
Instant createdAt
|
||||
<span class="fc" id="L52"> ) {</span>
|
||||
<span class="fc" id="L53"> this.id = Objects.requireNonNull(id, "id must not be null");</span>
|
||||
<span class="fc" id="L54"> this.email = Objects.requireNonNull(email, "email must not be null");</span>
|
||||
<span class="fc" id="L55"> this.name = Objects.requireNonNull(name, "name must not be null");</span>
|
||||
<span class="fc" id="L56"> this.provider = Objects.requireNonNull(provider, "provider must not be null");</span>
|
||||
<span class="fc" id="L57"> this.providerSubject = Objects.requireNonNull(providerSubject, "providerSubject must not be null");</span>
|
||||
<span class="fc" id="L58"> this.createdAt = Objects.requireNonNull(createdAt, "createdAt must not be null");</span>
|
||||
<span class="fc" id="L59"> }</span>
|
||||
|
||||
public static UserJpaEntity of(
|
||||
UUID id,
|
||||
String email,
|
||||
String name,
|
||||
AuthProvider provider,
|
||||
String providerSubject,
|
||||
Instant createdAt
|
||||
) {
|
||||
<span class="fc" id="L69"> return new UserJpaEntity(id, email, name, provider, providerSubject, createdAt);</span>
|
||||
}
|
||||
|
||||
public UUID getId() {
|
||||
<span class="fc" id="L73"> return id;</span>
|
||||
}
|
||||
|
||||
public String getEmail() {
|
||||
<span class="fc" id="L77"> return email;</span>
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
<span class="fc" id="L81"> return name;</span>
|
||||
}
|
||||
|
||||
public AuthProvider getProvider() {
|
||||
<span class="fc" id="L85"> return provider;</span>
|
||||
}
|
||||
|
||||
public String getProviderSubject() {
|
||||
<span class="fc" id="L89"> return providerSubject;</span>
|
||||
}
|
||||
|
||||
public Instant getCreatedAt() {
|
||||
<span class="fc" id="L93"> return createdAt;</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.infrastructure.persistence.user.entity</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">infrastructure</a> > <span class="el_package">com.project.auth.infrastructure.persistence.user.entity</span></div><h1>com.project.auth.infrastructure.persistence.user.entity</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 70</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">9</td><td class="ctr1">0</td><td class="ctr2">17</td><td class="ctr1">0</td><td class="ctr2">9</td><td class="ctr1">0</td><td class="ctr2">1</td></tr></tfoot><tbody><tr><td id="a0"><a href="UserJpaEntity.html" class="el_class">UserJpaEntity</a></td><td class="bar" id="b0"><img src="../jacoco-resources/greenbar.gif" width="120" height="10" title="70" alt="70"/></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">9</td><td class="ctr1" id="h0">0</td><td class="ctr2" id="i0">17</td><td class="ctr1" id="j0">0</td><td class="ctr2" id="k0">9</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.infrastructure.persistence.user.entity</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">infrastructure</a> > <span class="el_package">com.project.auth.infrastructure.persistence.user.entity</span></div><h1>com.project.auth.infrastructure.persistence.user.entity</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 70</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">9</td><td class="ctr1">0</td><td class="ctr2">17</td><td class="ctr1">0</td><td class="ctr2">9</td><td class="ctr1">0</td><td class="ctr2">1</td></tr></tfoot><tbody><tr><td id="a0"><a href="UserJpaEntity.java.html" class="el_source">UserJpaEntity.java</a></td><td class="bar" id="b0"><img src="../jacoco-resources/greenbar.gif" width="120" height="10" title="70" alt="70"/></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">9</td><td class="ctr1" id="h0">0</td><td class="ctr2" id="i0">17</td><td class="ctr1" id="j0">0</td><td class="ctr2" id="k0">9</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>UserPersistenceMapper</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">infrastructure</a> > <a href="index.html" class="el_package">com.project.auth.infrastructure.persistence.user.mapper</a> > <span class="el_class">UserPersistenceMapper</span></div><h1>UserPersistenceMapper</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 40</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">3</td><td class="ctr1">0</td><td class="ctr2">17</td><td class="ctr1">0</td><td class="ctr2">3</td></tr></tfoot><tbody><tr><td id="a0"><a href="UserPersistenceMapper.java.html#L26" class="el_method">toDomain(UserJpaEntity)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/greenbar.gif" width="120" height="10" title="23" alt="23"/></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">9</td><td class="ctr1" id="j0">0</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a1"><a href="UserPersistenceMapper.java.html#L14" class="el_method">toEntity(User)</a></td><td class="bar" id="b1"><img src="../jacoco-resources/greenbar.gif" width="73" height="10" title="14" alt="14"/></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">7</td><td class="ctr1" id="j1">0</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a2"><a href="UserPersistenceMapper.java.html#L11" class="el_method">UserPersistenceMapper()</a></td><td class="bar" id="b2"><img src="../jacoco-resources/greenbar.gif" width="15" 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></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,42 @@
|
||||
<?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>UserPersistenceMapper.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">infrastructure</a> > <a href="index.source.html" class="el_package">com.project.auth.infrastructure.persistence.user.mapper</a> > <span class="el_source">UserPersistenceMapper.java</span></div><h1>UserPersistenceMapper.java</h1><pre class="source lang-java linenums">package com.project.auth.infrastructure.persistence.user.mapper;
|
||||
|
||||
import com.project.auth.domain.user.exception.DomainException;
|
||||
import com.project.auth.domain.user.model.User;
|
||||
import com.project.auth.domain.user.model.UserEmail;
|
||||
import com.project.auth.domain.user.model.UserName;
|
||||
import com.project.auth.infrastructure.persistence.user.entity.UserJpaEntity;
|
||||
import com.project.auth.infrastructure.support.exception.InfrastructureErrorCode;
|
||||
import com.project.auth.infrastructure.support.exception.InfrastructureException;
|
||||
|
||||
<span class="fc" id="L11">public class UserPersistenceMapper {</span>
|
||||
|
||||
public UserJpaEntity toEntity(User user) {
|
||||
<span class="fc" id="L14"> return UserJpaEntity.of(</span>
|
||||
<span class="fc" id="L15"> user.getId(),</span>
|
||||
<span class="fc" id="L16"> user.getEmail(),</span>
|
||||
<span class="fc" id="L17"> user.getName(),</span>
|
||||
<span class="fc" id="L18"> user.getProvider(),</span>
|
||||
<span class="fc" id="L19"> user.getProviderSubject(),</span>
|
||||
<span class="fc" id="L20"> user.getCreatedAt()</span>
|
||||
);
|
||||
}
|
||||
|
||||
public User toDomain(UserJpaEntity userJpaEntity) {
|
||||
try {
|
||||
<span class="fc" id="L26"> return User.restore(</span>
|
||||
<span class="fc" id="L27"> userJpaEntity.getId(),</span>
|
||||
<span class="fc" id="L28"> UserEmail.from(userJpaEntity.getEmail()),</span>
|
||||
<span class="fc" id="L29"> UserName.from(userJpaEntity.getName()),</span>
|
||||
<span class="fc" id="L30"> userJpaEntity.getProvider(),</span>
|
||||
<span class="fc" id="L31"> userJpaEntity.getProviderSubject(),</span>
|
||||
<span class="fc" id="L32"> userJpaEntity.getCreatedAt()</span>
|
||||
);
|
||||
<span class="fc" id="L34"> } catch (DomainException | IllegalArgumentException | NullPointerException exception) {</span>
|
||||
<span class="fc" id="L35"> throw new InfrastructureException(</span>
|
||||
InfrastructureErrorCode.PERSISTED_DATA_INVALID,
|
||||
exception
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
</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.infrastructure.persistence.user.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">infrastructure</a> > <span class="el_package">com.project.auth.infrastructure.persistence.user.mapper</span></div><h1>com.project.auth.infrastructure.persistence.user.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 40</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">3</td><td class="ctr1">0</td><td class="ctr2">17</td><td class="ctr1">0</td><td class="ctr2">3</td><td class="ctr1">0</td><td class="ctr2">1</td></tr></tfoot><tbody><tr><td id="a0"><a href="UserPersistenceMapper.html" class="el_class">UserPersistenceMapper</a></td><td class="bar" id="b0"><img src="../jacoco-resources/greenbar.gif" width="120" height="10" title="40" alt="40"/></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">3</td><td class="ctr1" id="h0">0</td><td class="ctr2" id="i0">17</td><td class="ctr1" id="j0">0</td><td class="ctr2" id="k0">3</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.infrastructure.persistence.user.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">infrastructure</a> > <span class="el_package">com.project.auth.infrastructure.persistence.user.mapper</span></div><h1>com.project.auth.infrastructure.persistence.user.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 40</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">3</td><td class="ctr1">0</td><td class="ctr2">17</td><td class="ctr1">0</td><td class="ctr2">3</td><td class="ctr1">0</td><td class="ctr2">1</td></tr></tfoot><tbody><tr><td id="a0"><a href="UserPersistenceMapper.java.html" class="el_source">UserPersistenceMapper.java</a></td><td class="bar" id="b0"><img src="../jacoco-resources/greenbar.gif" width="120" height="10" title="40" alt="40"/></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">3</td><td class="ctr1" id="h0">0</td><td class="ctr2" id="i0">17</td><td class="ctr1" id="j0">0</td><td class="ctr2" id="k0">3</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>JpaUserRepositoryAdapter</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">infrastructure</a> > <a href="index.html" class="el_package">com.project.auth.infrastructure.persistence.user</a> > <span class="el_class">JpaUserRepositoryAdapter</span></div><h1>JpaUserRepositoryAdapter</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 62</td><td class="ctr2">54%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">3</td><td class="ctr2">5</td><td class="ctr1">5</td><td class="ctr2">12</td><td class="ctr1">3</td><td class="ctr2">5</td></tr></tfoot><tbody><tr><td id="a1"><a href="JpaUserRepositoryAdapter.java.html#L33" class="el_method">findByProviderAndProviderSubject(AuthProvider, String)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="82" height="10" title="13" alt="13"/></td><td class="ctr2" id="c2">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">2</td><td class="ctr2" id="i2">2</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a0"><a href="JpaUserRepositoryAdapter.java.html#L39" class="el_method">existsByEmail(UserEmail)</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="69" height="10" title="11" alt="11"/></td><td class="ctr2" id="c3">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="i3">2</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a3"><a href="JpaUserRepositoryAdapter.java.html#L46" class="el_method">register(User)</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="25" height="10" title="4" alt="4"/></td><td class="ctr2" id="c4">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="i4">1</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a4"><a href="JpaUserRepositoryAdapter.java.html#L50" class="el_method">save(User)</a></td><td class="bar" id="b3"><img src="../jacoco-resources/greenbar.gif" width="120" height="10" title="19" alt="19"/></td><td class="ctr2" id="c0">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="i1">3</td><td class="ctr1" id="j3">0</td><td class="ctr2" id="k3">1</td></tr><tr><td id="a2"><a href="JpaUserRepositoryAdapter.java.html#L20" class="el_method">JpaUserRepositoryAdapter(UserJpaRepository, UserPersistenceMapper)</a></td><td class="bar" id="b4"><img src="../jacoco-resources/greenbar.gif" width="94" height="10" title="15" alt="15"/></td><td class="ctr2" id="c1">100%</td><td class="bar" id="d4"/><td class="ctr2" id="e4">n/a</td><td class="ctr1" id="f4">0</td><td class="ctr2" id="g4">1</td><td class="ctr1" id="h4">0</td><td class="ctr2" id="i0">4</td><td class="ctr1" id="j4">0</td><td class="ctr2" id="k4">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>JpaUserRepositoryAdapter.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">infrastructure</a> > <a href="index.source.html" class="el_package">com.project.auth.infrastructure.persistence.user</a> > <span class="el_source">JpaUserRepositoryAdapter.java</span></div><h1>JpaUserRepositoryAdapter.java</h1><pre class="source lang-java linenums">package com.project.auth.infrastructure.persistence.user;
|
||||
|
||||
import com.project.auth.application.auth.identity.port.out.LoadKeycloakUserPort;
|
||||
import com.project.auth.application.auth.identity.port.out.RegisterKeycloakUserPort;
|
||||
import com.project.auth.domain.user.model.AuthProvider;
|
||||
import com.project.auth.domain.user.model.User;
|
||||
import com.project.auth.domain.user.model.UserEmail;
|
||||
import com.project.auth.infrastructure.persistence.user.entity.UserJpaEntity;
|
||||
import com.project.auth.infrastructure.persistence.user.mapper.UserPersistenceMapper;
|
||||
import com.project.auth.infrastructure.persistence.user.repository.UserJpaRepository;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
public class JpaUserRepositoryAdapter implements LoadKeycloakUserPort, RegisterKeycloakUserPort {
|
||||
|
||||
private final UserJpaRepository userJpaRepository;
|
||||
private final UserPersistenceMapper userPersistenceMapper;
|
||||
|
||||
<span class="fc" id="L20"> public JpaUserRepositoryAdapter(UserJpaRepository userJpaRepository, UserPersistenceMapper userPersistenceMapper) {</span>
|
||||
<span class="fc" id="L21"> this.userJpaRepository = Objects.requireNonNull(userJpaRepository, "userJpaRepository must not be null");</span>
|
||||
<span class="fc" id="L22"> this.userPersistenceMapper = Objects.requireNonNull(</span>
|
||||
userPersistenceMapper,
|
||||
"userPersistenceMapper must not be null"
|
||||
);
|
||||
<span class="fc" id="L26"> }</span>
|
||||
|
||||
@Override
|
||||
public Optional<User> findByProviderAndProviderSubject(
|
||||
AuthProvider provider,
|
||||
String providerSubject
|
||||
) {
|
||||
<span class="nc" id="L33"> return userJpaRepository.findByProviderAndProviderSubject(provider, providerSubject)</span>
|
||||
<span class="nc" id="L34"> .map(userPersistenceMapper::toDomain);</span>
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean existsByEmail(UserEmail email) {
|
||||
<span class="nc" id="L39"> UserEmail nonNullEmail = Objects.requireNonNull(email, "email must not be null");</span>
|
||||
|
||||
<span class="nc" id="L41"> return userJpaRepository.existsByEmail(nonNullEmail.value());</span>
|
||||
}
|
||||
|
||||
@Override
|
||||
public User register(User user) {
|
||||
<span class="nc" id="L46"> return save(user);</span>
|
||||
}
|
||||
|
||||
public User save(User user) {
|
||||
<span class="fc" id="L50"> User nonNullUser = Objects.requireNonNull(user, "user must not be null");</span>
|
||||
|
||||
<span class="fc" id="L52"> UserJpaEntity savedUser = userJpaRepository.save(userPersistenceMapper.toEntity(nonNullUser));</span>
|
||||
<span class="fc" id="L53"> return userPersistenceMapper.toDomain(savedUser);</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.infrastructure.persistence.user</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">infrastructure</a> > <span class="el_package">com.project.auth.infrastructure.persistence.user</span></div><h1>com.project.auth.infrastructure.persistence.user</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 62</td><td class="ctr2">54%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">3</td><td class="ctr2">5</td><td class="ctr1">5</td><td class="ctr2">12</td><td class="ctr1">3</td><td class="ctr2">5</td><td class="ctr1">0</td><td class="ctr2">1</td></tr></tfoot><tbody><tr><td id="a0"><a href="JpaUserRepositoryAdapter.html" class="el_class">JpaUserRepositoryAdapter</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="54" height="10" title="28" alt="28"/><img src="../jacoco-resources/greenbar.gif" width="65" height="10" title="34" alt="34"/></td><td class="ctr2" id="c0">54%</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">5</td><td class="ctr1" id="h0">5</td><td class="ctr2" id="i0">12</td><td class="ctr1" id="j0">3</td><td class="ctr2" id="k0">5</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.infrastructure.persistence.user</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">infrastructure</a> > <span class="el_package">com.project.auth.infrastructure.persistence.user</span></div><h1>com.project.auth.infrastructure.persistence.user</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 62</td><td class="ctr2">54%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">3</td><td class="ctr2">5</td><td class="ctr1">5</td><td class="ctr2">12</td><td class="ctr1">3</td><td class="ctr2">5</td><td class="ctr1">0</td><td class="ctr2">1</td></tr></tfoot><tbody><tr><td id="a0"><a href="JpaUserRepositoryAdapter.java.html" class="el_source">JpaUserRepositoryAdapter.java</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="54" height="10" title="28" alt="28"/><img src="../jacoco-resources/greenbar.gif" width="65" height="10" title="34" alt="34"/></td><td class="ctr2" id="c0">54%</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">5</td><td class="ctr1" id="h0">5</td><td class="ctr2" id="i0">12</td><td class="ctr1" id="j0">3</td><td class="ctr2" id="k0">5</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>InfrastructureErrorCode</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">infrastructure</a> > <a href="index.html" class="el_package">com.project.auth.infrastructure.support.exception</a> > <span class="el_class">InfrastructureErrorCode</span></div><h1>InfrastructureErrorCode</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">3 of 36</td><td class="ctr2">91%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">1</td><td class="ctr2">4</td><td class="ctr1">1</td><td class="ctr2">9</td><td class="ctr1">1</td><td class="ctr2">4</td></tr></tfoot><tbody><tr><td id="a0"><a href="InfrastructureErrorCode.java.html#L23" class="el_method">code()</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="18" height="10" title="3" alt="3"/></td><td class="ctr2" id="c3">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">1</td><td class="ctr2" id="i2">1</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a3"><a href="InfrastructureErrorCode.java.html#L9" class="el_method">static {...}</a></td><td class="bar" id="b1"><img src="../jacoco-resources/greenbar.gif" width="120" height="10" title="19" alt="19"/></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">3</td><td class="ctr1" id="j1">0</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a1"><a href="InfrastructureErrorCode.java.html#L16" class="el_method">InfrastructureErrorCode(String, int, String, String)</a></td><td class="bar" id="b2"><img src="../jacoco-resources/greenbar.gif" width="69" height="10" title="11" alt="11"/></td><td class="ctr2" id="c1">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="i0">4</td><td class="ctr1" id="j2">0</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a2"><a href="InfrastructureErrorCode.java.html#L28" class="el_method">message()</a></td><td class="bar" id="b3"><img src="../jacoco-resources/greenbar.gif" width="18" height="10" title="3" alt="3"/></td><td class="ctr2" id="c2">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,31 @@
|
||||
<?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>InfrastructureErrorCode.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">infrastructure</a> > <a href="index.source.html" class="el_package">com.project.auth.infrastructure.support.exception</a> > <span class="el_source">InfrastructureErrorCode.java</span></div><h1>InfrastructureErrorCode.java</h1><pre class="source lang-java linenums">package com.project.auth.infrastructure.support.exception;
|
||||
|
||||
import com.project.auth.application.support.exception.ExternalErrorCode;
|
||||
|
||||
/**
|
||||
* 내부 전용 인프라 장애 코드. 로그·모니터링·알람 라우팅 분류 용도로만 사용한다.
|
||||
* 외부 HTTP 응답에서는 의도적으로 COMMON-999로 정규화되어 노출된다.
|
||||
*/
|
||||
<span class="fc" id="L9">public enum InfrastructureErrorCode implements ExternalErrorCode {</span>
|
||||
<span class="fc" id="L10"> PERSISTED_DATA_INVALID("INFRA-003", "저장된 데이터가 도메인 규칙에 맞지 않습니다."),</span>
|
||||
<span class="fc" id="L11"> EXTERNAL_SERVICE_ERROR("INFRA-999", "외부 시스템 연동 중 오류가 발생했습니다.");</span>
|
||||
|
||||
private final String code;
|
||||
private final String message;
|
||||
|
||||
<span class="fc" id="L16"> InfrastructureErrorCode(String code, String message) {</span>
|
||||
<span class="fc" id="L17"> this.code = code;</span>
|
||||
<span class="fc" id="L18"> this.message = message;</span>
|
||||
<span class="fc" id="L19"> }</span>
|
||||
|
||||
@Override
|
||||
public String code() {
|
||||
<span class="nc" id="L23"> return code;</span>
|
||||
}
|
||||
|
||||
@Override
|
||||
public String message() {
|
||||
<span class="fc" id="L28"> 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>InfrastructureException</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">infrastructure</a> > <a href="index.html" class="el_package">com.project.auth.infrastructure.support.exception</a> > <span class="el_class">InfrastructureException</span></div><h1>InfrastructureException</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">23 of 35</td><td class="ctr2">34%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">3</td><td class="ctr2">5</td><td class="ctr1">9</td><td class="ctr2">13</td><td class="ctr1">3</td><td class="ctr2">5</td></tr></tfoot><tbody><tr><td id="a1"><a href="InfrastructureException.java.html#L21" class="el_method">InfrastructureException(InfrastructureErrorCode)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="106" height="10" title="8" alt="8"/></td><td class="ctr2" id="c2">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">3</td><td class="ctr2" id="i0">3</td><td class="ctr1" id="j0">1</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a3"><a href="InfrastructureException.java.html#L36" class="el_method">InfrastructureException(InfrastructureErrorCode, String, Throwable)</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="106" height="10" title="8" alt="8"/></td><td class="ctr2" id="c3">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">3</td><td class="ctr2" id="i1">3</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a2"><a href="InfrastructureException.java.html#L26" class="el_method">InfrastructureException(InfrastructureErrorCode, String)</a></td><td class="bar" id="b2"><img src="../jacoco-resources/redbar.gif" width="93" height="10" title="7" alt="7"/></td><td class="ctr2" id="c4">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">3</td><td class="ctr2" id="i2">3</td><td class="ctr1" id="j2">1</td><td class="ctr2" id="k2">1</td></tr><tr><td id="a4"><a href="InfrastructureException.java.html#L31" class="el_method">InfrastructureException(InfrastructureErrorCode, Throwable)</a></td><td class="bar" id="b3"><img src="../jacoco-resources/greenbar.gif" width="120" height="10" title="9" alt="9"/></td><td class="ctr2" id="c0">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">3</td><td class="ctr1" id="j3">0</td><td class="ctr2" id="k3">1</td></tr><tr><td id="a0"><a href="InfrastructureException.java.html#L41" class="el_method">getErrorCode()</a></td><td class="bar" id="b4"><img src="../jacoco-resources/greenbar.gif" width="40" height="10" title="3" alt="3"/></td><td class="ctr2" id="c1">100%</td><td class="bar" id="d4"/><td class="ctr2" id="e4">n/a</td><td class="ctr1" id="f4">0</td><td class="ctr2" id="g4">1</td><td class="ctr1" id="h4">0</td><td class="ctr2" id="i4">1</td><td class="ctr1" id="j4">0</td><td class="ctr2" id="k4">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,44 @@
|
||||
<?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>InfrastructureException.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">infrastructure</a> > <a href="index.source.html" class="el_package">com.project.auth.infrastructure.support.exception</a> > <span class="el_source">InfrastructureException.java</span></div><h1>InfrastructureException.java</h1><pre class="source lang-java linenums">package com.project.auth.infrastructure.support.exception;
|
||||
|
||||
/**
|
||||
* 인프라 계층(DB, 외부 HTTP 클라이언트, 시크릿 저장소 등) 장애를 표현하는 내부 전용 예외.
|
||||
*
|
||||
* 등록된 @ExceptionHandler는 ERROR 레벨로 전체 스택트레이스와 함께 {@code detailMessage}를
|
||||
* 로깅한다. 따라서 어댑터는 {@code detailMessage}에 민감 정보를 절대 포함시키면 안 된다.
|
||||
*
|
||||
* detailMessage에 금지: 커넥션 문자열, DB 자격 증명, Vault 토큰, JWT 페이로드 내용,
|
||||
* 정제되지 않은 사용자 입력, 외부 호출의 전체 요청/응답 바디.
|
||||
*
|
||||
* detailMessage에 허용: 식별 불가 형태의 상관 ID, 호스트/서비스 이름, 정제된 상태 코드,
|
||||
* 장애 모드를 설명하는 일반 문장. 이 detail은 운영자 트리아지용이며, 클라이언트는 항상
|
||||
* COMMON-999만 받는다.
|
||||
*/
|
||||
public class InfrastructureException extends RuntimeException {
|
||||
|
||||
private final InfrastructureErrorCode errorCode;
|
||||
|
||||
public InfrastructureException(InfrastructureErrorCode errorCode) {
|
||||
<span class="nc" id="L21"> super(errorCode.message());</span>
|
||||
<span class="nc" id="L22"> this.errorCode = errorCode;</span>
|
||||
<span class="nc" id="L23"> }</span>
|
||||
|
||||
public InfrastructureException(InfrastructureErrorCode errorCode, String detailMessage) {
|
||||
<span class="nc" id="L26"> super(detailMessage);</span>
|
||||
<span class="nc" id="L27"> this.errorCode = errorCode;</span>
|
||||
<span class="nc" id="L28"> }</span>
|
||||
|
||||
public InfrastructureException(InfrastructureErrorCode errorCode, Throwable cause) {
|
||||
<span class="fc" id="L31"> super(errorCode.message(), cause);</span>
|
||||
<span class="fc" id="L32"> this.errorCode = errorCode;</span>
|
||||
<span class="fc" id="L33"> }</span>
|
||||
|
||||
public InfrastructureException(InfrastructureErrorCode errorCode, String detailMessage, Throwable cause) {
|
||||
<span class="nc" id="L36"> super(detailMessage, cause);</span>
|
||||
<span class="nc" id="L37"> this.errorCode = errorCode;</span>
|
||||
<span class="nc" id="L38"> }</span>
|
||||
|
||||
public InfrastructureErrorCode getErrorCode() {
|
||||
<span class="fc" id="L41"> return errorCode;</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.infrastructure.support.exception</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">infrastructure</a> > <span class="el_package">com.project.auth.infrastructure.support.exception</span></div><h1>com.project.auth.infrastructure.support.exception</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">26 of 71</td><td class="ctr2">63%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">4</td><td class="ctr2">9</td><td class="ctr1">10</td><td class="ctr2">22</td><td class="ctr1">4</td><td class="ctr2">9</td><td class="ctr1">0</td><td class="ctr2">2</td></tr></tfoot><tbody><tr><td id="a1"><a href="InfrastructureException.html" class="el_class">InfrastructureException</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="76" height="10" title="23" alt="23"/><img src="../jacoco-resources/greenbar.gif" width="40" height="10" title="12" alt="12"/></td><td class="ctr2" id="c1">34%</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">5</td><td class="ctr1" id="h0">9</td><td class="ctr2" id="i0">13</td><td class="ctr1" id="j0">3</td><td class="ctr2" id="k0">5</td><td class="ctr1" id="l0">0</td><td class="ctr2" id="m0">1</td></tr><tr><td id="a0"><a href="InfrastructureErrorCode.html" class="el_class">InfrastructureErrorCode</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="10" height="10" title="3" alt="3"/><img src="../jacoco-resources/greenbar.gif" width="110" height="10" title="33" alt="33"/></td><td class="ctr2" id="c0">91%</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">4</td><td class="ctr1" id="h1">1</td><td class="ctr2" id="i1">9</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">4</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.infrastructure.support.exception</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">infrastructure</a> > <span class="el_package">com.project.auth.infrastructure.support.exception</span></div><h1>com.project.auth.infrastructure.support.exception</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">26 of 71</td><td class="ctr2">63%</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">4</td><td class="ctr2">9</td><td class="ctr1">10</td><td class="ctr2">22</td><td class="ctr1">4</td><td class="ctr2">9</td><td class="ctr1">0</td><td class="ctr2">2</td></tr></tfoot><tbody><tr><td id="a1"><a href="InfrastructureException.java.html" class="el_source">InfrastructureException.java</a></td><td class="bar" id="b0"><img src="../jacoco-resources/redbar.gif" width="76" height="10" title="23" alt="23"/><img src="../jacoco-resources/greenbar.gif" width="40" height="10" title="12" alt="12"/></td><td class="ctr2" id="c1">34%</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">5</td><td class="ctr1" id="h0">9</td><td class="ctr2" id="i0">13</td><td class="ctr1" id="j0">3</td><td class="ctr2" id="k0">5</td><td class="ctr1" id="l0">0</td><td class="ctr2" id="m0">1</td></tr><tr><td id="a0"><a href="InfrastructureErrorCode.java.html" class="el_source">InfrastructureErrorCode.java</a></td><td class="bar" id="b1"><img src="../jacoco-resources/redbar.gif" width="10" height="10" title="3" alt="3"/><img src="../jacoco-resources/greenbar.gif" width="110" height="10" title="33" alt="33"/></td><td class="ctr2" id="c0">91%</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">4</td><td class="ctr1" id="h1">1</td><td class="ctr2" id="i1">9</td><td class="ctr1" id="j1">1</td><td class="ctr2" id="k1">4</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,417 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||
<meta http-equiv="x-ua-compatible" content="IE=edge"/>
|
||||
<title>Test results - com.project.auth.infrastructure.persistence.user.UserJpaRepositoryTest</title>
|
||||
<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
|
||||
<link href="../css/style.css" rel="stylesheet" type="text/css"/>
|
||||
<script src="../js/report.js" type="text/javascript"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="content">
|
||||
<div class="breadcrumbs">
|
||||
<a class="breadcrumb" href="../index.html">all</a> >
|
||||
<span class="breadcrumb">com.project.auth.infrastructure.persistence.user.UserJpaRepositoryTest</span>
|
||||
</div>
|
||||
<div class="tab-container">
|
||||
<ul class="tabLinks">
|
||||
<li>
|
||||
<a class="successGroup" href="#">Gradle Test Run :infrastructure:test</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab">
|
||||
<h2>Gradle Test Run :infrastructure:test</h2>
|
||||
<h1>UserJpaRepositoryTest</h1>
|
||||
<div class="tab-container">
|
||||
<ul class="tabLinks">
|
||||
<li>
|
||||
<a class="" href="#">summary</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="" href="#">standard output</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab">
|
||||
<h2>summary</h2>
|
||||
<div>
|
||||
<div class="summary">
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="summaryGroup">
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="infoBox">
|
||||
<div class="counter">3</div>
|
||||
<p>tests</p>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox">
|
||||
<div class="counter">0</div>
|
||||
<p>failures</p>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox">
|
||||
<div class="counter">0</div>
|
||||
<p>skipped</p>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox duration">
|
||||
<div class="counter">11.782s</div>
|
||||
<p>duration</p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox success successRate">
|
||||
<div class="percent">100%</div>
|
||||
<p>successful</p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<table class="test-results">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Child</th>
|
||||
<th hidden="">Name</th>
|
||||
<th>Tests</th>
|
||||
<th>Failures</th>
|
||||
<th>Skipped</th>
|
||||
<th>Duration</th>
|
||||
<th>Success rate</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tr>
|
||||
<td class="success">
|
||||
<a href="savePersistsKeycloakUserAndReloadsFromDatabase().html">savePersistsKeycloakUserAndReloadsFromDatabase()</a>
|
||||
</td>
|
||||
<td class="path" hidden="">savePersistsKeycloakUserAndReloadsFromDatabase()</td>
|
||||
<td>1</td>
|
||||
<td>0</td>
|
||||
<td>0</td>
|
||||
<td>0.790s</td>
|
||||
<td class="success">100%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="success">
|
||||
<a href="saveRejectsDuplicateEmailOnFlush().html">saveRejectsDuplicateEmailOnFlush()</a>
|
||||
</td>
|
||||
<td class="path" hidden="">saveRejectsDuplicateEmailOnFlush()</td>
|
||||
<td>1</td>
|
||||
<td>0</td>
|
||||
<td>0</td>
|
||||
<td>0.860s</td>
|
||||
<td class="success">100%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="success">
|
||||
<a href="saveRejectsDuplicateProviderSubjectOnFlush().html">saveRejectsDuplicateProviderSubjectOnFlush()</a>
|
||||
</td>
|
||||
<td class="path" hidden="">saveRejectsDuplicateProviderSubjectOnFlush()</td>
|
||||
<td>1</td>
|
||||
<td>0</td>
|
||||
<td>0</td>
|
||||
<td>0.024s</td>
|
||||
<td class="success">100%</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tab">
|
||||
<h2>standard output</h2>
|
||||
<span class="code">
|
||||
<pre id="root-0-test-stdout-com.project.auth.infrastructure.persistence.user.UserJpaRepositoryTest">15:25:43.172 [Test worker] INFO org.testcontainers.images.PullPolicy -- Image pull policy will be performed by: DefaultPullPolicy()
|
||||
15:25:43.185 [Test worker] INFO org.testcontainers.utility.ImageNameSubstitutor -- Image name substitution will be performed by: DefaultImageNameSubstitutor (composite of 'ConfigurationFileImageNameSubstitutor' and 'PrefixingImageNameSubstitutor')
|
||||
15:25:43.200 [Test worker] INFO org.testcontainers.DockerClientFactory -- Testcontainers version: 2.0.3
|
||||
15:25:43.659 [Test worker] INFO org.testcontainers.dockerclient.DockerClientProviderStrategy -- Loaded org.testcontainers.dockerclient.UnixSocketClientProviderStrategy from ~/.testcontainers.properties, will try it first
|
||||
15:25:44.185 [Test worker] INFO org.testcontainers.dockerclient.DockerClientProviderStrategy -- Found Docker environment with local Unix socket (unix:///var/run/docker.sock)
|
||||
15:25:44.187 [Test worker] INFO org.testcontainers.DockerClientFactory -- Docker host IP address is localhost
|
||||
15:25:44.207 [Test worker] INFO org.testcontainers.DockerClientFactory -- Connected to docker:
|
||||
Server Version: 29.4.2
|
||||
API Version: 1.54
|
||||
Operating System: Ubuntu 24.04.4 LTS
|
||||
Total Memory: 31671 MB
|
||||
15:25:44.323 [Test worker] INFO tc.testcontainers/ryuk:0.13.0 -- Creating container for image: testcontainers/ryuk:0.13.0
|
||||
15:25:44.556 [Test worker] INFO tc.testcontainers/ryuk:0.13.0 -- Container testcontainers/ryuk:0.13.0 is starting: f4a1b80c92efedded8f8490bc8b2b72c966aa72e47173b9e3549678e6e93b264
|
||||
15:25:44.907 [Test worker] INFO tc.testcontainers/ryuk:0.13.0 -- Container testcontainers/ryuk:0.13.0 started in PT0.584400461S
|
||||
15:25:44.913 [Test worker] INFO org.testcontainers.utility.RyukResourceReaper -- Ryuk started - will monitor and terminate Testcontainers containers on JVM exit
|
||||
15:25:44.913 [Test worker] INFO org.testcontainers.DockerClientFactory -- Checking the system...
|
||||
15:25:44.913 [Test worker] INFO org.testcontainers.DockerClientFactory -- ✔︎ Docker server version should be at least 1.6.0
|
||||
15:25:44.914 [Test worker] INFO tc.postgres:16-alpine -- Creating container for image: postgres:16-alpine
|
||||
15:25:45.044 [Test worker] INFO tc.postgres:16-alpine -- Container postgres:16-alpine is starting: d80d78ac464fe96638d0a2d9c5c80ecee028627924cb361626ead41bae272c25
|
||||
15:25:46.585 [Test worker] INFO tc.postgres:16-alpine -- Container postgres:16-alpine started in PT1.671196137S
|
||||
15:25:46.586 [Test worker] INFO tc.postgres:16-alpine -- Container is started (JDBC URL: jdbc:postgresql://localhost:32777/test?loggerLevel=OFF)
|
||||
|
||||
. ____ _ __ _ _
|
||||
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
|
||||
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
|
||||
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
|
||||
' |____| .__|_| |_|_| |_\__, | / / / /
|
||||
=========|_|==============|___/=/_/_/_/
|
||||
|
||||
:: Spring Boot :: (v4.0.3)
|
||||
|
||||
2026-05-12T15:25:47.051+09:00 INFO 3159134 --- [ Test worker] c.p.a.i.p.user.UserJpaRepositoryTest : Starting UserJpaRepositoryTest using Java 21.0.10 with PID 3159134 (started by donghyeon in /home/donghyeon/dev/Project-Auth-Server/infrastructure)
|
||||
2026-05-12T15:25:47.052+09:00 INFO 3159134 --- [ Test worker] c.p.a.i.p.user.UserJpaRepositoryTest : No active profile set, falling back to 1 default profile: "default"
|
||||
2026-05-12T15:25:47.053+09:00 DEBUG 3159134 --- [ Test worker] o.s.boot.SpringApplication : Loading source class com.project.auth.infrastructure.persistence.user.UserJpaRepositoryTest$TestApplication,class com.project.auth.infrastructure.persistence.user.UserJpaRepositoryTest$TestFlywayConfiguration
|
||||
2026-05-12T15:25:47.335+09:00 INFO 3159134 --- [ Test worker] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
|
||||
2026-05-12T15:25:47.386+09:00 INFO 3159134 --- [ Test worker] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 39 ms. Found 1 JPA repository interface.
|
||||
2026-05-12T15:25:48.253+09:00 INFO 3159134 --- [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
|
||||
2026-05-12T15:25:48.506+09:00 INFO 3159134 --- [ Test worker] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@55f20d7e
|
||||
2026-05-12T15:25:48.509+09:00 INFO 3159134 --- [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
|
||||
2026-05-12T15:25:48.572+09:00 INFO 3159134 --- [ Test worker] org.flywaydb.core.FlywayExecutor : Database: jdbc:postgresql://localhost:32777/test?loggerLevel=OFF (PostgreSQL 16.13)
|
||||
2026-05-12T15:25:48.638+09:00 INFO 3159134 --- [ Test worker] o.f.core.internal.database.base.Schema : Creating schema "auth" ...
|
||||
2026-05-12T15:25:48.651+09:00 INFO 3159134 --- [ Test worker] o.f.c.i.s.JdbcTableSchemaHistory : Creating Schema History table "auth"."flyway_schema_history" ...
|
||||
2026-05-12T15:25:48.743+09:00 INFO 3159134 --- [ Test worker] o.f.core.internal.command.DbMigrate : Current version of schema "auth": null
|
||||
2026-05-12T15:25:48.762+09:00 INFO 3159134 --- [ Test worker] o.f.core.internal.command.DbMigrate : Migrating schema "auth" to version "1 - create users table"
|
||||
2026-05-12T15:25:48.775+09:00 WARN 3159134 --- [ Test worker] o.f.c.i.s.DefaultSqlScriptExecutor : DB: schema "auth" already exists, skipping (SQL State: 42P06 - Error Code: 0)
|
||||
2026-05-12T15:25:48.817+09:00 INFO 3159134 --- [ Test worker] o.f.core.internal.command.DbMigrate : Migrating schema "auth" to version "2 - add oauth login columns"
|
||||
2026-05-12T15:25:48.839+09:00 INFO 3159134 --- [ Test worker] o.f.core.internal.command.DbMigrate : Migrating schema "auth" to version "3 - add user provider field constraints"
|
||||
2026-05-12T15:25:48.855+09:00 INFO 3159134 --- [ Test worker] o.f.core.internal.command.DbMigrate : Migrating schema "auth" to version "4 - add keycloak provider"
|
||||
2026-05-12T15:25:48.877+09:00 INFO 3159134 --- [ Test worker] o.f.core.internal.command.DbMigrate : Migrating schema "auth" to version "5 - keycloak only provider"
|
||||
2026-05-12T15:25:48.902+09:00 INFO 3159134 --- [ Test worker] o.f.core.internal.command.DbMigrate : Successfully applied 5 migrations to schema "auth", now at version v5 (execution time 00:00.075s)
|
||||
2026-05-12T15:25:49.151+09:00 INFO 3159134 --- [ Test worker] org.hibernate.orm.jpa : HHH008540: Processing PersistenceUnitInfo [name: default]
|
||||
2026-05-12T15:25:49.255+09:00 INFO 3159134 --- [ Test worker] org.hibernate.orm.core : HHH000001: Hibernate ORM core version 7.2.4.Final
|
||||
2026-05-12T15:25:50.061+09:00 INFO 3159134 --- [ Test worker] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer
|
||||
2026-05-12T15:25:50.233+09:00 INFO 3159134 --- [ Test worker] org.hibernate.orm.connections.pooling : HHH10001005: Database info:
|
||||
Database JDBC URL [jdbc:postgresql://localhost:32777/test?loggerLevel=OFF]
|
||||
Database driver: PostgreSQL JDBC Driver
|
||||
Database dialect: PostgreSQLDialect
|
||||
Database version: 16.13
|
||||
Default catalog/schema: test/public
|
||||
Autocommit mode: undefined/unknown
|
||||
Isolation level: READ_COMMITTED [default READ_COMMITTED]
|
||||
JDBC fetch size: none
|
||||
Pool: DataSourceConnectionProvider
|
||||
Minimum pool size: undefined/unknown
|
||||
Maximum pool size: undefined/unknown
|
||||
2026-05-12T15:25:51.846+09:00 INFO 3159134 --- [ Test worker] org.hibernate.orm.core : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)
|
||||
2026-05-12T15:25:51.912+09:00 INFO 3159134 --- [ Test worker] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
|
||||
2026-05-12T15:25:52.038+09:00 INFO 3159134 --- [ Test worker] o.s.d.j.r.query.QueryEnhancerFactories : Hibernate is in classpath; If applicable, HQL parser will be used.
|
||||
2026-05-12T15:25:52.393+09:00 DEBUG 3159134 --- [ Test worker] .s.b.a.l.ConditionEvaluationReportLogger :
|
||||
|
||||
|
||||
============================
|
||||
CONDITIONS EVALUATION REPORT
|
||||
============================
|
||||
|
||||
|
||||
Positive matches:
|
||||
-----------------
|
||||
|
||||
DataSourceAutoConfiguration matched:
|
||||
- @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType' (OnClassCondition)
|
||||
- @ConditionalOnMissingBean (types: io.r2dbc.spi.ConnectionFactory; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
DataSourceAutoConfiguration.PooledDataSourceConfiguration matched:
|
||||
- AnyNestedCondition 1 matched 1 did not; NestedCondition on DataSourceAutoConfiguration.PooledDataSourceCondition.PooledDataSourceAvailable PooledDataSource found supported DataSource; NestedCondition on DataSourceAutoConfiguration.PooledDataSourceCondition.ExplicitType @ConditionalOnProperty (spring.datasource.type) did not find property 'spring.datasource.type' (DataSourceAutoConfiguration.PooledDataSourceCondition)
|
||||
- @ConditionalOnMissingBean (types: javax.sql.DataSource,javax.sql.XADataSource; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
DataSourceAutoConfiguration.PooledDataSourceConfiguration#jdbcConnectionDetails matched:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.boot.jdbc.autoconfigure.JdbcConnectionDetails; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
DataSourceConfiguration.Hikari matched:
|
||||
- @ConditionalOnClass found required class 'com.zaxxer.hikari.HikariDataSource' (OnClassCondition)
|
||||
- @ConditionalOnProperty (spring.datasource.type=com.zaxxer.hikari.HikariDataSource) matched (OnPropertyCondition)
|
||||
- @ConditionalOnMissingBean (types: javax.sql.DataSource; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
DataSourceInitializationAutoConfiguration matched:
|
||||
- @ConditionalOnClass found required class 'org.springframework.jdbc.datasource.init.DatabasePopulator' (OnClassCondition)
|
||||
- SQL InitializationDatabase Initialization default value is EMBEDDED (OnSqlInitializationCondition)
|
||||
- @ConditionalOnSingleCandidate (types: javax.sql.DataSource; SearchStrategy: all) found a single bean 'dataSource'; @ConditionalOnMissingBean (types: org.springframework.boot.sql.autoconfigure.init.ApplicationScriptDatabaseInitializer; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
DataSourcePoolMetadataProvidersConfiguration.HikariPoolDataSourceMetadataProviderConfiguration matched:
|
||||
- @ConditionalOnClass found required class 'com.zaxxer.hikari.HikariDataSource' (OnClassCondition)
|
||||
|
||||
DataSourceTransactionManagerAutoConfiguration matched:
|
||||
- @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.core.JdbcTemplate', 'org.springframework.transaction.TransactionManager' (OnClassCondition)
|
||||
|
||||
DataSourceTransactionManagerAutoConfiguration.JdbcTransactionManagerConfiguration matched:
|
||||
- @ConditionalOnSingleCandidate (types: javax.sql.DataSource; SearchStrategy: all) found a single bean 'dataSource' (OnBeanCondition)
|
||||
|
||||
HibernateJpaAutoConfiguration matched:
|
||||
- @ConditionalOnClass found required classes 'org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean', 'jakarta.persistence.EntityManager', 'org.hibernate.engine.spi.SessionImplementor' (OnClassCondition)
|
||||
|
||||
HibernateJpaConfiguration matched:
|
||||
- @ConditionalOnSingleCandidate (types: javax.sql.DataSource; SearchStrategy: all) found a single bean 'dataSource' (OnBeanCondition)
|
||||
|
||||
JdbcClientAutoConfiguration matched:
|
||||
- @ConditionalOnSingleCandidate (types: org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; SearchStrategy: all) found a single bean 'namedParameterJdbcTemplate'; @ConditionalOnMissingBean (types: org.springframework.jdbc.core.simple.JdbcClient; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
JdbcTemplateAutoConfiguration matched:
|
||||
- @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.core.JdbcTemplate' (OnClassCondition)
|
||||
- @ConditionalOnSingleCandidate (types: javax.sql.DataSource; SearchStrategy: all) found a single bean 'dataSource' (OnBeanCondition)
|
||||
|
||||
JdbcTemplateConfiguration matched:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.jdbc.core.JdbcOperations; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
JpaBaseConfiguration#entityManagerFactory matched:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean,jakarta.persistence.EntityManagerFactory; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
JpaBaseConfiguration#entityManagerFactoryBuilder matched:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.boot.jpa.EntityManagerFactoryBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
JpaBaseConfiguration#jpaVendorAdapter matched:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.orm.jpa.JpaVendorAdapter; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
JpaBaseConfiguration#transactionManager matched:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.transaction.TransactionManager; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
JpaBaseConfiguration.PersistenceManagedTypesConfiguration matched:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean,jakarta.persistence.EntityManagerFactory; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
JpaBaseConfiguration.PersistenceManagedTypesConfiguration#persistenceManagedTypes matched:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.orm.jpa.persistenceunit.PersistenceManagedTypes; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
NamedParameterJdbcTemplateConfiguration matched:
|
||||
- @ConditionalOnSingleCandidate (types: org.springframework.jdbc.core.JdbcTemplate; SearchStrategy: all) found a single bean 'jdbcTemplate'; @ConditionalOnMissingBean (types: org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
TestEntityManagerAutoConfiguration matched:
|
||||
- @ConditionalOnClass found required class 'jakarta.persistence.EntityManagerFactory' (OnClassCondition)
|
||||
|
||||
TestEntityManagerAutoConfiguration#testEntityManager matched:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.boot.jpa.test.autoconfigure.TestEntityManager; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
TransactionAutoConfiguration matched:
|
||||
- @ConditionalOnClass found required class 'org.springframework.transaction.PlatformTransactionManager' (OnClassCondition)
|
||||
|
||||
TransactionAutoConfiguration.EnableTransactionManagementConfiguration matched:
|
||||
- @ConditionalOnBean (types: org.springframework.transaction.TransactionManager; SearchStrategy: all) found bean 'transactionManager'; @ConditionalOnMissingBean (types: org.springframework.transaction.annotation.AbstractTransactionManagementConfiguration; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
TransactionAutoConfiguration.EnableTransactionManagementConfiguration.CglibAutoProxyConfiguration matched:
|
||||
- @ConditionalOnBooleanProperty (spring.aop.proxy-target-class=true) matched (OnPropertyCondition)
|
||||
|
||||
TransactionAutoConfiguration.TransactionTemplateConfiguration matched:
|
||||
- @ConditionalOnSingleCandidate (types: org.springframework.transaction.PlatformTransactionManager; SearchStrategy: all) found a single bean 'transactionManager' (OnBeanCondition)
|
||||
|
||||
TransactionAutoConfiguration.TransactionTemplateConfiguration#transactionTemplate matched:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.transaction.support.TransactionOperations; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
|
||||
Negative matches:
|
||||
-----------------
|
||||
|
||||
DataJpaRepositoriesAutoConfiguration:
|
||||
Did not match:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean,org.springframework.data.jpa.repository.config.JpaRepositoryConfigExtension; SearchStrategy: all) found beans of type 'org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean' &userJpaRepository and found beans of type 'org.springframework.data.jpa.repository.config.JpaRepositoryConfigExtension' org.springframework.data.jpa.repository.config.JpaRepositoryConfigExtension#0 (OnBeanCondition)
|
||||
Matched:
|
||||
- @ConditionalOnClass found required class 'org.springframework.data.jpa.repository.JpaRepository' (OnClassCondition)
|
||||
- @ConditionalOnBooleanProperty (spring.data.jpa.repositories.enabled=true) matched (OnPropertyCondition)
|
||||
|
||||
DataSourceAutoConfiguration.EmbeddedDatabaseConfiguration:
|
||||
Did not match:
|
||||
- EmbeddedDataSource spring.datasource.url is set (DataSourceAutoConfiguration.EmbeddedDatabaseCondition)
|
||||
|
||||
DataSourceCheckpointRestoreConfiguration:
|
||||
Did not match:
|
||||
- @ConditionalOnClass did not find required class 'org.crac.Resource' (OnClassCondition)
|
||||
|
||||
DataSourceConfiguration.Dbcp2:
|
||||
Did not match:
|
||||
- @ConditionalOnClass did not find required class 'org.apache.commons.dbcp2.BasicDataSource' (OnClassCondition)
|
||||
|
||||
DataSourceConfiguration.Generic:
|
||||
Did not match:
|
||||
- @ConditionalOnProperty (spring.datasource.type) did not find property 'spring.datasource.type' (OnPropertyCondition)
|
||||
|
||||
DataSourceConfiguration.OracleUcp:
|
||||
Did not match:
|
||||
- @ConditionalOnClass did not find required classes 'oracle.ucp.jdbc.PoolDataSourceImpl', 'oracle.jdbc.OracleConnection' (OnClassCondition)
|
||||
|
||||
DataSourceConfiguration.Tomcat:
|
||||
Did not match:
|
||||
- @ConditionalOnClass did not find required class 'org.apache.tomcat.jdbc.pool.DataSource' (OnClassCondition)
|
||||
|
||||
DataSourceJmxConfiguration:
|
||||
Did not match:
|
||||
- @ConditionalOnBooleanProperty (spring.jmx.enabled=true) found different value in property 'spring.jmx.enabled' (OnPropertyCondition)
|
||||
|
||||
DataSourcePoolMetadataProvidersConfiguration.CommonsDbcp2PoolDataSourceMetadataProviderConfiguration:
|
||||
Did not match:
|
||||
- @ConditionalOnClass did not find required class 'org.apache.commons.dbcp2.BasicDataSource' (OnClassCondition)
|
||||
|
||||
DataSourcePoolMetadataProvidersConfiguration.OracleUcpPoolDataSourceMetadataProviderConfiguration:
|
||||
Did not match:
|
||||
- @ConditionalOnClass did not find required classes 'oracle.ucp.jdbc.PoolDataSource', 'oracle.jdbc.OracleConnection' (OnClassCondition)
|
||||
|
||||
DataSourcePoolMetadataProvidersConfiguration.TomcatDataSourcePoolMetadataProviderConfiguration:
|
||||
Did not match:
|
||||
- @ConditionalOnClass did not find required class 'org.apache.tomcat.jdbc.pool.DataSource' (OnClassCondition)
|
||||
|
||||
DataSourceTransactionManagerAutoConfiguration.JdbcTransactionManagerConfiguration#transactionManager:
|
||||
Did not match:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.transaction.TransactionManager; SearchStrategy: all) found beans of type 'org.springframework.transaction.TransactionManager' transactionManager (OnBeanCondition)
|
||||
|
||||
JpaBaseConfiguration.JpaWebConfiguration:
|
||||
Did not match:
|
||||
- @ConditionalOnClass did not find required class 'org.springframework.web.servlet.config.annotation.WebMvcConfigurer' (OnClassCondition)
|
||||
|
||||
TestDatabaseAutoConfiguration#dataSource:
|
||||
Did not match:
|
||||
- @ConditionalOnProperty (spring.test.database.replace=AUTO_CONFIGURED) found different value in property 'spring.test.database.replace' (OnPropertyCondition)
|
||||
|
||||
TestDatabaseAutoConfiguration#embeddedDataSourceBeanFactoryPostProcessor:
|
||||
Did not match:
|
||||
- @ConditionalOnProperty (spring.test.database.replace=ANY) found different value in property 'spring.test.database.replace' (OnPropertyCondition)
|
||||
|
||||
TestDatabaseAutoConfiguration#nonTestEmbeddedDataSourceBeanFactoryPostProcessor:
|
||||
Did not match:
|
||||
- @ConditionalOnProperty (spring.test.database.replace=NON_TEST) found different value in property 'spring.test.database.replace' (OnPropertyCondition)
|
||||
|
||||
TransactionAutoConfiguration#transactionalOperator:
|
||||
Did not match:
|
||||
- @ConditionalOnSingleCandidate (types: org.springframework.transaction.ReactiveTransactionManager; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
TransactionAutoConfiguration.AspectJTransactionManagementConfiguration:
|
||||
Did not match:
|
||||
- @ConditionalOnBean (types: org.springframework.transaction.aspectj.AbstractTransactionAspect; SearchStrategy: all) did not find any beans of type org.springframework.transaction.aspectj.AbstractTransactionAspect (OnBeanCondition)
|
||||
|
||||
TransactionAutoConfiguration.EnableTransactionManagementConfiguration.JdkDynamicAutoProxyConfiguration:
|
||||
Did not match:
|
||||
- @ConditionalOnBooleanProperty (spring.aop.proxy-target-class=false) did not find property 'spring.aop.proxy-target-class' (OnPropertyCondition)
|
||||
|
||||
|
||||
Exclusions:
|
||||
-----------
|
||||
|
||||
None
|
||||
|
||||
|
||||
Unconditional classes:
|
||||
----------------------
|
||||
|
||||
org.springframework.boot.jdbc.test.autoconfigure.TestDatabaseAutoConfiguration
|
||||
|
||||
|
||||
|
||||
2026-05-12T15:25:52.402+09:00 INFO 3159134 --- [ Test worker] c.p.a.i.p.user.UserJpaRepositoryTest : Started UserJpaRepositoryTest in 5.765 seconds (process running for 11.36)
|
||||
2026-05-12T15:25:54.113+09:00 WARN 3159134 --- [ Test worker] o.j.j.e.d.AbstractExtensionContext : Type implements CloseableResource but not AutoCloseable: org.testcontainers.junit.jupiter.TestcontainersExtension$StoreAdapter
|
||||
</pre>
|
||||
<button class="clipboard-copy-btn" aria-label="Copy to clipboard" data-copy-element-id="root-0-test-stdout-com.project.auth.infrastructure.persistence.user.UserJpaRepositoryTest">Copy</button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footer">
|
||||
<p>
|
||||
<div>
|
||||
<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
|
||||
<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
|
||||
</label>
|
||||
</div>Generated by
|
||||
<a href="https://www.gradle.org">Gradle 9.3.1</a> at May 12, 2026, 3:25:54 PM</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,112 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||
<meta http-equiv="x-ua-compatible" content="IE=edge"/>
|
||||
<title>Test results - savePersistsKeycloakUserAndReloadsFromDatabase()</title>
|
||||
<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
|
||||
<link href="../css/style.css" rel="stylesheet" type="text/css"/>
|
||||
<script src="../js/report.js" type="text/javascript"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="content">
|
||||
<div class="breadcrumbs">
|
||||
<a class="breadcrumb" href="../index.html">all</a> >
|
||||
<a class="breadcrumb" href="index.html">com.project.auth.infrastructure.persistence.user.UserJpaRepositoryTest</a> >
|
||||
<span class="breadcrumb">savePersistsKeycloakUserAndReloadsFromDatabase()</span>
|
||||
</div>
|
||||
<div class="tab-container">
|
||||
<ul class="tabLinks">
|
||||
<li>
|
||||
<a class="successGroup" href="#">Gradle Test Run :infrastructure:test</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab">
|
||||
<h2>Gradle Test Run :infrastructure:test</h2>
|
||||
<h1>savePersistsKeycloakUserAndReloadsFromDatabase()</h1>
|
||||
<div class="tab-container">
|
||||
<ul class="tabLinks">
|
||||
<li>
|
||||
<a class="" href="#">summary</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="" href="#">standard output</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab">
|
||||
<h2>summary</h2>
|
||||
<div>
|
||||
<div class="summary">
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="summaryGroup">
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="infoBox">
|
||||
<div class="counter">1</div>
|
||||
<p>tests</p>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox">
|
||||
<div class="counter">0</div>
|
||||
<p>failures</p>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox">
|
||||
<div class="counter">0</div>
|
||||
<p>skipped</p>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox duration">
|
||||
<div class="counter">0.790s</div>
|
||||
<p>duration</p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox success successRate">
|
||||
<div class="percent">100%</div>
|
||||
<p>successful</p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tab">
|
||||
<h2>standard output</h2>
|
||||
<span class="code">
|
||||
<pre id="root-0-test-stdout-savePersistsKeycloakUserAndReloadsFromDatabase()">2026-05-12T15:25:53.321+09:00 DEBUG 3159134 --- [ Test worker] org.hibernate.SQL : select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.id=?
|
||||
Hibernate: select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.id=?
|
||||
2026-05-12T15:25:53.323+09:00 DEBUG 3159134 --- [ Test worker] org.hibernate.SQL : insert into auth.users (created_at,email,name,provider,provider_subject,id) values (?,?,?,?,?,?)
|
||||
Hibernate: insert into auth.users (created_at,email,name,provider,provider_subject,id) values (?,?,?,?,?,?)
|
||||
2026-05-12T15:25:54.071+09:00 DEBUG 3159134 --- [ Test worker] org.hibernate.SQL : select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.provider=? and uje1_0.provider_subject=?
|
||||
Hibernate: select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.provider=? and uje1_0.provider_subject=?
|
||||
</pre>
|
||||
<button class="clipboard-copy-btn" aria-label="Copy to clipboard" data-copy-element-id="root-0-test-stdout-savePersistsKeycloakUserAndReloadsFromDatabase()">Copy</button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footer">
|
||||
<p>
|
||||
<div>
|
||||
<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
|
||||
<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
|
||||
</label>
|
||||
</div>Generated by
|
||||
<a href="https://www.gradle.org">Gradle 9.3.1</a> at May 12, 2026, 3:25:54 PM</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,132 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||
<meta http-equiv="x-ua-compatible" content="IE=edge"/>
|
||||
<title>Test results - saveRejectsDuplicateEmailOnFlush()</title>
|
||||
<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
|
||||
<link href="../css/style.css" rel="stylesheet" type="text/css"/>
|
||||
<script src="../js/report.js" type="text/javascript"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="content">
|
||||
<div class="breadcrumbs">
|
||||
<a class="breadcrumb" href="../index.html">all</a> >
|
||||
<a class="breadcrumb" href="index.html">com.project.auth.infrastructure.persistence.user.UserJpaRepositoryTest</a> >
|
||||
<span class="breadcrumb">saveRejectsDuplicateEmailOnFlush()</span>
|
||||
</div>
|
||||
<div class="tab-container">
|
||||
<ul class="tabLinks">
|
||||
<li>
|
||||
<a class="successGroup" href="#">Gradle Test Run :infrastructure:test</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab">
|
||||
<h2>Gradle Test Run :infrastructure:test</h2>
|
||||
<h1>saveRejectsDuplicateEmailOnFlush()</h1>
|
||||
<div class="tab-container">
|
||||
<ul class="tabLinks">
|
||||
<li>
|
||||
<a class="" href="#">summary</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="" href="#">standard output</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="" href="#">error output</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab">
|
||||
<h2>summary</h2>
|
||||
<div>
|
||||
<div class="summary">
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="summaryGroup">
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="infoBox">
|
||||
<div class="counter">1</div>
|
||||
<p>tests</p>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox">
|
||||
<div class="counter">0</div>
|
||||
<p>failures</p>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox">
|
||||
<div class="counter">0</div>
|
||||
<p>skipped</p>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox duration">
|
||||
<div class="counter">0.860s</div>
|
||||
<p>duration</p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox success successRate">
|
||||
<div class="percent">100%</div>
|
||||
<p>successful</p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tab">
|
||||
<h2>standard output</h2>
|
||||
<span class="code">
|
||||
<pre id="root-0-test-stdout-saveRejectsDuplicateEmailOnFlush()">2026-05-12T15:25:52.978+09:00 DEBUG 3159134 --- [ Test worker] org.hibernate.SQL : select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.id=?
|
||||
Hibernate: select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.id=?
|
||||
2026-05-12T15:25:53.078+09:00 DEBUG 3159134 --- [ Test worker] org.hibernate.SQL : insert into auth.users (created_at,email,name,provider,provider_subject,id) values (?,?,?,?,?,?)
|
||||
Hibernate: insert into auth.users (created_at,email,name,provider,provider_subject,id) values (?,?,?,?,?,?)
|
||||
2026-05-12T15:25:53.094+09:00 DEBUG 3159134 --- [ Test worker] org.hibernate.SQL : select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.id=?
|
||||
Hibernate: select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.id=?
|
||||
2026-05-12T15:25:53.181+09:00 DEBUG 3159134 --- [ Test worker] org.hibernate.SQL : insert into auth.users (created_at,email,name,provider,provider_subject,id) values (?,?,?,?,?,?)
|
||||
Hibernate: insert into auth.users (created_at,email,name,provider,provider_subject,id) values (?,?,?,?,?,?)
|
||||
2026-05-12T15:25:53.192+09:00 WARN 3159134 --- [ Test worker] org.hibernate.orm.jdbc.error : HHH000247: ErrorCode: 0, SQLState: 23505
|
||||
2026-05-12T15:25:53.192+09:00 WARN 3159134 --- [ Test worker] org.hibernate.orm.jdbc.error : ERROR: duplicate key value violates unique constraint "uq_users__email"
|
||||
Detail: Key (email)=(duplicate@example.com) already exists.
|
||||
</pre>
|
||||
<button class="clipboard-copy-btn" aria-label="Copy to clipboard" data-copy-element-id="root-0-test-stdout-saveRejectsDuplicateEmailOnFlush()">Copy</button>
|
||||
</span>
|
||||
</div>
|
||||
<div class="tab">
|
||||
<h2>error output</h2>
|
||||
<span class="code">
|
||||
<pre id="root-0-test-stderr-saveRejectsDuplicateEmailOnFlush()">Mockito is currently self-attaching to enable the inline-mock-maker. This will no longer work in future releases of the JDK. Please add Mockito as an agent to your build as described in Mockito's documentation: https://javadoc.io/doc/org.mockito/mockito-core/latest/org.mockito/org/mockito/Mockito.html#0.3
|
||||
WARNING: A Java agent has been loaded dynamically (/home/donghyeon/.gradle/caches/modules-2/files-2.1/net.bytebuddy/byte-buddy-agent/1.17.8/f09415827a71be7ed621c7bd02550678f28bc81c/byte-buddy-agent-1.17.8.jar)
|
||||
WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warning
|
||||
WARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more information
|
||||
WARNING: Dynamic loading of agents will be disallowed by default in a future release
|
||||
</pre>
|
||||
<button class="clipboard-copy-btn" aria-label="Copy to clipboard" data-copy-element-id="root-0-test-stderr-saveRejectsDuplicateEmailOnFlush()">Copy</button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footer">
|
||||
<p>
|
||||
<div>
|
||||
<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
|
||||
<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
|
||||
</label>
|
||||
</div>Generated by
|
||||
<a href="https://www.gradle.org">Gradle 9.3.1</a> at May 12, 2026, 3:25:54 PM</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,117 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||
<meta http-equiv="x-ua-compatible" content="IE=edge"/>
|
||||
<title>Test results - saveRejectsDuplicateProviderSubjectOnFlush()</title>
|
||||
<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
|
||||
<link href="../css/style.css" rel="stylesheet" type="text/css"/>
|
||||
<script src="../js/report.js" type="text/javascript"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="content">
|
||||
<div class="breadcrumbs">
|
||||
<a class="breadcrumb" href="../index.html">all</a> >
|
||||
<a class="breadcrumb" href="index.html">com.project.auth.infrastructure.persistence.user.UserJpaRepositoryTest</a> >
|
||||
<span class="breadcrumb">saveRejectsDuplicateProviderSubjectOnFlush()</span>
|
||||
</div>
|
||||
<div class="tab-container">
|
||||
<ul class="tabLinks">
|
||||
<li>
|
||||
<a class="successGroup" href="#">Gradle Test Run :infrastructure:test</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab">
|
||||
<h2>Gradle Test Run :infrastructure:test</h2>
|
||||
<h1>saveRejectsDuplicateProviderSubjectOnFlush()</h1>
|
||||
<div class="tab-container">
|
||||
<ul class="tabLinks">
|
||||
<li>
|
||||
<a class="" href="#">summary</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="" href="#">standard output</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab">
|
||||
<h2>summary</h2>
|
||||
<div>
|
||||
<div class="summary">
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="summaryGroup">
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="infoBox">
|
||||
<div class="counter">1</div>
|
||||
<p>tests</p>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox">
|
||||
<div class="counter">0</div>
|
||||
<p>failures</p>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox">
|
||||
<div class="counter">0</div>
|
||||
<p>skipped</p>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox duration">
|
||||
<div class="counter">0.024s</div>
|
||||
<p>duration</p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox success successRate">
|
||||
<div class="percent">100%</div>
|
||||
<p>successful</p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tab">
|
||||
<h2>standard output</h2>
|
||||
<span class="code">
|
||||
<pre id="root-0-test-stdout-saveRejectsDuplicateProviderSubjectOnFlush()">2026-05-12T15:25:53.291+09:00 DEBUG 3159134 --- [ Test worker] org.hibernate.SQL : select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.id=?
|
||||
Hibernate: select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.id=?
|
||||
2026-05-12T15:25:53.294+09:00 DEBUG 3159134 --- [ Test worker] org.hibernate.SQL : insert into auth.users (created_at,email,name,provider,provider_subject,id) values (?,?,?,?,?,?)
|
||||
Hibernate: insert into auth.users (created_at,email,name,provider,provider_subject,id) values (?,?,?,?,?,?)
|
||||
2026-05-12T15:25:53.297+09:00 DEBUG 3159134 --- [ Test worker] org.hibernate.SQL : select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.id=?
|
||||
Hibernate: select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.id=?
|
||||
2026-05-12T15:25:53.300+09:00 DEBUG 3159134 --- [ Test worker] org.hibernate.SQL : insert into auth.users (created_at,email,name,provider,provider_subject,id) values (?,?,?,?,?,?)
|
||||
Hibernate: insert into auth.users (created_at,email,name,provider,provider_subject,id) values (?,?,?,?,?,?)
|
||||
2026-05-12T15:25:53.302+09:00 WARN 3159134 --- [ Test worker] org.hibernate.orm.jdbc.error : HHH000247: ErrorCode: 0, SQLState: 23505
|
||||
2026-05-12T15:25:53.302+09:00 WARN 3159134 --- [ Test worker] org.hibernate.orm.jdbc.error : ERROR: duplicate key value violates unique constraint "uq_users__provider_provider_subject"
|
||||
Detail: Key (provider, provider_subject)=(KEYCLOAK, keycloak-subject-1) already exists.
|
||||
</pre>
|
||||
<button class="clipboard-copy-btn" aria-label="Copy to clipboard" data-copy-element-id="root-0-test-stdout-saveRejectsDuplicateProviderSubjectOnFlush()">Copy</button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footer">
|
||||
<p>
|
||||
<div>
|
||||
<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
|
||||
<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
|
||||
</label>
|
||||
</div>Generated by
|
||||
<a href="https://www.gradle.org">Gradle 9.3.1</a> at May 12, 2026, 3:25:54 PM</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,117 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||
<meta http-equiv="x-ua-compatible" content="IE=edge"/>
|
||||
<title>Test results - com.project.auth.infrastructure.persistence.user.mapper.UserPersistenceMapperTest</title>
|
||||
<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
|
||||
<link href="../css/style.css" rel="stylesheet" type="text/css"/>
|
||||
<script src="../js/report.js" type="text/javascript"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="content">
|
||||
<div class="breadcrumbs">
|
||||
<a class="breadcrumb" href="../index.html">all</a> >
|
||||
<span class="breadcrumb">com.project.auth.infrastructure.persistence.user.mapper.UserPersistenceMapperTest</span>
|
||||
</div>
|
||||
<div class="tab-container">
|
||||
<ul class="tabLinks">
|
||||
<li>
|
||||
<a class="successGroup" href="#">Gradle Test Run :infrastructure:test</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab">
|
||||
<h2>Gradle Test Run :infrastructure:test</h2>
|
||||
<h1>UserPersistenceMapperTest</h1>
|
||||
<div class="tab-container">
|
||||
<ul class="tabLinks">
|
||||
<li>
|
||||
<a class="" href="#">summary</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab">
|
||||
<h2>summary</h2>
|
||||
<div>
|
||||
<div class="summary">
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="summaryGroup">
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="infoBox">
|
||||
<div class="counter">1</div>
|
||||
<p>tests</p>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox">
|
||||
<div class="counter">0</div>
|
||||
<p>failures</p>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox">
|
||||
<div class="counter">0</div>
|
||||
<p>skipped</p>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox duration">
|
||||
<div class="counter">0.005s</div>
|
||||
<p>duration</p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox success successRate">
|
||||
<div class="percent">100%</div>
|
||||
<p>successful</p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<table class="test-results">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Child</th>
|
||||
<th hidden="">Name</th>
|
||||
<th>Tests</th>
|
||||
<th>Failures</th>
|
||||
<th>Skipped</th>
|
||||
<th>Duration</th>
|
||||
<th>Success rate</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tr>
|
||||
<td class="success">toDomain_translates_invalid_persisted_user_state_to_infrastructure_exception()</td>
|
||||
<td class="path" hidden="">toDomain_translates_invalid_persisted_user_state_to_infrastructure_exception()</td>
|
||||
<td>1</td>
|
||||
<td>0</td>
|
||||
<td>0</td>
|
||||
<td>0.004s</td>
|
||||
<td class="success">100%</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footer">
|
||||
<p>
|
||||
<div>
|
||||
<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
|
||||
<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
|
||||
</label>
|
||||
</div>Generated by
|
||||
<a href="https://www.gradle.org">Gradle 9.3.1</a> at May 12, 2026, 3:25:54 PM</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,175 @@
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-family: sans-serif;
|
||||
font-size: 12pt;
|
||||
}
|
||||
|
||||
body, a, a:visited {
|
||||
color: #303030;
|
||||
}
|
||||
|
||||
#content {
|
||||
padding: 30px 50px;
|
||||
}
|
||||
|
||||
#content h1 {
|
||||
font-size: 160%;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
#footer {
|
||||
margin-top: 100px;
|
||||
font-size: 80%;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
#footer, #footer a {
|
||||
color: #a0a0a0;
|
||||
}
|
||||
|
||||
#line-wrapping-toggle {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
#label-for-line-wrapping-toggle {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
ul {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
h1, h2, h3 {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 120%;
|
||||
}
|
||||
|
||||
.tab-container .tab-container {
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
ul.tabLinks {
|
||||
padding: 0;
|
||||
margin-bottom: 0;
|
||||
overflow: auto;
|
||||
min-width: 800px;
|
||||
width: auto;
|
||||
border-bottom: solid 1px #aaa;
|
||||
}
|
||||
|
||||
ul.tabLinks li {
|
||||
float: left;
|
||||
height: 100%;
|
||||
list-style: none;
|
||||
padding: 5px 10px;
|
||||
border-radius: 7px 7px 0 0;
|
||||
border: solid 1px transparent;
|
||||
border-bottom: none;
|
||||
margin-right: 6px;
|
||||
background-color: #f0f0f0;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
ul.tabLinks li.deselected > a {
|
||||
color: #6d6d6d;
|
||||
}
|
||||
|
||||
ul.tabLinks li:hover {
|
||||
background-color: #fafafa;
|
||||
}
|
||||
|
||||
ul.tabLinks li.selected {
|
||||
background-color: #c5f0f5;
|
||||
border-color: #aaa;
|
||||
}
|
||||
|
||||
ul.tabLinks a {
|
||||
font-size: 120%;
|
||||
display: block;
|
||||
outline: none;
|
||||
text-decoration: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
ul.tabLinks li h2 {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
div.tab {
|
||||
}
|
||||
|
||||
div.selected {
|
||||
display: block;
|
||||
}
|
||||
|
||||
div.deselected {
|
||||
display: none;
|
||||
}
|
||||
|
||||
div.tab table {
|
||||
min-width: 350px;
|
||||
width: auto;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
div.tab th, div.tab table {
|
||||
border-bottom: solid 1px #d0d0d0;
|
||||
}
|
||||
|
||||
div.tab th {
|
||||
text-align: left;
|
||||
white-space: nowrap;
|
||||
padding-left: 6em;
|
||||
}
|
||||
|
||||
div.tab th:first-child {
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
div.tab td {
|
||||
white-space: nowrap;
|
||||
padding-left: 6em;
|
||||
padding-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
div.tab td:first-child {
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
div.tab td.numeric, div.tab th.numeric {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
span.code {
|
||||
display: inline-block;
|
||||
margin-top: 0;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
span.code pre {
|
||||
font-size: 11pt;
|
||||
padding: 10px;
|
||||
margin: 0;
|
||||
background-color: #f7f7f7;
|
||||
border: solid 1px #d0d0d0;
|
||||
min-width: 700px;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
span.wrapped pre {
|
||||
word-wrap: break-word;
|
||||
white-space: pre-wrap;
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
label.hidden {
|
||||
display: none;
|
||||
}
|
||||
@@ -0,0 +1,154 @@
|
||||
.summary {
|
||||
margin-top: 30px;
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
|
||||
.summary table {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.summary td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
div.tab table.test-results td {
|
||||
padding-left: 1em;
|
||||
}
|
||||
|
||||
div.tab table.test-results th {
|
||||
padding-top: 0.5em;
|
||||
padding-left: 1em;
|
||||
}
|
||||
|
||||
.breadcrumbs, .breadcrumbs a {
|
||||
color: #606060;
|
||||
}
|
||||
|
||||
.infoBox {
|
||||
width: 110px;
|
||||
padding-top: 15px;
|
||||
padding-bottom: 15px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.infoBox p {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.counter, .percent {
|
||||
font-size: 120%;
|
||||
font-weight: bold;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.duration {
|
||||
width: 125px;
|
||||
}
|
||||
|
||||
.successRate, .summaryGroup {
|
||||
border: solid 2px #d0d0d0;
|
||||
-moz-border-radius: 10px;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
.successRate {
|
||||
width: 140px;
|
||||
margin-left: 35px;
|
||||
}
|
||||
|
||||
.successRate .percent {
|
||||
font-size: 180%;
|
||||
}
|
||||
|
||||
.success, .success a {
|
||||
color: #008000;
|
||||
}
|
||||
|
||||
div.success, .successRate.success {
|
||||
background-color: #bbd9bb;
|
||||
border-color: #008000;
|
||||
}
|
||||
|
||||
.failures, .failures a {
|
||||
color: #b60808;
|
||||
}
|
||||
|
||||
.skipped, .skipped a {
|
||||
color: #c09853;
|
||||
}
|
||||
|
||||
div.failures, .successRate.failures {
|
||||
background-color: #ecdada;
|
||||
border-color: #b60808;
|
||||
}
|
||||
|
||||
ul.linkList {
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
ul.linkList li {
|
||||
list-style: none;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
div.metadata td:first-child {
|
||||
padding-left: 5px;
|
||||
}
|
||||
|
||||
div.metadata td {
|
||||
padding-left: 5px;
|
||||
}
|
||||
|
||||
.metadata tr.odd {
|
||||
background-color: #f7f7f7;
|
||||
border: solid 1px #d0d0d0;
|
||||
}
|
||||
|
||||
.metadata tr.even {
|
||||
border: solid 1px #d0d0d0;
|
||||
}
|
||||
|
||||
.metadata th, .metadata td {
|
||||
padding: 5px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.metadata a {
|
||||
color: blue;
|
||||
}
|
||||
|
||||
.metadata .unrenderable {
|
||||
color: darkred;
|
||||
}
|
||||
|
||||
.code {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.clipboard-copy-btn {
|
||||
position: absolute;
|
||||
top: 8px;
|
||||
right: 8px;
|
||||
padding: 4px 8px;
|
||||
font-size: 0.9em;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.successGroup::before {
|
||||
content: "\23FA";
|
||||
margin-right: 8px;
|
||||
color: #008000;
|
||||
display: inline-block;
|
||||
}
|
||||
.failureGroup::before {
|
||||
content: "\2297";
|
||||
margin-right: 8px;
|
||||
color: #b60808;
|
||||
display: inline-block;
|
||||
}
|
||||
.skippedGroup::before {
|
||||
content: "\2296";
|
||||
margin-right: 8px;
|
||||
color: #c09853;
|
||||
display: inline-block;
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||
<meta http-equiv="x-ua-compatible" content="IE=edge"/>
|
||||
<title>Test results - All Results</title>
|
||||
<link href="css/base-style.css" rel="stylesheet" type="text/css"/>
|
||||
<link href="css/style.css" rel="stylesheet" type="text/css"/>
|
||||
<script src="js/report.js" type="text/javascript"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="content">
|
||||
<h1>All Results</h1>
|
||||
<div class="tab-container">
|
||||
<ul class="tabLinks">
|
||||
<li>
|
||||
<a class="successGroup" href="#">Gradle Test Run :infrastructure:test</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab">
|
||||
<h2>Gradle Test Run :infrastructure:test</h2>
|
||||
<h1>Gradle Test Run :infrastructure:test</h1>
|
||||
<div class="tab-container">
|
||||
<ul class="tabLinks">
|
||||
<li>
|
||||
<a class="" href="#">summary</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab">
|
||||
<h2>summary</h2>
|
||||
<div>
|
||||
<div class="summary">
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="summaryGroup">
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="infoBox">
|
||||
<div class="counter">4</div>
|
||||
<p>tests</p>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox">
|
||||
<div class="counter">0</div>
|
||||
<p>failures</p>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox">
|
||||
<div class="counter">0</div>
|
||||
<p>skipped</p>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox duration">
|
||||
<div class="counter">13.691s</div>
|
||||
<p>duration</p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="infoBox success successRate">
|
||||
<div class="percent">100%</div>
|
||||
<p>successful</p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<table class="test-results">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Child</th>
|
||||
<th>Name</th>
|
||||
<th>Tests</th>
|
||||
<th>Failures</th>
|
||||
<th>Skipped</th>
|
||||
<th>Duration</th>
|
||||
<th>Success rate</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tr>
|
||||
<td class="success">
|
||||
<a href="com.project.auth.infrastructure.persistence.user.mapper.UserPersistenceMapperTest/index.html">UserPersistenceMapperTest</a>
|
||||
</td>
|
||||
<td class="path">com.project.auth.infrastructure.persistence.user.mapper.UserPersistenceMapperTest</td>
|
||||
<td>1</td>
|
||||
<td>0</td>
|
||||
<td>0</td>
|
||||
<td>0.005s</td>
|
||||
<td class="success">100%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="success">
|
||||
<a href="com.project.auth.infrastructure.persistence.user.UserJpaRepositoryTest/index.html">UserJpaRepositoryTest</a>
|
||||
</td>
|
||||
<td class="path">com.project.auth.infrastructure.persistence.user.UserJpaRepositoryTest</td>
|
||||
<td>3</td>
|
||||
<td>0</td>
|
||||
<td>0</td>
|
||||
<td>11.782s</td>
|
||||
<td class="success">100%</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footer">
|
||||
<p>
|
||||
<div>
|
||||
<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
|
||||
<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
|
||||
</label>
|
||||
</div>Generated by
|
||||
<a href="https://www.gradle.org">Gradle 9.3.1</a> at May 12, 2026, 3:25:54 PM</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,228 @@
|
||||
(function (window, document) {
|
||||
"use strict";
|
||||
|
||||
function changeElementClass(element, classValue) {
|
||||
if (element.getAttribute("className")) {
|
||||
element.setAttribute("className", classValue);
|
||||
} else {
|
||||
element.setAttribute("class", classValue);
|
||||
}
|
||||
}
|
||||
|
||||
function getClassAttribute(element) {
|
||||
if (element.getAttribute("className")) {
|
||||
return element.getAttribute("className");
|
||||
} else {
|
||||
return element.getAttribute("class");
|
||||
}
|
||||
}
|
||||
|
||||
function addClass(element, classValue) {
|
||||
changeElementClass(element, getClassAttribute(element) + " " + classValue);
|
||||
}
|
||||
|
||||
function removeClass(element, classValue) {
|
||||
changeElementClass(element, getClassAttribute(element).replace(classValue, ""));
|
||||
}
|
||||
|
||||
function getCheckBox() {
|
||||
return document.getElementById("line-wrapping-toggle");
|
||||
}
|
||||
|
||||
function getLabelForCheckBox() {
|
||||
return document.getElementById("label-for-line-wrapping-toggle");
|
||||
}
|
||||
|
||||
function findCodeBlocks() {
|
||||
const codeBlocks = [];
|
||||
const tabContainers = getTabContainers();
|
||||
for (let i = 0; i < tabContainers.length; i++) {
|
||||
const spans = tabContainers[i].getElementsByTagName("span");
|
||||
for (let i = 0; i < spans.length; ++i) {
|
||||
if (spans[i].className.indexOf("code") >= 0) {
|
||||
codeBlocks.push(spans[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return codeBlocks;
|
||||
}
|
||||
|
||||
function forAllCodeBlocks(operation) {
|
||||
const codeBlocks = findCodeBlocks();
|
||||
|
||||
for (let i = 0; i < codeBlocks.length; ++i) {
|
||||
operation(codeBlocks[i], "wrapped");
|
||||
}
|
||||
}
|
||||
|
||||
function toggleLineWrapping() {
|
||||
const checkBox = getCheckBox();
|
||||
|
||||
if (checkBox.checked) {
|
||||
forAllCodeBlocks(addClass);
|
||||
} else {
|
||||
forAllCodeBlocks(removeClass);
|
||||
}
|
||||
}
|
||||
|
||||
function initClipboardCopyButton() {
|
||||
document.querySelectorAll(".clipboard-copy-btn").forEach((button) => {
|
||||
const copyElementId = button.getAttribute("data-copy-element-id");
|
||||
const elementWithCodeToSelect = document.getElementById(copyElementId);
|
||||
|
||||
button.addEventListener("click", () => {
|
||||
const text = elementWithCodeToSelect.innerText.trim();
|
||||
navigator.clipboard
|
||||
.writeText(text)
|
||||
.then(() => {
|
||||
button.textContent = "Copied!";
|
||||
setTimeout(() => {
|
||||
button.textContent = "Copy";
|
||||
}, 1500);
|
||||
})
|
||||
.catch((err) => {
|
||||
alert("Failed to copy to the clipboard: '" + err.message + "'. Check JavaScript console for more details.")
|
||||
console.warn("Failed to copy to the clipboard", err);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function initControls() {
|
||||
if (findCodeBlocks().length > 0) {
|
||||
const checkBox = getCheckBox();
|
||||
const label = getLabelForCheckBox();
|
||||
|
||||
checkBox.onclick = toggleLineWrapping;
|
||||
checkBox.checked = false;
|
||||
|
||||
removeClass(label, "hidden");
|
||||
}
|
||||
|
||||
initClipboardCopyButton()
|
||||
}
|
||||
|
||||
class TabManager {
|
||||
baseId;
|
||||
tabs;
|
||||
titles;
|
||||
headers;
|
||||
|
||||
constructor(baseId, tabs, titles, headers) {
|
||||
this.baseId = baseId;
|
||||
this.tabs = tabs;
|
||||
this.titles = titles;
|
||||
this.headers = headers;
|
||||
this.init();
|
||||
}
|
||||
|
||||
init() {
|
||||
for (let i = 0; i < this.headers.length; i++) {
|
||||
const header = this.headers[i];
|
||||
header.onclick = () => {
|
||||
this.select(i);
|
||||
return false;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
select(i) {
|
||||
this.deselectAll();
|
||||
|
||||
changeElementClass(this.tabs[i], "tab selected");
|
||||
changeElementClass(this.headers[i], "selected");
|
||||
}
|
||||
|
||||
deselectAll() {
|
||||
for (let i = 0; i < this.tabs.length; i++) {
|
||||
changeElementClass(this.tabs[i], "tab deselected");
|
||||
changeElementClass(this.headers[i], "deselected");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getTabContainers() {
|
||||
const tabContainers = Array.from(document.getElementsByClassName("tab-container"));
|
||||
|
||||
// Used by existing TabbedPageRenderer users, which have not adjusted to use TabsRenderer yet.
|
||||
const legacyContainer = document.getElementById("tabs");
|
||||
if (legacyContainer) {
|
||||
tabContainers.push(legacyContainer);
|
||||
}
|
||||
|
||||
return tabContainers;
|
||||
}
|
||||
|
||||
function initTabs() {
|
||||
let tabGroups = 0;
|
||||
|
||||
function createTab(num, container) {
|
||||
const tabElems = findTabs(container);
|
||||
const tabManager = new TabManager("tabs" + num, tabElems, findTitles(tabElems), findHeaders(container));
|
||||
tabManager.select(0);
|
||||
}
|
||||
|
||||
const tabContainers = getTabContainers();
|
||||
|
||||
for (let i = 0; i < tabContainers.length; i++) {
|
||||
createTab(tabGroups, tabContainers[i]);
|
||||
tabGroups++;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function findTabs(container) {
|
||||
return findChildElements(container, "DIV", "tab");
|
||||
}
|
||||
|
||||
function findHeaders(container) {
|
||||
const owner = findChildElements(container, "UL", "tabLinks");
|
||||
return findChildElements(owner[0], "LI", null);
|
||||
}
|
||||
|
||||
function findTitles(tabs) {
|
||||
const titles = [];
|
||||
|
||||
for (let i = 0; i < tabs.length; i++) {
|
||||
const tab = tabs[i];
|
||||
const header = findChildElements(tab, "H2", null)[0];
|
||||
|
||||
header.parentNode.removeChild(header);
|
||||
|
||||
if (header.innerText) {
|
||||
titles.push(header.innerText);
|
||||
} else {
|
||||
titles.push(header.textContent);
|
||||
}
|
||||
}
|
||||
|
||||
return titles;
|
||||
}
|
||||
|
||||
function findChildElements(container, name, targetClass) {
|
||||
const elements = [];
|
||||
const children = container.childNodes;
|
||||
|
||||
for (let i = 0; i < children.length; i++) {
|
||||
const child = children.item(i);
|
||||
|
||||
if (child.nodeType === 1 && child.nodeName === name) {
|
||||
if (targetClass && child.className.indexOf(targetClass) < 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
elements.push(child);
|
||||
}
|
||||
}
|
||||
|
||||
return elements;
|
||||
}
|
||||
|
||||
// Entry point.
|
||||
|
||||
window.onload = function() {
|
||||
initTabs();
|
||||
initControls();
|
||||
};
|
||||
} (window, window.document));
|
||||
@@ -0,0 +1,30 @@
|
||||
create schema if not exists auth;
|
||||
|
||||
create or replace function auth.set_updated_at()
|
||||
returns trigger as $$
|
||||
begin
|
||||
new.updated_at := current_timestamp;
|
||||
return new;
|
||||
end;
|
||||
$$ language plpgsql;
|
||||
|
||||
create table auth.users (
|
||||
id uuid not null,
|
||||
email text not null,
|
||||
encoded_password text not null,
|
||||
name text not null,
|
||||
provider text not null,
|
||||
created_at timestamp with time zone not null default current_timestamp,
|
||||
updated_at timestamp with time zone not null default current_timestamp,
|
||||
constraint pk_users primary key (id),
|
||||
constraint uq_users__email unique (email),
|
||||
constraint ck_users__provider check (provider in ('LOCAL', 'GOOGLE', 'GITHUB'))
|
||||
);
|
||||
|
||||
create index ix_users__created_at on auth.users (created_at);
|
||||
|
||||
create trigger trg_users__set_updated_at
|
||||
before update on auth.users
|
||||
for each row
|
||||
when (old.* is distinct from new.*)
|
||||
execute function auth.set_updated_at();
|
||||
@@ -0,0 +1,6 @@
|
||||
alter table auth.users alter column encoded_password drop not null;
|
||||
|
||||
alter table auth.users add column provider_subject text;
|
||||
|
||||
alter table auth.users
|
||||
add constraint uq_users__provider_provider_subject unique (provider, provider_subject);
|
||||
@@ -0,0 +1,13 @@
|
||||
alter table auth.users
|
||||
add constraint ck_users__local_password_required
|
||||
check (
|
||||
(provider = 'LOCAL' and encoded_password is not null and provider_subject is null)
|
||||
or (provider <> 'LOCAL')
|
||||
);
|
||||
|
||||
alter table auth.users
|
||||
add constraint ck_users__social_subject_required
|
||||
check (
|
||||
(provider <> 'LOCAL' and provider_subject is not null and encoded_password is null)
|
||||
or (provider = 'LOCAL')
|
||||
);
|
||||
@@ -0,0 +1,4 @@
|
||||
alter table auth.users drop constraint ck_users__provider;
|
||||
|
||||
alter table auth.users
|
||||
add constraint ck_users__provider check (provider in ('LOCAL', 'KEYCLOAK', 'GOOGLE', 'GITHUB'));
|
||||
@@ -0,0 +1,10 @@
|
||||
alter table auth.users drop constraint if exists ck_users__local_password_required;
|
||||
alter table auth.users drop constraint if exists ck_users__social_subject_required;
|
||||
alter table auth.users drop constraint if exists ck_users__provider;
|
||||
|
||||
alter table auth.users drop column if exists encoded_password;
|
||||
|
||||
alter table auth.users alter column provider_subject set not null;
|
||||
|
||||
alter table auth.users
|
||||
add constraint ck_users__provider check (provider = 'KEYCLOAK');
|
||||
@@ -0,0 +1,308 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<testsuite name="com.project.auth.infrastructure.persistence.user.UserJpaRepositoryTest" tests="3" skipped="0" failures="0" errors="0" timestamp="2026-05-12T06:25:42.685Z" hostname="donghyeon-960XGK" time="11.415">
|
||||
<properties/>
|
||||
<testcase name="saveRejectsDuplicateEmailOnFlush()" classname="com.project.auth.infrastructure.persistence.user.UserJpaRepositoryTest" time="0.86"/>
|
||||
<testcase name="saveRejectsDuplicateProviderSubjectOnFlush()" classname="com.project.auth.infrastructure.persistence.user.UserJpaRepositoryTest" time="0.024"/>
|
||||
<testcase name="savePersistsKeycloakUserAndReloadsFromDatabase()" classname="com.project.auth.infrastructure.persistence.user.UserJpaRepositoryTest" time="0.79"/>
|
||||
<system-out><![CDATA[15:25:43.172 [Test worker] INFO org.testcontainers.images.PullPolicy -- Image pull policy will be performed by: DefaultPullPolicy()
|
||||
15:25:43.185 [Test worker] INFO org.testcontainers.utility.ImageNameSubstitutor -- Image name substitution will be performed by: DefaultImageNameSubstitutor (composite of 'ConfigurationFileImageNameSubstitutor' and 'PrefixingImageNameSubstitutor')
|
||||
15:25:43.200 [Test worker] INFO org.testcontainers.DockerClientFactory -- Testcontainers version: 2.0.3
|
||||
15:25:43.659 [Test worker] INFO org.testcontainers.dockerclient.DockerClientProviderStrategy -- Loaded org.testcontainers.dockerclient.UnixSocketClientProviderStrategy from ~/.testcontainers.properties, will try it first
|
||||
15:25:44.185 [Test worker] INFO org.testcontainers.dockerclient.DockerClientProviderStrategy -- Found Docker environment with local Unix socket (unix:///var/run/docker.sock)
|
||||
15:25:44.187 [Test worker] INFO org.testcontainers.DockerClientFactory -- Docker host IP address is localhost
|
||||
15:25:44.207 [Test worker] INFO org.testcontainers.DockerClientFactory -- Connected to docker:
|
||||
Server Version: 29.4.2
|
||||
API Version: 1.54
|
||||
Operating System: Ubuntu 24.04.4 LTS
|
||||
Total Memory: 31671 MB
|
||||
15:25:44.323 [Test worker] INFO tc.testcontainers/ryuk:0.13.0 -- Creating container for image: testcontainers/ryuk:0.13.0
|
||||
15:25:44.556 [Test worker] INFO tc.testcontainers/ryuk:0.13.0 -- Container testcontainers/ryuk:0.13.0 is starting: f4a1b80c92efedded8f8490bc8b2b72c966aa72e47173b9e3549678e6e93b264
|
||||
15:25:44.907 [Test worker] INFO tc.testcontainers/ryuk:0.13.0 -- Container testcontainers/ryuk:0.13.0 started in PT0.584400461S
|
||||
15:25:44.913 [Test worker] INFO org.testcontainers.utility.RyukResourceReaper -- Ryuk started - will monitor and terminate Testcontainers containers on JVM exit
|
||||
15:25:44.913 [Test worker] INFO org.testcontainers.DockerClientFactory -- Checking the system...
|
||||
15:25:44.913 [Test worker] INFO org.testcontainers.DockerClientFactory -- ✔︎ Docker server version should be at least 1.6.0
|
||||
15:25:44.914 [Test worker] INFO tc.postgres:16-alpine -- Creating container for image: postgres:16-alpine
|
||||
15:25:45.044 [Test worker] INFO tc.postgres:16-alpine -- Container postgres:16-alpine is starting: d80d78ac464fe96638d0a2d9c5c80ecee028627924cb361626ead41bae272c25
|
||||
15:25:46.585 [Test worker] INFO tc.postgres:16-alpine -- Container postgres:16-alpine started in PT1.671196137S
|
||||
15:25:46.586 [Test worker] INFO tc.postgres:16-alpine -- Container is started (JDBC URL: jdbc:postgresql://localhost:32777/test?loggerLevel=OFF)
|
||||
|
||||
. ____ _ __ _ _
|
||||
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
|
||||
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
|
||||
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
|
||||
' |____| .__|_| |_|_| |_\__, | / / / /
|
||||
=========|_|==============|___/=/_/_/_/
|
||||
|
||||
:: Spring Boot :: (v4.0.3)
|
||||
|
||||
2026-05-12T15:25:47.051+09:00 INFO 3159134 --- [ Test worker] c.p.a.i.p.user.UserJpaRepositoryTest : Starting UserJpaRepositoryTest using Java 21.0.10 with PID 3159134 (started by donghyeon in /home/donghyeon/dev/Project-Auth-Server/infrastructure)
|
||||
2026-05-12T15:25:47.052+09:00 INFO 3159134 --- [ Test worker] c.p.a.i.p.user.UserJpaRepositoryTest : No active profile set, falling back to 1 default profile: "default"
|
||||
2026-05-12T15:25:47.053+09:00 DEBUG 3159134 --- [ Test worker] o.s.boot.SpringApplication : Loading source class com.project.auth.infrastructure.persistence.user.UserJpaRepositoryTest$TestApplication,class com.project.auth.infrastructure.persistence.user.UserJpaRepositoryTest$TestFlywayConfiguration
|
||||
2026-05-12T15:25:47.335+09:00 INFO 3159134 --- [ Test worker] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
|
||||
2026-05-12T15:25:47.386+09:00 INFO 3159134 --- [ Test worker] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 39 ms. Found 1 JPA repository interface.
|
||||
2026-05-12T15:25:48.253+09:00 INFO 3159134 --- [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
|
||||
2026-05-12T15:25:48.506+09:00 INFO 3159134 --- [ Test worker] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@55f20d7e
|
||||
2026-05-12T15:25:48.509+09:00 INFO 3159134 --- [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
|
||||
2026-05-12T15:25:48.572+09:00 INFO 3159134 --- [ Test worker] org.flywaydb.core.FlywayExecutor : Database: jdbc:postgresql://localhost:32777/test?loggerLevel=OFF (PostgreSQL 16.13)
|
||||
2026-05-12T15:25:48.638+09:00 INFO 3159134 --- [ Test worker] o.f.core.internal.database.base.Schema : Creating schema "auth" ...
|
||||
2026-05-12T15:25:48.651+09:00 INFO 3159134 --- [ Test worker] o.f.c.i.s.JdbcTableSchemaHistory : Creating Schema History table "auth"."flyway_schema_history" ...
|
||||
2026-05-12T15:25:48.743+09:00 INFO 3159134 --- [ Test worker] o.f.core.internal.command.DbMigrate : Current version of schema "auth": null
|
||||
2026-05-12T15:25:48.762+09:00 INFO 3159134 --- [ Test worker] o.f.core.internal.command.DbMigrate : Migrating schema "auth" to version "1 - create users table"
|
||||
2026-05-12T15:25:48.775+09:00 WARN 3159134 --- [ Test worker] o.f.c.i.s.DefaultSqlScriptExecutor : DB: schema "auth" already exists, skipping (SQL State: 42P06 - Error Code: 0)
|
||||
2026-05-12T15:25:48.817+09:00 INFO 3159134 --- [ Test worker] o.f.core.internal.command.DbMigrate : Migrating schema "auth" to version "2 - add oauth login columns"
|
||||
2026-05-12T15:25:48.839+09:00 INFO 3159134 --- [ Test worker] o.f.core.internal.command.DbMigrate : Migrating schema "auth" to version "3 - add user provider field constraints"
|
||||
2026-05-12T15:25:48.855+09:00 INFO 3159134 --- [ Test worker] o.f.core.internal.command.DbMigrate : Migrating schema "auth" to version "4 - add keycloak provider"
|
||||
2026-05-12T15:25:48.877+09:00 INFO 3159134 --- [ Test worker] o.f.core.internal.command.DbMigrate : Migrating schema "auth" to version "5 - keycloak only provider"
|
||||
2026-05-12T15:25:48.902+09:00 INFO 3159134 --- [ Test worker] o.f.core.internal.command.DbMigrate : Successfully applied 5 migrations to schema "auth", now at version v5 (execution time 00:00.075s)
|
||||
2026-05-12T15:25:49.151+09:00 INFO 3159134 --- [ Test worker] org.hibernate.orm.jpa : HHH008540: Processing PersistenceUnitInfo [name: default]
|
||||
2026-05-12T15:25:49.255+09:00 INFO 3159134 --- [ Test worker] org.hibernate.orm.core : HHH000001: Hibernate ORM core version 7.2.4.Final
|
||||
2026-05-12T15:25:50.061+09:00 INFO 3159134 --- [ Test worker] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer
|
||||
2026-05-12T15:25:50.233+09:00 INFO 3159134 --- [ Test worker] org.hibernate.orm.connections.pooling : HHH10001005: Database info:
|
||||
Database JDBC URL [jdbc:postgresql://localhost:32777/test?loggerLevel=OFF]
|
||||
Database driver: PostgreSQL JDBC Driver
|
||||
Database dialect: PostgreSQLDialect
|
||||
Database version: 16.13
|
||||
Default catalog/schema: test/public
|
||||
Autocommit mode: undefined/unknown
|
||||
Isolation level: READ_COMMITTED [default READ_COMMITTED]
|
||||
JDBC fetch size: none
|
||||
Pool: DataSourceConnectionProvider
|
||||
Minimum pool size: undefined/unknown
|
||||
Maximum pool size: undefined/unknown
|
||||
2026-05-12T15:25:51.846+09:00 INFO 3159134 --- [ Test worker] org.hibernate.orm.core : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)
|
||||
2026-05-12T15:25:51.912+09:00 INFO 3159134 --- [ Test worker] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
|
||||
2026-05-12T15:25:52.038+09:00 INFO 3159134 --- [ Test worker] o.s.d.j.r.query.QueryEnhancerFactories : Hibernate is in classpath; If applicable, HQL parser will be used.
|
||||
2026-05-12T15:25:52.393+09:00 DEBUG 3159134 --- [ Test worker] .s.b.a.l.ConditionEvaluationReportLogger :
|
||||
|
||||
|
||||
============================
|
||||
CONDITIONS EVALUATION REPORT
|
||||
============================
|
||||
|
||||
|
||||
Positive matches:
|
||||
-----------------
|
||||
|
||||
DataSourceAutoConfiguration matched:
|
||||
- @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType' (OnClassCondition)
|
||||
- @ConditionalOnMissingBean (types: io.r2dbc.spi.ConnectionFactory; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
DataSourceAutoConfiguration.PooledDataSourceConfiguration matched:
|
||||
- AnyNestedCondition 1 matched 1 did not; NestedCondition on DataSourceAutoConfiguration.PooledDataSourceCondition.PooledDataSourceAvailable PooledDataSource found supported DataSource; NestedCondition on DataSourceAutoConfiguration.PooledDataSourceCondition.ExplicitType @ConditionalOnProperty (spring.datasource.type) did not find property 'spring.datasource.type' (DataSourceAutoConfiguration.PooledDataSourceCondition)
|
||||
- @ConditionalOnMissingBean (types: javax.sql.DataSource,javax.sql.XADataSource; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
DataSourceAutoConfiguration.PooledDataSourceConfiguration#jdbcConnectionDetails matched:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.boot.jdbc.autoconfigure.JdbcConnectionDetails; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
DataSourceConfiguration.Hikari matched:
|
||||
- @ConditionalOnClass found required class 'com.zaxxer.hikari.HikariDataSource' (OnClassCondition)
|
||||
- @ConditionalOnProperty (spring.datasource.type=com.zaxxer.hikari.HikariDataSource) matched (OnPropertyCondition)
|
||||
- @ConditionalOnMissingBean (types: javax.sql.DataSource; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
DataSourceInitializationAutoConfiguration matched:
|
||||
- @ConditionalOnClass found required class 'org.springframework.jdbc.datasource.init.DatabasePopulator' (OnClassCondition)
|
||||
- SQL InitializationDatabase Initialization default value is EMBEDDED (OnSqlInitializationCondition)
|
||||
- @ConditionalOnSingleCandidate (types: javax.sql.DataSource; SearchStrategy: all) found a single bean 'dataSource'; @ConditionalOnMissingBean (types: org.springframework.boot.sql.autoconfigure.init.ApplicationScriptDatabaseInitializer; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
DataSourcePoolMetadataProvidersConfiguration.HikariPoolDataSourceMetadataProviderConfiguration matched:
|
||||
- @ConditionalOnClass found required class 'com.zaxxer.hikari.HikariDataSource' (OnClassCondition)
|
||||
|
||||
DataSourceTransactionManagerAutoConfiguration matched:
|
||||
- @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.core.JdbcTemplate', 'org.springframework.transaction.TransactionManager' (OnClassCondition)
|
||||
|
||||
DataSourceTransactionManagerAutoConfiguration.JdbcTransactionManagerConfiguration matched:
|
||||
- @ConditionalOnSingleCandidate (types: javax.sql.DataSource; SearchStrategy: all) found a single bean 'dataSource' (OnBeanCondition)
|
||||
|
||||
HibernateJpaAutoConfiguration matched:
|
||||
- @ConditionalOnClass found required classes 'org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean', 'jakarta.persistence.EntityManager', 'org.hibernate.engine.spi.SessionImplementor' (OnClassCondition)
|
||||
|
||||
HibernateJpaConfiguration matched:
|
||||
- @ConditionalOnSingleCandidate (types: javax.sql.DataSource; SearchStrategy: all) found a single bean 'dataSource' (OnBeanCondition)
|
||||
|
||||
JdbcClientAutoConfiguration matched:
|
||||
- @ConditionalOnSingleCandidate (types: org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; SearchStrategy: all) found a single bean 'namedParameterJdbcTemplate'; @ConditionalOnMissingBean (types: org.springframework.jdbc.core.simple.JdbcClient; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
JdbcTemplateAutoConfiguration matched:
|
||||
- @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.core.JdbcTemplate' (OnClassCondition)
|
||||
- @ConditionalOnSingleCandidate (types: javax.sql.DataSource; SearchStrategy: all) found a single bean 'dataSource' (OnBeanCondition)
|
||||
|
||||
JdbcTemplateConfiguration matched:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.jdbc.core.JdbcOperations; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
JpaBaseConfiguration#entityManagerFactory matched:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean,jakarta.persistence.EntityManagerFactory; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
JpaBaseConfiguration#entityManagerFactoryBuilder matched:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.boot.jpa.EntityManagerFactoryBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
JpaBaseConfiguration#jpaVendorAdapter matched:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.orm.jpa.JpaVendorAdapter; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
JpaBaseConfiguration#transactionManager matched:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.transaction.TransactionManager; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
JpaBaseConfiguration.PersistenceManagedTypesConfiguration matched:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean,jakarta.persistence.EntityManagerFactory; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
JpaBaseConfiguration.PersistenceManagedTypesConfiguration#persistenceManagedTypes matched:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.orm.jpa.persistenceunit.PersistenceManagedTypes; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
NamedParameterJdbcTemplateConfiguration matched:
|
||||
- @ConditionalOnSingleCandidate (types: org.springframework.jdbc.core.JdbcTemplate; SearchStrategy: all) found a single bean 'jdbcTemplate'; @ConditionalOnMissingBean (types: org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
TestEntityManagerAutoConfiguration matched:
|
||||
- @ConditionalOnClass found required class 'jakarta.persistence.EntityManagerFactory' (OnClassCondition)
|
||||
|
||||
TestEntityManagerAutoConfiguration#testEntityManager matched:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.boot.jpa.test.autoconfigure.TestEntityManager; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
TransactionAutoConfiguration matched:
|
||||
- @ConditionalOnClass found required class 'org.springframework.transaction.PlatformTransactionManager' (OnClassCondition)
|
||||
|
||||
TransactionAutoConfiguration.EnableTransactionManagementConfiguration matched:
|
||||
- @ConditionalOnBean (types: org.springframework.transaction.TransactionManager; SearchStrategy: all) found bean 'transactionManager'; @ConditionalOnMissingBean (types: org.springframework.transaction.annotation.AbstractTransactionManagementConfiguration; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
TransactionAutoConfiguration.EnableTransactionManagementConfiguration.CglibAutoProxyConfiguration matched:
|
||||
- @ConditionalOnBooleanProperty (spring.aop.proxy-target-class=true) matched (OnPropertyCondition)
|
||||
|
||||
TransactionAutoConfiguration.TransactionTemplateConfiguration matched:
|
||||
- @ConditionalOnSingleCandidate (types: org.springframework.transaction.PlatformTransactionManager; SearchStrategy: all) found a single bean 'transactionManager' (OnBeanCondition)
|
||||
|
||||
TransactionAutoConfiguration.TransactionTemplateConfiguration#transactionTemplate matched:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.transaction.support.TransactionOperations; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
|
||||
Negative matches:
|
||||
-----------------
|
||||
|
||||
DataJpaRepositoriesAutoConfiguration:
|
||||
Did not match:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean,org.springframework.data.jpa.repository.config.JpaRepositoryConfigExtension; SearchStrategy: all) found beans of type 'org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean' &userJpaRepository and found beans of type 'org.springframework.data.jpa.repository.config.JpaRepositoryConfigExtension' org.springframework.data.jpa.repository.config.JpaRepositoryConfigExtension#0 (OnBeanCondition)
|
||||
Matched:
|
||||
- @ConditionalOnClass found required class 'org.springframework.data.jpa.repository.JpaRepository' (OnClassCondition)
|
||||
- @ConditionalOnBooleanProperty (spring.data.jpa.repositories.enabled=true) matched (OnPropertyCondition)
|
||||
|
||||
DataSourceAutoConfiguration.EmbeddedDatabaseConfiguration:
|
||||
Did not match:
|
||||
- EmbeddedDataSource spring.datasource.url is set (DataSourceAutoConfiguration.EmbeddedDatabaseCondition)
|
||||
|
||||
DataSourceCheckpointRestoreConfiguration:
|
||||
Did not match:
|
||||
- @ConditionalOnClass did not find required class 'org.crac.Resource' (OnClassCondition)
|
||||
|
||||
DataSourceConfiguration.Dbcp2:
|
||||
Did not match:
|
||||
- @ConditionalOnClass did not find required class 'org.apache.commons.dbcp2.BasicDataSource' (OnClassCondition)
|
||||
|
||||
DataSourceConfiguration.Generic:
|
||||
Did not match:
|
||||
- @ConditionalOnProperty (spring.datasource.type) did not find property 'spring.datasource.type' (OnPropertyCondition)
|
||||
|
||||
DataSourceConfiguration.OracleUcp:
|
||||
Did not match:
|
||||
- @ConditionalOnClass did not find required classes 'oracle.ucp.jdbc.PoolDataSourceImpl', 'oracle.jdbc.OracleConnection' (OnClassCondition)
|
||||
|
||||
DataSourceConfiguration.Tomcat:
|
||||
Did not match:
|
||||
- @ConditionalOnClass did not find required class 'org.apache.tomcat.jdbc.pool.DataSource' (OnClassCondition)
|
||||
|
||||
DataSourceJmxConfiguration:
|
||||
Did not match:
|
||||
- @ConditionalOnBooleanProperty (spring.jmx.enabled=true) found different value in property 'spring.jmx.enabled' (OnPropertyCondition)
|
||||
|
||||
DataSourcePoolMetadataProvidersConfiguration.CommonsDbcp2PoolDataSourceMetadataProviderConfiguration:
|
||||
Did not match:
|
||||
- @ConditionalOnClass did not find required class 'org.apache.commons.dbcp2.BasicDataSource' (OnClassCondition)
|
||||
|
||||
DataSourcePoolMetadataProvidersConfiguration.OracleUcpPoolDataSourceMetadataProviderConfiguration:
|
||||
Did not match:
|
||||
- @ConditionalOnClass did not find required classes 'oracle.ucp.jdbc.PoolDataSource', 'oracle.jdbc.OracleConnection' (OnClassCondition)
|
||||
|
||||
DataSourcePoolMetadataProvidersConfiguration.TomcatDataSourcePoolMetadataProviderConfiguration:
|
||||
Did not match:
|
||||
- @ConditionalOnClass did not find required class 'org.apache.tomcat.jdbc.pool.DataSource' (OnClassCondition)
|
||||
|
||||
DataSourceTransactionManagerAutoConfiguration.JdbcTransactionManagerConfiguration#transactionManager:
|
||||
Did not match:
|
||||
- @ConditionalOnMissingBean (types: org.springframework.transaction.TransactionManager; SearchStrategy: all) found beans of type 'org.springframework.transaction.TransactionManager' transactionManager (OnBeanCondition)
|
||||
|
||||
JpaBaseConfiguration.JpaWebConfiguration:
|
||||
Did not match:
|
||||
- @ConditionalOnClass did not find required class 'org.springframework.web.servlet.config.annotation.WebMvcConfigurer' (OnClassCondition)
|
||||
|
||||
TestDatabaseAutoConfiguration#dataSource:
|
||||
Did not match:
|
||||
- @ConditionalOnProperty (spring.test.database.replace=AUTO_CONFIGURED) found different value in property 'spring.test.database.replace' (OnPropertyCondition)
|
||||
|
||||
TestDatabaseAutoConfiguration#embeddedDataSourceBeanFactoryPostProcessor:
|
||||
Did not match:
|
||||
- @ConditionalOnProperty (spring.test.database.replace=ANY) found different value in property 'spring.test.database.replace' (OnPropertyCondition)
|
||||
|
||||
TestDatabaseAutoConfiguration#nonTestEmbeddedDataSourceBeanFactoryPostProcessor:
|
||||
Did not match:
|
||||
- @ConditionalOnProperty (spring.test.database.replace=NON_TEST) found different value in property 'spring.test.database.replace' (OnPropertyCondition)
|
||||
|
||||
TransactionAutoConfiguration#transactionalOperator:
|
||||
Did not match:
|
||||
- @ConditionalOnSingleCandidate (types: org.springframework.transaction.ReactiveTransactionManager; SearchStrategy: all) did not find any beans (OnBeanCondition)
|
||||
|
||||
TransactionAutoConfiguration.AspectJTransactionManagementConfiguration:
|
||||
Did not match:
|
||||
- @ConditionalOnBean (types: org.springframework.transaction.aspectj.AbstractTransactionAspect; SearchStrategy: all) did not find any beans of type org.springframework.transaction.aspectj.AbstractTransactionAspect (OnBeanCondition)
|
||||
|
||||
TransactionAutoConfiguration.EnableTransactionManagementConfiguration.JdkDynamicAutoProxyConfiguration:
|
||||
Did not match:
|
||||
- @ConditionalOnBooleanProperty (spring.aop.proxy-target-class=false) did not find property 'spring.aop.proxy-target-class' (OnPropertyCondition)
|
||||
|
||||
|
||||
Exclusions:
|
||||
-----------
|
||||
|
||||
None
|
||||
|
||||
|
||||
Unconditional classes:
|
||||
----------------------
|
||||
|
||||
org.springframework.boot.jdbc.test.autoconfigure.TestDatabaseAutoConfiguration
|
||||
|
||||
|
||||
|
||||
2026-05-12T15:25:52.402+09:00 INFO 3159134 --- [ Test worker] c.p.a.i.p.user.UserJpaRepositoryTest : Started UserJpaRepositoryTest in 5.765 seconds (process running for 11.36)
|
||||
2026-05-12T15:25:52.978+09:00 DEBUG 3159134 --- [ Test worker] org.hibernate.SQL : select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.id=?
|
||||
Hibernate: select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.id=?
|
||||
2026-05-12T15:25:53.078+09:00 DEBUG 3159134 --- [ Test worker] org.hibernate.SQL : insert into auth.users (created_at,email,name,provider,provider_subject,id) values (?,?,?,?,?,?)
|
||||
Hibernate: insert into auth.users (created_at,email,name,provider,provider_subject,id) values (?,?,?,?,?,?)
|
||||
2026-05-12T15:25:53.094+09:00 DEBUG 3159134 --- [ Test worker] org.hibernate.SQL : select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.id=?
|
||||
Hibernate: select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.id=?
|
||||
2026-05-12T15:25:53.181+09:00 DEBUG 3159134 --- [ Test worker] org.hibernate.SQL : insert into auth.users (created_at,email,name,provider,provider_subject,id) values (?,?,?,?,?,?)
|
||||
Hibernate: insert into auth.users (created_at,email,name,provider,provider_subject,id) values (?,?,?,?,?,?)
|
||||
2026-05-12T15:25:53.192+09:00 WARN 3159134 --- [ Test worker] org.hibernate.orm.jdbc.error : HHH000247: ErrorCode: 0, SQLState: 23505
|
||||
2026-05-12T15:25:53.192+09:00 WARN 3159134 --- [ Test worker] org.hibernate.orm.jdbc.error : ERROR: duplicate key value violates unique constraint "uq_users__email"
|
||||
Detail: Key (email)=(duplicate@example.com) already exists.
|
||||
2026-05-12T15:25:53.291+09:00 DEBUG 3159134 --- [ Test worker] org.hibernate.SQL : select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.id=?
|
||||
Hibernate: select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.id=?
|
||||
2026-05-12T15:25:53.294+09:00 DEBUG 3159134 --- [ Test worker] org.hibernate.SQL : insert into auth.users (created_at,email,name,provider,provider_subject,id) values (?,?,?,?,?,?)
|
||||
Hibernate: insert into auth.users (created_at,email,name,provider,provider_subject,id) values (?,?,?,?,?,?)
|
||||
2026-05-12T15:25:53.297+09:00 DEBUG 3159134 --- [ Test worker] org.hibernate.SQL : select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.id=?
|
||||
Hibernate: select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.id=?
|
||||
2026-05-12T15:25:53.300+09:00 DEBUG 3159134 --- [ Test worker] org.hibernate.SQL : insert into auth.users (created_at,email,name,provider,provider_subject,id) values (?,?,?,?,?,?)
|
||||
Hibernate: insert into auth.users (created_at,email,name,provider,provider_subject,id) values (?,?,?,?,?,?)
|
||||
2026-05-12T15:25:53.302+09:00 WARN 3159134 --- [ Test worker] org.hibernate.orm.jdbc.error : HHH000247: ErrorCode: 0, SQLState: 23505
|
||||
2026-05-12T15:25:53.302+09:00 WARN 3159134 --- [ Test worker] org.hibernate.orm.jdbc.error : ERROR: duplicate key value violates unique constraint "uq_users__provider_provider_subject"
|
||||
Detail: Key (provider, provider_subject)=(KEYCLOAK, keycloak-subject-1) already exists.
|
||||
2026-05-12T15:25:53.321+09:00 DEBUG 3159134 --- [ Test worker] org.hibernate.SQL : select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.id=?
|
||||
Hibernate: select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.id=?
|
||||
2026-05-12T15:25:53.323+09:00 DEBUG 3159134 --- [ Test worker] org.hibernate.SQL : insert into auth.users (created_at,email,name,provider,provider_subject,id) values (?,?,?,?,?,?)
|
||||
Hibernate: insert into auth.users (created_at,email,name,provider,provider_subject,id) values (?,?,?,?,?,?)
|
||||
2026-05-12T15:25:54.071+09:00 DEBUG 3159134 --- [ Test worker] org.hibernate.SQL : select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.provider=? and uje1_0.provider_subject=?
|
||||
Hibernate: select uje1_0.id,uje1_0.created_at,uje1_0.email,uje1_0.name,uje1_0.provider,uje1_0.provider_subject,uje1_0.updated_at from auth.users uje1_0 where uje1_0.provider=? and uje1_0.provider_subject=?
|
||||
2026-05-12T15:25:54.113+09:00 WARN 3159134 --- [ Test worker] o.j.j.e.d.AbstractExtensionContext : Type implements CloseableResource but not AutoCloseable: org.testcontainers.junit.jupiter.TestcontainersExtension$StoreAdapter
|
||||
]]></system-out>
|
||||
<system-err><![CDATA[Mockito is currently self-attaching to enable the inline-mock-maker. This will no longer work in future releases of the JDK. Please add Mockito as an agent to your build as described in Mockito's documentation: https://javadoc.io/doc/org.mockito/mockito-core/latest/org.mockito/org/mockito/Mockito.html#0.3
|
||||
WARNING: A Java agent has been loaded dynamically (/home/donghyeon/.gradle/caches/modules-2/files-2.1/net.bytebuddy/byte-buddy-agent/1.17.8/f09415827a71be7ed621c7bd02550678f28bc81c/byte-buddy-agent-1.17.8.jar)
|
||||
WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warning
|
||||
WARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more information
|
||||
WARNING: Dynamic loading of agents will be disallowed by default in a future release
|
||||
]]></system-err>
|
||||
</testsuite>
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<testsuite name="com.project.auth.infrastructure.persistence.user.mapper.UserPersistenceMapperTest" tests="1" skipped="0" failures="0" errors="0" timestamp="2026-05-12T06:25:54.468Z" hostname="donghyeon-960XGK" time="0.005">
|
||||
<properties/>
|
||||
<testcase name="toDomain_translates_invalid_persisted_user_state_to_infrastructure_exception()" classname="com.project.auth.infrastructure.persistence.user.mapper.UserPersistenceMapperTest" time="0.004"/>
|
||||
<system-out><![CDATA[]]></system-out>
|
||||
<system-err><![CDATA[]]></system-err>
|
||||
</testsuite>
|
||||
@@ -0,0 +1,20 @@
|
||||
Manifest-Version: 1.0
|
||||
Created-By: Apache Maven Bundle Plugin 6.0.0
|
||||
Build-Jdk-Spec: 21
|
||||
Build-Tool-Jdk-Spec: 21
|
||||
Automatic-Module-Name: org.jacoco.agent
|
||||
Bnd-LastModified: 1743583180503
|
||||
Bundle-Description: JaCoCo Agent
|
||||
Bundle-License: https://www.eclipse.org/legal/epl-2.0/
|
||||
Bundle-ManifestVersion: 2
|
||||
Bundle-Name: JaCoCo Agent
|
||||
Bundle-RequiredExecutionEnvironment: J2SE-1.5
|
||||
Bundle-SymbolicName: org.jacoco.agent
|
||||
Bundle-Vendor: Mountainminds GmbH & Co. KG
|
||||
Bundle-Version: 0.8.13.202504020838
|
||||
Eclipse-SourceReferences: scm:git:git://github.com/jacoco/jacoco.git;pat
|
||||
h="org.jacoco.agent";commitId=78d5eff856bbe6129f05012e40c13d1840e20598
|
||||
Export-Package: org.jacoco.agent;version="0.8.13"
|
||||
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.5))"
|
||||
Tool: Bnd-7.0.0.202310060912
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
artifactId=org.jacoco.agent
|
||||
groupId=org.jacoco
|
||||
version=0.8.13
|
||||
@@ -0,0 +1,106 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
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:
|
||||
Evgeny Mandrikov - initial API and implementation
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<parent>
|
||||
<groupId>org.jacoco</groupId>
|
||||
<artifactId>org.jacoco.build</artifactId>
|
||||
<version>0.8.13</version>
|
||||
<relativePath>../org.jacoco.build</relativePath>
|
||||
</parent>
|
||||
|
||||
<artifactId>org.jacoco.agent</artifactId>
|
||||
|
||||
<name>JaCoCo :: Agent</name>
|
||||
<description>JaCoCo Agent</description>
|
||||
|
||||
<build>
|
||||
<sourceDirectory>src</sourceDirectory>
|
||||
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-dependency-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>prepare-package</phase>
|
||||
<goals>
|
||||
<goal>copy</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<artifactItems>
|
||||
<artifactItem>
|
||||
<groupId>${project.groupId}</groupId>
|
||||
<artifactId>org.jacoco.agent.rt</artifactId>
|
||||
<classifier>all</classifier>
|
||||
<version>${project.version}</version>
|
||||
<destFileName>jacocoagent.jar</destFileName>
|
||||
</artifactItem>
|
||||
</artifactItems>
|
||||
<outputDirectory>${project.build.directory}/classes</outputDirectory>
|
||||
<overWriteReleases>false</overWriteReleases>
|
||||
<overWriteSnapshots>false</overWriteSnapshots>
|
||||
<overWriteIfNewer>true</overWriteIfNewer>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>build-helper-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>attach-artifacts</id>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>attach-artifact</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<artifacts>
|
||||
<artifact>
|
||||
<file>${project.build.directory}/classes/jacocoagent.jar</file>
|
||||
<type>jar</type>
|
||||
<classifier>runtime</classifier>
|
||||
</artifact>
|
||||
</artifacts>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.apache.felix</groupId>
|
||||
<artifactId>maven-bundle-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>process-classes</phase>
|
||||
<goals>
|
||||
<goal>manifest</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<configuration>
|
||||
<archive>
|
||||
<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
|
||||
</archive>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
@@ -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>
|
||||
<head>
|
||||
<title>About</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
</head>
|
||||
<body lang="EN-US">
|
||||
<h2>About This Content</h2>
|
||||
|
||||
<p>
|
||||
2025/04/02
|
||||
</p>
|
||||
|
||||
<h3>License</h3>
|
||||
|
||||
<p>
|
||||
All Content in this distribution is made available by Mountainminds GmbH & Co.
|
||||
KG, Munich. Unless otherwise indicated below, the Content is provided to you
|
||||
under the terms and conditions of the Eclipse Public License Version 2.0
|
||||
("EPL"). A copy of the EPL is available at
|
||||
<a href="https://www.eclipse.org/legal/epl-2.0/">https://www.eclipse.org/legal/epl-2.0/</a>.
|
||||
For purposes of the EPL, "Program" will mean the Content.
|
||||
</p>
|
||||
|
||||
<h3>Third Party Content</h3>
|
||||
|
||||
<p>
|
||||
The Content includes items that have been sourced from third parties as set
|
||||
out below.
|
||||
</p>
|
||||
|
||||
<h4>ASM</h4>
|
||||
|
||||
<p>
|
||||
<a href="https://asm.ow2.io/">ASM 9.8</a> is subject to the terms and
|
||||
conditions of the following license:
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
ASM: a very small and fast Java bytecode manipulation framework
|
||||
Copyright (c) 2000-2011 INRIA, France Telecom
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
3. Neither the name of the copyright holders nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
THE POSSIBILITY OF SUCH DAMAGE.
|
||||
</pre>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||