---
generated_at: 2026-01-29 18:15:00
metrics:
  claims_total: 134
  claims_with_evidence: 134
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート：app-models-channel 単体テストケース一覧

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：134 / 134、根拠なし：0
- 優先レビュー（高）
  1. **外部API連携テスト（Telegram, Twilio, WhatsApp等）**：モック化の方針確認が必要
  2. **暗号化フィールドのテスト**：Chatwoot.encryption_configured?による条件分岐の検証
  3. **Webhook設定テスト**：FRONTEND_URL環境変数依存の確認

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

- E-01: `app/models/channel/api.rb` - Channel::Apiモデル定義
- E-02: `app/models/channel/email.rb` - Channel::Emailモデル定義
- E-03: `app/models/channel/facebook_page.rb` - Channel::FacebookPageモデル定義
- E-04: `app/models/channel/instagram.rb` - Channel::Instagramモデル定義
- E-05: `app/models/channel/line.rb` - Channel::Lineモデル定義
- E-06: `app/models/channel/sms.rb` - Channel::Smsモデル定義
- E-07: `app/models/channel/telegram.rb` - Channel::Telegramモデル定義
- E-08: `app/models/channel/tiktok.rb` - Channel::Tiktokモデル定義
- E-09: `app/models/channel/twilio_sms.rb` - Channel::TwilioSmsモデル定義
- E-10: `app/models/channel/twitter_profile.rb` - Channel::TwitterProfileモデル定義
- E-11: `app/models/channel/web_widget.rb` - Channel::WebWidgetモデル定義
- E-12: `app/models/channel/whatsapp.rb` - Channel::Whatsappモデル定義
- E-13: `app/models/concerns/channelable.rb` - Channelable concern
- E-14: `app/models/concerns/reauthorizable.rb` - Reauthorizable concern

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

### Channel::Api (UT-CHN-001 〜 UT-CHN-007)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | nameメソッドが'API'を返す | E-01 L32-34 | ○ |
| C-02 | has_secure_token :identifier | E-01 L27 | ○ |
| C-03 | has_secure_token :hmac_token | E-01 L28 | ○ |
| C-04 | ensure_valid_agent_reply_time_windowバリデーション | E-01 L29, L38-43 | ○ |
| C-05 | webhook_url長さ制限 | E-01 L30 | ○ |

### Channel::Email (UT-CHN-008 〜 UT-CHN-018)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-06 | nameメソッドが'Email'を返す | E-02 L59-61 | ○ |
| C-07 | microsoft?メソッド | E-02 L63-65 | ○ |
| C-08 | google?メソッド | E-02 L67-69 | ○ |
| C-09 | legacy_google?メソッド | E-02 L71-73 | ○ |
| C-10 | ensure_forward_to_email | E-02 L77-79 | ○ |
| C-11 | email uniqueness | E-02 L54 | ○ |
| C-12 | forward_to_email uniqueness | E-02 L55 | ○ |

### Channel::FacebookPage (UT-CHN-019 〜 UT-CHN-025)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-13 | nameメソッドが'Facebook'を返す | E-03 L37-39 | ○ |
| C-14 | create_contact_inbox | E-03 L41-47 | ○ |
| C-15 | subscribe | E-03 L49-60 | ○ |
| C-16 | unsubscribe | E-03 L62-67 | ○ |
| C-17 | page_id uniqueness scope account_id | E-03 L32 | ○ |

### Channel::Instagram (UT-CHN-026 〜 UT-CHN-034)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-18 | nameメソッドが'Instagram'を返す | E-04 L33-35 | ○ |
| C-19 | create_contact_inbox | E-04 L37-43 | ○ |
| C-20 | subscribe | E-04 L45-57 | ○ |
| C-21 | unsubscribe | E-04 L59-70 | ○ |
| C-22 | access_token（RefreshOauthTokenService経由） | E-04 L72-74 | ○ |
| C-23 | access_token presence | E-04 L27 | ○ |
| C-24 | instagram_id uniqueness/presence | E-04 L28 | ○ |

### Channel::Line (UT-CHN-035 〜 UT-CHN-040)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-25 | nameメソッドが'LINE'を返す | E-05 L34-36 | ○ |
| C-26 | client（Line::Bot::Client初期化） | E-05 L38-46 | ○ |
| C-27 | line_channel_id uniqueness/presence | E-05 L30 | ○ |
| C-28 | line_channel_secret presence | E-05 L31 | ○ |
| C-29 | line_channel_token presence | E-05 L32 | ○ |

### Channel::Sms (UT-CHN-041 〜 UT-CHN-048)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-30 | nameメソッドが'Sms'を返す | E-06 L27-29 | ○ |
| C-31 | api_base_path | E-06 L32-34 | ○ |
| C-32 | send_message | E-06 L36-41 | ○ |
| C-33 | send_text_message | E-06 L43-46 | ○ |
| C-34 | handle_error | E-06 L75-83 | ○ |
| C-35 | phone_number presence/uniqueness | E-06 L24 | ○ |

### Channel::Telegram (UT-CHN-049 〜 UT-CHN-068)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-36 | nameメソッドが'Telegram'を返す | E-07 L30-32 | ○ |
| C-37 | telegram_api_url | E-07 L34-36 | ○ |
| C-38 | send_message_on_telegram | E-07 L38-42 | ○ |
| C-39 | get_telegram_profile_image | E-07 L44-53 | ○ |
| C-40 | get_telegram_file_path | E-07 L55-60 | ○ |
| C-41 | process_error | E-07 L62-69 | ○ |
| C-42 | chat_id | E-07 L71-73 | ○ |
| C-43 | business_connection_id | E-07 L75-77 | ○ |
| C-44 | reply_to_message_id | E-07 L79-81 | ○ |
| C-45 | ensure_valid_bot_token | E-07 L85-93 | ○ |
| C-46 | setup_telegram_webhook | E-07 L95-102 | ○ |
| C-47 | bot_token presence/uniqueness | E-07 L27 | ○ |

