---
generated_at: 2026-01-30 14:35:00
metrics:
  claims_total: 210
  claims_with_evidence: 205
  claims_without_evidence: 5
confidence_derived: 0.98
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.98**
  - 根拠あり：205 / 210、根拠なし：5
- 優先レビュー（高）
  1. **UT-SYN-206〜210（サーバー起動関連）**：実行時の挙動に依存する部分があり、モック化が必要
  2. **UT-SYN-195〜198（fetchAllowlist）**：外部API呼び出しを含むため、テスト環境での挙動確認が必要
  3. **UT-SYN-122〜131（OpenID関連）**：外部IdPとの連携があるため、モック化の設計が重要

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

- E-01: `packages/sync-server/src/db.js` - WrappedDatabaseクラス、openDatabase関数
- E-02: `packages/sync-server/src/app-sync/services/files-service.js` - FilesService、File、FileUpdateクラス
- E-03: `packages/sync-server/src/app-sync/errors.js` - FileNotFound、GenericFileErrorクラス
- E-04: `packages/sync-server/src/app-sync/validation.js` - validateSyncedFile、validateUploadedFile関数
- E-05: `packages/sync-server/src/sync-simple.js` - sync、addMessages、getMerkle関数
- E-06: `packages/sync-server/src/util/validate-user.ts` - validateSession、validateAuthHeader関数
- E-07: `packages/sync-server/src/util/middlewares.js` - errorMiddleware、validateSessionMiddleware
- E-08: `packages/sync-server/src/util/hash.js` - sha256String関数
- E-09: `packages/sync-server/src/util/paths.js` - getPathForUserFile、getPathForGroupFile関数
- E-10: `packages/sync-server/src/services/secrets-service.js` - SecretsDb、secretsServiceオブジェクト
- E-11: `packages/sync-server/src/services/user-service.js` - ユーザー関連サービス関数群
- E-12: `packages/sync-server/src/accounts/password.js` - パスワード認証関連関数
- E-13: `packages/sync-server/src/accounts/openid.js` - OpenID認証関連関数
- E-14: `packages/sync-server/src/account-db.js` - アカウントDB関連関数
- E-15: `packages/sync-server/src/util/title/index.js` - title関数
- E-16: `packages/sync-server/src/util/payee-name.js` - formatPayeeName、formatPayeeIban関数
- E-17: `packages/sync-server/src/app-gocardless/utils.js` - printIban、sortByBookingDateOrValueDate、amountToInteger関数
- E-18: `packages/sync-server/src/app-gocardless/bank-factory.js` - BankFactory、isSpecialContinuousAccessBank関数
- E-19: `packages/sync-server/src/app-gocardless/util/handle-error.js` - handleError関数
- E-20: `packages/sync-server/src/app-gocardless/errors.js` - GoCardless関連エラークラス群
- E-21: `packages/sync-server/src/app-cors-proxy.js` - isUrlAllowed、fetchAllowlist、clearAllowlistCache関数
- E-22: `packages/sync-server/src/app-simplefin/app-simplefin.js` - parseAccessKey、getAccessKey、getAccountResponse関数
- E-23: `packages/sync-server/src/app.ts` - run、parseHTTPSConfig関数
- E-24: `packages/sync-server/src/app-sync.ts` - sync APIエンドポイント実装
- E-25: `packages/sync-server/src/app-admin.js` - 管理APIエンドポイント実装
- E-26: `packages/sync-server/src/app-openid.js` - OpenID APIエンドポイント実装
- E-27: `packages/sync-server/src/app-account.js` - アカウントAPIエンドポイント実装
- E-28: `packages/sync-server/src/app-secrets.js` - シークレットAPIエンドポイント実装
- E-29: `packages/sync-server/src/load-config.js` - 設定管理

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

### データベース操作（UT-SYN-001〜012）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | WrappedDatabase.allが複数行を返す | E-01 | ○ |
| C-02 | WrappedDatabase.allが空配列を返す | E-01 | ○ |
| C-03 | WrappedDatabase.firstが1行を返す | E-01 | ○ |
| C-04 | WrappedDatabase.firstがnullを返す | E-01 | ○ |
| C-05 | WrappedDatabase.mutateがchanges/insertIdを返す | E-01 | ○ |
| C-06 | WrappedDatabase.mutateが更新件数を返す | E-01 | ○ |
| C-07 | transactionがコミットされる | E-01 | ○ |
| C-08 | transactionがロールバックされる | E-01 | ○ |
| C-09 | execが複数SQL実行できる | E-01 | ○ |
| C-10 | closeが接続を閉じる | E-01 | ○ |
| C-11 | openDatabaseがインスタンスを返す | E-01 | ○ |
| C-12 | openDatabaseが無効パスでエラー | E-01 | ○ |

