Skip to content

Commit

Permalink
KP削除処理のコントローラの実装とUTを対応
Browse files Browse the repository at this point in the history
  • Loading branch information
rami2076 committed Oct 5, 2023
1 parent 535c7f8 commit d559d8c
Show file tree
Hide file tree
Showing 6 changed files with 121 additions and 7 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.example.kotlinonspringboot.domain.usecase

import com.example.kotlinonspringboot.domain.model.condition.DeleteCondition

interface EmployeeDeleteUseCase {

/**
* 削除ユースケース
* @param deleteCondition 削除条件
* @return true,削除した場合。false,削除対象がなかった場合。
*/
fun delete(deleteCondition: DeleteCondition): Boolean
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.example.kotlinonspringboot.presentation.controller

import com.example.kotlinonspringboot.domain.model.EmployeeNumber
import com.example.kotlinonspringboot.domain.model.condition.DeleteCondition
import com.example.kotlinonspringboot.domain.usecase.EmployeeDeleteUseCase
import com.example.kotlinonspringboot.presentation.api.EmployeeUpdateApi
import com.example.kotlinonspringboot.presentation.model.EmployeeRegisterRequest
import com.example.kotlinonspringboot.presentation.model.EmployeeUpdateRequest
Expand All @@ -9,13 +12,19 @@ import org.springframework.web.bind.annotation.RestController
import java.math.BigDecimal

@RestController
class EmployeeUpdateController : EmployeeUpdateApi {
class EmployeeUpdateController(
private val employeeDeleteUseCase: EmployeeDeleteUseCase
) : EmployeeUpdateApi {

override fun register(employeeRegisterRequest: EmployeeRegisterRequest): ResponseEntity<Unit> {
return ResponseEntity.status(HttpStatus.CREATED).build()
}

override fun delete(employeeNumber: BigDecimal): ResponseEntity<Unit> {
val deleteCondition = DeleteCondition(EmployeeNumber(employeeNumber.toLong()))

employeeDeleteUseCase.delete(deleteCondition)

return ResponseEntity.noContent().build()
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.example.kotlinonspringboot.usecase

import com.example.kotlinonspringboot.domain.model.condition.DeleteCondition
import com.example.kotlinonspringboot.domain.usecase.EmployeeDeleteUseCase
import org.springframework.stereotype.Service

@Service
class EmployeeDeleteUseCaseImpl : EmployeeDeleteUseCase {

override fun delete(deleteCondition: DeleteCondition): Boolean {
return true
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package com.example.kotlinonspringboot.presentation.controller

import com.example.kotlinonspringboot.domain.model.EmployeeServiceException
import com.example.kotlinonspringboot.domain.usecase.EmployeeDeleteUseCase
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.CsvSource
import org.mockito.kotlin.any
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.doThrow
import org.mockito.kotlin.whenever
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.mock.mockito.MockBean
import org.springframework.test.web.reactive.server.WebTestClient

/**
* メソッドが多いのでテストクラスを分割している
*/
@SpringBootTest
@AutoConfigureMockMvc
@DisplayName("社員削除コントローラのテスト")
class DeleteInEmployeeUpdateControllerTest {

@MockBean
private lateinit var employeeDeleteUseCase: EmployeeDeleteUseCase

@Nested
@DisplayName("PK社員削除")
inner class Delete {

@ParameterizedTest(name = "削除対象:{1}の場合、例外が発生しない場合は204を返却する")
@CsvSource(
delimiter = '|',
textBlock =
// 削除対象の有無
"""
true |削除あり
false |削除対象なし"""
)
@DisplayName("削除時に例外が出ない場合、204を返却すること")
fun test1(isDelete: Boolean, description: String, @Autowired webClient: WebTestClient) {
// 準備
// 社員削除ユースケースからの返却を定義
whenever(employeeDeleteUseCase.delete(any())).doReturn(isDelete)

// 実行 & 検証
webClient
.delete().uri("/api/v1/employee/1")
.exchange()
.expectStatus().isNoContent
}

@Test
@DisplayName("社員データソース例外が発生した場合、ステータス500をが返却すること")
fun test2(@Autowired webClient: WebTestClient) {
// 準備
// 社員削除ユースケースからの返却を定義
val runtimeException = RuntimeException("something error message")
val exception = EmployeeServiceException.EmployeeDataSourceException(runtimeException)
whenever(employeeDeleteUseCase.delete(any())).doThrow(exception)

// 実行 & 検証
webClient
.delete().uri("/api/v1/employee/1")
.exchange()
.expectStatus().is5xxServerError
.expectStatus().isEqualTo(500)
.expectBody().json(
"""
{
"message": "databaseで予期しない例外が発生しました"
}"""
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -133,11 +133,9 @@ class EmployeeSearchControllerTest {
fun test4(@Autowired webClient: WebTestClient) {
// 準備
// 社員検索ユースケースからの返却を定義
whenever(employeeSearchUseCase.sortedSearch(any())).thenThrow(
EmployeeServiceException.EmployeeDataSourceException(
RuntimeException("something error message")
)
)
val runtimeException = RuntimeException("something error message")
val exception = EmployeeServiceException.EmployeeDataSourceException(runtimeException)
whenever(employeeSearchUseCase.sortedSearch(any())).thenThrow(exception)

// 実行 & 検証
webClient
Expand Down
3 changes: 2 additions & 1 deletion todo_it.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@
- [ ] /v1/employee/1をHTTPのDELETEメソッドでリクエストし成功した場合
- [x] HTTPステータス204が返却されること
- [ ] 削除されていること
- [ ] 500系 DB接続エラー
- [x] 例外が発生しない場合、ステータス204をが返却すること
- [x] 社員データソース例外が発生した場合、ステータス500をが返却すること

- [ ] データベースに登録済み社員が2名登録されている場合,
- [ ] /v1/employeeに社員更新リクエストをHTTPのPUTメソッドでリクエストし成功した場合
Expand Down

0 comments on commit d559d8c

Please sign in to comment.