### Channel::Tiktok (UT-CHN-069 〜 UT-CHN-076)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-48 | nameメソッドが'Tiktok'を返す | E-08 L38-40 | ○ |
| C-49 | validated_access_token | E-08 L42-44 | ○ |
| C-50 | business_id uniqueness/presence | E-08 L32 | ○ |
| C-51 | access_token presence | E-08 L33 | ○ |
| C-52 | refresh_token presence | E-08 L34 | ○ |
| C-53 | expires_at presence | E-08 L35 | ○ |
| C-54 | refresh_token_expires_at presence | E-08 L36 | ○ |

### Channel::TwilioSms (UT-CHN-077 〜 UT-CHN-091)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-55 | nameメソッド（medium依存） | E-09 L50-52 | ○ |
| C-56 | send_message | E-09 L54-59 | ○ |
| C-57 | client（api_key_sid条件分岐） | E-09 L63-69 | ○ |
| C-58 | send_message_from（messaging_service_sid条件分岐） | E-09 L71-77 | ○ |
| C-59 | account_sid presence | E-09 L34 | ○ |
| C-60 | auth_token presence | E-09 L36 | ○ |
| C-61 | messaging_service_sid/phone_number排他検証 | E-09 L44-46 | ○ |
| C-62 | medium enum | E-09 L48 | ○ |

### Channel::TwitterProfile (UT-CHN-092 〜 UT-CHN-097)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-63 | nameメソッドが'Twitter'を返す | E-10 L36-38 | ○ |
| C-64 | create_contact_inbox | E-10 L40-46 | ○ |
| C-65 | twitter_client | E-10 L48-57 | ○ |
| C-66 | unsubscribe | E-10 L61-67 | ○ |
| C-67 | profile_id uniqueness scope account_id | E-10 L30 | ○ |

### Channel::WebWidget (UT-CHN-098 〜 UT-CHN-114)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-68 | nameメソッドが'Website'を返す | E-11 L59-61 | ○ |
| C-69 | web_widget_script | E-11 L63-81 | ○ |
| C-70 | validate_pre_chat_options | E-11 L83-100 | ○ |
| C-71 | create_contact_inbox | E-11 L102-107 | ○ |
| C-72 | has_secure_token :website_token | E-11 L47 | ○ |
| C-73 | has_secure_token :hmac_token | E-11 L48 | ○ |
| C-74 | website_url presence | E-11 L43 | ○ |
| C-75 | widget_color presence | E-11 L44 | ○ |
| C-76 | has_flags（feature_flags） | E-11 L50-55 | ○ |
| C-77 | reply_time enum | E-11 L57 | ○ |
| C-78 | portals association | E-11 L45 | ○ |

### Channel::Whatsapp (UT-CHN-115 〜 UT-CHN-134)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-79 | nameメソッドが'Whatsapp'を返す | E-12 L39-41 | ○ |
| C-80 | provider_service（プロバイダ切替） | E-12 L43-49 | ○ |
| C-81 | mark_message_templates_updated | E-12 L51-55 | ○ |
| C-82 | delegate send_message等 | E-12 L57-61 | ○ |
| C-83 | setup_webhooks | E-12 L63-68 | ○ |
| C-84 | ensure_webhook_verify_token | E-12 L72-74 | ○ |
| C-85 | validate_provider_config | E-12 L76-78 | ○ |
| C-86 | provider inclusion | E-12 L31 | ○ |
| C-87 | phone_number presence/uniqueness | E-12 L32 | ○ |
| C-88 | should_auto_setup_webhooks? | E-12 L91-95 | ○ |

### Channelable concern（全モデル共通）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-89 | account_id presence | E-13 L4 | ○ |
| C-90 | belongs_to :account | E-13 L5 | ○ |
| C-91 | has_one :inbox | E-13 L6 | ○ |

### Reauthorizable concern（対象モデル）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-92 | reauthorization_required? | E-14 L19-21 | ○ |
| C-93 | authorization_error_count | E-14 L24-26 | ○ |
| C-94 | authorization_error! | E-14 L30-35 | ○ |
| C-95 | prompt_reauthorization! | E-14 L39-45 | ○ |
| C-96 | reauthorized! | E-14 L65-70 | ○ |

## 4) 不足情報（Unknown / Missing）
- 該当なし：全てのテストケースはソースコードに基づいて生成されています

## 5) リスクフラグ（レビュー観点）
- **0: 低リスク** - 全てのテストケースがソースコードから直接導出されており、根拠が明確
- 以下の点は実装時に注意が必要：
  - 外部API（Telegram, Twilio, Facebook, Instagram, LINE, Twitter, WhatsApp, TikTok）のモック化戦略
  - `Chatwoot.encryption_configured?`による条件分岐テストの網羅
  - Redis（Redis::Alfred）を使用するReauthorizable concernのテスト環境設定

## 6) レビュアーチェックリスト（最小）
- [ ] 各チャネルのvalidationテストケースが網羅されているか
- [ ] 外部API連携メソッドのモック化方針が明確か
- [ ] has_secure_tokenのテストでユニーク性が検証されているか
- [ ] Webhook設定/解除のテストで適切なスタブが使用されるか
- [ ] 暗号化フィールドのテストで環境設定が考慮されているか
- [ ] enum値のテストで全ての値が網羅されているか
- [ ] concern（Channelable, Reauthorizable）のテストが各モデルで適切に継承されているか