### ファイル管理（UT-SYN-013〜027）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-13 | FilesService.getがファイルを返す | E-02 | ○ |
| C-14 | FilesService.getがFileNotFoundをスロー | E-02, E-03 | ○ |
| C-15 | 削除済みファイルでFileNotFound | E-02 | ○ |
| C-16 | FilesService.setが新規ファイルを作成 | E-02 | ○ |
| C-17 | 管理者が全ファイルを取得可能 | E-02 | ○ |
| C-18 | 一般ユーザーが自分のファイルのみ取得 | E-02 | ○ |
| C-19 | limit=0で空配列 | E-02 | ○ |
| C-20 | findUsersWithAccessがユーザー一覧を返す | E-02 | ○ |
| C-21 | updateがファイル名を更新 | E-02 | ○ |
| C-22 | updateが複数フィールドを更新 | E-02 | ○ |
| C-23 | 存在しないファイル更新でエラー | E-02, E-03 | ○ |
| C-24 | validateがFileオブジェクトに変換 | E-02 | ○ |
| C-25 | deleted=1がboolean trueに変換 | E-02 | ○ |
| C-26 | FileNotFoundのエラーメッセージ | E-03 | ○ |
| C-27 | GenericFileErrorのカスタムメッセージ | E-03 | ○ |

### 同期検証（UT-SYN-028〜044）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-28 | validateSyncedFileが有効ファイルでnull | E-04 | ○ |
| C-29 | syncVersion nullでfile-old-version | E-04 | ○ |
| C-30 | 古いsyncVersionでfile-old-version | E-04 | ○ |
| C-31 | groupId nullでfile-needs-upload | E-04 | ○ |
| C-32 | 暗号化キー不一致でfile-key-mismatch | E-04 | ○ |
| C-33 | groupId不一致でfile-has-reset | E-04 | ○ |
| C-34 | keyId不一致でfile-has-new-key | E-04 | ○ |
| C-35 | 新規ファイルでnull | E-04 | ○ |
| C-36 | アップロード時groupId不一致でfile-has-reset | E-04 | ○ |
| C-37 | アップロード時keyId不一致でfile-has-new-key | E-04 | ○ |
| C-38 | syncが正常動作 | E-05 | ○ |
| C-39 | 新規グループで空trie | E-05 | ○ |
| C-40 | since以降のメッセージのみ返却 | E-05 | ○ |
| C-41 | addMessagesがDB追加 | E-05 | ○ |
| C-42 | 重複メッセージ無視 | E-05 | ○ |
| C-43 | getMerkleが既存trie取得 | E-05 | ○ |
| C-44 | getMerkleが空オブジェクト返却 | E-05 | ○ |

### 認証・セッション（UT-SYN-045〜056）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-45 | validateSessionがセッション返却 | E-06 | ○ |
| C-46 | トークンなしで401 | E-06 | ○ |
| C-47 | 無効トークンで401 | E-06 | ○ |
| C-48 | 期限切れで401 | E-06 | ○ |
| C-49 | 永続トークンは期限切れにならない | E-06 | ○ |
| C-50 | 信頼プロキシでtrue | E-06 | ○ |
| C-51 | 非信頼IPでfalse | E-06 | ○ |
| C-52 | remoteAddress undefinedでfalse | E-06 | ○ |
| C-53 | errorMiddlewareが500返却 | E-07 | ○ |
| C-54 | ヘッダー送信済みでnext呼び出し | E-07 | ○ |
| C-55 | validateSessionMiddlewareがlocals設定 | E-07 | ○ |
| C-56 | 無効セッションでnext未呼び出し | E-07 | ○ |

### ユーティリティ（UT-SYN-057〜069）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-57 | sha256Stringがハッシュ生成 | E-08 | ○ |
| C-58 | 空文字列でもハッシュ生成 | E-08 | ○ |
| C-59 | getPathForUserFileがパス生成 | E-09 | ○ |
| C-60 | getPathForGroupFileがパス生成 | E-09 | ○ |
| C-61 | SecretsDb.setがシークレット保存 | E-10 | ○ |
| C-62 | 既存シークレット上書き | E-10 | ○ |
| C-63 | SecretsDb.getがシークレット取得 | E-10 | ○ |
| C-64 | 存在しないシークレットでnull | E-10 | ○ |
| C-65 | キャッシュからシークレット取得 | E-10 | ○ |
| C-66 | キャッシュミス時にDB取得 | E-10 | ○ |
| C-67 | set成功時にキャッシュ更新 | E-10 | ○ |
| C-68 | existsがtrue返却 | E-10 | ○ |
| C-69 | existsがfalse返却 | E-10 | ○ |

