SlotKeeper 設計と品質

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