---
generated_at: 2026-02-24 23:15:00
metrics:
  claims_total: 82
  claims_with_evidence: 79
  claims_without_evidence: 3
confidence_derived: 0.96
---

# 根拠レポート：api-key モジュール単体テストケース一覧

## 本レポートについて

### 目的
本レポートは、生成された設計書・ドキュメントの信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

### チェック方法
以下の観点でドキュメントの内容（Claim：主張）を検証しています：

1. **根拠の有無確認**：各主張に対して、ソースコード・既存設計書・要件定義書などの根拠（Evidence）が存在するか
2. **根拠との整合性**：主張の内容が根拠と矛盾していないか
3. **網羅性**：参照すべき情報源を適切にカバーしているか

### 信頼度スコアの算出
- **confidence_derived** = 根拠あり件数 / 総主張件数
- 状態「○」：根拠あり、「△」：根拠不足または要確認

### 本レポートの使い方
1. まず「サマリー」で全体の信頼度と優先レビュー項目を確認
2. 「Claims と根拠の対応」で △ の項目を重点的にレビュー
3. 「不足情報」で補完が必要な情報源を確認

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.96**
  - 根拠あり：79 / 82、根拠なし：3
- 優先レビュー（高）
  1. **C-72**：短いキーでのredactKey動作 - 境界値テストのエッジケース、実装確認推奨
  2. **C-48**：空文字トークン認証 - 明示的な検証コードなし
  3. **C-26**：存在しないID取得エラー - 親クラス（MedusaService）の挙動に依存

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。抽出フェーズで付けたIDをそのまま出す。

- E-01: `packages/modules/api-key/src/services/api-key-module-service.ts` - メインサービスクラス（616行）
- E-02: `packages/modules/api-key/src/models/api-key.ts` - ApiKeyモデル定義（32行）
- E-03: `packages/modules/api-key/src/index.ts` - モジュールエクスポート（6行）
- E-04: `packages/modules/api-key/src/joiner-config.ts` - Joiner設定（8行）
- E-05: `packages/modules/api-key/src/types/index.ts` - 型定義（31行）
- E-06: `packages/modules/api-key/integration-tests/__tests__/api-key-module-service.spec.ts` - 統合テスト（416行）
- E-07: `packages/modules/api-key/integration-tests/__fixtures__/index.ts` - テストフィクスチャ（14行）

## 3) Claims と根拠の対応（レビューの主戦場）

### createApiKeys メソッド関連
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | Publishable APIキーが正常に作成される | E-01 (L112-151), E-06 (L73-95) | ○ |
| C-02 | Secret APIキーが正常に作成される | E-01 (L112-183), E-06 (L97-116) | ○ |
| C-03 | 複数のAPIキーが一度に作成できる | E-01 (L126-133), E-06 (L118-131) | ○ |
| C-04 | 作成時に生のトークンが返却される | E-01 (L141-148), E-06 (L90-93, L111-114) | ○ |
| C-05 | saltがレスポンスに含まれない | E-01 (L147), E-06 (L84, L106) | ○ |
| C-06 | redactedフィールドが正しく生成される | E-01 (L613-615), E-06 (L89, L111) | ○ |
| C-07 | 単一データで単一オブジェクト返却 | E-01 (L150) | ○ |
| C-08 | 配列データで配列返却 | E-01 (L150) | ○ |

### deleteApiKeys メソッド関連
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-09 | 失効済みのAPIキーが正常に削除される | E-01 (L69-110), E-06 (L233-252) | ○ |
| C-10 | 複数の失効済みAPIキーが一度に削除できる | E-01 (L84, L109), E-06 (L245-248) | ○ |
| C-11 | 失効していないAPIキーの削除でエラー発生 | E-01 (L100-107), E-06 (L254-271) | ○ |
| C-12 | 将来失効予定のAPIキーの削除でエラー発生 | E-01 (L91-93) | ○ |
| C-13 | 文字列IDでも正常動作 | E-01 (L84) | ○ |

### updateApiKeys メソッド関連
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-14 | APIキーのtitleが正常に更新される | E-01 (L298-313), E-06 (L203-213) | ○ |
| C-15 | セレクタを使用して複数キーを更新できる | E-01 (L264-268, L273-296) | ○ |
| C-16 | 更新時にtokenが空文字で返却される（Secret） | E-01 (L291, L604-611) | ○ |
| C-17 | revoked_by等の更新が無視される | E-01 (L303-306), E-06 (L215-230) | ○ |

