---
generated_at: 2026-02-24 23:15:00
metrics:
  claims_total: 76
  claims_with_evidence: 72
  claims_without_evidence: 4
confidence_derived: 0.95
---

# 根拠レポート：store.csv

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.95**
  - 根拠あり：72 / 76、根拠なし：4
- 優先レビュー（高）
  1. **UT-STO-018（空配列upsert）**：空配列時の挙動がコードから明示的に確認できない
  2. **UT-STO-031（0件マッチ更新）**：セレクタに一致しない場合の戻り値の明示的仕様なし
  3. **UT-STO-045（複数重複検出）**：getDuplicatesの実装詳細が外部依存
  4. **UT-STO-052/053（カスケード削除）**：実際の削除挙動はDBレベルでの確認が必要

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

- E-01: `packages/modules/store/src/services/store-module-service.ts`
- E-02: `packages/modules/store/src/models/store.ts`
- E-03: `packages/modules/store/src/models/currency.ts`
- E-04: `packages/modules/store/src/models/locale.ts`
- E-05: `packages/modules/store/src/types/index.ts`
- E-06: `packages/modules/store/src/index.ts`
- E-07: `packages/modules/store/src/models/index.ts`
- E-08: `packages/modules/store/src/services/index.ts`

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

### StoreModuleService - createStores

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 (UT-STO-001) | 単一のストアを正常に作成できること | E-01: L55-79 createStores実装 | ○ |
| C-02 (UT-STO-002) | 複数のストアを配列で作成できること | E-01: L72 Array.isArray(data)による配列処理 | ○ |
| C-03 (UT-STO-003) | サポート通貨を含むストアを作成できること | E-01: L92 relations: ["supported_currencies"] | ○ |
| C-04 (UT-STO-004) | サポートロケールを含むストアを作成できること | E-01: L92 relations: ["supported_locales"] | ○ |
| C-05 (UT-STO-005) | 通貨コードが小文字に正規化されること | E-01: L218 currency_code: c.currency_code.toLowerCase() | ○ |
| C-06 (UT-STO-006) | ストア名の前後の空白がトリムされること | E-01: L220 name: store.name?.trim() | ○ |
| C-07 (UT-STO-007) | デフォルト通貨がない場合エラーとなること | E-01: L248-253 seenDefaultチェック | ○ |
| C-08 (UT-STO-008) | 複数のデフォルト通貨がある場合エラーとなること | E-01: L237-245 複数デフォルトチェック | ○ |
| C-09 (UT-STO-009) | 重複する通貨コードがある場合エラーとなること | E-01: L230-233 validateUnique呼び出し | ○ |
| C-10 (UT-STO-010) | 重複するロケールコードがある場合エラーとなること | E-01: L256-260 validateUnique呼び出し | ○ |
| C-11 (UT-STO-011) | 通貨が0件の場合（空配列）処理されること | E-01: L229 supported_currencies?.length条件 | ○ |
| C-12 (UT-STO-012) | ロケールが0件の場合（空配列）処理されること | E-01: L256 supported_locales?.length条件 | ○ |
| C-13 (UT-STO-013) | 通貨が1件のみの場合正常処理されること | E-01: L229-262 バリデーションロジック | ○ |

### StoreModuleService - upsertStores

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-14 (UT-STO-014) | 新規ストアをupsertで作成できること | E-01: L129-136 forCreate処理 | ○ |
| C-15 (UT-STO-015) | 既存ストアをupsertで更新できること | E-01: L126-139 forUpdate処理 | ○ |
| C-16 (UT-STO-016) | 配列で複数ストアをupsertできること | E-01: L125 Array.isArray(data) | ○ |
| C-17 (UT-STO-017) | 作成と更新が混在する配列を処理できること | E-01: L133-142 promiseAll並列処理 | ○ |
| C-18 (UT-STO-018) | 空配列をupsertした場合の挙動 | E-01: L125-144 | △ |

