SlotKeeper 設計と品質

update_resource unit test factors

  • Operation: updateResource
  • Endpoint: PUT /resources/{resourceId}

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_resource_management_permission(caller)
要素ID 要素 期待観点
F01-true 成立 HTTP 403 error response: forbidden
log message_id: updateResource.caller_cannot_manage_resources
log summary: 呼び出し元が管理者ではないため、資源編集を拒否した。
F01-false 不成立 条件不成立側または後続処理を継続する。

F02 条件分岐

  • 対象: 条件分岐: 編集要求の公開版が資源の現在の公開版と一致しない場合。
  • AST: not await api_functions.is_current_resource_version(resource, request)
要素ID 要素 期待観点
F02-true 成立 HTTP 409 error response: stale_version
log message_id: updateResource.stale_resource_version
log summary: 資源の公開版が現在値と一致しないため、資源編集を拒否した。
F02-false 不成立 条件不成立側または後続処理を継続する。

F03 条件分岐

  • 対象: 条件分岐: 無効化する資源に開始前の確定予約が残っている場合。
  • AST: await api_functions.has_future_reservations(resource, request, clock, session)
要素ID 要素 期待観点
F03-true 成立 HTTP 409 error response: future_reservations_exist
log message_id: updateResource.future_reservations_exist
log summary: 開始前の確定予約が残っているため、資源の無効化を拒否した。
F03-false 不成立 条件不成立側または後続処理を継続する。

F04 例外処理

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

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

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

3. テスト詳細

TC001

要因 要素 期待観点
F01 条件分岐: 呼び出し元が資源を管理できる管理者でない場合。 成立 HTTP 403 error response: forbidden
log message_id: updateResource.caller_cannot_manage_resources
log summary: 呼び出し元が管理者ではないため、資源編集を拒否した。

TC002

要因 要素 期待観点
F01 条件分岐: 呼び出し元が資源を管理できる管理者でない場合。 不成立 条件不成立側または後続処理を継続する。
F02 条件分岐: 編集要求の公開版が資源の現在の公開版と一致しない場合。 成立 HTTP 409 error response: stale_version
log message_id: updateResource.stale_resource_version
log summary: 資源の公開版が現在値と一致しないため、資源編集を拒否した。

TC003

要因 要素 期待観点
F01 条件分岐: 呼び出し元が資源を管理できる管理者でない場合。 不成立 条件不成立側または後続処理を継続する。
F02 条件分岐: 編集要求の公開版が資源の現在の公開版と一致しない場合。 不成立 条件不成立側または後続処理を継続する。
F03 条件分岐: 無効化する資源に開始前の確定予約が残っている場合。 成立 HTTP 409 error response: future_reservations_exist
log message_id: updateResource.future_reservations_exist
log summary: 開始前の確定予約が残っているため、資源の無効化を拒否した。

TC004

要因 要素 期待観点
F01 条件分岐: 呼び出し元が資源を管理できる管理者でない場合。 不成立 条件不成立側または後続処理を継続する。
F02 条件分岐: 編集要求の公開版が資源の現在の公開版と一致しない場合。 不成立 条件不成立側または後続処理を継続する。
F03 条件分岐: 無効化する資源に開始前の確定予約が残っている場合。 不成立 条件不成立側または後続処理を継続する。
F04 例外処理: ROUTER_HANDLED_EXCEPTIONS 発生しない try bodyを継続し、このexcept handlerへ遷移しない。
API正常応答 正常 HTTP 200 success response

TC005

要因 要素 期待観点
F01 条件分岐: 呼び出し元が資源を管理できる管理者でない場合。 不成立 条件不成立側または後続処理を継続する。
F02 条件分岐: 編集要求の公開版が資源の現在の公開版と一致しない場合。 不成立 条件不成立側または後続処理を継続する。
F03 条件分岐: 無効化する資源に開始前の確定予約が残っている場合。 不成立 条件不成立側または後続処理を継続する。
F04 例外処理: ROUTER_HANDLED_EXCEPTIONS ApiFunctionError HTTP 500 error response: forced router error

TC006

要因 要素 期待観点
F01 条件分岐: 呼び出し元が資源を管理できる管理者でない場合。 不成立 条件不成立側または後続処理を継続する。
F02 条件分岐: 編集要求の公開版が資源の現在の公開版と一致しない場合。 不成立 条件不成立側または後続処理を継続する。
F03 条件分岐: 無効化する資源に開始前の確定予約が残っている場合。 不成立 条件不成立側または後続処理を継続する。
F04 例外処理: ROUTER_HANDLED_EXCEPTIONS ExternalApiError HTTP 502 error response: external service request failed

TC007

要因 要素 期待観点
F01 条件分岐: 呼び出し元が資源を管理できる管理者でない場合。 不成立 条件不成立側または後続処理を継続する。
F02 条件分岐: 編集要求の公開版が資源の現在の公開版と一致しない場合。 不成立 条件不成立側または後続処理を継続する。
F03 条件分岐: 無効化する資源に開始前の確定予約が残っている場合。 不成立 条件不成立側または後続処理を継続する。
F04 例外処理: ROUTER_HANDLED_EXCEPTIONS HTTPException HTTP 400 error response: forced http exception