### upsertApiKeys メソッド関連
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-18 | idなしデータで新規作成される | E-01 (L214-216, L220-243) | ○ |
| C-19 | idありデータで更新される | E-01 (L211-213, L245-251) | ○ |
| C-20 | 作成と更新が混在するデータを処理できる | E-01 (L210-254) | ○ |
| C-21 | 新規作成時に生トークンが返却される | E-01 (L222-239) | ○ |

### retrieveApiKey メソッド関連
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-22 | IDでAPIキーを取得できる | E-01 (L315-330), E-06 (L395-412) | ○ |
| C-23 | Secretキー取得時にtokenが空で返却される | E-01 (L325, L604-611), E-06 (L390-400) | ○ |
| C-24 | Publishableキー取得時にtokenが返却される | E-01 (L608), E-06 (L402-412) | ○ |
| C-25 | saltが常に返却されない | E-01 (L609-610) | ○ |
| C-26 | 存在しないIDでエラー発生 | E-01 (L322 - 親クラス依存) | △ |

### listApiKeys メソッド関連
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-27 | 全APIキーの一覧が取得できる | E-01 (L332-351), E-06 (L331-339) | ○ |
| C-28 | フィルタ条件で絞り込みができる | E-01 (L339-343) | ○ |
| C-29 | tokenフィルタで特定キーを取得できる | E-06 (L341-352) | ○ |
| C-30 | Secretキーのtokenが空で返却される | E-01 (L346), E-06 (L354-361) | ○ |
| C-31 | キーが0件の場合に空配列が返却される | E-01 (L345-350) | ○ |

### listAndCountApiKeys メソッド関連
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-32 | APIキー一覧と総件数が取得できる | E-01 (L353-375) | ○ |
| C-33 | フィルタ条件で絞り込みとカウントができる | E-01 (L360-364) | ○ |
| C-34 | Secretキーのtokenが空で返却される | E-01 (L367-368), E-06 (L372-379) | ○ |
| C-35 | キーが0件の場合に[[], 0]が返却される | E-01 (L366-374) | ○ |

### revoke メソッド関連
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-36 | APIキーが正常に失効される | E-01 (L377-437), E-06 (L133-148) | ○ |
| C-37 | 将来の失効日時を指定できる | E-01 (L420-422), E-06 (L150-169) | ○ |
| C-38 | セレクタを使用して複数キーを失効できる | E-01 (L382-386, L391-409), E-06 (L240-243) | ○ |
| C-39 | 空配列の場合に何も処理しない | E-06 (L171-181) | ○ |
| C-40 | 既に失効済みのキーを再失効でエラー発生 | E-01 (L552-567), E-06 (L183-200) | ○ |
| C-41 | revoked_byが未指定でエラー発生 | E-01 (L545-550) | ○ |
| C-42 | idが未指定でエラー発生 | E-01 (L538-543) | ○ |

### authenticate メソッド関連
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-43 | 有効なSecretキーで認証が成功する | E-01 (L439-499), E-06 (L275-282) | ○ |
| C-44 | 将来失効予定のキーで認証が成功する | E-01 (L469-471), E-06 (L284-299) | ○ |
| C-45 | Publishableキーでは認証が失敗する | E-01 (L464), E-06 (L301-308) | ○ |
| C-46 | 存在しないトークンでは認証が失敗する | E-01 (L494-498), E-06 (L309-316) | ○ |
| C-47 | 失効済みトークンでは認証が失敗する | E-01 (L469-471), E-06 (L317-327) | ○ |
| C-48 | 空文字トークンでは認証が失敗する | E-01 (L494-498 - 推定動作) | △ |

### generatePublishableKey メソッド関連
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-49 | pk_プレフィックス付きトークンが生成される | E-01 (L571-572) | ○ |
| C-50 | rawTokenとhashedTokenが同一である | E-01 (L574-575) | ○ |
| C-51 | saltが空文字である | E-01 (L577) | ○ |
| C-52 | redactedフィールドが正しく生成される | E-01 (L578) | ○ |

### generateSecretKey メソッド関連
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-53 | sk_プレフィックス付きトークンが生成される | E-01 (L583) | ○ |
| C-54 | rawTokenとhashedTokenが異なる | E-01 (L583-585) | ○ |
| C-55 | saltが生成される | E-01 (L584) | ○ |
| C-56 | redactedフィールドが正しく生成される | E-01 (L591) | ○ |

