SlotKeeper 設計と品質

cancel_reservation unit test factors

  • Operation: cancelReservation
  • Endpoint: POST /reservations/{reservationId}/cancel

0. Router層の暗黙処理

Case ID 処理 発生条件 期待観点
R001 FastAPI Depends(get_caller_identity) Authorization ヘッダのBearer tokenが未指定、または署名・issuer・client・用途・期限を検証できない場合。 HTTP 401 error response: authentication_required / invalid_token
R002 FastAPI/Pydantic request validation Path/Query/Header/Body が型または制約に一致しない場合。 HTTP 422 error response: invalid_input

1. 要因ごとの要素

F01 条件分岐

  • 対象: 条件分岐: 呼び出し元が予約者本人または管理者でない場合。
  • AST: not await api_functions.has_reservation_cancel_permission(reservation, caller)
要素ID 要素 期待観点
F01-true 成立 HTTP 403 error response: forbidden
log message_id: cancelReservation.caller_cannot_cancel_reservation
log summary: 呼び出し元が予約者本人でも管理者でもないため、予約取消を拒否した。
F01-false 不成立 条件不成立側または後続処理を継続する。

F02 条件分岐

  • 対象: 条件分岐: 取消要求の版が予約の現在の版と一致しない場合。
  • AST: not await api_functions.is_current_reservation_version(reservation, request)
要素ID 要素 期待観点
F02-true 成立 HTTP 409 error response: stale_version
log message_id: cancelReservation.stale_reservation_version
log summary: 予約の版が現在値と一致しないため、予約取消を拒否した。
F02-false 不成立 条件不成立側または後続処理を継続する。

F03 条件分岐

  • 対象: 条件分岐: 予約が取消前の確定状態でない場合。
  • AST: not await api_functions.is_confirmed_reservation(reservation)
要素ID 要素 期待観点
F03-true 成立 HTTP 409 error response: already_cancelled
log message_id: cancelReservation.reservation_already_cancelled
log summary: 予約が取消済みのため、予約取消を拒否した。
F03-false 不成立 条件不成立側または後続処理を継続する。

F04 条件分岐

  • 対象: 条件分岐: 予約の開始時刻が現在時刻以前である場合。
  • AST: await api_functions.is_started_reservation(reservation, clock)
要素ID 要素 期待観点
F04-true 成立 HTTP 409 error response: already_started
log message_id: cancelReservation.reservation_already_started
log summary: 予約の開始時刻を過ぎているため、予約取消を拒否した。
F04-false 不成立 条件不成立側または後続処理を継続する。

F05 例外処理

  • 対象: 例外処理: ROUTER_HANDLED_EXCEPTIONS
  • AST: ROUTER_HANDLED_EXCEPTIONS
要素ID 要素 期待観点
F05-normal 発生しない try bodyを継続し、このexcept handlerへ遷移しない。
F05-raised-apifunctionerror ApiFunctionError HTTP 500 error response: forced router error
F05-raised-externalapierror ExternalApiError HTTP 502 error response: external service request failed
F05-raised-httpexception HTTPException HTTP 400 error response: forced http exception

2. 直積したテストケース一覧

Case ID F01 F02 F03 F04 F05
TC001 成立 - - - -
TC002 不成立 成立 - - -
TC003 不成立 不成立 成立 - -
TC004 不成立 不成立 不成立 成立 -
TC005 不成立 不成立 不成立 不成立 発生しない
TC006 不成立 不成立 不成立 不成立 ApiFunctionError
TC007 不成立 不成立 不成立 不成立 ExternalApiError
TC008 不成立 不成立 不成立 不成立 HTTPException

3. テスト詳細

TC001

要因 要素 期待観点
F01 条件分岐: 呼び出し元が予約者本人または管理者でない場合。 成立 HTTP 403 error response: forbidden
log message_id: cancelReservation.caller_cannot_cancel_reservation
log summary: 呼び出し元が予約者本人でも管理者でもないため、予約取消を拒否した。

TC002

要因 要素 期待観点
F01 条件分岐: 呼び出し元が予約者本人または管理者でない場合。 不成立 条件不成立側または後続処理を継続する。
F02 条件分岐: 取消要求の版が予約の現在の版と一致しない場合。 成立 HTTP 409 error response: stale_version
log message_id: cancelReservation.stale_reservation_version
log summary: 予約の版が現在値と一致しないため、予約取消を拒否した。

