---
generated_at: 2026-01-29 21:30:00
metrics:
  claims_total: 243
  claims_with_evidence: 238
  claims_without_evidence: 5
confidence_derived: 0.98
---

# 根拠レポート: plugin モジュール 単体テストケース一覧

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.98**
  - 根拠あり：238 / 243、根拠なし：5
- 優先レビュー（高）
  1. **scan_receive_item詳細フロー**: ValidationErrorの全パターン網羅が必要
  2. **get_git_log**: テスト環境でのgitリポジトリ依存動作確認
  3. **plugin_dirs カスタムディレクトリ**: 環境依存のパス処理
  4. **PluginConfig.meta初期化**: 動的属性取得のエッジケース
  5. **ScheduleMixin タスク登録**: django_q.Scheduleモデル依存

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

- E-01: `src/backend/InvenTree/plugin/models.py` - PluginConfig, PluginSetting, PluginUserSettingモデル定義
- E-02: `src/backend/InvenTree/plugin/plugin.py` - InvenTreePlugin基底クラス、MetaBase、MixinBase、VersionMixin
- E-03: `src/backend/InvenTree/plugin/registry.py` - PluginsRegistryクラス、プラグイン管理ロジック
- E-04: `src/backend/InvenTree/plugin/helpers.py` - IntegrationPluginError、ヘルパー関数群
- E-05: `src/backend/InvenTree/plugin/installer.py` - pip_command、install_plugin、uninstall_plugin
- E-06: `src/backend/InvenTree/plugin/events.py` - PluginEvents、trigger_event、register_event、process_event
- E-07: `src/backend/InvenTree/plugin/staticfiles.py` - 静的ファイル管理関数群
- E-08: `src/backend/InvenTree/plugin/serializers.py` - API用シリアライザ群
- E-09: `src/backend/InvenTree/plugin/api.py` - REST APIビュー、フィルタクラス
- E-10: `src/backend/InvenTree/plugin/base/integration/SettingsMixin.py` - 設定管理mixin
- E-11: `src/backend/InvenTree/plugin/base/integration/ValidationMixin.py` - バリデーションmixin
- E-12: `src/backend/InvenTree/plugin/base/integration/ScheduleMixin.py` - スケジュールタスクmixin
- E-13: `src/backend/InvenTree/plugin/base/event/mixins.py` - イベント処理mixin
- E-14: `src/backend/InvenTree/plugin/base/barcodes/mixins.py` - バーコード処理mixin
- E-15: `src/backend/InvenTree/plugin/base/event/events.py` - イベントトリガー・処理ロジック
- E-16: `src/backend/InvenTree/plugin/mixins/__init__.py` - 利用可能なmixin一覧

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

### PluginConfig モデル (UT-PLG-001 ~ UT-PLG-028)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | PluginConfig.__str__がアクティブ状態で異なる文字列を返す | E-01 L72-77 | ○ |
| C-02 | PluginConfig.get_api_urlが正しいURLを返す | E-01 L31-34 | ○ |
| C-03 | PluginConfig.mixinsがget_registered_mixinsを呼び出す | E-01 L80-89 | ○ |
| C-04 | PluginConfig.__init__でmeta属性が初期化される | E-01 L93-136 | ○ |
| C-05 | PluginConfig.__getstate__でpluginがpickle除外される | E-01 L137-143 | ○ |
| C-06 | PluginConfig.saveでmandatoryプラグインがactive強制 | E-01 L145-165 | ○ |
| C-07 | PluginConfig.is_installedがplugin存在で判定 | E-01 L167-174 | ○ |
| C-08 | PluginConfig.is_sampleがcheck_is_sampleを呼ぶ | E-01 L176-182 | ○ |
| C-09 | PluginConfig.is_builtinがcheck_is_builtinを呼ぶ | E-01 L184-190 | ○ |
| C-10 | PluginConfig.is_mandatoryがPLUGINS_MANDATORYをチェック | E-01 L192-201 | ○ |
| C-11 | PluginConfig.is_activeがmandatoryで常にTrue | E-01 L203-208 | ○ |
| C-12 | PluginConfig.is_packageがpackage_nameで判定 | E-01 L210-220 | ○ |
| C-13 | PluginConfig.admin_sourceがget_admin_sourceを呼ぶ | E-01 L222-240 | ○ |
| C-14 | PluginConfig.admin_contextがget_admin_contextを呼ぶ | E-01 L242-257 | ○ |
| C-15 | PluginConfig.activateがイベントトリガーとタスクオフロード | E-01 L259-279 | ○ |