### calculateHash メソッド関連
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-57 | 同じトークンとsaltで同じハッシュが生成される | E-01 (L595-600) | ○ |
| C-58 | 異なるsaltで異なるハッシュが生成される | E-01 (L595-600) | ○ |
| C-59 | 64バイトの16進数文字列が返却される | E-01 (L599) | ○ |

### normalizeUpdateInput_ メソッド関連
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-60 | 文字列IDが正規化される | E-01 (L507-508) | ○ |
| C-61 | セレクタが正規化される | E-01 (L511-525) | ○ |

### validateRevokeApiKeys_ メソッド関連
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-62 | 有効な入力データで検証が成功する | E-01 (L530-568) | ○ |
| C-63 | 空配列で検証がスキップされる | E-01 (L534-536) | ○ |
| C-64 | idなしデータでエラー発生 | E-01 (L538-543) | ○ |
| C-65 | revoked_byなしデータでエラー発生 | E-01 (L545-550) | ○ |
| C-66 | 既にrevoke済みキーでエラー発生 | E-01 (L552-567) | ○ |

### その他メソッド関連
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-67 | __joinerConfig が joiner設定を返却する | E-01 (L65-67), E-04 | ○ |
| C-68 | omitToken がSecretキーのtokenを空文字に置換する | E-01 (L604-608) | ○ |
| C-69 | omitToken がPublishableキーのtokenを保持する | E-01 (L608) | ○ |
| C-70 | omitToken がsaltを削除する | E-01 (L609-610) | ○ |
| C-71 | redactKey がキーの先頭6文字と末尾3文字を保持する | E-01 (L613-615) | ○ |
| C-72 | redactKey が短いキーでもマスキングが動作する | E-01 (L613-615 - 推定動作) | △ |

### モデル・設定関連
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-73 | id がapkプレフィックス付きで生成される | E-02 (L5) | ○ |
| C-74 | typeがpublishableまたはsecretのenum値である | E-02 (L10) | ○ |
| C-75 | tokenにユニーク制約が適用される | E-02 (L16-19) | ○ |
| C-76 | last_used_atがnullable である | E-02 (L11) | ○ |
| C-77 | revoked_byがnullableである | E-02 (L13) | ○ |
| C-78 | revoked_atがnullableである | E-02 (L14) | ○ |
| C-79 | titleがsearchableである | E-02 (L9) | ○ |
| C-80 | redactedがsearchableである | E-02 (L8) | ○ |
| C-81 | publishable_key_idがlinkableKeyとして設定される | E-04 (L5-7) | ○ |
| C-82 | API_KEYモジュールとしてエクスポートされる | E-03 (L4-6) | ○ |

## 4) 不足情報（Unknown / Missing）
- **C-26（存在しないID取得エラー）**: MedusaServiceの親クラスの挙動に依存しており、api-keyモジュール内では明示的なエラーハンドリングコードが存在しない。親クラスの実装を確認する必要がある。
  - 候補: `packages/core/utils/src/modules-sdk/medusa-service.ts` / `packages/core/utils/src/modules-sdk/medusa-internal-service.ts`
- **C-48（空文字トークン認証）**: 空文字トークンに対する明示的なバリデーションコードがなく、redactKey関数経由で処理される際の挙動は推定に基づく。
  - 候補: 明示的な入力バリデーション追加 / 統合テストでの確認
- **C-72（短いキーでのredactKey動作）**: sliceメソッドの挙動から推定しているが、極端に短いキー（9文字未満）での動作は未テスト。
  - 候補: 単体テストでの境界値検証

## 5) リスクフラグ（レビュー観点）
- **リスク0（低）**: 大部分のテストケース - ソースコードと統合テストの両方で確認済み
- **リスク1（中）**: C-26, C-48, C-72 - ソースコードから推定可能だが、明示的な検証がない
- **リスク0（低）**: モデル定義関連（C-73〜C-82） - モデル定義ファイルで明示的に確認可能

## 6) レビュアーチェックリスト（最小）
- [ ] 親クラス（MedusaService）のretrieveメソッドの存在しないID処理を確認（C-26）
- [ ] 空文字トークンでのauthenticate動作を統合テストで確認（C-48）
- [ ] 短いキーでのredactKey動作を単体テストで検証（C-72）
- [ ] Secretキーのトークン秘匿処理（omitToken）がすべてのAPI出力パスで適用されていることを確認
- [ ] revoke_in（遅延失効）の秒数指定が負の値の場合の挙動を確認
