Skip to content

Commit

Permalink
Merge pull request #83 from le2sky/develop
Browse files Browse the repository at this point in the history
[배포] v0.5.1(PR#81,PR#82)
  • Loading branch information
le2sky committed Oct 4, 2023
2 parents 96d994d + 7204ea2 commit fe3e6e2
Show file tree
Hide file tree
Showing 43 changed files with 898 additions and 52 deletions.
8 changes: 6 additions & 2 deletions .github/workflows/mealkitary-main-develop-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@ jobs:
./mealkitary-infrastructure/adapter-persistence-spring-data-jpa/build/test-results/**/*.xml
./mealkitary-infrastructure/adapter-paymentgateway-tosspayments/build/test-results/**/*.xml
./mealkitary-infrastructure/adapter-firebase-notification/build/test-results/**/*.xml
./mealkitary-infrastructure/business-registration-number-validator/adapter-simple-brn-validator/build/test-results/**/*.xml
./mealkitary-infrastructure/adapter-business-registration-number-validator/simple-brn-validator/build/test-results/**/*.xml
./mealkitary-infrastructure/adapter-business-registration-number-validator/open-api-brn-validator/build/test-results/**/*.xml
./mealkitary-infrastructure/adapter-address-resolver/build/test-results/**/*.xml
- name: Jacoco Coverage 리포트 전솑
uses: codecov/codecov-action@v3
Expand All @@ -67,7 +69,9 @@ jobs:
./mealkitary-infrastructure/adapter-persistence-spring-data-jpa/build/reports/jacoco/test/jacocoTestReport.xml,
./mealkitary-infrastructure/adapter-paymentgateway-tosspayments/build/reports/jacoco/test/jacocoTestReport.xml,
./mealkitary-infrastructure/adapter-firebase-notification/build/reports/jacoco/test/jacocoTestReport.xml,
./mealkitary-infrastructure/business-registration-number-validator/adapter-simple-brn-validator/build/reports/jacoco/test/jacocoTestReport.xml
./mealkitary-infrastructure/adapter-business-registration-number-validator/simple-brn-validator/build/reports/jacoco/test/jacocoTestReport.xml,
./mealkitary-infrastructure/adapter-business-registration-number-validator/open-api-brn-validator/build/reports/jacoco/test/jacocoTestReport.xml,
./mealkitary-infrastructure/adapter-address-resolver/build/reports/jacoco/test/jacocoTestReport.xml
name: mealkitary-codecov
verbose: true

Expand Down
8 changes: 6 additions & 2 deletions .github/workflows/mealkitary-test-coverage-automation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,9 @@ jobs:
./mealkitary-infrastructure/adapter-persistence-spring-data-jpa/build/test-results/**/*.xml
./mealkitary-infrastructure/adapter-paymentgateway-tosspayments/build/test-results/**/*.xml
./mealkitary-infrastructure/adapter-firebase-notification/build/test-results/**/*.xml
./mealkitary-infrastructure/business-registration-number-validator/adapter-simple-brn-validator/build/test-results/**/*.xml
./mealkitary-infrastructure/adapter-business-registration-number-validator/simple-brn-validator/build/test-results/**/*.xml
./mealkitary-infrastructure/adapter-business-registration-number-validator/open-api-brn-validator/build/test-results/**/*.xml
./mealkitary-infrastructure/adapter-address-resolver/build/test-results/**/*.xml
- name: Jacoco Coverage 리포트 전솑
uses: codecov/codecov-action@v3
Expand All @@ -55,6 +57,8 @@ jobs:
./mealkitary-infrastructure/adapter-persistence-spring-data-jpa/build/reports/jacoco/test/jacocoTestReport.xml,
./mealkitary-infrastructure/adapter-paymentgateway-tosspayments/build/reports/jacoco/test/jacocoTestReport.xml,
./mealkitary-infrastructure/adapter-firebase-notification/build/reports/jacoco/test/jacocoTestReport.xml,
./mealkitary-infrastructure/business-registration-number-validator/adapter-simple-brn-validator/build/reports/jacoco/test/jacocoTestReport.xml
./mealkitary-infrastructure/adapter-business-registration-number-validator/simple-brn-validator/build/reports/jacoco/test/jacocoTestReport.xml,
./mealkitary-infrastructure/adapter-business-registration-number-validator/open-api-brn-validator/build/reports/jacoco/test/jacocoTestReport.xml,
./mealkitary-infrastructure/adapter-address-resolver/build/reports/jacoco/test/jacocoTestReport.xml
name: mealkitary-codecov
verbose: true
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ ktlintVersion=11.0.0
springBootVersion=2.7.11
springDependencyManagementVersion=1.0.15.RELEASE
# project
applicationVersion=0.5.0
applicationVersion=0.5.1
projectGroup=com.mealkitary
# test
kotestVersion=4.4.3
Expand Down
7 changes: 5 additions & 2 deletions mealkitary-api/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ val snippetsDir by extra { file("build/generated-snippets") }
val asciidoctorExt: Configuration by configurations.creating

bootJar.enabled = true
bootJar.duplicatesStrategy = DuplicatesStrategy.EXCLUDE
jar.enabled = false

plugins {
Expand All @@ -21,14 +22,16 @@ dependencies {
implementation(project(":mealkitary-infrastructure:adapter-persistence-spring-data-jpa"))
implementation(project(":mealkitary-infrastructure:adapter-paymentgateway-tosspayments"))
implementation(project(":mealkitary-infrastructure:adapter-firebase-notification"))
implementation(project(":mealkitary-infrastructure:adapter-configuration"))
implementation(project(":mealkitary-infrastructure:adapter-address-resolver"))
implementation(
project(
":mealkitary-infrastructure:business-registration-number-validator:adapter-open-api-brn-validator",
":mealkitary-infrastructure:adapter-business-registration-number-validator:open-api-brn-validator",
)
)
implementation(
project(
":mealkitary-infrastructure:business-registration-number-validator:adapter-simple-brn-validator",
":mealkitary-infrastructure:adapter-business-registration-number-validator:simple-brn-validator",
)
)
testImplementation("org.springframework.restdocs:spring-restdocs-mockmvc")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,11 @@ data class RegisterShopWebRequest(
val title: String? = null,

@field:NotBlank(message = "μ‚¬μ—…μž λ²ˆν˜ΈλŠ” ν•„μˆ˜μž…λ‹ˆλ‹€.")
val brn: String? = null
val brn: String? = null,

@field:NotBlank(message = "μ£Όμ†ŒλŠ” ν•„μˆ˜μž…λ‹ˆλ‹€.")
val address: String? = null
) {

fun mapToServiceRequest() = RegisterShopRequest(title!!, brn!!)
fun mapToServiceRequest() = RegisterShopRequest(title!!, brn!!, address!!)
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class RegisterShopControllerDocsTest : RestDocsSupport() {
fun `api docs test - registerShop`() {
every { registerShopUseCase.register(any()) } answers { 1L }

val registerShopWebRequest = RegisterShopWebRequest("집λ°₯λšλ”± μ•ˆμ–‘μ ", "123-23-12345")
val registerShopWebRequest = RegisterShopWebRequest("집λ°₯λšλ”± μ•ˆμ–‘μ ", "123-23-12345", "경기도 μ•ˆμ–‘μ‹œ λ™μ•ˆκ΅¬ 벌말둜")

mvc.perform(
RestDocumentationRequestBuilders.post("/shops")
Expand All @@ -45,6 +45,7 @@ class RegisterShopControllerDocsTest : RestDocsSupport() {
requestFields(
fieldWithPath("title").type(JsonFieldType.STRING).description("등둝 λŒ€μƒ κ°€κ²Œ 이름"),
fieldWithPath("brn").type(JsonFieldType.STRING).description("μ‚¬μ—…μž 번호"),
fieldWithPath("address").type(JsonFieldType.STRING).description("κ°€κ²Œ λ„λ‘œλͺ… μ£Όμ†Œ"),
),
responseHeaders(headerWithName("Location").description("μƒμ„±λœ κ°€κ²Œ λ¦¬μ†ŒμŠ€ URI")),
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class RegisterShopControllerTest : WebIntegrationTestSupport() {
fun `api integration test - registerShop`() {
every { registerShopUseCase.register(any()) } answers { 1L }

val registerShopWebRequest = RegisterShopWebRequest("집λ°₯λšλ”± μ•ˆμ–‘μ ", "123-23-12345")
val registerShopWebRequest = RegisterShopWebRequest("집λ°₯λšλ”± μ•ˆμ–‘μ ", "123-23-12345", "경기도 μ•ˆμ–‘μ‹œ λ™μ•ˆκ΅¬ 벌말둜 40")

mvc.perform(
MockMvcRequestBuilders.post("/shops")
Expand All @@ -28,7 +28,7 @@ class RegisterShopControllerTest : WebIntegrationTestSupport() {

@Test
fun `api integration test - κ°€κ²Œ 이름이 λˆ„λ½λœ 경우 400 μ—λŸ¬λ₯Ό λ°œμƒν•œλ‹€`() {
val registerShopWebRequest = RegisterShopWebRequest(brn = "123-23-12345")
val registerShopWebRequest = RegisterShopWebRequest(brn = "123-23-12345", address = "경기도 μ•ˆμ–‘μ‹œ λ™μ•ˆκ΅¬ 벌말둜 40")

mvc.perform(
MockMvcRequestBuilders.post("/shops")
Expand All @@ -44,7 +44,7 @@ class RegisterShopControllerTest : WebIntegrationTestSupport() {

@Test
fun `api integration test - μ‚¬μ—…μž λ²ˆν˜Έκ°€ λˆ„λ½λœ 경우 400 μ—λŸ¬λ₯Ό λ°œμƒν•œλ‹€`() {
val registerShopWebRequest = RegisterShopWebRequest(title = "집λ°₯λšλ”± μ•ˆμ–‘μ ")
val registerShopWebRequest = RegisterShopWebRequest(title = "집λ°₯λšλ”± μ•ˆμ–‘μ ", address = "경기도 μ•ˆμ–‘μ‹œ λ™μ•ˆκ΅¬ 벌말둜 40")

mvc.perform(
MockMvcRequestBuilders.post("/shops")
Expand All @@ -58,6 +58,22 @@ class RegisterShopControllerTest : WebIntegrationTestSupport() {
.andExpect(jsonPath("$..errors[0].reason").value("μ‚¬μ—…μž λ²ˆν˜ΈλŠ” ν•„μˆ˜μž…λ‹ˆλ‹€."))
}

@Test
fun `api integration test - μ£Όμ†Œκ°€ λˆ„λ½λœ 경우 400 μ—λŸ¬λ₯Ό λ°œμƒν•œλ‹€`() {
val registerShopWebRequest = RegisterShopWebRequest(title = "집λ°₯λšλ”± μ•ˆμ–‘μ ", brn = "123-23-12345")

mvc.perform(
MockMvcRequestBuilders.post("/shops")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(registerShopWebRequest))
)
.andExpect(status().isBadRequest)
.andExpect(jsonPath("$.status").value("400"))
.andExpect(jsonPath("$.message").value("잘λͺ»λœ μž…λ ₯κ°’μž…λ‹ˆλ‹€."))
.andExpect(jsonPath("$..errors[0].field").value("address"))
.andExpect(jsonPath("$..errors[0].reason").value("μ£Όμ†ŒλŠ” ν•„μˆ˜μž…λ‹ˆλ‹€."))
}

@Test
fun `api integration test - JSON ν˜•μ‹μ΄ μ•„λ‹Œ 경우 400 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€`() {
mvc.perform(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@ package com.mealkitary.shop.application.port.input

data class RegisterShopRequest(
val title: String,
val brn: String
val brn: String,
val address: String
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,23 @@ package com.mealkitary.shop.application.service
import com.mealkitary.shop.application.port.input.RegisterShopRequest
import com.mealkitary.shop.application.port.input.RegisterShopUseCase
import com.mealkitary.shop.application.port.output.SaveShopPort
import com.mealkitary.shop.domain.shop.factory.ShopBusinessNumberValidator
import com.mealkitary.shop.domain.shop.factory.ShopFactory
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional

@Service
@Transactional(readOnly = true)
@Transactional
class RegisterShopService(
private val saveShopPort: SaveShopPort,
shopBusinessNumberValidator: ShopBusinessNumberValidator
private val shopFactory: ShopFactory
) : RegisterShopUseCase {

private val shopFactory = ShopFactory(shopBusinessNumberValidator)

@Transactional
override fun register(registerShopRequest: RegisterShopRequest): Long {
val shop = shopFactory.createOne(registerShopRequest.title, registerShopRequest.brn)
val shop = shopFactory.createOne(
registerShopRequest.title,
registerShopRequest.brn,
registerShopRequest.address
)

return saveShopPort.saveOne(shop)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package com.mealkitary.shop.application.service

import com.mealkitary.common.model.Address
import com.mealkitary.common.model.Coordinates
import com.mealkitary.shop.application.port.input.ShopResponse
import com.mealkitary.shop.application.port.output.LoadShopPort
import com.mealkitary.shop.domain.shop.Shop
import com.mealkitary.shop.domain.shop.ShopBusinessNumber
import com.mealkitary.shop.domain.shop.ShopStatus
import com.mealkitary.shop.domain.shop.ShopTitle
import com.mealkitary.shop.domain.shop.address.ShopAddress
import io.kotest.core.spec.style.AnnotationSpec
import io.kotest.matchers.shouldBe
import io.mockk.every
Expand All @@ -24,6 +27,19 @@ class GetShopServiceTest : AnnotationSpec() {
ShopTitle.from("집λ°₯λšλ”±"),
ShopStatus.VALID,
ShopBusinessNumber.from("123-45-67890"),
ShopAddress.of(
"1234567890",
Coordinates.of(
126.99599512792346,
35.976749396987046
),
Address.of(
"region1DepthName",
"region2DepthName",
"region3DepthName",
"roadName"
)
),
mutableListOf(),
mutableListOf()
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
package com.mealkitary.shop.application.service

import com.mealkitary.common.model.Address
import com.mealkitary.common.model.Coordinates
import com.mealkitary.shop.application.port.input.RegisterShopRequest
import com.mealkitary.shop.application.port.output.SaveShopPort
import com.mealkitary.shop.domain.product.Product
import com.mealkitary.shop.domain.shop.Shop
import com.mealkitary.shop.domain.shop.ShopBusinessNumber
import com.mealkitary.shop.domain.shop.ShopStatus
import com.mealkitary.shop.domain.shop.ShopTitle
import com.mealkitary.shop.domain.shop.address.ShopAddress
import com.mealkitary.shop.domain.shop.factory.AddressResolver
import com.mealkitary.shop.domain.shop.factory.ShopBusinessNumberValidator
import com.mealkitary.shop.domain.shop.factory.ShopFactory
import io.kotest.assertions.throwables.shouldThrow
import io.kotest.core.spec.style.AnnotationSpec
import io.kotest.matchers.collections.shouldBeEmpty
Expand All @@ -12,35 +21,60 @@ import io.kotest.matchers.throwable.shouldHaveMessage
import io.mockk.every
import io.mockk.mockk
import io.mockk.slot
import java.time.LocalTime

class RegisterShopServiceTest : AnnotationSpec() {

private val saveShopPort = mockk<SaveShopPort>()
private val shopFactory = mockk<ShopFactory>()
private val shopBusinessNumberValidator = mockk<ShopBusinessNumberValidator>()
private val registerShopService = RegisterShopService(saveShopPort, shopBusinessNumberValidator)
private val addressResolver = mockk<AddressResolver>()
private val registerShopService = RegisterShopService(saveShopPort, shopFactory)

@Test
fun `service unit test - μ‹ κ·œ κ°€κ²Œλ₯Ό λ“±λ‘ν•œλ‹€`() {
val shopSlot = slot<Shop>()
val request = RegisterShopRequest("집λ°₯λšλ”± μ•ˆμ–‘μ ", "123-23-12345")
val request = RegisterShopRequest("집λ°₯λšλ”± μ•ˆμ–‘μ ", "123-23-12345", "경기도 μ•ˆμ–‘μ‹œ λ™μ•ˆκ΅¬ 벌말둜 40")
val expectedShopAddress =
ShopAddress.of("1234567890", Coordinates.of(0.0, 0.0), Address.of("경기도", "μ•ˆμ–‘μ‹œ λ™μ•ˆκ΅¬", "벌말둜", "40"))

val mockedShop = Shop(
ShopTitle.from(request.title),
ShopStatus.VALID,
ShopBusinessNumber.from(request.brn),
expectedShopAddress,
emptyList<LocalTime>().toMutableList(),
emptyList<Product>().toMutableList()
)

every {
shopFactory.createOne(request.title, request.brn, request.address)
} returns mockedShop
every { saveShopPort.saveOne(capture(shopSlot)) } answers { 1L }
every { shopBusinessNumberValidator.validate(any()) } answers {}

val result = registerShopService.register(request)

val capturedShop = shopSlot.captured
result shouldBe 1L
capturedShop.businessNumber.value shouldBe "123-23-12345"
capturedShop.title.value shouldBe "집λ°₯λšλ”± μ•ˆμ–‘μ "
capturedShop.address shouldBe expectedShopAddress
capturedShop.products.shouldBeEmpty()
capturedShop.reservableTimes.shouldBeEmpty()
}

@Test
fun `service unit test - κ°€κ²Œ 이름 ν˜•μ‹μ— λ§žμ§€ μ•ŠμœΌλ©΄ μ˜ˆμ™Έλ₯Ό λ°œμƒν•œλ‹€`() {
val request = RegisterShopRequest("invalid!#@", "123-23-12345")
val request = RegisterShopRequest("invalid!#@", "123-23-12345", "경기도 μ•ˆμ–‘μ‹œ λ™μ•ˆκ΅¬ 벌말둜 40")
val expectedShopAddress =
ShopAddress.of("1234567890", Coordinates.of(0.0, 0.0), Address.of("경기도", "μ•ˆμ–‘μ‹œ λ™μ•ˆκ΅¬", "벌말둜", "40"))

every {
shopFactory.createOne(any(), any(), any())
} throws IllegalArgumentException("μ˜¬λ°”λ₯Έ κ°€κ²Œ 이름 ν˜•μ‹μ΄ μ•„λ‹™λ‹ˆλ‹€.(ν•œκΈ€, 영문, 곡백, 숫자만 포함 κ°€λŠ₯)")
every { saveShopPort.saveOne(any()) } answers { 1L }
every { shopBusinessNumberValidator.validate(any()) } answers {}
every { addressResolver.resolveAddress("경기도 μ•ˆμ–‘μ‹œ λ™μ•ˆκ΅¬ 벌말둜 40") } returns expectedShopAddress

shouldThrow<IllegalArgumentException> {
registerShopService.register(request)
Expand All @@ -49,7 +83,11 @@ class RegisterShopServiceTest : AnnotationSpec() {

@Test
fun `service unit test - μ‚¬μ—…μž 번호 ν˜•μ‹μ— λ§žμ§€ μ•ŠμœΌλ©΄ μ˜ˆμ™Έλ₯Ό λ°œμƒν•œλ‹€`() {
val request = RegisterShopRequest("집λ°₯λšλ”± μ•ˆμ–‘μ ", "invalid-brn")
val request = RegisterShopRequest("집λ°₯λšλ”± μ•ˆμ–‘μ ", "invalid-brn", "경기도 μ•ˆμ–‘μ‹œ λ™μ•ˆκ΅¬ 벌말둜 40")

every {
shopFactory.createOne(any(), any(), any())
} throws IllegalArgumentException("μ˜¬λ°”λ₯Έ μ‚¬μ—…μžλ²ˆν˜Έ ν˜•μ‹μ΄ μ•„λ‹™λ‹ˆλ‹€.")
every { saveShopPort.saveOne(any()) } answers { 1L }
every { shopBusinessNumberValidator.validate(any()) } answers {}

Expand Down
Loading

0 comments on commit fe3e6e2

Please sign in to comment.