### PluginSetting / PluginUserSetting モデル (UT-PLG-029 ~ UT-PLG-033)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-16 | PluginSetting.to_native_valueがget_settingを呼ぶ | E-01 L293-295 | ○ |
| C-17 | PluginSetting.get_setting_definitionがmixins_settingsを参照 | E-01 L305-325 | ○ |
| C-18 | PluginUserSetting.__str__が適切なフォーマット | E-01 L360-362 | ○ |
| C-19 | PluginUserSetting.get_setting_definitionがmixins_user_settingsを参照 | E-01 L364-384 | ○ |

### InvenTreePlugin クラス (UT-PLG-034 ~ UT-PLG-067)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-20 | InvenTreePlugin.__init__でBASE mixinが追加される | E-02 L312-320 | ○ |
| C-21 | __init_subclass__でfinalメソッドオーバーライド検出 | E-02 L322-341 | ○ |
| C-22 | file/pathがPathオブジェクトを返す | E-02 L343-353 | ○ |
| C-23 | プロパティname/slug/human_nameが正しく動作 | E-02 L126-166 | ○ |
| C-24 | descriptionがDESCRIPTIONまたはNAMEを返す | E-02 L371-378 | ○ |
| C-25 | author/version/website/licenseが_get_valueを使用 | E-02 L380-417 | ○ |
| C-26 | check_versionがMIN/MAX_VERSIONで範囲チェック | E-02 L283-292 | ○ |
| C-27 | is_activeがis_mandatoryまたはconfig.is_activeをチェック | E-02 L175-187 | ○ |
| C-28 | check_is_sample/check_is_builtinがpackage_pathをチェック | E-02 L433-454 | ○ |
| C-29 | plugin_static_fileがDEBUG設定で異なるURLを返す | E-02 L581-611 | ○ |
| C-30 | get_admin_sourceがADMIN_SOURCEを使用 | E-02 L613-621 | ○ |

### MixinBase クラス (UT-PLG-058 ~ UT-PLG-067)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-31 | mixin/mixin_enabledが_mixinsをチェック | E-02 L202-227 | ○ |
| C-32 | add_mixinが_mixinsと_mixinregを更新 | E-02 L229-248 | ○ |
| C-33 | get_registered_mixinsがwith_base/with_clsオプションをサポート | E-02 L250-268 | ○ |

### MetaBase クラス
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-34 | get_meta_valueがold_keyで警告を出す | E-02 L95-123 | ○ |
| C-35 | plugin_name/plugin_slugがget_meta_valueを使用 | E-02 L125-152 | ○ |

### PluginsRegistry クラス (UT-PLG-068 ~ UT-PLG-096)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-36 | __init__でplugins系dictが初期化 | E-03 L107-139 | ○ |
| C-37 | is_ready/is_loadingがフラグ/ロックをチェック | E-03 L171-179 | ○ |
| C-38 | get_pluginがslug/active/with_mixinでフィルタ | E-03 L181-213 | ○ |
| C-39 | get_plugin_configが存在しない場合に作成 | E-03 L215-250 | ○ |
| C-40 | set_plugin_stateがcfg.activeを更新しハッシュ更新 | E-03 L252-269 | ○ |
| C-41 | call_plugin_functionがプラグインのメソッドを呼び出す | E-03 L271-296 | ○ |
| C-42 | with_mixinがmixin/active/builtinでフィルタ | E-03 L300-356 | ○ |
| C-43 | reload_pluginsがロック取得し_unload/_loadを実行 | E-03 L409-489 | ○ |
| C-44 | plugin_dirsがPLUGINS_ENABLED設定でディレクトリを返す | E-03 L491-555 | ○ |
| C-45 | collect_pluginsがモジュールからプラグインを収集 | E-03 L557-618 | ○ |
| C-46 | calculate_plugin_hashがMD5ハッシュを計算 | E-03 L1007-1033 | ○ |
| C-47 | check_reloadがハッシュ比較でリロード判定 | E-03 L1035-1073 | ○ |

### helpers モジュール (UT-PLG-097 ~ UT-PLG-106)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-48 | IntegrationPluginErrorがpath/messageを保持 | E-04 L23-38 | ○ |
| C-49 | log_registry_errorがregistry.errorsに追加 | E-04 L52-61 | ○ |
| C-50 | handle_errorがIntegrationPluginErrorをラップ | E-04 L64-106 | ○ |
| C-51 | get_entrypointsがinventree_pluginsを返す | E-04 L109-114 | ○ |
| C-52 | get_git_logがdulwichを使用してgit情報取得 | E-04 L121-164 | △ |
| C-53 | get_modules/get_classes/get_pluginsがモジュール探索 | E-04 L171-242 | ○ |

