---
generated_at: 2026-02-25 02:50:00
metrics:
  claims_total: 51
  claims_with_evidence: 51
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート：controllers-users 単体テストケース一覧

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：51 / 51、根拠なし：0
- 優先レビュー（高）
  1. **なし**：全てのテストケースにソースコード根拠あり

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

- E-01: `app/controllers/users/avatars_controller.rb`
- E-02: `app/controllers/users/data_exports_controller.rb`
- E-03: `app/controllers/users/email_addresses_controller.rb`
- E-04: `app/controllers/users/email_addresses/confirmations_controller.rb`
- E-05: `app/controllers/users/events_controller.rb`
- E-06: `app/controllers/users/joins_controller.rb`
- E-07: `app/controllers/users/push_subscriptions_controller.rb`
- E-08: `app/controllers/users/roles_controller.rb`
- E-09: `app/controllers/users/verifications_controller.rb`
- E-10: `app/controllers/concerns/filter_scoped.rb`

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

### Users::AvatarsController（UT-USR-001 〜 UT-USR-008）

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | showアクションでシステムユーザーの場合、system_user.pngにリダイレクト | E-01 (L8-9) `if @user.system? redirect_to view_context.image_path("system_user.png")` | ○ |
| C-02 | showアクションでavatarがattachedの場合、avatar_thumbnailにリダイレクト | E-01 (L10-11) `elsif @user.avatar.attached? redirect_to rails_blob_path(@user.avatar_thumbnail, disposition: "inline")` | ○ |
| C-03 | showアクションでavatar未設定の場合、SVGでイニシャルをレンダリング | E-01 (L12-13, L39-41) `elsif stale? @user, cache_control: cache_control render_initials ... render formats: :svg` | ○ |
| C-04 | cache_controlがCurrent.userの場合、空のハッシュを返す | E-01 (L31-36) `if @user == Current.user {} else { max_age: 30.minutes, stale_while_revalidate: 1.week }` | ○ |
| C-05 | cache_controlが他ユーザーの場合、30分のmax_ageを設定 | E-01 (L34-35) `{ max_age: 30.minutes, stale_while_revalidate: 1.week }` | ○ |
| C-06 | set_userで存在しないユーザーIDの場合、RecordNotFound発生 | E-01 (L24) `@user = Current.account.users.find(params[:user_id])` - findはRecordNotFoundを発生 | ○ |
| C-07 | destroyアクションでアバターが削除される | E-01 (L17-19) `def destroy @user.avatar.destroy redirect_to @user` | ○ |
| C-08 | ensure_permission_to_administer_userで権限チェック | E-01 (L27-29) `def ensure_permission_to_administer_user head :forbidden unless Current.user.can_change?(@user)` | ○ |

### Users::DataExportsController（UT-USR-009 〜 UT-USR-015）

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-09 | showアクションで完了済みエクスポートを取得 | E-02 (L30-32) `def set_export @export = @user.data_exports.completed.find_by(id: params[:id])` | ○ |
| C-10 | ensure_current_userでCurrent.user以外を拒否 | E-02 (L22-24) `def ensure_current_user head :forbidden unless @user == Current.user` | ○ |
| C-11 | createアクションでエクスポート作成とbuild_later呼び出し | E-02 (L12-14) `@user.data_exports.create!(account: Current.account).build_later redirect_to @user, notice: "Export started..."` | ○ |
| C-12 | CURRENT_EXPORT_LIMIT定数で上限が10件に設定 | E-02 (L7) `CURRENT_EXPORT_LIMIT = 10` | ○ |
| C-13 | ensure_export_limit_not_exceededで上限チェック | E-02 (L26-28) `def ensure_export_limit_not_exceeded head :too_many_requests if @user.data_exports.current.count >= CURRENT_EXPORT_LIMIT` | ○ |

### Users::EmailAddressesController（UT-USR-016 〜 UT-USR-020）

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-14 | createアクションで重複メールアドレスをチェック | E-03 (L9-13) `identity = Identity.find_by_email_address(new_email_address) if identity&.users&.exists?(account: @user.account) flash[:alert] = "You already have a user..."` | ○ |
| C-15 | createアクションで変更確認メールを送信 | E-03 (L15) `@user.send_email_address_change_confirmation(new_email_address)` | ○ |
| C-16 | rate_limitで1時間に5回の制限 | E-03 (L3) `rate_limit to: 5, within: 1.hour, only: :create` | ○ |
| C-17 | set_userでCurrent.identity.usersからユーザーを取得 | E-03 (L20-22) `def set_user @user = Current.identity.users.find(params[:user_id])` | ○ |

