diff --git a/build.gradle.kts b/build.gradle.kts index f773e6c..d98a8bb 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,7 +13,7 @@ java { sourceCompatibility = JavaVersion.VERSION_21 } repositories { mavenCentral() } dependencies { - implementation("org.springframework.boot:spring-boot-starter-data-jdbc") + implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("org.springframework.boot:spring-boot-starter-webflux") implementation("org.springframework.boot:spring-boot-starter-validation") runtimeOnly("org.postgresql:postgresql") @@ -30,6 +30,8 @@ dependencies { testImplementation(platform("org.testcontainers:testcontainers-bom:1.20.1")) testImplementation("org.testcontainers:postgresql") testImplementation("org.testcontainers:junit-jupiter") + val stubitVersion = 0.6 + testImplementation("org.stubit:spring-data:$stubitVersion") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/Application.java b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/Application.java index 139e1c2..944da8b 100644 --- a/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/Application.java +++ b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/Application.java @@ -4,11 +4,11 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; -import org.springframework.data.jdbc.repository.config.EnableJdbcRepositories; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; @SpringBootApplication -@EnableJdbcRepositories +@EnableJpaRepositories public class Application { static { diff --git a/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/adapter/driven/db/UnicornEntity.java b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/adapter/driven/db/UnicornEntity.java new file mode 100644 index 0000000..3272dae --- /dev/null +++ b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/adapter/driven/db/UnicornEntity.java @@ -0,0 +1,91 @@ +package com.agiletestingdays.untangletestcode.unicornservice.adapter.driven.db; + +import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneOffset; +import java.util.UUID; + +@Entity +@Table(name = "unicorns") +public class UnicornEntity { + + @Id private UUID id; + private String name; + private String maneColor; + private Integer hornLength; + private Integer hornDiameter; + private Instant dateOfBirth; + + public UnicornEntity() {} + + public UnicornEntity(Unicorn unicorn) { + this.id = unicorn.id(); + this.name = unicorn.name(); + this.maneColor = unicorn.maneColor().name(); + this.hornLength = unicorn.hornLength(); + this.hornDiameter = unicorn.hornDiameter(); + this.dateOfBirth = unicorn.dateOfBirth().atStartOfDay().toInstant(ZoneOffset.UTC); + } + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getManeColor() { + return maneColor; + } + + public void setManeColor(String maneColor) { + this.maneColor = maneColor; + } + + public Integer getHornLength() { + return hornLength; + } + + public void setHornLength(Integer hornLength) { + this.hornLength = hornLength; + } + + public Integer getHornDiameter() { + return hornDiameter; + } + + public void setHornDiameter(Integer hornDiameter) { + this.hornDiameter = hornDiameter; + } + + public Instant getDateOfBirth() { + return dateOfBirth; + } + + public void setDateOfBirth(Instant dateOfBirth) { + this.dateOfBirth = dateOfBirth; + } + + public Unicorn toUnicorn() { + return new Unicorn( + id, + name, + Unicorn.ManeColor.valueOf(maneColor), + hornLength, + hornDiameter, + LocalDate.ofInstant(dateOfBirth, ZoneOffset.UTC)); + } +} diff --git a/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/adapter/driven/db/UnicornRepository.java b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/adapter/driven/db/UnicornRepository.java new file mode 100644 index 0000000..6394c86 --- /dev/null +++ b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/adapter/driven/db/UnicornRepository.java @@ -0,0 +1,12 @@ +package com.agiletestingdays.untangletestcode.unicornservice.adapter.driven.db; + +import java.util.List; +import java.util.UUID; +import org.springframework.data.repository.ListCrudRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface UnicornRepository extends ListCrudRepository { + + List findAll(); +} diff --git a/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/adapter/driven/db/UnicornStoreAdapter.java b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/adapter/driven/db/UnicornStoreAdapter.java new file mode 100644 index 0000000..9dffe04 --- /dev/null +++ b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/adapter/driven/db/UnicornStoreAdapter.java @@ -0,0 +1,33 @@ +package com.agiletestingdays.untangletestcode.unicornservice.adapter.driven.db; + +import com.agiletestingdays.untangletestcode.unicornservice.application.port.out.UnicornStore; +import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import org.springframework.stereotype.Service; + +@Service +public class UnicornStoreAdapter implements UnicornStore { + + UnicornRepository repository; + + public UnicornStoreAdapter(UnicornRepository repository) { + this.repository = repository; + } + + @Override + public Optional findById(UUID id) { + return repository.findById(id).map(UnicornEntity::toUnicorn); + } + + @Override + public List getAll() { + return repository.findAll().stream().map(UnicornEntity::toUnicorn).toList(); + } + + @Override + public Unicorn save(Unicorn unicorn) { + return repository.save(new UnicornEntity(unicorn)).toUnicorn(); + } +} diff --git a/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/UnicornController.java b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/adapter/driving/http/UnicornController.java similarity index 88% rename from src/main/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/UnicornController.java rename to src/main/java/com/agiletestingdays/untangletestcode/unicornservice/adapter/driving/http/UnicornController.java index 18025c7..7595ebd 100644 --- a/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/UnicornController.java +++ b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/adapter/driving/http/UnicornController.java @@ -1,10 +1,12 @@ -package com.agiletestingdays.untangletestcode.unicornservice.unicorn; +package com.agiletestingdays.untangletestcode.unicornservice.adapter.driving.http; import static java.util.Objects.requireNonNull; import static java.util.UUID.randomUUID; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; -import com.agiletestingdays.untangletestcode.unicornservice.unicorn.Unicorn.ManeColor; +import com.agiletestingdays.untangletestcode.unicornservice.application.service.UnicornService; +import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn; +import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn.ManeColor; import jakarta.validation.Validator; import java.util.List; import java.util.UUID; diff --git a/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/UnicornDto.java b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/adapter/driving/http/UnicornDto.java similarity index 83% rename from src/main/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/UnicornDto.java rename to src/main/java/com/agiletestingdays/untangletestcode/unicornservice/adapter/driving/http/UnicornDto.java index cff4752..846ffd5 100644 --- a/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/UnicornDto.java +++ b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/adapter/driving/http/UnicornDto.java @@ -1,5 +1,6 @@ -package com.agiletestingdays.untangletestcode.unicornservice.unicorn; +package com.agiletestingdays.untangletestcode.unicornservice.adapter.driving.http; +import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import jakarta.validation.constraints.Past; diff --git a/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/application/port/in/ReadUnicorn.java b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/application/port/in/ReadUnicorn.java new file mode 100644 index 0000000..ccac1e2 --- /dev/null +++ b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/application/port/in/ReadUnicorn.java @@ -0,0 +1,13 @@ +package com.agiletestingdays.untangletestcode.unicornservice.application.port.in; + +import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface ReadUnicorn { + + List getAll(); + + Optional getById(UUID id); +} diff --git a/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/application/port/in/WriteUnicorn.java b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/application/port/in/WriteUnicorn.java new file mode 100644 index 0000000..5598957 --- /dev/null +++ b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/application/port/in/WriteUnicorn.java @@ -0,0 +1,8 @@ +package com.agiletestingdays.untangletestcode.unicornservice.application.port.in; + +import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn; + +public interface WriteUnicorn { + + void createNewUnicorn(Unicorn unicorn); +} diff --git a/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/application/port/out/UnicornStore.java b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/application/port/out/UnicornStore.java new file mode 100644 index 0000000..7c9887a --- /dev/null +++ b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/application/port/out/UnicornStore.java @@ -0,0 +1,15 @@ +package com.agiletestingdays.untangletestcode.unicornservice.application.port.out; + +import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface UnicornStore { + + Optional findById(UUID id); + + List getAll(); + + Unicorn save(Unicorn unicorn); +} diff --git a/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/application/service/UnicornService.java b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/application/service/UnicornService.java new file mode 100644 index 0000000..9a3c552 --- /dev/null +++ b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/application/service/UnicornService.java @@ -0,0 +1,32 @@ +package com.agiletestingdays.untangletestcode.unicornservice.application.service; + +import com.agiletestingdays.untangletestcode.unicornservice.application.port.in.ReadUnicorn; +import com.agiletestingdays.untangletestcode.unicornservice.application.port.in.WriteUnicorn; +import com.agiletestingdays.untangletestcode.unicornservice.application.port.out.UnicornStore; +import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import org.springframework.stereotype.Service; + +@Service +public class UnicornService implements ReadUnicorn, WriteUnicorn { + + private final UnicornStore store; + + public UnicornService(UnicornStore store) { + this.store = store; + } + + public List getAll() { + return store.getAll(); + } + + public Optional getById(UUID id) { + return store.findById(id); + } + + public void createNewUnicorn(Unicorn newUnicorn) { + store.save(newUnicorn); + } +} diff --git a/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/Unicorn.java b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/domain/Unicorn.java similarity index 89% rename from src/main/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/Unicorn.java rename to src/main/java/com/agiletestingdays/untangletestcode/unicornservice/domain/Unicorn.java index 6be9cce..acc4908 100644 --- a/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/Unicorn.java +++ b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/domain/Unicorn.java @@ -1,4 +1,4 @@ -package com.agiletestingdays.untangletestcode.unicornservice.unicorn; +package com.agiletestingdays.untangletestcode.unicornservice.domain; import java.time.LocalDate; import java.time.Period; diff --git a/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/UnicornRepository.java b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/UnicornRepository.java deleted file mode 100644 index 94e7828..0000000 --- a/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/UnicornRepository.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.agiletestingdays.untangletestcode.unicornservice.unicorn; - -import java.util.Objects; -import java.util.Optional; -import java.util.UUID; -import java.util.stream.Stream; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Repository; - -@Repository -public class UnicornRepository { - - private static final RowMapper unicornRowMapper = - (resultSet, rowNumber) -> - new Unicorn( - UUID.fromString(resultSet.getString("id")), - resultSet.getString("name"), - Unicorn.ManeColor.valueOf(resultSet.getString("mane_color")), - resultSet.getInt("horn_length"), - resultSet.getInt("horn_diameter"), - resultSet.getDate("date_of_birth").toLocalDate()); - - private final JdbcTemplate jdbcTemplate; - - public UnicornRepository(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = Objects.requireNonNull(jdbcTemplate); - } - - Stream streamAll() { - return jdbcTemplate.queryForStream("SELECT * FROM unicorns", unicornRowMapper); - } - - public Optional findById(UUID id) { - try { - final var unicorn = - jdbcTemplate.queryForObject( - "SELECT * FROM unicorns WHERE id = uuid(?)", unicornRowMapper, id.toString()); - return Optional.ofNullable(unicorn); - } catch (EmptyResultDataAccessException e) { - return Optional.empty(); - } - } - - public void save(Unicorn newUnicorn) { - jdbcTemplate.update( - """ - INSERT INTO unicorns(id, name, mane_color, horn_length, horn_diameter, date_of_birth) - VALUES(?, ?, ?, ?, ?, ?); - """, - newUnicorn.id(), - newUnicorn.name(), - newUnicorn.maneColor().name(), - newUnicorn.hornLength(), - newUnicorn.hornDiameter(), - newUnicorn.dateOfBirth()); - } -} diff --git a/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/UnicornService.java b/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/UnicornService.java deleted file mode 100644 index 14996fc..0000000 --- a/src/main/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/UnicornService.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.agiletestingdays.untangletestcode.unicornservice.unicorn; - -import java.util.List; -import java.util.Optional; -import java.util.UUID; -import org.springframework.stereotype.Service; - -@Service -public class UnicornService { - - private final UnicornRepository repository; - - public UnicornService(UnicornRepository repository) { - this.repository = repository; - } - - public List getAll() { - return repository.streamAll().toList(); - } - - public Optional getById(UUID id) { - return repository.findById(id); - } - - public void createNewUnicorn(Unicorn newUnicorn) { - repository.save(newUnicorn); - } -} diff --git a/src/test/java/com/agiletestingdays/untangletestcode/unicornservice/adapter/driven/db/UnicornRepositoryStub.java b/src/test/java/com/agiletestingdays/untangletestcode/unicornservice/adapter/driven/db/UnicornRepositoryStub.java new file mode 100644 index 0000000..0ceabf3 --- /dev/null +++ b/src/test/java/com/agiletestingdays/untangletestcode/unicornservice/adapter/driven/db/UnicornRepositoryStub.java @@ -0,0 +1,7 @@ +package com.agiletestingdays.untangletestcode.unicornservice.adapter.driven.db; + +import java.util.UUID; +import org.stubit.springdata.ListCrudRepositoryStub; + +public class UnicornRepositoryStub extends ListCrudRepositoryStub + implements UnicornRepository {} diff --git a/src/test/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/UnicornControllerTest.java b/src/test/java/com/agiletestingdays/untangletestcode/unicornservice/adapter/driving/http/UnicornControllerTest.java similarity index 92% rename from src/test/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/UnicornControllerTest.java rename to src/test/java/com/agiletestingdays/untangletestcode/unicornservice/adapter/driving/http/UnicornControllerTest.java index 7da1114..2291e4c 100644 --- a/src/test/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/UnicornControllerTest.java +++ b/src/test/java/com/agiletestingdays/untangletestcode/unicornservice/adapter/driving/http/UnicornControllerTest.java @@ -1,4 +1,4 @@ -package com.agiletestingdays.untangletestcode.unicornservice.unicorn; +package com.agiletestingdays.untangletestcode.unicornservice.adapter.driving.http; import static java.util.UUID.randomUUID; import static org.assertj.core.api.Assertions.assertThat; @@ -8,7 +8,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import com.agiletestingdays.untangletestcode.unicornservice.unicorn.Unicorn.ManeColor; +import com.agiletestingdays.untangletestcode.unicornservice.application.service.UnicornService; +import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn; +import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn.ManeColor; import jakarta.validation.Validator; import java.time.LocalDate; import java.util.List; diff --git a/src/test/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/UnicornServiceTest.java b/src/test/java/com/agiletestingdays/untangletestcode/unicornservice/application/service/UnicornServiceTest.java similarity index 59% rename from src/test/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/UnicornServiceTest.java rename to src/test/java/com/agiletestingdays/untangletestcode/unicornservice/application/service/UnicornServiceTest.java index d90fa34..c393c39 100644 --- a/src/test/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/UnicornServiceTest.java +++ b/src/test/java/com/agiletestingdays/untangletestcode/unicornservice/application/service/UnicornServiceTest.java @@ -1,14 +1,19 @@ -package com.agiletestingdays.untangletestcode.unicornservice.unicorn; +package com.agiletestingdays.untangletestcode.unicornservice.application.service; import static java.util.UUID.randomUUID; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import com.agiletestingdays.untangletestcode.unicornservice.unicorn.Unicorn.ManeColor; +import com.agiletestingdays.untangletestcode.unicornservice.adapter.driven.db.UnicornEntity; +import com.agiletestingdays.untangletestcode.unicornservice.adapter.driven.db.UnicornRepository; +import com.agiletestingdays.untangletestcode.unicornservice.adapter.driven.db.UnicornStoreAdapter; +import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn; +import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn.ManeColor; import java.time.LocalDate; import java.util.List; import java.util.Optional; @@ -19,7 +24,7 @@ class UnicornServiceTest { UnicornRepository repository = mock(UnicornRepository.class); - UnicornService unicornService = new UnicornService(repository); + UnicornService unicornService = new UnicornService(new UnicornStoreAdapter(repository)); @Test void getAllCallsRepository() { @@ -27,19 +32,19 @@ void getAllCallsRepository() { List.of( new Unicorn(randomUUID(), "Gilly", ManeColor.RED, 111, 11, LocalDate.of(1911, 11, 11)), new Unicorn(randomUUID(), "Garry", ManeColor.BLUE, 99, 9, LocalDate.of(1912, 12, 12))); - when(repository.streamAll()).thenReturn(unicorns.stream()); + when(repository.findAll()).thenReturn(unicorns.stream().map(UnicornEntity::new).toList()); var returnedUnicorns = unicornService.getAll(); assertThat(returnedUnicorns).containsAll(unicorns); - verify(repository, times(1)).streamAll(); + verify(repository, times(1)).findAll(); } @Test void getByIdCallsRepository() { var gilly = new Unicorn(randomUUID(), "Gilly", ManeColor.RED, 111, 11, LocalDate.of(1911, 11, 11)); - when(repository.findById(any(UUID.class))).thenReturn(Optional.of(gilly)); + when(repository.findById(any(UUID.class))).thenReturn(Optional.of(new UnicornEntity(gilly))); var returnedUnicorn = unicornService.getById(gilly.id()); @@ -51,9 +56,11 @@ void getByIdCallsRepository() { void savingAUnicornWorks() { Unicorn garry = new Unicorn(randomUUID(), "Garry", ManeColor.BLUE, 99, 9, LocalDate.of(1912, 12, 12)); + when(repository.save(any(UnicornEntity.class))) + .thenAnswer(invocation -> invocation.getArgument(0)); unicornService.createNewUnicorn(garry); - verify(repository, times(1)).save(garry); + verify(repository, times(1)).save(argThat(entity -> entity.toUnicorn().equals(garry))); } } diff --git a/src/test/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/UnicornTest.java b/src/test/java/com/agiletestingdays/untangletestcode/unicornservice/domain/UnicornTest.java similarity index 88% rename from src/test/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/UnicornTest.java rename to src/test/java/com/agiletestingdays/untangletestcode/unicornservice/domain/UnicornTest.java index 94594ec..33a6977 100644 --- a/src/test/java/com/agiletestingdays/untangletestcode/unicornservice/unicorn/UnicornTest.java +++ b/src/test/java/com/agiletestingdays/untangletestcode/unicornservice/domain/UnicornTest.java @@ -1,9 +1,9 @@ -package com.agiletestingdays.untangletestcode.unicornservice.unicorn; +package com.agiletestingdays.untangletestcode.unicornservice.domain; import static java.util.UUID.randomUUID; import static org.assertj.core.api.Assertions.assertThat; -import com.agiletestingdays.untangletestcode.unicornservice.unicorn.Unicorn.ManeColor; +import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn.ManeColor; import java.time.LocalDate; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/agiletestingdays/untangletestcode/unicornservice/test/TestDataManager.java b/src/test/java/com/agiletestingdays/untangletestcode/unicornservice/test/TestDataManager.java index 43b7f9e..28b449a 100644 --- a/src/test/java/com/agiletestingdays/untangletestcode/unicornservice/test/TestDataManager.java +++ b/src/test/java/com/agiletestingdays/untangletestcode/unicornservice/test/TestDataManager.java @@ -1,52 +1,27 @@ package com.agiletestingdays.untangletestcode.unicornservice.test; -import com.agiletestingdays.untangletestcode.unicornservice.unicorn.Unicorn; -import javax.sql.DataSource; -import org.springframework.jdbc.core.JdbcTemplate; +import com.agiletestingdays.untangletestcode.unicornservice.adapter.driven.db.UnicornEntity; +import com.agiletestingdays.untangletestcode.unicornservice.adapter.driven.db.UnicornRepository; +import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @Component public class TestDataManager { - private final JdbcTemplate jdbcTemplate; + private final UnicornRepository repository; - public TestDataManager(DataSource daraSource) { - jdbcTemplate = new JdbcTemplate(daraSource); + public TestDataManager(@Qualifier("unicornRepository") UnicornRepository repository) { + this.repository = repository; } public TestDataManager withUnicorn(Unicorn unicorn) { - jdbcTemplate.update( - """ - INSERT - INTO - unicorns( - id, - name, - mane_color, - horn_length, - horn_diameter, - date_of_birth - ) - VALUES( - ?, - ?, - ?, - ?, - ?, - ? - ); - """, - unicorn.id(), - unicorn.name(), - unicorn.maneColor().name(), - unicorn.hornLength(), - unicorn.hornDiameter(), - unicorn.dateOfBirth()); + repository.save(new UnicornEntity(unicorn)); return this; } public TestDataManager clear() { - jdbcTemplate.execute("TRUNCATE TABLE unicorns;"); + repository.deleteAll(); return this; } } diff --git a/src/test/java/com/agiletestingdays/untangletestcode/unicornservice/test/UnicornTestDataBuilder.java b/src/test/java/com/agiletestingdays/untangletestcode/unicornservice/test/UnicornTestDataBuilder.java index 1208842..59d212a 100644 --- a/src/test/java/com/agiletestingdays/untangletestcode/unicornservice/test/UnicornTestDataBuilder.java +++ b/src/test/java/com/agiletestingdays/untangletestcode/unicornservice/test/UnicornTestDataBuilder.java @@ -3,8 +3,10 @@ import static java.util.UUID.randomUUID; import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; -import com.agiletestingdays.untangletestcode.unicornservice.unicorn.Unicorn; -import com.agiletestingdays.untangletestcode.unicornservice.unicorn.Unicorn.ManeColor; +import com.agiletestingdays.untangletestcode.unicornservice.adapter.driven.db.UnicornEntity; +import com.agiletestingdays.untangletestcode.unicornservice.adapter.driving.http.UnicornDto; +import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn; +import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn.ManeColor; import java.security.SecureRandom; import java.time.LocalDate; import java.util.UUID; @@ -78,6 +80,14 @@ public Unicorn build() { return new Unicorn(id, name, maneColor, hornLength, hornDiameter, dateOfBirth); } + public UnicornDto buildDto() { + return new UnicornDto(build()); + } + + public UnicornEntity buildEntity() { + return new UnicornEntity(build()); + } + public String buildJson() { return """ {