---
generated_at: 2026-01-29 20:30:00
metrics:
  claims_total: 145
  claims_with_evidence: 142
  claims_without_evidence: 3
confidence_derived: 0.98
---

# 根拠レポート：importer単体テストケース一覧

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.98**
  - 根拠あり：142 / 145、根拠なし：3
- 優先レビュー（高）
  1. **UT-IMP-073**: バリデーションエラー時の詳細なエラーメッセージ形式の確認が必要
  2. **UT-IMP-079**: ID形式エラー時の具体的なエラーメッセージの確認が必要
  3. **UT-IMP-124**: check_daily_holdoffの正確な動作仕様の確認が必要

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

- E-01: `src/backend/InvenTree/importer/models.py` - DataImportSession, DataImportColumnMap, DataImportRowモデル定義
- E-02: `src/backend/InvenTree/importer/mixins.py` - DataImportSerializerMixinクラス定義
- E-03: `src/backend/InvenTree/importer/serializers.py` - シリアライザクラス定義
- E-04: `src/backend/InvenTree/importer/validators.py` - バリデーション関数定義
- E-05: `src/backend/InvenTree/importer/operations.py` - データ操作関数定義
- E-06: `src/backend/InvenTree/importer/registry.py` - シリアライザレジストリ定義
- E-07: `src/backend/InvenTree/importer/tasks.py` - 非同期タスク定義
- E-08: `src/backend/InvenTree/importer/status_codes.py` - ステータスコード定義
- E-09: `src/backend/InvenTree/importer/api.py` - APIエンドポイント定義
- E-10: `src/backend/InvenTree/importer/tests.py` - 既存テストコード

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

### DataImportSessionモデル（UT-IMP-001〜033）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | DataImportSession.save()で新規作成時に初期設定が実行される | E-01 (L55-68) | ○ |
| C-02 | DataImportSession.save()で既存更新時は初期設定がスキップされる | E-01 (L57: initial = self.pk is None) | ○ |
| C-03 | get_api_urlがreverse('api-importer-session-list')を返す | E-01 (L51-53) | ○ |
| C-04 | field_mappingプロパティがfield:column辞書を返す | E-01 (L130-137) | ○ |
| C-05 | model_classがserializer.Meta.modelを返す | E-01 (L139-146) | ○ |
| C-06 | serializer_classがsupported_models()から取得される | E-01 (L147-152) | ○ |
| C-07 | extract_columnsがカラム名を抽出し、マッピングを作成する | E-01 (L154-225), E-10 (L40-54) | ○ |
| C-08 | accept_mappingが必須フィールドをチェックする | E-01 (L227-264) | ○ |
| C-09 | trigger_data_importがoffload_taskを呼び出す | E-01 (L266-277) | ○ |
| C-10 | import_dataがDataImportRowを作成する | E-01 (L279-322), E-10 (L57-58) | ○ |
| C-11 | check_completeが全行完了時にTrueを返す | E-01 (L324-334) | ○ |
| C-12 | row_countがrows.count()を返す | E-01 (L336-339) | ○ |
| C-13 | completed_row_countがcomplete=Trueの行数を返す | E-01 (L341-344) | ○ |
| C-14 | available_fieldsがInvenTreeMetadataを使用してフィールド情報を返す | E-01 (L346-380) | ○ |
| C-15 | required_fieldsがrequired=Trueのフィールドを返す | E-01 (L382-396) | ○ |

### DataImportColumnMapモデル（UT-IMP-034〜049）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-16 | DataImportColumnMap.save()がcleanとvalidate_uniqueを呼ぶ | E-01 (L412-417) | ○ |
| C-17 | validate_uniqueが同一カラムの重複を検出する | E-01 (L419-436) | ○ |
| C-18 | cleanがsession必須をチェックする | E-01 (L438-445) | ○ |
| C-19 | cleanがカラム存在をチェックする | E-01 (L447-449) | ○ |
| C-20 | cleanがフィールド存在とread_onlyをチェックする | E-01 (L452-460) | ○ |
| C-21 | field_definitionがフィールド定義を返す | E-01 (L486-490) | ○ |
| C-22 | labelプロパティがフィールドラベルを返す | E-01 (L492-496) | ○ |
| C-23 | descriptionプロパティがhelp_textまたはlabelを返す | E-01 (L498-509) | ○ |