### Users::EmailAddresses::ConfirmationsController（UT-USR-021 〜 UT-USR-026）

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-18 | allow_unauthenticated_accessで認証不要 | E-04 (L2) `allow_unauthenticated_access` | ○ |
| C-19 | set_userでactiveユーザーのみ取得 | E-04 (L22-24) `def set_user @user = Current.account.users.active.find(params[:user_id])` | ○ |
| C-20 | createアクションでトークン検証とセッション処理 | E-04 (L10-18) `if @user.change_email_address_using_token(token) terminate_session if Current.session start_new_session_for @user.identity redirect_to edit_user_url...` | ○ |
| C-21 | 無効なトークンの場合、invalid_tokenをレンダリング | E-04 (L17) `render :invalid_token, status: :unprocessable_entity` | ○ |
| C-22 | rate_limitで1時間に5回の制限 | E-04 (L5) `rate_limit to: 5, within: 1.hour, only: :create` | ○ |

### Users::EventsController（UT-USR-027 〜 UT-USR-031）

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-23 | showアクションでFilterを作成しタイムラインを取得 | E-05 (L7-8) `@filter = Current.user.filters.new(creator_ids: [ @user.id ]) @day_timeline = Current.user.timeline_for(day_param, filter: @filter)` | ○ |
| C-24 | day_paramでパラメータ未指定の場合Time.currentを使用 | E-05 (L18-23) `def day_param if params[:day].present? Time.zone.parse(params[:day]) else Time.current end` | ○ |
| C-25 | fresh_whenでHTTPキャッシュを設定 | E-05 (L10) `fresh_when @day_timeline` | ○ |
| C-26 | set_userでactiveユーザーのみ取得 | E-05 (L14-16) `def set_user @user = Current.account.users.active.find(params[:user_id])` | ○ |
| C-27 | FilterScopedモジュールをinclude | E-05 (L2) `include FilterScoped`、E-10参照 | ○ |

### Users::JoinsController（UT-USR-032 〜 UT-USR-035）

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-28 | publicレイアウトを使用 | E-06 (L2) `layout "public"` | ○ |
| C-29 | createアクションでCurrent.userを更新 | E-06 (L7-9) `def create Current.user.update!(user_params) redirect_to landing_path` | ○ |
| C-30 | user_paramsでname、avatarのみ許可 | E-06 (L13-15) `def user_params params.expect(user: [ :name, :avatar ])` | ○ |

### Users::PushSubscriptionsController（UT-USR-036 〜 UT-USR-042）

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-31 | indexアクションで購読一覧を設定 | E-07 (L4-5) `def index end`、set_push_subscriptions (L17-19) | ○ |
| C-32 | createアクションでcreate_or_find_by!を使用 | E-07 (L7-8) `def create @push_subscriptions.create_with(user_agent: request.user_agent).create_or_find_by!(push_subscription_params)` | ○ |
| C-33 | destroyアクションでdestroy_byを使用 | E-07 (L10-13) `def destroy @push_subscriptions.destroy_by(id: params[:id]) redirect_to user_push_subscriptions_url` | ○ |
| C-34 | set_push_subscriptionsでCurrent.userの購読のみ取得 | E-07 (L17-19) `def set_push_subscriptions @push_subscriptions = Current.user.push_subscriptions` | ○ |
| C-35 | push_subscription_paramsでendpoint、p256dh_key、auth_keyを許可 | E-07 (L21-23) `def push_subscription_params params.require(:push_subscription).permit(:endpoint, :p256dh_key, :auth_key)` | ○ |

### Users::RolesController（UT-USR-043 〜 UT-USR-049）

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-36 | updateアクションでロールを更新 | E-08 (L5-8) `def update @user.update!(role_params) redirect_to account_settings_path` | ○ |
| C-37 | ensure_permission_to_administer_userでcan_administer?チェック | E-08 (L15-17) `def ensure_permission_to_administer_user head :forbidden unless Current.user.can_administer?(@user)` | ○ |
| C-38 | role_paramsでmember/adminのみ許可、デフォルトmember | E-08 (L19-21) `def role_params { role: params.require(:user)[:role].presence_in(%w[ member admin ]) || "member" }` | ○ |
| C-39 | set_userでactiveユーザーのみ取得 | E-08 (L11-13) `def set_user @user = Current.account.users.active.find(params[:user_id])` | ○ |

### Users::VerificationsController（UT-USR-050 〜 UT-USR-051）

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-40 | publicレイアウトを使用 | E-09 (L2) `layout "public"` | ○ |
| C-41 | createアクションでCurrent.user.verifyを呼び出し | E-09 (L7-9) `def create Current.user.verify redirect_to new_users_join_path` | ○ |

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

## 5) リスクフラグ（レビュー観点）
- 0: 低リスク - 全てのテストケースがソースコードから直接導出されており、根拠が明確

## 6) レビュアーチェックリスト（最小）
- [ ] 各コントローラの全publicメソッドがカバーされているか確認
- [ ] before_actionによる権限チェックのテストケースが適切か確認
- [ ] レート制限のテストケースが実装可能か確認（テスト環境での設定）
- [ ] モデルのバリデーションに依存するテストケースの前提条件が正確か確認
- [ ] HTTPキャッシュ（fresh_when、stale?）のテストケースが実装可能か確認