### ユーザー管理（UT-SYN-070〜109）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-70〜C-109 | ユーザーサービス関数群 | E-11 | ○ |

### パスワード認証（UT-SYN-110〜121）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-110〜C-121 | パスワード認証関数群 | E-12 | ○ |

### OpenID認証（UT-SYN-122〜135）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-122〜C-135 | OpenID認証関数群 | E-13 | ○ |

### アカウントDB（UT-SYN-136〜166）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-136〜C-166 | アカウントDB関数群 | E-14 | ○ |

### 文字列処理（UT-SYN-167〜180）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-167〜C-169 | title関数 | E-15 | ○ |
| C-170〜C-172 | formatPayeeName関数 | E-16 | ○ |
| C-173〜C-174 | printIban関数 | E-17 | ○ |
| C-175〜C-177 | sortByBookingDateOrValueDate関数 | E-17 | ○ |
| C-178〜C-180 | amountToInteger関数 | E-17 | ○ |

### 銀行ファクトリ・GoCardless（UT-SYN-181〜190）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-181〜C-184 | BankFactory、isSpecialContinuousAccessBank | E-18 | ○ |
| C-185〜C-186 | handleError関数 | E-19 | ○ |
| C-187〜C-190 | GoCardlessエラークラス群 | E-20 | ○ |

### CORSプロキシ（UT-SYN-191〜198）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-191〜C-194 | isUrlAllowed関数 | E-21 | ○ |
| C-195 | fetchAllowlist正常系 | E-21 | △ |
| C-196 | fetchAllowlistキャッシュ | E-21 | △ |
| C-197 | fetchAllowlistエラー時 | E-21 | △ |
| C-198 | clearAllowlistCache | E-21 | ○ |

### SimpleFIN（UT-SYN-199〜205）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-199〜C-205 | SimpleFIN関連関数群 | E-22 | ○ |

### サーバー起動（UT-SYN-206〜210）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-206 | run関数の正常起動 | E-23 | △ |
| C-207 | HTTPS設定時の起動 | E-23 | △ |
| C-208 | OpenID設定時のbootstrap | E-23 | ○ |
| C-209 | parseHTTPSConfig PEM形式 | E-23 | ○ |
| C-210 | parseHTTPSConfig ファイルパス | E-23 | ○ |

## 4) 不足情報（Unknown / Missing）
- **外部API依存テスト（UT-SYN-195〜197）**：fetchAllowlistはGitHub APIに依存するため、テスト時はモック化が必要。実際のAPIレスポンス形式の変更に追従できない可能性あり。
  - 候補：nockなどのHTTPモックライブラリ使用 / テスト用のモックサーバー構築 / 環境変数で切り替え
- **サーバー起動テスト（UT-SYN-206〜207）**：実際のポートバインドやHTTPS証明書の検証が必要。テスト環境での実行が困難な場合あり。
  - 候補：supertestを使用した統合テスト / ポートバインドのモック化 / Docker環境でのE2Eテスト

## 5) リスクフラグ（レビュー観点）
- **0（低リスク）**：UT-SYN-001〜069、UT-SYN-167〜190 - 純粋関数またはDB操作のため、モック化が容易
- **1（中リスク）**：UT-SYN-070〜166 - DB依存があるが、テストDBで対応可能
- **2（高リスク）**：UT-SYN-191〜210 - 外部依存やネットワーク通信があり、テスト環境の構築に注意が必要

## 6) レビュアーチェックリスト（最小）
- [ ] データベース操作（UT-SYN-001〜012）のテストケースがbetter-sqlite3の仕様と整合しているか
- [ ] 認証・セッション（UT-SYN-045〜056）のテストケースがセキュリティ要件を満たしているか
- [ ] OpenID認証（UT-SYN-122〜135）のテストケースが外部IdPとの連携パターンを網羅しているか
- [ ] CORSプロキシ（UT-SYN-191〜198）のテストケースがSSRF攻撃対策を検証しているか
- [ ] ファイル管理（UT-SYN-013〜027）のテストケースが権限管理を正しく検証しているか
- [ ] 金額計算（UT-SYN-178〜180）のテストケースが精度問題を考慮しているか
- [ ] 外部API依存テストのモック化方針が適切か確認
