create_reservation unit test factors
- Operation:
createReservation - Endpoint:
POST /reservations
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 条件分岐
- 対象: 条件分岐: 有効期限内の成功記録がIdempotency-Keyに紐づいている場合。
- AST:
await api_functions.has_idempotency_result(idempotency_record)
| 要素ID | 要素 | 期待観点 |
|---|---|---|
F01-true |
成立 | 内側の条件分岐へ進む。 |
F01-false |
不成立 | 条件不成立側または後続処理を継続する。 |
F02 条件分岐
- 対象: 条件分岐: 成功記録の正規化入力と再送された要求が一致しない場合。
- AST:
not await api_functions.is_same_idempotent_request(idempotency_record, request)
| 要素ID | 要素 | 期待観点 |
|---|---|---|
F02-true |
成立 | HTTP 409 error response: idempotency_input_mismatch log message_id: createReservation.idempotency_key_reused log summary: 同じIdempotency-Keyで異なる入力が送られたため、予約作成を拒否した。 |
F02-false |
不成立 | HTTP 201 success response |
F03 条件分岐
- 対象: 条件分岐: 予約対象の資源が有効でない場合。
- AST:
not await api_functions.is_active_resource(resource)
| 要素ID | 要素 | 期待観点 |
|---|---|---|
F03-true |
成立 | HTTP 409 error response: resource_inactive log message_id: createReservation.resource_inactive log summary: 予約対象の資源が無効化されているため、予約作成を拒否した。 |
F03-false |
不成立 | 条件不成立側または後続処理を継続する。 |
F04 条件分岐
- 対象: 条件分岐: 取消済みを除き、半開区間が重なる確定予約がある場合。
- AST:
await api_functions.has_overlapping_reservation(validated_request, session)
| 要素ID | 要素 | 期待観点 |
|---|---|---|
F04-true |
成立 | HTTP 409 error response: slot_taken log message_id: createReservation.slot_taken 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 条件分岐: 有効期限内の成功記録がIdempotency-Keyに紐づいている場合。 |
成立 | 内側の条件分岐へ進む。 |
F02 条件分岐: 成功記録の正規化入力と再送された要求が一致しない場合。 |
成立 | HTTP 409 error response: idempotency_input_mismatch log message_id: createReservation.idempotency_key_reused log summary: 同じIdempotency-Keyで異なる入力が送られたため、予約作成を拒否した。 |
TC002
| 要因 | 要素 | 期待観点 |
|---|---|---|
F01 条件分岐: 有効期限内の成功記録がIdempotency-Keyに紐づいている場合。 |
成立 | 内側の条件分岐へ進む。 |
F02 条件分岐: 成功記録の正規化入力と再送された要求が一致しない場合。 |
不成立 | HTTP 201 success response |
TC003
| 要因 | 要素 | 期待観点 |
|---|---|---|
F01 条件分岐: 有効期限内の成功記録がIdempotency-Keyに紐づいている場合。 |
不成立 | 条件不成立側または後続処理を継続する。 |
F03 条件分岐: 予約対象の資源が有効でない場合。 |
成立 | HTTP 409 error response: resource_inactive log message_id: createReservation.resource_inactive log summary: 予約対象の資源が無効化されているため、予約作成を拒否した。 |
TC004
| 要因 | 要素 | 期待観点 |
|---|---|---|
F01 条件分岐: 有効期限内の成功記録がIdempotency-Keyに紐づいている場合。 |
不成立 | 条件不成立側または後続処理を継続する。 |
F03 条件分岐: 予約対象の資源が有効でない場合。 |
不成立 | 条件不成立側または後続処理を継続する。 |
F04 条件分岐: 取消済みを除き、半開区間が重なる確定予約がある場合。 |
成立 | HTTP 409 error response: slot_taken log message_id: createReservation.slot_taken log summary: 同じ資源の確定予約と時間帯が重なるため、予約作成を拒否した。 |
TC005
| 要因 | 要素 | 期待観点 |
|---|---|---|
F01 条件分岐: 有効期限内の成功記録がIdempotency-Keyに紐づいている場合。 |
不成立 | 条件不成立側または後続処理を継続する。 |
F03 条件分岐: 予約対象の資源が有効でない場合。 |
不成立 | 条件不成立側または後続処理を継続する。 |
F04 条件分岐: 取消済みを除き、半開区間が重なる確定予約がある場合。 |
不成立 | 条件不成立側または後続処理を継続する。 |
F05 例外処理: ROUTER_HANDLED_EXCEPTIONS |
発生しない | try bodyを継続し、このexcept handlerへ遷移しない。 |
| API正常応答 | 正常 | HTTP 201 success response |
TC006
| 要因 | 要素 | 期待観点 |
|---|---|---|
F01 条件分岐: 有効期限内の成功記録がIdempotency-Keyに紐づいている場合。 |
不成立 | 条件不成立側または後続処理を継続する。 |
F03 条件分岐: 予約対象の資源が有効でない場合。 |
不成立 | 条件不成立側または後続処理を継続する。 |
F04 条件分岐: 取消済みを除き、半開区間が重なる確定予約がある場合。 |
不成立 | 条件不成立側または後続処理を継続する。 |
F05 例外処理: ROUTER_HANDLED_EXCEPTIONS |
ApiFunctionError | HTTP 500 error response: forced router error |
TC007
| 要因 | 要素 | 期待観点 |
|---|---|---|
F01 条件分岐: 有効期限内の成功記録がIdempotency-Keyに紐づいている場合。 |
不成立 | 条件不成立側または後続処理を継続する。 |
F03 条件分岐: 予約対象の資源が有効でない場合。 |
不成立 | 条件不成立側または後続処理を継続する。 |
F04 条件分岐: 取消済みを除き、半開区間が重なる確定予約がある場合。 |
不成立 | 条件不成立側または後続処理を継続する。 |
F05 例外処理: ROUTER_HANDLED_EXCEPTIONS |
ExternalApiError | HTTP 502 error response: external service request failed |
TC008
| 要因 | 要素 | 期待観点 |
|---|---|---|
F01 条件分岐: 有効期限内の成功記録がIdempotency-Keyに紐づいている場合。 |
不成立 | 条件不成立側または後続処理を継続する。 |
F03 条件分岐: 予約対象の資源が有効でない場合。 |
不成立 | 条件不成立側または後続処理を継続する。 |
F04 条件分岐: 取消済みを除き、半開区間が重なる確定予約がある場合。 |
不成立 | 条件不成立側または後続処理を継続する。 |
F05 例外処理: ROUTER_HANDLED_EXCEPTIONS |
HTTPException | HTTP 400 error response: forced http exception |