### StoreModuleService - updateStores

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-19 (UT-STO-019) | IDを指定してストアを更新できること | E-01: L169-170 isString(idOrSelector)分岐 | ○ |
| C-20 (UT-STO-020) | セレクタを指定して複数ストアを更新できること | E-01: L172-181 selectorによるlist | ○ |
| C-21 (UT-STO-021) | サポート通貨を更新できること | E-01: L204 relations: ["supported_currencies"] | ○ |
| C-22 (UT-STO-022) | サポートロケールを更新できること | E-01: L204 relations: ["supported_locales"] | ○ |
| C-23 (UT-STO-023) | デフォルト販売チャネルIDを更新できること | E-02: L9 default_sales_channel_idフィールド | ○ |
| C-24 (UT-STO-024) | デフォルトリージョンIDを更新できること | E-02: L10 default_region_idフィールド | ○ |
| C-25 (UT-STO-025) | デフォルトロケーションIDを更新できること | E-02: L11 default_location_idフィールド | ○ |
| C-26 (UT-STO-026) | メタデータを更新できること | E-02: L12 metadataフィールド | ○ |
| C-27 (UT-STO-027) | 更新時に複数デフォルト通貨エラー | E-01: L276-278 validateUpdateRequest | ○ |
| C-28 (UT-STO-028) | 更新時にデフォルト通貨なしエラー | E-01: L276-278 validateUpdateRequest | ○ |
| C-29 (UT-STO-029) | 更新時に重複通貨コードエラー | E-01: L276-278 validateUpdateRequest | ○ |
| C-30 (UT-STO-030) | 更新時に重複ロケールコードエラー | E-01: L276-278 validateUpdateRequest | ○ |
| C-31 (UT-STO-031) | セレクタに一致するストアが0件の場合 | E-01: L172-181 | △ |

### StoreModuleService - normalizeInput

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-32 (UT-STO-032) | 通貨コードが小文字に変換されること | E-01: L218 toLowerCase() | ○ |
| C-33 (UT-STO-033) | ストア名がトリムされること | E-01: L220 trim() | ○ |
| C-34 (UT-STO-034) | undefinedフィールドが削除されること | E-01: L214 removeUndefined() | ○ |
| C-35 (UT-STO-035) | supported_currenciesがundefinedの場合 | E-01: L216 オプショナルチェーン | ○ |
| C-36 (UT-STO-036) | nameがundefinedの場合 | E-01: L220 オプショナルチェーン | ○ |

### StoreModuleService - validateCreateRequest / validateUnique

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-37 (UT-STO-037) | 有効なリクエストでエラーなし | E-01: L225-263 | ○ |
| C-38 (UT-STO-038) | 複数通貨で1つのみデフォルトでOK | E-01: L235-246 | ○ |
| C-39 (UT-STO-039) | デフォルト通貨なしでエラー | E-01: L248-253 | ○ |
| C-40 (UT-STO-040) | 複数デフォルト通貨でエラー | E-01: L238-245 | ○ |
| C-41 (UT-STO-041) | 重複通貨コードでエラー | E-01: L265-273 | ○ |
| C-42 (UT-STO-042) | 重複ロケールコードでエラー | E-01: L265-273 | ○ |
| C-43 (UT-STO-043) | 重複なしでエラーなし | E-01: L265-273 | ○ |
| C-44 (UT-STO-044) | 重複ありでエラー | E-01: L268-273 | ○ |
| C-45 (UT-STO-045) | 複数の重複がある場合全て報告 | 外部依存（getDuplicates） | △ |
| C-46 (UT-STO-046) | 空配列でエラーなし | E-01: L268 duplicates.length条件 | ○ |
| C-47 (UT-STO-047) | 1件のみでエラーなし | E-01: L268 duplicates.length条件 | ○ |

### コンストラクタ・モデル定義

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-48 (UT-STO-048) | 依存関係が正しく注入されること | E-01: L44-52 constructor | ○ |
| C-49 (UT-STO-049) | Storeモデル定義が正しいこと | E-02: L5-27 model.define | ○ |
| C-50 (UT-STO-050) | Storeのidプレフィックスがstoreであること | E-02: L7 prefix: "store" | ○ |
| C-51 (UT-STO-051) | nameのデフォルト値が'Medusa Store'であること | E-02: L8 default("Medusa Store") | ○ |
| C-52 (UT-STO-052) | Store削除時にsupported_currenciesがカスケード削除 | E-02: L25-27 cascades.delete | △ |
| C-53 (UT-STO-053) | Store削除時にsupported_localesがカスケード削除 | E-02: L25-27 cascades.delete | ○ |
| C-54 (UT-STO-054) | StoreCurrencyモデル定義が正しいこと | E-03: L4-13 model.define | ○ |
| C-55 (UT-STO-055) | StoreCurrencyのidプレフィックスがstocurであること | E-03: L5 prefix: "stocur" | ○ |
| C-56 (UT-STO-056) | is_defaultのデフォルト値がfalseであること | E-03: L7 default(false) | ○ |
| C-57 (UT-STO-057) | StoreCurrencyからStoreへのリレーション | E-03: L8-12 belongsTo | ○ |
| C-58 (UT-STO-058) | StoreLocaleモデル定義が正しいこと | E-04: L7-21 model.define | ○ |
| C-59 (UT-STO-059) | StoreLocaleのidプレフィックスがstlocであること | E-04: L8 prefix: "stloc" | ○ |
| C-60 (UT-STO-060) | StoreLocaleからStoreへのリレーション | E-04: L16-20 belongsTo | ○ |
| C-61 (UT-STO-061) | StoreModuleが正しくエクスポートされること | E-06: L4-6 Module export | ○ |

