"No","テストID","対象クラス","対象メソッド","テスト観点","テストケース名","前提条件","入力値","期待結果","優先度","備考"
"1","UT-APP-001","Channelable","included","正常系","account_idのpresenceバリデーションが機能すること","なし","account_id=nil","バリデーションエラーが発生する","高","必須バリデーション"
"2","UT-APP-002","Channelable","included","正常系","accountとのbelongs_toリレーションが正しく機能すること","Accountが存在","account_id=1","Accountオブジェクトが返却される","高","リレーション定義"
"3","UT-APP-003","Channelable","included","正常系","inboxとのhas_oneリレーションが正しく機能すること","Inboxが存在","なし","Inboxオブジェクトが返却される","高","ポリモーフィックリレーション"
"4","UT-APP-004","Channelable","create_audit_log_entry","正常系","更新時にaudit_log_entryコールバックが呼ばれること","レコードが存在","属性を更新","create_audit_log_entryが呼ばれる","中","after_updateコールバック"
"5","UT-APP-005","MessageFilterHelpers","reportable?","正常系","incoming?がtrueの場合trueが返却されること","メッセージが受信","message_type=incoming","trueが返却される","中","フィルタメソッド"
"6","UT-APP-006","MessageFilterHelpers","reportable?","正常系","outgoing?がtrueの場合trueが返却されること","メッセージが送信","message_type=outgoing","trueが返却される","中","フィルタメソッド"
"7","UT-APP-007","MessageFilterHelpers","reportable?","異常系","incoming?もoutgoing?もfalseの場合falseが返却されること","メッセージがactivity","message_type=activity","falseが返却される","中","フィルタメソッド"
"8","UT-APP-008","MessageFilterHelpers","webhook_sendable?","正常系","template?がtrueの場合trueが返却されること","メッセージがテンプレート","message_type=template","trueが返却される","中","Webhook送信判定"
"9","UT-APP-009","MessageFilterHelpers","slack_hook_sendable?","正常系","outgoing?がtrueの場合trueが返却されること","メッセージが送信","message_type=outgoing","trueが返却される","中","Slack連携判定"
"10","UT-APP-010","MessageFilterHelpers","notifiable?","正常系","incoming?がtrueの場合trueが返却されること","メッセージが受信","message_type=incoming","trueが返却される","中","通知判定"
"11","UT-APP-011","MessageFilterHelpers","conversation_transcriptable?","正常系","outgoing?がtrueの場合trueが返却されること","メッセージが送信","message_type=outgoing","trueが返却される","中","トランスクリプト判定"
"12","UT-APP-012","MessageFilterHelpers","email_reply_summarizable?","正常系","input_csat?がtrueの場合trueが返却されること","メッセージがCSAT","message_type=input_csat","trueが返却される","中","メール返信要約判定"
"13","UT-APP-013","MessageFilterHelpers","instagram_story_mention?","正常系","Instagram inboxでstory_mentionの場合trueが返却されること","Instagram inbox, image_type=story_mention","content_attributes[:image_type]=story_mention","trueが返却される","中","Instagram連携"
"14","UT-APP-014","MessageFilterHelpers","instagram_story_mention?","異常系","Instagram inbox以外の場合falseが返却されること","Web inbox","なし","falseが返却される","中","Instagram連携"
"15","UT-APP-015","PushDataHelper","push_event_data","正常系","EventDataPresenterのpush_dataが呼ばれること","Conversationが存在","なし","push_dataの結果が返却される","中","イベントデータ取得"
"16","UT-APP-016","PushDataHelper","lock_event_data","正常系","EventDataPresenterのlock_dataが呼ばれること","Conversationが存在","なし","lock_dataの結果が返却される","中","ロックイベントデータ"
"17","UT-APP-017","PushDataHelper","webhook_data","正常系","EventDataPresenterのpush_dataが呼ばれること","Conversationが存在","なし","push_dataの結果が返却される","中","Webhookデータ取得"
"18","UT-APP-018","AssignmentHandler","ensure_assignee_is_from_team","正常系","チーム変更時に担当者がチームメンバーでない場合nullになること","担当者がチームメンバーでない","team_id変更, assignee_idがチーム外","assignee_id=nil","高","担当者検証"
"19","UT-APP-019","AssignmentHandler","ensure_assignee_is_from_team","正常系","チーム変更時にauto_assignが有効なら新担当者が割り当てられること","allow_auto_assign=true","team_id変更","新担当者が割り当てられる","高","自動割り当て"
"20","UT-APP-020","AssignmentHandler","notify_assignment_change","正常系","担当者変更時にASSIGNEE_CHANGEDイベントがdispatchされること","担当者が変更","assignee_id変更","ASSIGNEE_CHANGEDがdispatchされる","高","イベント通知"
"21","UT-APP-021","AssignmentHandler","notify_assignment_change","正常系","チーム変更時にTEAM_CHANGEDイベントがdispatchされること","チームが変更","team_id変更","TEAM_CHANGEDがdispatchされる","高","イベント通知"
"22","UT-APP-022","AssignmentHandler","self_assign?","正常系","Current.userと担当者が同じ場合trueが返却されること","Current.user.id=1","assignee_id=1","trueが返却される","中","自己割り当て判定"
"23","UT-APP-023","AssignmentHandler","self_assign?","異常系","assignee_idがnilの場合falseが返却されること","なし","assignee_id=nil","falseが返却される","中","自己割り当て判定"
"24","UT-APP-024","UserAttributeHelpers","available_name","正常系","display_nameが存在する場合display_nameが返却されること","display_name=Test","なし","Testが返却される","中","表示名取得"
"25","UT-APP-025","UserAttributeHelpers","available_name","正常系","display_nameがnilの場合nameが返却されること","display_name=nil, name=User","なし","Userが返却される","中","表示名取得"
"26","UT-APP-026","UserAttributeHelpers","availability_status","正常系","current_account_userのavailability_statusが返却されること","AccountUserが存在","なし","availability_statusが返却される","中","ステータス取得"
"27","UT-APP-027","UserAttributeHelpers","auto_offline","正常系","current_account_userのauto_offlineが返却されること","AccountUserが存在","なし","auto_offline値が返却される","中","オフライン設定取得"
"28","UT-APP-028","UserAttributeHelpers","current_account_user","正常系","Current.accountのaccount_userが返却されること","Current.account設定済み","なし","AccountUserが返却される","高","現在アカウントユーザー取得"
"29","UT-APP-029","UserAttributeHelpers","current_account_user","異常系","Current.accountがnilの場合nilが返却されること","Current.account=nil","なし","nilが返却される","中","現在アカウントユーザー取得"
"30","UT-APP-030","UserAttributeHelpers","administrator?","正常系","管理者の場合trueが返却されること","ユーザーが管理者","なし","trueが返却される","高","権限チェック"
"31","UT-APP-031","UserAttributeHelpers","agent?","正常系","エージェントの場合trueが返却されること","ユーザーがエージェント","なし","trueが返却される","高","権限チェック"
"32","UT-APP-032","UserAttributeHelpers","hmac_identifier","正常系","HMAC_KEYが設定されている場合HMACが返却されること","CHATWOOT_INBOX_HMAC_KEY設定済み","email=test@example.com","HMACハッシュが返却される","高","認証識別子"
"33","UT-APP-033","UserAttributeHelpers","hmac_identifier","異常系","HMAC_KEYが未設定の場合空文字が返却されること","CHATWOOT_INBOX_HMAC_KEY未設定","なし","空文字が返却される","中","認証識別子"
"34","UT-APP-034","AutoAssignmentHandler","run_auto_assignment","正常系","ステータスがopenに変更された場合自動割り当てが実行されること","status変更, enable_auto_assignment=true","status=open","AgentAssignmentServiceが呼ばれる","高","自動割り当て実行"
"35","UT-APP-035","AutoAssignmentHandler","run_auto_assignment","正常系","auto_assignment_v2が有効な場合Jobがキューされること","auto_assignment_v2_enabled=true","status=open","AssignmentJobがperform_laterされる","高","v2自動割り当て"
"36","UT-APP-036","AutoAssignmentHandler","should_run_auto_assignment?","異常系","enable_auto_assignment?がfalseの場合falseが返却されること","enable_auto_assignment=false","なし","falseが返却される","高","自動割り当て条件"
"37","UT-APP-037","AutoAssignmentHandler","should_run_auto_assignment?","正常系","担当者が空の場合trueが返却されること","assignee=nil","なし","trueが返却される","中","自動割り当て条件"
"38","UT-APP-038","SortHandler","sort_on_last_activity_at","正常系","last_activity_atでソートされること","複数レコードが存在","sort_direction=:desc","降順でソートされる","中","ソート機能"
"39","UT-APP-039","SortHandler","sort_on_created_at","正常系","created_atでソートされること","複数レコードが存在","sort_direction=:asc","昇順でソートされる","中","ソート機能"
"40","UT-APP-040","SortHandler","sort_on_priority","正常系","priorityでソートされNULLが最後になること","複数レコードが存在","sort_direction=:desc","NULLS LASTでソートされる","中","ソート機能"
"41","UT-APP-041","SortHandler","sort_on_waiting_since","正常系","waiting_sinceでソートされること","複数レコードが存在","sort_direction=:asc","昇順でソートされる","中","ソート機能"
"42","UT-APP-042","SortHandler","last_messaged_conversations","正常系","各会話の最新メッセージが取得されること","複数メッセージが存在","なし","DISTINCT ON conversation_idで取得","中","最新メッセージ取得"
"43","UT-APP-043","LlmFormattable","to_llm_text","正常系","LlmTextFormatterServiceが呼ばれること","オブジェクトが存在","config={}","フォーマットされたテキストが返却される","中","LLMフォーマット"
"44","UT-APP-044","LlmFormattable","to_llm_text","正常系","configオプションが渡されること","オブジェクトが存在","config={key: value}","configが適用されたテキストが返却される","中","LLMフォーマット"
"45","UT-APP-045","OutOfOffisable","out_of_office?","正常系","営業時間外の場合trueが返却されること","working_hours_enabled=true, 現在時刻が営業時間外","なし","trueが返却される","高","営業時間判定"
"46","UT-APP-046","OutOfOffisable","out_of_office?","正常系","営業時間内の場合falseが返却されること","working_hours_enabled=true, 現在時刻が営業時間内","なし","falseが返却される","高","営業時間判定"
"47","UT-APP-047","OutOfOffisable","out_of_office?","異常系","working_hours_enabledがfalseの場合falseが返却されること","working_hours_enabled=false","なし","falseが返却される","高","営業時間判定"
"48","UT-APP-048","OutOfOffisable","working_now?","正常系","out_of_office?の逆が返却されること","なし","なし","!out_of_office?が返却される","中","営業中判定"
"49","UT-APP-049","OutOfOffisable","weekly_schedule","正常系","曜日順のスケジュールが返却されること","working_hoursが設定済み","なし","day_of_week昇順の配列が返却される","中","週間スケジュール取得"
"50","UT-APP-050","OutOfOffisable","update_working_hours","正常系","working_hoursが更新されること","working_hoursが存在","params=[{day_of_week: 1, open_hour: 10}]","working_hoursが更新される","高","営業時間更新"
"51","UT-APP-051","OutOfOffisable","update_working_hours","正常系","トランザクション内で更新されること","working_hoursが存在","複数の更新params","全てが成功または全てロールバック","高","トランザクション処理"
"52","UT-APP-052","OutOfOffisable","create_default_working_hours","正常系","作成時にデフォルトの営業時間が作成されること","なし","なし","7日分のworking_hoursが作成される","高","初期データ作成"
"53","UT-APP-053","ActivityMessageHandler","create_activity","正常系","ステータス変更時にアクティビティが作成されること","status変更","なし","status_change_activityが呼ばれる","高","アクティビティ作成"
"54","UT-APP-054","ActivityMessageHandler","create_activity","正常系","優先度変更時にアクティビティが作成されること","priority変更","なし","priority_change_activityが呼ばれる","高","アクティビティ作成"
"55","UT-APP-055","ActivityMessageHandler","create_activity","正常系","ラベル変更時にアクティビティが作成されること","label_list変更","なし","create_label_changeが呼ばれる","中","アクティビティ作成"
"56","UT-APP-056","ActivityMessageHandler","create_activity","正常系","SLAポリシー変更時にアクティビティが作成されること","sla_policy_id変更","なし","create_sla_change_activityが呼ばれる","中","アクティビティ作成"
"57","UT-APP-057","ActivityMessageHandler","auto_resolve_message_key","正常系","1440分以上で日単位のキーが返却されること","なし","minutes=2880","key=auto_resolved_days, count=2","中","自動解決メッセージ"
"58","UT-APP-058","ActivityMessageHandler","auto_resolve_message_key","正常系","60分以上で時間単位のキーが返却されること","なし","minutes=120","key=auto_resolved_hours, count=2","中","自動解決メッセージ"
"59","UT-APP-059","ActivityMessageHandler","auto_resolve_message_key","正常系","60分未満で分単位のキーが返却されること","なし","minutes=30","key=auto_resolved_minutes, count=30","中","自動解決メッセージ"
"60","UT-APP-060","ActivityMessageHandler","create_muted_message","正常系","Current.userが存在する場合ミュートメッセージが作成されること","Current.user設定済み","なし","ActivityMessageJobがキューされる","中","ミュートアクティビティ"
"61","UT-APP-061","ActivityMessageHandler","create_unmuted_message","正常系","Current.userが存在する場合アンミュートメッセージが作成されること","Current.user設定済み","なし","ActivityMessageJobがキューされる","中","ミュートアクティビティ"
"62","UT-APP-062","ActivityMessageHandler","generate_assignee_change_activity_content","正常系","担当者割り当て時にassignedキーが使用されること","assignee_idが設定","assignee_id=1","assignedのI18nメッセージが返却される","中","担当者変更メッセージ"
"63","UT-APP-063","ActivityMessageHandler","generate_assignee_change_activity_content","正常系","担当者解除時にremovedキーが使用されること","assignee_idがnil","assignee_id=nil","removedのI18nメッセージが返却される","中","担当者変更メッセージ"
"64","UT-APP-064","ActivityMessageHandler","generate_assignee_change_activity_content","正常系","自己割り当て時にself_assignedキーが使用されること","Current.user.id=assignee_id","なし","self_assignedのI18nメッセージが返却される","中","担当者変更メッセージ"
"65","UT-APP-065","SlaActivityMessageHandler","create_sla_change_activity","正常系","SLA追加時にaddedメッセージが作成されること","SLA追加","change_type=added","addedのI18nメッセージでJobがキューされる","中","SLAアクティビティ"
"66","UT-APP-066","SlaActivityMessageHandler","create_sla_change_activity","正常系","SLA削除時にremovedメッセージが作成されること","SLA削除","change_type=removed","removedのI18nメッセージでJobがキューされる","中","SLAアクティビティ"
"67","UT-APP-067","SlaActivityMessageHandler","determine_sla_change_type","正常系","nil->有効でaddedが返却されること","なし","sla_policy_id: nil -> 1","addedが返却される","中","SLA変更タイプ判定"
"68","UT-APP-068","SlaActivityMessageHandler","determine_sla_change_type","正常系","有効->nilでremovedが返却されること","なし","sla_policy_id: 1 -> nil","removedが返却される","中","SLA変更タイプ判定"
"69","UT-APP-069","Reauthorizable","reauthorization_required?","正常系","Redisにキーが存在する場合trueが返却されること","reauthorization_required_key設定済み","なし","trueが返却される","高","再認証要否判定"
"70","UT-APP-070","Reauthorizable","reauthorization_required?","正常系","Redisにキーが存在しない場合falseが返却されること","reauthorization_required_key未設定","なし","falseが返却される","高","再認証要否判定"
"71","UT-APP-071","Reauthorizable","authorization_error_count","正常系","Redisの値が数値として返却されること","authorization_error_count_key=3","なし","3が返却される","中","エラーカウント取得"
"72","UT-APP-072","Reauthorizable","authorization_error!","正常系","エラーカウントがインクリメントされること","authorization_error_count=0","なし","authorization_error_count=1","高","認証エラー処理"
"73","UT-APP-073","Reauthorizable","authorization_error!","正常系","閾値超過時にprompt_reauthorization!が呼ばれること","authorization_error_count>=2","なし","reauthorization_requiredが設定される","高","再認証プロンプト"
"74","UT-APP-074","Reauthorizable","prompt_reauthorization!","正常系","reauthorization_required_keyが設定されること","なし","なし","Redisにキーが設定される","高","再認証プロンプト"
"75","UT-APP-075","Reauthorizable","prompt_reauthorization!","正常系","クラスに応じたハンドラが呼ばれること","Integrations::Hookの場合","なし","process_integration_hook_reauthorization_emailsが呼ばれる","高","再認証ハンドラ"
"76","UT-APP-076","Reauthorizable","reauthorized!","正常系","Redisのキーが削除されること","reauthorization_required_key設定済み","なし","両キーが削除される","高","再認証完了処理"
"77","UT-APP-077","Reauthorizable","send_channel_reauthorization_email","正常系","指定されたdisconnect_typeのメールが送信されること","なし","disconnect_type=:facebook_disconnect","facebook_disconnectメールが送信される","中","再認証メール送信"
"78","UT-APP-078","PriorityActivityMessageHandler","priority_change_activity","正常系","優先度追加時にaddedメッセージが作成されること","old_priority=nil, new_priority=high","なし","addedのI18nメッセージでJobがキューされる","中","優先度アクティビティ"
"79","UT-APP-079","PriorityActivityMessageHandler","priority_change_activity","正常系","優先度更新時にupdatedメッセージが作成されること","old_priority=low, new_priority=high","なし","updatedのI18nメッセージでJobがキューされる","中","優先度アクティビティ"
"80","UT-APP-080","PriorityActivityMessageHandler","priority_change_activity","正常系","優先度削除時にremovedメッセージが作成されること","old_priority=high, new_priority=nil","なし","removedのI18nメッセージでJobがキューされる","中","優先度アクティビティ"
"81","UT-APP-081","PriorityActivityMessageHandler","get_priority_change_type","正常系","両方存在でupdatedが返却されること","なし","old_priority=low, new_priority=high","updatedが返却される","中","変更タイプ判定"
"82","UT-APP-082","PriorityActivityMessageHandler","get_priority_change_type","正常系","新規のみでaddedが返却されること","なし","old_priority=nil, new_priority=high","addedが返却される","中","変更タイプ判定"
"83","UT-APP-083","CaptainFeaturable","captain_preferences","正常系","modelsとfeaturesを含むハッシュが返却されること","captain_models, captain_features設定済み","なし","両方を含むHashが返却される","中","設定取得"
"84","UT-APP-084","CaptainFeaturable","captain_xxx_enabled?","正常系","feature_keyに対応する有効状態が返却されること","captain_features設定済み","feature_key=editor","boolean値が返却される","中","機能有効判定"
"85","UT-APP-085","CaptainFeaturable","captain_xxx_model","正常系","feature_keyに対応するモデル名が返却されること","captain_models設定済み","feature_key=editor","モデル名が返却される","中","モデル取得"
"86","UT-APP-086","CaptainFeaturable","validate_captain_models","異常系","無効なモデル名でバリデーションエラーになること","なし","captain_models={editor: invalid_model}","バリデーションエラーが発生する","高","モデルバリデーション"
"87","UT-APP-087","CaptainFeaturable","captain_models_with_defaults","正常系","未設定のfeature_keyにはデフォルトが使用されること","captain_models未設定","なし","デフォルトモデルが返却される","中","デフォルト適用"
"88","UT-APP-088","LabelActivityMessageHandler","create_label_added","正常系","ラベル追加時にaddedメッセージが作成されること","user_name設定済み","labels=[tag1, tag2]","addedのI18nメッセージでJobがキューされる","中","ラベルアクティビティ"
"89","UT-APP-089","LabelActivityMessageHandler","create_label_removed","正常系","ラベル削除時にremovedメッセージが作成されること","user_name設定済み","labels=[tag1]","removedのI18nメッセージでJobがキューされる","中","ラベルアクティビティ"
"90","UT-APP-090","LabelActivityMessageHandler","create_label_change_activity","異常系","labelsが空の場合何もしないこと","なし","labels=[]","Jobがキューされない","低","ラベルアクティビティ"
"91","UT-APP-091","SsoAuthenticatable","generate_sso_auth_token","正常系","32バイトのトークンが生成されること","なし","なし","64文字のhex文字列が返却される","高","SSOトークン生成"
"92","UT-APP-092","SsoAuthenticatable","generate_sso_auth_token","正常系","Redisに5分のTTLで保存されること","なし","なし","5分後に期限切れになる","高","SSOトークン保存"
"93","UT-APP-093","SsoAuthenticatable","invalidate_sso_auth_token","正常系","指定トークンがRedisから削除されること","トークンが存在","token=xxx","トークンが削除される","高","SSOトークン無効化"
"94","UT-APP-094","SsoAuthenticatable","valid_sso_auth_token?","正常系","有効なトークンの場合trueが返却されること","トークンがRedisに存在","token=xxx","trueが返却される","高","SSOトークン検証"
"95","UT-APP-095","SsoAuthenticatable","valid_sso_auth_token?","正常系","無効なトークンの場合falseが返却されること","トークンがRedisに存在しない","token=invalid","falseが返却される","高","SSOトークン検証"
"96","UT-APP-096","SsoAuthenticatable","generate_sso_link","正常系","正しいフォーマットのURLが生成されること","email設定済み","なし","FRONTEND_URL/app/login?email=xxx&sso_auth_token=xxxの形式","高","SSOリンク生成"
"97","UT-APP-097","SsoAuthenticatable","generate_sso_link","正常系","emailがURLエンコードされること","email=test+user@example.com","なし","+が%2Bにエンコードされる","中","SSOリンク生成"
"98","UT-APP-098","SsoAuthenticatable","generate_sso_link_with_impersonation","正常系","impersonation=trueパラメータが付与されること","なし","なし","impersonation=trueが含まれる","中","代理ログインリンク"
"99","UT-APP-099","ConversationMuteHelpers","mute!","正常系","会話がresolvedになりcontactがblockedになること","contactが存在","なし","status=resolved, contact.blocked=true","高","ミュート処理"
"100","UT-APP-100","ConversationMuteHelpers","mute!","異常系","contactがnilの場合何もしないこと","contact=nil","なし","何も変更されない","中","ミュート処理"
"101","UT-APP-101","ConversationMuteHelpers","unmute!","正常系","contactのblockedがfalseになること","contactがblocked=true","なし","contact.blocked=false","高","ミュート解除"
"102","UT-APP-102","ConversationMuteHelpers","unmute!","異常系","contactがnilの場合何もしないこと","contact=nil","なし","何も変更されない","中","ミュート解除"
"103","UT-APP-103","ConversationMuteHelpers","muted?","正常系","contactがblockedの場合trueが返却されること","contact.blocked=true","なし","trueが返却される","中","ミュート判定"
"104","UT-APP-104","ConversationMuteHelpers","muted?","正常系","contactがblockedでない場合falseが返却されること","contact.blocked=false","なし","falseが返却される","中","ミュート判定"
"105","UT-APP-105","ConversationMuteHelpers","muted?","異常系","contactがnilの場合falseが返却されること","contact=nil","なし","falseが返却される","中","ミュート判定"
"106","UT-APP-106","Avatarable","avatar_url","正常系","アバターがattachされている場合URLが返却されること","avatar attached","なし","resize_to_fill: [250, nil]のURLが返却される","中","アバターURL取得"
"107","UT-APP-107","Avatarable","avatar_url","正常系","アバターがattachされていない場合空文字が返却されること","avatar not attached","なし","空文字が返却される","中","アバターURL取得"
"108","UT-APP-108","Avatarable","fetch_avatar_from_gravatar","正常系","email変更時にGravatarジョブがキューされること","emailが変更された","email変更","AvatarFromGravatarJobが30秒後にキューされる","中","Gravatar取得"
"109","UT-APP-109","Avatarable","fetch_avatar_from_gravatar","異常系","emailが空の場合ジョブがキューされないこと","emailが空","email=nil","Jobがキューされない","中","Gravatar取得"
"110","UT-APP-110","Avatarable","acceptable_avatar","異常系","15MBを超えるファイルでエラーになること","avatar attached","byte_size=16MB","avatar is too bigエラー","高","アバターバリデーション"
"111","UT-APP-111","Avatarable","acceptable_avatar","異常系","許可されていないファイルタイプでエラーになること","avatar attached","content_type=image/bmp","filetype not supportedエラー","高","アバターバリデーション"
"112","UT-APP-112","Avatarable","acceptable_avatar","正常系","JPEG/PNG/GIFは許可されること","avatar attached","content_type=image/png","バリデーションエラーなし","高","アバターバリデーション"
"113","UT-APP-113","JsonSchemaValidator","validate","正常系","スキーマに適合するJSONの場合エラーなしになること","スキーマ定義済み","適合するJSON","record.errors空","高","JSONスキーマ検証"
"114","UT-APP-114","JsonSchemaValidator","validate","異常系","必須フィールド欠落でis requiredエラーになること","スキーマ定義済み","必須フィールド欠落","is requiredエラー","高","JSONスキーマ検証"
"115","UT-APP-115","JsonSchemaValidator","validate","異常系","型不一致でmust be of typeエラーになること","スキーマ定義済み","型が違うJSON","must be of typeエラー","高","JSONスキーマ検証"
"116","UT-APP-116","JsonSchemaValidator","validate","異常系","minimum違反でgreater than or equal toエラーになること","スキーマ定義済み","値がminimum未満","must be greater than or equal toエラー","中","JSONスキーマ検証"
"117","UT-APP-117","JsonSchemaValidator","validate","異常系","maximum違反でless than or equal toエラーになること","スキーマ定義済み","値がmaximum超過","must be less than or equal toエラー","中","JSONスキーマ検証"
"118","UT-APP-118","AccessTokenable","create_access_token","正常系","作成時にAccessTokenが作成されること","なし","なし","AccessTokenが作成される","高","アクセストークン生成"
"119","UT-APP-119","AccessTokenable","included","正常系","access_tokenリレーションが定義されること","なし","なし","has_one :access_tokenが機能する","高","リレーション定義"
"120","UT-APP-120","Pubsubable","rotate_pubsub_token","正常系","パスワード変更時にトークンがローテートされること","Userモデル","encrypted_password変更","新しいpubsub_tokenが生成される","高","トークンローテート"
"121","UT-APP-121","Pubsubable","rotate_pubsub_token","正常系","User以外ではローテートされないこと","Contactモデル","encrypted_password変更","pubsub_tokenは変更されない","中","トークンローテート"
"122","UT-APP-122","Pubsubable","pubsub_token","正常系","トークンが空でpersistedの場合再生成されること","pubsub_token=nil, persisted=true","なし","新しいトークンが生成・保存される","高","トークン取得"
"123","UT-APP-123","Pubsubable","pubsub_token","正常系","トークンが存在する場合そのまま返却されること","pubsub_token=xxx","なし","xxxが返却される","中","トークン取得"
"124","UT-APP-124","Liquidable","process_liquid_in_content","正常系","outgoingメッセージでLiquidテンプレートが処理されること","message_type=outgoing, content=Hello {{contact.name}}","なし","contentがレンダリングされる","高","Liquid処理"
"125","UT-APP-125","Liquidable","process_liquid_in_content","正常系","templateメッセージでLiquidテンプレートが処理されること","message_type=template, content=Hello {{contact.name}}","なし","contentがレンダリングされる","高","Liquid処理"
"126","UT-APP-126","Liquidable","process_liquid_in_content","異常系","incomingメッセージでは処理されないこと","message_type=incoming","なし","contentは変更されない","中","Liquid処理"
"127","UT-APP-127","Liquidable","process_liquid_in_content","異常系","Liquid構文エラーの場合例外が握りつぶされること","content=invalid{{liquid","なし","例外が発生せずcontentは元のまま","中","Liquidエラー処理"
"128","UT-APP-128","Liquidable","modified_liquid_content","正常系","コードブロック内はrawタグでラップされること","content=`{{code}}`","なし","{% raw %}`{{code}}`{% endraw %}に変換","中","コードブロック保護"
"129","UT-APP-129","Liquidable","process_liquid_in_template_params","正常系","template_paramsのprocessed_paramsがレンダリングされること","template_params設定済み","なし","processed_paramsがレンダリングされる","中","テンプレートパラメータ処理"
"130","UT-APP-130","Liquidable","message_drops","正常系","contact, agent, conversation, inbox, accountのDropオブジェクトが返却されること","conversation設定済み","なし","5つのDropオブジェクトを含むHash","中","Dropオブジェクト生成"
"131","UT-APP-131","Featurable","enable_features","正常系","指定された機能が有効になること","なし","names=[:feature1, :feature2]","feature_feature1=true, feature_feature2=true","高","機能有効化"
"132","UT-APP-132","Featurable","enable_features!","正常系","有効化後に保存されること","なし","names=[:feature1]","DBに保存される","高","機能有効化と保存"
"133","UT-APP-133","Featurable","disable_features","正常系","指定された機能が無効になること","feature1=true","names=[:feature1]","feature_feature1=false","高","機能無効化"
"134","UT-APP-134","Featurable","disable_features!","正常系","無効化後に保存されること","feature1=true","names=[:feature1]","DBに保存される","高","機能無効化と保存"
"135","UT-APP-135","Featurable","feature_enabled?","正常系","有効な機能の場合trueが返却されること","feature1=true","name=feature1","trueが返却される","中","機能有効判定"
"136","UT-APP-136","Featurable","all_features","正常系","全機能の有効/無効状態がHashで返却されること","複数機能設定済み","なし","{feature1: true, feature2: false}形式","中","全機能状態取得"
"137","UT-APP-137","Featurable","enabled_features","正常系","有効な機能のみが返却されること","feature1=true, feature2=false","なし","{feature1: true}","中","有効機能取得"
"138","UT-APP-138","Featurable","disabled_features","正常系","無効な機能のみが返却されること","feature1=true, feature2=false","なし","{feature2: false}","中","無効機能取得"
"139","UT-APP-139","Featurable","enable_default_features","正常系","InstallationConfigに基づいてデフォルト機能が有効化されること","ACCOUNT_LEVEL_FEATURE_DEFAULTS設定済み","なし","設定された機能が有効化される","高","デフォルト機能有効化"
"140","UT-APP-140","TeamActivityMessageHandler","create_team_change_activity","正常系","チーム割り当て時にassignedメッセージが作成されること","team設定済み","なし","assignedのI18nメッセージでJobがキューされる","中","チームアクティビティ"
"141","UT-APP-141","TeamActivityMessageHandler","create_team_change_activity","正常系","チーム解除時にremovedメッセージが作成されること","team=nil","なし","removedのI18nメッセージでJobがキューされる","中","チームアクティビティ"
"142","UT-APP-142","TeamActivityMessageHandler","generate_team_change_activity_key","正常系","チームと担当者同時変更時にassigned_with_assigneeが返却されること","team変更, assignee変更","なし","assigned_with_assigneeが返却される","中","アクティビティキー生成"
"143","UT-APP-143","Labelable","update_labels","正常系","label_listが更新されること","labels設定済み","labels=[tag1, tag2]","label_listが[tag1, tag2]に更新","中","ラベル更新"
"144","UT-APP-144","Labelable","add_labels","正常系","既存ラベルに新ラベルが追加されること","labels=[tag1]","new_labels=[tag2]","label_listが[tag1, tag2]になる","中","ラベル追加"
"145","UT-APP-145","Labelable","add_labels","異常系","new_labelsがblankの場合何もしないこと","labels=[tag1]","new_labels=nil","label_listは変更されない","低","ラベル追加"
"146","UT-APP-146","Labelable","add_labels","正常系","単一文字列もArrayに変換されること","labels=[]","new_labels=tag1","label_listが[tag1]になる","中","ラベル追加"
"147","UT-APP-147","ContentAttributeValidator","validate","正常系","input_selectでitemsが存在する場合バリデーション通過すること","content_type=input_select","items=[{title: x, value: y}]","エラーなし","高","コンテンツ属性検証"
"148","UT-APP-148","ContentAttributeValidator","validate","異常系","itemsが空の場合エラーになること","content_type=input_select","items=[]","At least one item is requiredエラー","高","コンテンツ属性検証"
"149","UT-APP-149","ContentAttributeValidator","validate","異常系","itemsがHashでない場合エラーになること","content_type=input_select","items=[string]","Items should be a hashエラー","高","コンテンツ属性検証"
"150","UT-APP-150","ContentAttributeValidator","validate","異常系","無効なキーを含む場合エラーになること","content_type=input_select","items=[{invalid_key: x}]","contains invalid keysエラー","高","コンテンツ属性検証"
"151","UT-APP-151","ContentAttributeValidator","validate","異常系","cardsでactionsが欠落している場合エラーになること","content_type=cards","items=[{title: x}]","contains items missing actionsエラー","高","コンテンツ属性検証"
"152","UT-APP-152","InboxAgentAvailability","available_agents","正常系","オンラインエージェントのみが返却されること","agent1=online, agent2=offline","なし","agent1のみ返却される","高","オンラインエージェント取得"
"153","UT-APP-153","InboxAgentAvailability","available_agents","境界値","オンラインエージェントがいない場合空が返却されること","全員offline","なし","空のリレーションが返却される","高","オンラインエージェント取得"
"154","UT-APP-154","InboxAgentAvailability","member_ids_with_assignment_capacity","正常系","member_idsが返却されること","メンバーが存在","なし","member_idsが返却される","中","割り当て可能メンバー取得"
"155","UT-APP-155","AccountCacheRevalidator","update_account_cache","正常系","create時にaccountのupdate_cache_keyが呼ばれること","なし","createアクション","update_cache_keyが呼ばれる","中","キャッシュ更新"
"156","UT-APP-156","AccountCacheRevalidator","update_account_cache","正常系","update時にaccountのupdate_cache_keyが呼ばれること","レコードが存在","updateアクション","update_cache_keyが呼ばれる","中","キャッシュ更新"
"157","UT-APP-157","AccountCacheRevalidator","update_account_cache","正常系","destroy時にaccountのupdate_cache_keyが呼ばれること","レコードが存在","destroyアクション","update_cache_keyが呼ばれる","中","キャッシュ更新"
"158","UT-APP-158","Reportable","included","正常系","reporting_eventsリレーションが定義されること","なし","なし","has_many :reporting_eventsが機能する","中","リレーション定義"
"159","UT-APP-159","AvailabilityStatusable","online_presence?","正常系","OnlineStatusTrackerからプレゼンス情報が取得されること","なし","なし","get_presenceの結果が返却される","中","オンライン判定"
"160","UT-APP-160","AvailabilityStatusable","online_presence?","正常系","Contactの場合idが使用されること","Contactモデル","なし","Contact.idでget_presenceが呼ばれる","中","オンライン判定"
"161","UT-APP-161","AvailabilityStatusable","availability_status","正常系","Contactでオンラインの場合onlineが返却されること","Contact, online=true","なし","onlineが返却される","中","ステータス取得"
"162","UT-APP-162","AvailabilityStatusable","availability_status","正常系","Contactでオフラインの場合offlineが返却されること","Contact, online=false","なし","offlineが返却される","中","ステータス取得"
"163","UT-APP-163","AvailabilityStatusable","availability_status","正常系","AccountUserでauto_offline=falseの場合availabilityが返却されること","AccountUser, auto_offline=false","なし","availabilityが返却される","中","ステータス取得"
"164","UT-APP-164","AvailabilityStatusable","availability_status","正常系","AccountUserでオンラインの場合Redisのステータスが返却されること","AccountUser, online=true, auto_offline=true","なし","Redisのステータスが返却される","中","ステータス取得"
"165","UT-APP-165","CacheKeys","cache_keys","正常系","cacheable_modelsの各キーが取得されること","Label, Inbox, Teamのキャッシュ存在","なし","{label: x, inbox: y, team: z}形式","中","キャッシュキー取得"
"166","UT-APP-166","CacheKeys","update_cache_key","正常系","指定キーがRedisに保存されイベントがdispatchされること","なし","key=label","Redisに保存, ACCOUNT_CACHE_INVALIDATEDイベント発行","高","キャッシュ更新"
"167","UT-APP-167","CacheKeys","reset_cache_keys","正常系","全cacheable_modelsのキーがリセットされること","なし","なし","全モデルのキーがRedisに保存される","中","キャッシュリセット"
"168","UT-APP-168","CacheKeys","CACHE_KEYS_EXPIRY","正常系","72時間のTTLでキャッシュが保存されること","なし","なし","TTL=72時間","中","キャッシュ有効期限"