TC003

要因 要素 期待観点
F01 条件分岐: 呼び出し元が予約者本人または管理者でない場合。 不成立 条件不成立側または後続処理を継続する。
F02 条件分岐: 取消要求の版が予約の現在の版と一致しない場合。 不成立 条件不成立側または後続処理を継続する。
F03 条件分岐: 予約が取消前の確定状態でない場合。 成立 HTTP 409 error response: already_cancelled
log message_id: cancelReservation.reservation_already_cancelled
log summary: 予約が取消済みのため、予約取消を拒否した。

TC004

要因 要素 期待観点
F01 条件分岐: 呼び出し元が予約者本人または管理者でない場合。 不成立 条件不成立側または後続処理を継続する。
F02 条件分岐: 取消要求の版が予約の現在の版と一致しない場合。 不成立 条件不成立側または後続処理を継続する。
F03 条件分岐: 予約が取消前の確定状態でない場合。 不成立 条件不成立側または後続処理を継続する。
F04 条件分岐: 予約の開始時刻が現在時刻以前である場合。 成立 HTTP 409 error response: already_started
log message_id: cancelReservation.reservation_already_started
log summary: 予約の開始時刻を過ぎているため、予約取消を拒否した。

TC005

要因 要素 期待観点
F01 条件分岐: 呼び出し元が予約者本人または管理者でない場合。 不成立 条件不成立側または後続処理を継続する。
F02 条件分岐: 取消要求の版が予約の現在の版と一致しない場合。 不成立 条件不成立側または後続処理を継続する。
F03 条件分岐: 予約が取消前の確定状態でない場合。 不成立 条件不成立側または後続処理を継続する。
F04 条件分岐: 予約の開始時刻が現在時刻以前である場合。 不成立 条件不成立側または後続処理を継続する。
F05 例外処理: ROUTER_HANDLED_EXCEPTIONS 発生しない try bodyを継続し、このexcept handlerへ遷移しない。
API正常応答 正常 HTTP 200 success response

TC006

要因 要素 期待観点
F01 条件分岐: 呼び出し元が予約者本人または管理者でない場合。 不成立 条件不成立側または後続処理を継続する。
F02 条件分岐: 取消要求の版が予約の現在の版と一致しない場合。 不成立 条件不成立側または後続処理を継続する。
F03 条件分岐: 予約が取消前の確定状態でない場合。 不成立 条件不成立側または後続処理を継続する。
F04 条件分岐: 予約の開始時刻が現在時刻以前である場合。 不成立 条件不成立側または後続処理を継続する。
F05 例外処理: ROUTER_HANDLED_EXCEPTIONS ApiFunctionError HTTP 500 error response: forced router error

TC007

要因 要素 期待観点
F01 条件分岐: 呼び出し元が予約者本人または管理者でない場合。 不成立 条件不成立側または後続処理を継続する。
F02 条件分岐: 取消要求の版が予約の現在の版と一致しない場合。 不成立 条件不成立側または後続処理を継続する。
F03 条件分岐: 予約が取消前の確定状態でない場合。 不成立 条件不成立側または後続処理を継続する。
F04 条件分岐: 予約の開始時刻が現在時刻以前である場合。 不成立 条件不成立側または後続処理を継続する。
F05 例外処理: ROUTER_HANDLED_EXCEPTIONS ExternalApiError HTTP 502 error response: external service request failed

TC008

要因 要素 期待観点
F01 条件分岐: 呼び出し元が予約者本人または管理者でない場合。 不成立 条件不成立側または後続処理を継続する。
F02 条件分岐: 取消要求の版が予約の現在の版と一致しない場合。 不成立 条件不成立側または後続処理を継続する。
F03 条件分岐: 予約が取消前の確定状態でない場合。 不成立 条件不成立側または後続処理を継続する。
F04 条件分岐: 予約の開始時刻が現在時刻以前である場合。 不成立 条件不成立側または後続処理を継続する。
F05 例外処理: ROUTER_HANDLED_EXCEPTIONS HTTPException HTTP 400 error response: forced http exception