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 |