---
generated_at: 2026-02-24 12:00:00
metrics:
  claims_total: 46
  claims_with_evidence: 46
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート：providers-locking-redis 単体テストケース一覧

## 本レポートについて

### 目的
本レポートは、生成された単体テストケース一覧の信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：46 / 46、根拠なし：0
- 優先レビュー（高）
  1. **UT-LKR-035（タイムアウト処理）**：タイムアウト時の挙動は実際のRedis負荷テストで確認推奨
  2. **UT-LKR-030（大量キー処理）**：100件以上のスキャン処理は性能観点でレビュー推奨
  3. **UT-LKR-045（接続エラーハンドリング）**：ネットワーク障害時の挙動確認推奨

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

- E-01: `packages/modules/providers/locking-redis/src/services/redis-lock.ts` - RedisLockingProviderクラス実装
- E-02: `packages/modules/providers/locking-redis/src/loaders/index.ts` - Loaderモジュール実装
- E-03: `packages/modules/providers/locking-redis/src/types/index.ts` - RedisCacheModuleOptions型定義
- E-04: `packages/modules/providers/locking-redis/src/index.ts` - モジュールエントリーポイント

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

### RedisLockingProvider - constructor

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | デフォルト設定でインスタンスが作成される | E-01 L24-38: `this.keyNamePrefix = prefix ?? "medusa_lock:"` | ○ |
| C-02 | カスタムprefixが設定される | E-01 L26: `this.keyNamePrefix = prefix ?? "medusa_lock:"` | ○ |
| C-03 | waitLockingTimeoutオプションが設定される | E-01 L28-30: `if (!isNaN(+options?.waitLockingTimeout!))` | ○ |
| C-04 | defaultRetryIntervalオプションが設定される | E-01 L32-34: `if (!isNaN(+options?.defaultRetryInterval!))` | ○ |
| C-05 | maximumRetryIntervalオプションが設定される | E-01 L36-38: `if (!isNaN(+options?.maximumRetryInterval!))` | ○ |
| C-06 | NaNのオプション値が渡された場合デフォルト値が使用される | E-01 L28,32,36: `!isNaN()`チェック | ○ |
| C-07 | acquireLockコマンドがRedisに定義される | E-01 L41-80: `this.redisClient.defineCommand("acquireLock"...)` | ○ |
| C-08 | releaseLockコマンドがRedisに定義される | E-01 L83-95: `this.redisClient.defineCommand("releaseLock"...)` | ○ |

### RedisLockingProvider - getKeyName

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-09 | プレフィックス付きのキー名が返される | E-01 L98-100: `return \`${this.keyNamePrefix}${key}\`` | ○ |
| C-10 | 空文字列のキーでもプレフィックスが付与される | E-01 L99: テンプレートリテラルで連結 | ○ |

### RedisLockingProvider - acquire/acquire_

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-11 | 単一キーのロック取得に成功する | E-01 L139-148, L159: `keys = Array.isArray(keys) ? keys : [keys]` | ○ |
| C-12 | 複数キーのロック取得に成功する | E-01 L168-208: `acquirePromises = keys.map(...)` | ○ |
| C-13 | ownerIdを指定してロック取得できる | E-01 L165: `const ownerId = args?.ownerId ?? "*"` | ○ |
| C-14 | expireを指定してロック取得できる | E-01 L161-162, L181: `args?.expire ? timeoutSeconds : 0` | ○ |
| C-15 | awaitQueueがtrueの場合リトライしてロック取得する | E-01 L166,188-197: リトライループ実装 | ○ |
| C-16 | awaitQueueがfalseで取得失敗時にエラーがスローされる | E-01 L198-200: `throw new Error(errMessage)` | ○ |
| C-17 | 同一ownerIdで再取得した場合成功する | E-01 L64-71: Luaスクリプトで`currentOwnerId == ownerId`時はSET XX | ○ |
| C-18 | 異なるownerIdでの取得が失敗する | E-01 L72-73: `else return 0` | ○ |
| C-19 | キャンセルトークンがキャンセル済みの場合エラーがスローされる | E-01 L174-176: `if (cancellationToken?.cancelled)` | ○ |
| C-20 | expireが0以下の場合TTLなしでロック取得される | E-01 L50-53: Luaスクリプトで`if ttl > 0 then` | ○ |