### installer モジュール (UT-PLG-107 ~ UT-PLG-130)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-54 | pip_commandがsubprocess.check_outputを実行 | E-05 L20-40 | ○ |
| C-55 | handle_pip_errorがValidationErrorを発生 | E-05 L43-67 | ○ |
| C-56 | get_install_infoがpip showを実行 | E-05 L70-106 | ○ |
| C-57 | plugins_file_hashがSHA256ハッシュを計算 | E-05 L109-124 | ○ |
| C-58 | install_plugins_fileがpip install -r を実行 | E-05 L127-158 | ○ |
| C-59 | update_plugins_fileがファイルを読み書き | E-05 L161-227 | ○ |
| C-60 | install_pluginがURL/packagenameでインストール | E-05 L230-305 | ○ |
| C-61 | validate_package_pluginが各種チェックを実行 | E-05 L308-320 | ○ |
| C-62 | uninstall_pluginがactive/mandatory/sample/builtinチェック | E-05 L323-395 | ○ |

### events モジュール (UT-PLG-131 ~ UT-PLG-141)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-63 | trigger_eventがENABLE_PLUGINS_EVENTSをチェック | E-15 L22-58 | ○ |
| C-64 | register_eventがwith_mixinでプラグインを取得 | E-15 L61-91 | ○ |
| C-65 | process_eventがplugin.process_eventを呼び出す | E-15 L94-115 | ○ |
| C-66 | allow_table_eventがプレフィックス/リストでフィルタ | E-15 L118-161 | ○ |
| C-67 | after_save/after_deleteがイベントをトリガー | E-15 L164-196 | ○ |

### staticfiles モジュール (UT-PLG-142 ~ UT-PLG-148)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-68 | clear_static_dirが再帰的にファイル削除 | E-07 L12-35 | ○ |
| C-69 | collect_plugins_static_filesが全プラグインを処理 | E-07 L38-45 | ○ |
| C-70 | clear_plugins_static_filesが不要ディレクトリを削除 | E-07 L48-65 | ○ |
| C-71 | copy_plugin_static_filesがファイルをコピー | E-07 L68-118 | ○ |

### SettingsMixin (UT-PLG-149 ~ UT-PLG-159)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-72 | __init__でsettings mixinが登録される | E-10 L38-43 | ○ |
| C-73 | has_settingsがsettings/user_settingsをチェック | E-10 L72-75 | ○ |
| C-74 | get_setting/set_settingがPluginSettingを操作 | E-10 L77-116 | ○ |
| C-75 | get_user_setting/set_user_settingがPluginUserSettingを操作 | E-10 L118-161 | ○ |
| C-76 | check_settingsが必須設定をチェック | E-10 L163-176 | ○ |
| C-77 | get_settings_dictが全設定を返す | E-10 L178-205 | ○ |

### ValidationMixin (UT-PLG-160 ~ UT-PLG-172)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-78 | __init__でvalidation mixinが登録される | E-11 L48-51 | ○ |
| C-79 | raise_errorがValidationErrorを発生 | E-11 L53-55 | ○ |
| C-80 | validate_*メソッドがデフォルトでNoneを返す | E-11 L57-246 | ○ |

### EventMixin (UT-PLG-173 ~ UT-PLG-175)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-81 | __init__でevents mixinが登録される | E-13 L34-37 | ○ |
| C-82 | wants_process_eventがデフォルトでTrueを返す | E-13 L13-19 | ○ |
| C-83 | process_eventがMixinNotImplementedErrorを発生 | E-13 L21-27 | ○ |

### ScheduleMixin (UT-PLG-176 ~ UT-PLG-188)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-84 | __init__でschedule mixinが登録される | E-12 L52-58 | ○ |
| C-85 | has_scheduled_tasksがSCHEDULED_TASKSをチェック | E-12 L113-116 | ○ |
| C-86 | validate_scheduled_tasksが必須フィールドをチェック | E-12 L118-145 | ○ |
| C-87 | get_task_name/get_task_namesがタスク名を生成 | E-12 L147-156 | ○ |
| C-88 | register_tasksがScheduleを作成/更新 | E-12 L158-211 | ○ |
| C-89 | unregister_tasksがScheduleを削除 | E-12 L213-228 | ○ |

### BarcodeMixin (UT-PLG-189 ~ UT-PLG-194)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-90 | __init__でbarcode mixinが登録される | E-14 L35-38 | ○ |
| C-91 | has_barcodeが常にTrueを返す | E-14 L40-43 | ○ |
| C-92 | scanがデフォルトでNoneを返す | E-14 L45-56 | ○ |
| C-93 | has_barcode_generationがgenerate実装をチェック | E-14 L58-70 | ○ |
| C-94 | generateがNotImplementedErrorを発生 | E-14 L72-80 | ○ |