### DataImportRowモデル（UT-IMP-050〜079）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-24 | DataImportRow.save()がvalidateを呼ぶ | E-01 (L528-531) | ○ |
| C-25 | default_valuesがsession.field_defaultsを返す | E-01 (L554-566) | ○ |
| C-26 | override_valuesがsession.field_overridesを返す | E-01 (L568-580) | ○ |
| C-27 | extract_dataがフィールドマッピングに従ってデータを抽出する | E-01 (L582-668) | ○ |
| C-28 | extract_dataがbooleanフィールドを変換する | E-01 (L622-623) | ○ |
| C-29 | extract_dataがchoiceフィールドをマッチングする | E-01 (L632-661) | ○ |
| C-30 | serializer_dataがdefault→data→overrideの順でマージする | E-01 (L670-686) | ○ |
| C-31 | construct_serializerがシリアライザインスタンスを作成する | E-01 (L688-695) | ○ |
| C-32 | validateがシリアライザのis_validを呼ぶ | E-01 (L697-774) | ○ |
| C-33 | validateがupdate_records時にIDをチェックする | E-01 (L714-740) | ○ |
| C-34 | バリデーションエラー時のエラー詳細形式 | E-01 (L756-757) | △ |

### DataImportSerializerMixin（UT-IMP-080〜089）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-35 | __init__がimporting引数を処理する | E-02 (L21-47) | ○ |
| C-36 | get_importable_fieldsがread_onlyフィールドを除外する | E-02 (L49-85) | ○ |
| C-37 | get_importable_fieldsがSerializerサブクラスを除外する | E-02 (L70-72) | ○ |
| C-38 | get_importable_fieldsがFileFieldを除外する | E-02 (L74-75) | ○ |
| C-39 | get_importable_fieldsがTagListSerializerFieldを除外する | E-02 (L78-81) | ○ |

### Validators（UT-IMP-090〜100）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-40 | validate_data_fileがファイルサイズをチェックする | E-04 (L18-21) | ○ |
| C-41 | validate_data_fileがヘッダー存在をチェックする | E-04 (L25-26) | ○ |
| C-42 | validate_data_fileがカラム数制限をチェックする | E-04 (L28-29) | ○ |
| C-43 | validate_data_fileが行数制限をチェックする | E-04 (L31-32) | ○ |
| C-44 | validate_importer_model_typeがsupported_modelsをチェックする | E-04 (L35-40) | ○ |
| C-45 | validate_field_defaultsが辞書またはJSON文字列を受け入れる | E-04 (L43-53) | ○ |

### Operations（UT-IMP-101〜111）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-46 | load_data_fileがtablibを使用してデータを読み込む | E-05 (L14-56) | ○ |
| C-47 | load_data_fileがファイル拡張子から形式を判定する | E-05 (L22-28) | ○ |
| C-48 | extract_column_namesがヘッダーを抽出する | E-05 (L59-85) | ○ |
| C-49 | extract_column_namesが空ヘッダーにデフォルト名を付与する | E-05 (L82-83) | ○ |
| C-50 | get_field_labelがラベルを返す | E-05 (L88-108) | ○ |

### Registry（UT-IMP-112〜119）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-51 | DataImportSerializerRegister.registerが有効なシリアライザを登録する | E-06 (L19-32) | ○ |
| C-52 | registerがDataImportSerializerMixin継承をチェックする | E-06 (L21-23) | ○ |
| C-53 | registerがSerializer継承をチェックする | E-06 (L25-27) | ○ |
| C-54 | registerが重複登録を防止する | E-06 (L31-32) | ○ |
| C-55 | supported_modelsがモデル名:シリアライザの辞書を返す | E-06 (L43-51) | ○ |
| C-56 | register_importerデコレータがシリアライザを登録する | E-06 (L64-71) | ○ |

