Skip to content

Commit

Permalink
displayOrder 삭제, expiredAt 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
k-kbk committed Nov 4, 2023
1 parent c96d728 commit 8416a18
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 32 deletions.
25 changes: 13 additions & 12 deletions src/main/kotlin/com/mjucow/eatda/domain/banner/entity/Banner.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand All @@ -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)
}
Expand All @@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/db/changelog/231016-banner.sql
Original file line number Diff line number Diff line change
Expand Up @@ -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
);
70 changes: 51 additions & 19 deletions src/test/kotlin/com/mjucow/eatda/domain/banner/entity/BannerTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,20 @@ 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("링크 주소가 빈 값일 경우 예외를 던진다")
@ParameterizedTest
@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)
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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"
}
}

0 comments on commit 8416a18

Please sign in to comment.