### SupplierBarcodeMixin (UT-PLG-195 ~ UT-PLG-218)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-95 | __init__でsupplier-barcode mixinが登録される | E-14 L105-108 | ○ |
| C-96 | get_field_valueがbarcode_fieldsから取得 | E-14 L110-114 | ○ |
| C-97 | quantity/supplier_part_numberがget_field_valueを使用 | E-14 L121-129 | ○ |
| C-98 | get_supplier_part/get_manufacturer_partがDB検索 | E-14 L131-205 | ○ |
| C-99 | get_purchase_orderがcustomer/supplier order numberで検索 | E-14 L217-246 | ○ |
| C-100 | extract_barcode_fieldsがNotImplementedErrorを発生 | E-14 L248-262 | ○ |
| C-101 | scanがマッチ結果をdictで返す | E-14 L264-311 | ○ |
| C-102 | scan_receive_itemが受入処理を実行 | E-14 L313-432 | △ |
| C-103 | get_supplierがSUPPLIER_ID設定を使用 | E-14 L434-470 | ○ |
| C-104 | parse_ecia_barcode2d/parse_isoiec_15434_barcode2dがパース | E-14 L472-558 | ○ |

### serializers モジュール (UT-PLG-219 ~ UT-PLG-230)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-105 | MetadataSerializer.updateがpartialでマージ | E-08 L29-42 | ○ |
| C-106 | PluginConfigInstallSerializer.validateが必須チェック | E-08 L141-155 | ○ |
| C-107 | PluginConfigInstallSerializer.saveがinstall_pluginを呼ぶ | E-08 L157-170 | ○ |
| C-108 | PluginReloadSerializer.saveがreload_pluginsを呼ぶ | E-08 L208-217 | ○ |
| C-109 | PluginActivateSerializer.updateがactivateを呼ぶ | E-08 L237-247 | ○ |
| C-110 | PluginUninstallSerializer.updateがuninstall_pluginを呼ぶ | E-08 L265-273 | ○ |
| C-111 | PluginRelationSerializerがslugで検索/返却 | E-08 L322-343 | ○ |

### api モジュール (UT-PLG-231 ~ UT-PLG-243)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-112 | PluginFilter.filter_mixinがカンマ区切りでフィルタ | E-09 L53-77 | ○ |
| C-113 | PluginFilter.filter_builtin/mandatory/sample/installedが各フラグでフィルタ | E-09 L79-134 | ○ |
| C-114 | PluginDetail.deleteがactive時にエラー | E-09 L181-193 | ○ |
| C-115 | check_pluginがslug/pk/active/installedをチェック | E-09 L310-358 | ○ |
| C-116 | RegistryStatusView.getがエラーリストを返す | E-09 L480-509 | ○ |

## 4) 不足情報（Unknown / Missing）
- **C-52 (get_git_log)**: dulwichライブラリの動作がgitリポジトリ環境に依存するため、テスト環境での挙動確認が必要
  - 候補：モック使用 / 実gitリポジトリでのテスト / CI環境設定
- **C-102 (scan_receive_item)**: 複数のValidationErrorパターン(サプライヤー不一致、ライン完了済み等)の網羅性
  - 候補：エッジケース追加 / 統合テストでの確認
- **plugin_dirs カスタムディレクトリ**: INVENTREE_PLUGIN_TEST_DIR環境変数依存のパス処理
  - 候補：環境変数モック / 一時ディレクトリ使用
- **PluginConfig.meta動的初期化**: getattr+条件分岐のエッジケース
  - 候補：Noneケース追加テスト
- **ScheduleMixin django_q依存**: Schedule.objects操作がdjango_qモデルに依存
  - 候補：モデルモック / django_qテスト環境

## 5) リスクフラグ（レビュー観点）
- **1: 中リスク** - プラグインインストール/アンインストール処理 (UT-PLG-107~130)
  - pip操作がシステムに影響を与える可能性、テスト環境の分離が重要
- **1: 中リスク** - レジストリリロード処理 (UT-PLG-085~087)
  - 並行アクセス時のロック競合、プラグイン状態の不整合リスク
- **1: 中リスク** - イベント処理 (UT-PLG-131~141)
  - 非同期処理のタイミング依存、バックグラウンドワーカー連携
- **0: 低リスク** - モデルの基本的なCRUD操作
- **0: 低リスク** - シリアライザの入出力検証

## 6) レビュアーチェックリスト（最小）
- [ ] PluginConfig.saveのレジストリリロードトリガー条件が正確か確認
- [ ] install_plugin/uninstall_pluginの権限チェックが十分か確認
- [ ] SupplierBarcodeMixin.scan_receive_itemの全エラーパターンがカバーされているか確認
- [ ] ScheduleMixin.register_tasksのdjango_qモデル操作が正確か確認
- [ ] check_pluginのNotFound例外メッセージが適切か確認
- [ ] PluginFilter各メソッドのフィルタロジックがQuerySetを正しく返すか確認
- [ ] is_mandatory判定がsettings.PLUGINS_MANDATORYとregistry.MANDATORY_PLUGINSの両方を考慮しているか確認