### Tasks（UT-IMP-120〜124）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-57 | import_dataタスクがsession.import_dataを呼ぶ | E-07 (L13-26) | ○ |
| C-58 | cleanup_import_sessionsが古いセッションを削除する | E-07 (L29-52) | ○ |
| C-59 | cleanup_import_sessionsがcheck_daily_holdoffを使用する | E-07 (L39) | △ |

### Serializers（UT-IMP-125〜140）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-60 | DataImportSessionSerializer.validate_field_defaultsがJSON変換を行う | E-03 (L83-94) | ○ |
| C-61 | DataImportSessionSerializer.validate_field_overridesがJSON変換を行う | E-03 (L96-107) | ○ |
| C-62 | DataImportSessionSerializer.validate_field_filtersがJSON変換を行う | E-03 (L109-120) | ○ |
| C-63 | DataImportSessionSerializer.createがユーザーを設定する | E-03 (L122-133) | ○ |
| C-64 | DataImportAcceptRowSerializer.validate_rowsが行を検証する | E-03 (L181-203) | ○ |
| C-65 | DataImportAcceptRowSerializer.saveが行を完了する | E-03 (L205-217) | ○ |

### Status Codes（UT-IMP-141〜145）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-66 | DataImportStatusCode.INITIAL = 0 | E-08 (L11-15) | ○ |
| C-67 | DataImportStatusCode.MAPPING = 10 | E-08 (L16-20) | ○ |
| C-68 | DataImportStatusCode.IMPORTING = 20 | E-08 (L21) | ○ |
| C-69 | DataImportStatusCode.PROCESSING = 30 | E-08 (L22-26) | ○ |
| C-70 | DataImportStatusCode.COMPLETE = 40 | E-08 (L27) | ○ |

## 4) 不足情報（Unknown / Missing）
- **C-34（UT-IMP-073）**: バリデーションエラー時の具体的なエラーメッセージ形式
  - 候補：DRFのValidationError.detail形式 / Django ValidationError形式
- **C-59（UT-IMP-124）**: check_daily_holdoffの正確な動作仕様
  - 候補：InvenTree.tasks.check_daily_holdoff関数の詳細実装
- **ID形式エラー（UT-IMP-079）**: ValueErrorの具体的なエラーメッセージ
  - 候補：Djangoのモデル.objects.get()の例外メッセージ

## 5) リスクフラグ（レビュー観点）
- **0: 低リスク** - ステータスコード定義、静的メソッド
- **1: 中リスク** - プロパティの戻り値、キャッシュ動作、フォールバック処理
- **2: 高リスク** - データインポート処理、バリデーションロジック、状態遷移、非同期タスク

主な高リスク項目：
- UT-IMP-001〜002: saveメソッドの初期化ロジック
- UT-IMP-014〜017: accept_mappingの必須フィールドチェック
- UT-IMP-020〜023: import_dataのデータ処理
- UT-IMP-071〜079: validateメソッドの複雑なロジック
- UT-IMP-090〜094: ファイルバリデーションの制限値

## 6) レビュアーチェックリスト（最小）
- [ ] DataImportSession.save()の初期化ロジックが実際の動作と一致するか確認
- [ ] accept_mapping()の必須フィールドチェックが網羅的か確認
- [ ] DataImportRow.validate()のupdate_recordsモードの動作を確認
- [ ] validate_data_fileの制限値（IMPORTER_MAX_FILE_SIZE, IMPORTER_MAX_ROWS, IMPORTER_MAX_COLS）が正確か確認
- [ ] cleanup_import_sessionsの実行間隔（5日）が正しいか確認
- [ ] 既存テストコード（E-10）との整合性を確認