### 内部メソッド

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-62 (UT-STO-062) | 内部create処理が正しく動作すること | E-01: L81-96 create_ | ○ |
| C-63 (UT-STO-063) | upsertWithReplaceが正しいリレーションで呼び出される | E-01: L92 relations引数 | ○ |
| C-64 (UT-STO-064) | 内部update処理が正しく動作すること | E-01: L193-208 update_ | ○ |
| C-65 (UT-STO-065) | idありデータはupdate_に振り分け | E-01: L126-128 forUpdate | ○ |
| C-66 (UT-STO-066) | idなしデータはcreate_に振り分け | E-01: L129-131 forCreate | ○ |
| C-67 (UT-STO-067) | promiseAllで並列実行されること | E-01: L142 promiseAll(operations) | ○ |

### デコレータ

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-68 (UT-STO-068) | createStores @InjectManager | E-01: L65 | ○ |
| C-69 (UT-STO-069) | createStores @EmitEvents | E-01: L66 | ○ |
| C-70 (UT-STO-070) | updateStores @InjectManager | E-01: L160 | ○ |
| C-71 (UT-STO-071) | updateStores @EmitEvents | E-01: L161 | ○ |
| C-72 (UT-STO-072) | upsertStores @InjectManager | E-01: L107 | ○ |
| C-73 (UT-STO-073) | upsertStores @EmitEvents | E-01: L108 | ○ |
| C-74 (UT-STO-074) | create_ @InjectTransactionManager | E-01: L81 | ○ |
| C-75 (UT-STO-075) | update_ @InjectTransactionManager | E-01: L193 | ○ |
| C-76 (UT-STO-076) | upsertStores_ @InjectTransactionManager | E-01: L120 | ○ |

## 4) 不足情報（Unknown / Missing）

- **UT-STO-018（空配列upsert）**: 空配列が入力された場合の挙動がコードから明示的に読み取れない。`promiseAll([])`の結果が空配列になることは推測されるが、明示的なテストが望ましい。
  - 候補：統合テスト / ユニットテストで実際に確認

- **UT-STO-031（0件マッチ更新）**: セレクタに一致するストアが0件の場合、`storeService_.list`が空配列を返し、その後`update_`が空配列で呼ばれることが推測されるが、明示的な仕様としては記載されていない。
  - 候補：API仕様書 / 統合テスト

- **UT-STO-045（複数重複検出）**: `getDuplicates`関数は`@medusajs/framework/utils`からインポートされており、その実装詳細は本モジュール外にある。
  - 候補：`@medusajs/framework/utils`のソースコード

- **UT-STO-052/053（カスケード削除）**: モデル定義では`cascades.delete`が設定されているが、実際のDB削除挙動はORMの実装に依存する。
  - 候補：統合テスト / ORMドキュメント

## 5) リスクフラグ（レビュー観点）

- **0（低リスク）**: デコレータ関連のテストケース（C-68〜C-76） - デコレータの存在確認のみで、実際の動作はフレームワークに依存
- **1（中リスク）**: 境界値テストケース（空配列、1件のみ） - エッジケースの挙動確認
- **2（高リスク）**: バリデーション関連のテストケース（C-07〜C-10, C-27〜C-30） - ビジネスルールの正確性に直結

## 6) レビュアーチェックリスト（最小）

- [ ] デフォルト通貨のバリデーションロジックが仕様と一致しているか確認
- [ ] 通貨コードの小文字正規化が全ての入力パスで適用されているか確認
- [ ] カスケード削除の挙動が期待通りか統合テストで確認
- [ ] 空配列入力時の挙動が明確か確認
- [ ] `getDuplicates`関数の挙動（複数重複検出）が期待通りか確認
- [ ] セレクタに一致するストアが0件の場合のAPI応答が仕様と一致しているか確認
