diff --git a/src/main/kotlin/com/mjucow/eatda/domain/banner/entity/Banner.kt b/src/main/kotlin/com/mjucow/eatda/domain/banner/entity/Banner.kt index be3750a..8d9e80d 100644 --- a/src/main/kotlin/com/mjucow/eatda/domain/banner/entity/Banner.kt +++ b/src/main/kotlin/com/mjucow/eatda/domain/banner/entity/Banner.kt @@ -5,38 +5,39 @@ import jakarta.persistence.Column import jakarta.persistence.Entity import jakarta.persistence.Table import java.net.URL +import java.time.Instant @Entity @Table(name = "banner") class Banner() : BaseEntity() { constructor( - displayOrder: Int, link: String, imageAddress: String, + expiredAt: Instant, ) : this() { - this.displayOrder = displayOrder this.link = link this.imageAddress = imageAddress + this.expiredAt = expiredAt } @Column(nullable = false) - var displayOrder: Int = 0 + var link: String = "" set(value) { - validateDisplayOrder(value) + validateLink(value) field = value } @Column(nullable = false) - var link: String = "" + var imageAddress: String = "" set(value) { - validateLink(value) + validateImageAddress(value) field = value } @Column(nullable = false) - var imageAddress: String = "" + var expiredAt: Instant = Instant.MIN set(value) { - validateImageAddress(value) + validateExpiredAt(value) field = value } @@ -46,10 +47,6 @@ class Banner() : BaseEntity() { }.isSuccess } - private fun validateDisplayOrder(displayOrder: Int) { - // - } - private fun validateLink(link: String) { require(link.isNotBlank() && isValidUrl(link) && link.length <= MAX_LINK_LENGTH) } @@ -58,6 +55,10 @@ class Banner() : BaseEntity() { require(imageAddress.isNotBlank() && imageAddress.length <= MAX_IMAGE_ADDRESS_LENGTH) } + private fun validateExpiredAt(expiredAt: Instant) { + require(expiredAt.isAfter(Instant.now()) && expiredAt.isBefore(Instant.MAX)) + } + companion object { const val MAX_LINK_LENGTH = 255 const val MAX_IMAGE_ADDRESS_LENGTH = 255 diff --git a/src/main/resources/db/changelog/231016-banner.sql b/src/main/resources/db/changelog/231016-banner.sql index fadf583..3e8a6bf 100644 --- a/src/main/resources/db/changelog/231016-banner.sql +++ b/src/main/resources/db/changelog/231016-banner.sql @@ -4,9 +4,9 @@ CREATE TABLE banner ( id bigserial NOT NULL PRIMARY KEY, - display_order integer NOT NULL, link varchar(255) NOT NULL, image_address varchar(255) NOT NULL, + expired_at timestamp NOT NULL, created_at timestamp NOT NULL DEFAULT NOW(), updated_at timestamp NOT NULL ); \ No newline at end of file diff --git a/src/test/kotlin/com/mjucow/eatda/domain/banner/entity/BannerTest.kt b/src/test/kotlin/com/mjucow/eatda/domain/banner/entity/BannerTest.kt index 769eec1..8366107 100644 --- a/src/test/kotlin/com/mjucow/eatda/domain/banner/entity/BannerTest.kt +++ b/src/test/kotlin/com/mjucow/eatda/domain/banner/entity/BannerTest.kt @@ -6,6 +6,8 @@ import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.EmptySource +import java.time.Instant +import java.time.temporal.ChronoUnit class BannerTest { @DisplayName("링크 주소가 빈 값일 경우 예외를 던진다") @@ -13,11 +15,11 @@ class BannerTest { @EmptySource fun task1(link: String) { // given - val displayOrder = 0 val imageAddress = "imageAddress" + val expiredAt = Instant.now().plus(1, ChronoUnit.DAYS) // when - val throwable = Assertions.catchThrowable { Banner(displayOrder, link, imageAddress) } + val throwable = Assertions.catchThrowable { Banner(link, imageAddress, expiredAt) } // then assertThat(throwable).isInstanceOf(RuntimeException::class.java) @@ -27,12 +29,12 @@ class BannerTest { @Test fun task2() { // given - val displayOrder = 0 val link = "link" val imageAddress = "imageAddress" + val expiredAt = Instant.now().plus(1, ChronoUnit.DAYS) // when - val throwable = Assertions.catchThrowable { Banner(displayOrder, link, imageAddress) } + val throwable = Assertions.catchThrowable { Banner(link, imageAddress, expiredAt) } // then assertThat(throwable).isInstanceOf(RuntimeException::class.java) @@ -42,12 +44,12 @@ class BannerTest { @Test fun task3() { // given - val displayOrder = 0 val link = "x".repeat(Banner.MAX_LINK_LENGTH + 1) val imageAddress = "imageAddress" + val expiredAt = Instant.now().plus(1, ChronoUnit.DAYS) // when - val throwable = Assertions.catchThrowable { Banner(displayOrder, link, imageAddress) } + val throwable = Assertions.catchThrowable { Banner(link, imageAddress, expiredAt) } // then assertThat(throwable).isInstanceOf(RuntimeException::class.java) @@ -58,11 +60,10 @@ class BannerTest { @EmptySource fun task4(imageAddress: String) { // given - val displayOrder = 0 - val link = "https://career.programmers.co.kr/competitions/3353" + val expiredAt = Instant.now().plus(1, ChronoUnit.DAYS) // when - val throwable = Assertions.catchThrowable { Banner(displayOrder, link, imageAddress) } + val throwable = Assertions.catchThrowable { Banner(NORMAL_LINK, imageAddress, expiredAt) } // then assertThat(throwable).isInstanceOf(RuntimeException::class.java) @@ -72,33 +73,64 @@ class BannerTest { @Test fun task5() { // given - val displayOrder = 0 - val link = "link" val imageAddress = "x".repeat(Banner.MAX_IMAGE_ADDRESS_LENGTH + 1) + val expiredAt = Instant.now().plus(1, ChronoUnit.DAYS) // when - val throwable = Assertions.catchThrowable { Banner(displayOrder, link, imageAddress) } + val throwable = Assertions.catchThrowable { Banner(NORMAL_LINK, imageAddress, expiredAt) } // then assertThat(throwable).isInstanceOf(RuntimeException::class.java) } - @DisplayName("정상적인 값일 경우 객체가 생성된다") + @DisplayName("설정한 유효기간이 현재 시간보다 빠를 경우 예외를 던진다") @Test fun task6() { // given - val displayOrder = 0 - val link = "https://career.programmers.co.kr/competitions/3353" val imageAddress = "imageAddress" + val expiredAt = Instant.now().minus(1, ChronoUnit.DAYS) + + // when + val throwable = Assertions.catchThrowable { Banner(NORMAL_LINK, imageAddress, expiredAt) } + + // then + assertThat(throwable).isInstanceOf(RuntimeException::class.java) + } + + @DisplayName("설정한 유효기간이 최대 값보다 클 경우 예외를 던진다") + @Test + fun task7() { + // given + val imageAddress = "imageAddress" + val expiredAt = Instant.MAX + + // when + val throwable = Assertions.catchThrowable { Banner(NORMAL_LINK, imageAddress, expiredAt) } + + // then + assertThat(throwable).isInstanceOf(RuntimeException::class.java) + } + + + @DisplayName("정상적인 값일 경우 객체가 생성된다") + @Test + fun task8() { + // given + val imageAddress = "imageAddress" + val expiredAt = Instant.now().plus(1, ChronoUnit.DAYS) // when val banner = Banner( - displayOrder, - link, - imageAddress + NORMAL_LINK, + imageAddress, + expiredAt ) // then assertThat(banner).isNotNull() } -} + + companion object { + const val NORMAL_LINK = "https://career.programmers.co.kr/competitions/3353" + } +} \ No newline at end of file