### RedisLockingProvider - release

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-21 | 単一キーのロック解放に成功する | E-01 L211-228: release実装 | ○ |
| C-22 | 複数キーのロック解放に成功する | E-01 L218,220-224: `keys.map(...)` | ○ |
| C-23 | ownerIdを指定してロック解放できる | E-01 L217: `const ownerId = args?.ownerId ?? "*"` | ○ |
| C-24 | 異なるownerIdでの解放が失敗する | E-01 L89-90: Luaスクリプトで`GET key == ownerId`チェック | ○ |
| C-25 | 存在しないキーの解放でfalseが返される | E-01 L88-93: Luaスクリプトでマッチしない場合`return 0` | ○ |
| C-26 | ownerIdがnullの場合デフォルト"*"が使用される | E-01 L217: `args?.ownerId ?? "*"` | ○ |

### RedisLockingProvider - releaseAll

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-27 | 指定ownerIdの全ロックが解放される | E-01 L231-268: releaseAll実装 | ○ |
| C-28 | ownerIdがnullの場合デフォルト"*"の全ロックが解放される | E-01 L232: `const ownerId = args?.ownerId ?? "*"` | ○ |
| C-29 | ロックが存在しない場合でも正常終了する | E-01 L248: `if (keys.length > 0)` 条件付き処理 | ○ |
| C-30 | 100件以上のキーがある場合カーソルベースでスキャンされる | E-01 L237-268: SCANコマンドでdo-whileループ | ○ |
| C-31 | 異なるownerIdのロックは解放されない | E-01 L261: `if (currentOwner === ownerId)` | ○ |

### RedisLockingProvider - execute

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-32 | ロック取得後にジョブを実行し解放する | E-01 L102-137: execute実装 | ○ |
| C-33 | 複数キーでロック取得してジョブを実行する | E-01 L119-128: `this.acquire_`に配列渡し | ○ |
| C-34 | ジョブが例外をスローした場合でもロックが解放される | E-01 L134-136: `finally { await this.release(keys) }` | ○ |
| C-35 | タイムアウトした場合エラーがスローされる | E-01 L115-116,130: `Promise.race`でタイムアウト競争 | ○ |
| C-36 | timeoutが指定された場合その値がexpireとして使用される | E-01 L124: `expire: args?.timeout ? timeoutSeconds` | ○ |
| C-37 | timeout未指定時はデフォルトタイムアウトが使用される | E-01 L109: `args?.timeout ?? this.waitLockingTimeout` | ○ |
| C-38 | timeout=0の場合最小値1秒が使用される | E-01 L109: `Math.max(..., 1)` | ○ |

### RedisLockingProvider - getTimeout

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-39 | 指定秒数後にcancelledがtrueになりrejectされる | E-01 L271-279: getTimeout実装 | ○ |

### Loader

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-40 | Redis接続が確立される | E-02 L28-30: `await connection.connect()` | ○ |
| C-41 | redisUrlが未指定の場合エラーがスローされる | E-02 L16-19: `if (!redisUrl) throw Error(...)` | ○ |
| C-42 | カスタムnamespaceがコンテナに登録される | E-02 L39: `prefix: asValue(namespace ?? "medusa_lock:")` | ○ |
| C-43 | namespace未指定時はデフォルト値が使用される | E-02 L39: `namespace ?? "medusa_lock:"` | ○ |
| C-44 | redisOptionsがRedisクライアントに渡される | E-02 L22-26: `new Redis(redisUrl, {...(redisOptions ?? {})})` | ○ |
| C-45 | Redis接続エラー時にエラーログが出力される | E-02 L31-34: `catch (err) { logger?.error(...) }` | ○ |
| C-46 | redisClientがコンテナに登録される | E-02 L38: `redisClient: asValue(connection)` | ○ |

## 4) 不足情報（Unknown / Missing）
- 根拠なしの項目はありません

## 5) リスクフラグ（レビュー観点）
- **0（低リスク）**: 全テストケースがソースコードに基づいて生成されている

### 補足的なリスク項目
- **1（中リスク）**: Luaスクリプトのアトミック性テスト（UT-LKR-007, 008）は実際のRedis環境でのテストが推奨される
- **1（中リスク）**: タイムアウト・リトライ関連のテスト（UT-LKR-015, 035）は並行実行環境でのテストが推奨される

## 6) レビュアーチェックリスト（最小）
- [ ] RedisLockingProviderの各メソッドに対して正常系・異常系・境界値のテストケースが網羅されているか
- [ ] Luaスクリプトで実装されているacquireLock/releaseLockのロジックが正しくテストされているか
- [ ] Loaderのエラーハンドリング（redisUrl未指定、接続エラー）がカバーされているか
- [ ] タイムアウト処理とキャンセル処理のテストケースが適切か
- [ ] 複数キーでの一括ロック取得・解放のテストケースが含まれているか
- [ ] releaseAllのカーソルベーススキャン処理のテストケースが含まれているか
