---
generated_at: 2026-02-25 12:00:00
metrics:
  claims_total: 137
  claims_with_evidence: 131
  claims_without_evidence: 6
confidence_derived: 0.96
---

# 根拠レポート：decap-cms-backend-git-gateway 単体テストケース一覧

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.96**
  - 根拠あり：131 / 137、根拠なし：6
- 優先レビュー（高）
  1. **C-076〜C-079 (getDeployPreview Netlify API連携)**：外部API（Netlify API）のレスポンス仕様はソースコードの実装から推測しており、公式APIドキュメントの確認が必要
  2. **C-037 (AccessTokenError)**：AccessTokenErrorのインポート元（decap-cms-lib-util）の実装詳細は未確認
  3. **C-107 (matchPath ワイルドカード)**：minimatchライブラリのmatchBaseオプション動作は外部ライブラリ仕様に依存

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。

- E-01: `packages/decap-cms-backend-git-gateway/src/implementation.ts` - GitGatewayクラスの実装ファイル（645行）
- E-02: `packages/decap-cms-backend-git-gateway/src/GitHubAPI.ts` - GitHub API ラッパークラス（137行）
- E-03: `packages/decap-cms-backend-git-gateway/src/GitLabAPI.ts` - GitLab API ラッパークラス（30行）
- E-04: `packages/decap-cms-backend-git-gateway/src/netlify-lfs-client.ts` - Netlify LFS クライアント（181行）
- E-05: `packages/decap-cms-backend-git-gateway/src/index.ts` - エクスポート定義（6行）
- E-06: `packages/decap-cms-backend-git-gateway/src/__tests__/GitHubAPI.spec.js` - 既存テスト（97行）
- E-07: `packages/decap-cms-backend-git-gateway/src/types/ini.d.ts` - ini型定義

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

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-001 | getEndpoint: ローカルホストかつnetlifySiteURLありでnetlifyパスの場合にURLが結合される | E-01 (L85-102) | ○ |
| C-002 | getEndpoint: netlifySiteURL末尾スラッシュで二重スラッシュにならない | E-01 (L93-95) | ○ |
| C-003 | getEndpoint: ローカルホストでない場合にendpointがそのまま返る | E-01 (L86-87, L101) | ○ |
| C-004 | getEndpoint: netlifySiteURLがnullの場合にendpointがそのまま返る | E-01 (L87-88) | ○ |
| C-005 | getEndpoint: netlifyパス以外のendpointの場合にそのまま返る | E-01 (L89) | ○ |
| C-006 | getEndpoint: 127.0.0.1がローカルホスト認識 | E-01 (L76) | ○ |
| C-007 | getEndpoint: 0.0.0.0がローカルホスト認識 | E-01 (L77) | ○ |
| C-008 | constructor: デフォルト設定で初期化 | E-01 (L162-201) | ○ |
| C-009 | constructor: カスタム設定で初期化 | E-01 (L170-173) | ○ |
| C-010 | constructor: gatewayUrlからgithubバックエンドタイプ検出 | E-01 (L185-189) | ○ |
| C-011 | constructor: gatewayUrlからgitlabバックエンドタイプ検出 | E-01 (L185-189) | ○ |
| C-012 | constructor: gatewayUrlからbitbucketバックエンドタイプ検出 | E-01 (L185-189) | ○ |
| C-013 | constructor: backendType未検出でnull | E-01 (L190-191) | ○ |
| C-014 | constructor: auth_type='pkce'設定 | E-01 (L195-196) | ○ |
| C-015 | constructor: デフォルトauth_type='netlify' | E-01 (L197-199) | ○ |
| C-016 | constructor: branchのtrim処理 | E-01 (L170) | ○ |
| C-017 | constructor: transformImages=false設定 | E-01 (L175-176) | ○ |
| C-018 | isGitBackend: 常にtrue | E-01 (L203-205) | ○ |
| C-019 | status: API/auth両方operational | E-01 (L207-235) | ○ |
| C-020 | status: API取得失敗でtrue返却 | E-01 (L217-220) | ○ |
| C-021 | status: APIダウン時にauth確認スキップ | E-01 (L224) | ○ |
| C-022 | status: tokenPromise失敗でauth=false | E-01 (L228-231) | ○ |
| C-023 | getAuthClient: 既存クライアント返却 | E-01 (L238-240) | ○ |
| C-024 | getAuthClient: netlifyIdentityベースクライアント | E-01 (L242-254) | ○ |
| C-025 | getAuthClient: GoTrueベースクライアント | E-01 (L255-268) | ○ |
| C-026 | requestFunction: トークン付きリクエスト | E-01 (L272-277) | ○ |
| C-027 | authenticate: JWT認証でユーザー情報返却 | E-01 (L279-387) | ○ |
| C-028 | authenticate: OAuth認証でトークン使用 | E-01 (L291-294) | ○ |
| C-029 | authenticate: Gateway設定からバックエンドタイプ決定 | E-01 (L297-336) | ○ |
| C-030 | authenticate: GitLabバックエンド初期化 | E-01 (L366-368) | ○ |
| C-031 | authenticate: Bitbucketバックエンド初期化 | E-01 (L369-376) | ○ |
| C-032 | authenticate: JSON以外のContent-TypeでAPIError | E-01 (L308-314) | ○ |
| C-033 | authenticate: エラーレスポンスでAPIError | E-01 (L318-324) | ○ |
| C-034 | authenticate: ロール不足でエラー | E-01 (L338-343) | ○ |
| C-035 | authenticate: 有効ロールで認証成功 | E-01 (L338-344) | ○ |
| C-036 | authenticate: hasWriteAccess=falseでエラー | E-01 (L378-380) | ○ |
| C-037 | authenticate: JWT取得失敗でAccessTokenError | E-01 (L284-289) | ○ |
| C-038 | authenticate: full_name空でemailからname生成 | E-01 (L347) | ○ |
| C-039 | restoreUser: currentUser存在時にauthenticate呼出 | E-01 (L388-393) | ○ |
| C-040 | restoreUser: currentUser null時にreject | E-01 (L391) | ○ |
| C-041 | authComponent: pkce時にPKCEPage | E-01 (L394-396) | ○ |
| C-042 | authComponent: netlify時にNetlifyPage | E-01 (L394-396) | ○ |
| C-043 | logout: 正常ログアウト | E-01 (L398-407) | ○ |
| C-044 | logout: 失敗時にclearStore | E-01 (L402-406) | ○ |
| C-045 | getToken: tokenPromise結果返却 | E-01 (L408-410) | ○ |
| C-046 | entriesByFolder: backend委譲 | E-01 (L412-414) | ○ |
| C-047 | allEntriesByFolder: backend委譲 | E-01 (L415-417) | ○ |
| C-048 | entriesByFiles: backend委譲 | E-01 (L418-420) | ○ |
| C-049 | getEntry: backend委譲 | E-01 (L421-423) | ○ |
| C-050 | isLargeMediaFile: 有効でマッチ時true | E-01 (L429-432) | ○ |
| C-051 | isLargeMediaFile: 無効時false | E-01 (L429-432) | ○ |
| C-052 | isLargeMediaFile: 不一致時false | E-01 (L429-432) | ○ |
| C-053 | unpublishedEntryMediaFile: LargeMedia時 | E-01 (L434-451) | ○ |
| C-054 | unpublishedEntryMediaFile: 非LargeMedia時 | E-01 (L448-450) | ○ |
| C-055 | getLargeMediaClient: 初回初期化 | E-01 (L459-465) | ○ |
| C-056 | getLargeMediaClient: メモ化動作 | E-01 (L460-461) | ○ |
| C-057 | _getLargeMediaClient: netlify.comで有効 | E-01 (L466-506) | ○ |
| C-058 | _getLargeMediaClient: netlify.appで有効 | E-01 (L471) | ○ |
| C-059 | _getLargeMediaClient: lfsconfig無しで無効 | E-01 (L473) | ○ |
| C-060 | _getLargeMediaClient: gitattributes 404で空パターン | E-01 (L478-485) | ○ |
| C-061 | _getLargeMediaClient: gitattributes非404エラーで無効 | E-01 (L483-484, L489) | ○ |
| C-062 | getLargeMediaDisplayURL: 正常なポインタファイル | E-01 (L507-533) | ○ |
| C-063 | getLargeMediaDisplayURL: sha空でフォールバック | E-01 (L525-528) | ○ |
| C-064 | getMediaDisplayURL: LargeMedia時 | E-01 (L535-548) | ○ |
| C-065 | getMediaDisplayURL: 文字列URLパススルー | E-01 (L542-544) | ○ |
| C-066 | getMediaDisplayURL: 非LargeMediaでbackend委譲 | E-01 (L546-547) | ○ |
| C-067 | getMediaFile: LargeMedia時 | E-01 (L550-565) | ○ |
| C-068 | getMediaFile: 非LargeMedia時backend委譲 | E-01 (L564) | ○ |
| C-069 | persistEntry: LargeMedia有効時フィルタ | E-01 (L567-575) | ○ |
| C-070 | persistEntry: LargeMedia無効時そのまま | E-01 (L572-574) | ○ |
| C-071 | persistMedia: LargeMedia時ポインタ変換 | E-01 (L577-595) | ○ |
| C-072 | persistMedia: 非LargeMedia時そのまま | E-01 (L594) | ○ |
| C-073 | persistMedia: 先頭スラッシュ除去 | E-01 (L581) | ○ |
| C-074 | deleteFiles: backend委譲 | E-01 (L596-598) | ○ |
| C-075 | getDeployPreview: backend経由で取得 | E-01 (L599-626) | ○ |
| C-076 | getDeployPreview: Netlify API経由で取得 | E-01 (L601-621) | △ |
| C-077 | getDeployPreview: state='ready'でSuccess | E-01 (L617) | △ |
| C-078 | getDeployPreview: state!='ready'でOther | E-01 (L617) | △ |
| C-079 | getDeployPreview: Netlify APIエラーでundefined | E-01 (L623) | △ |
| C-080 | GitHubAPI constructor: 設定値初期化 | E-02 (L20-31) | ○ |
| C-081 | GitHubAPI constructor: repoURL/originRepoURL空文字 | E-02 (L29-30) | ○ |
| C-082 | hasWriteAccess: 成功でtrue | E-02 (L33-35) | ○ |
| C-083 | hasWriteAccess: 401 Bad credentialsでAPIError | E-02 (L37-43) | ○ |
| C-084 | hasWriteAccess: 401その他でfalse | E-02 (L44-45) | ○ |
| C-085 | hasWriteAccess: 404 message undefinedでAPIError | E-02 (L47-49) | ○ |
| C-086 | hasWriteAccess: 404 Unable to locateでAPIError | E-02 (L49) | ○ |
| C-087 | hasWriteAccess: その他エラーで再スロー | E-02 (L57-59) | ○ |
| C-088 | requestHeaders: JWTトークン付きヘッダー | E-02 (L63-73) | ○ |
| C-089 | requestHeaders: カスタムヘッダーマージ | E-02 (L63-73) | ○ |
| C-090 | handleRequestError: message優先 | E-02 (L75-77) | ○ |
| C-091 | handleRequestError: msgフォールバック | E-02 (L75-77) | ○ |
| C-092 | user: commitAuthor返却 | E-02 (L79-81) | ○ |
| C-093 | getHeadReference: repoOwner未設定時自動取得 | E-02 (L83-95) | ○ |
| C-094 | getHeadReference: repoOwner設定済み時スキップ | E-02 (L84) | ○ |
| C-095 | commit: commitAuthor付きコミット | E-02 (L97-120) | ○ |
| C-096 | commit: parentSha未定義で空parents | E-02 (L106) | ○ |
| C-097 | commit: commitAuthor未設定でauthorなし | E-02 (L109-114) | ○ |
| C-098 | nextUrlProcessor: URL書き換え | E-02 (L122-124), E-06 (L86-96) | ○ |
| C-099 | diffFromFile: isLargeMediaでbinaryマージ | E-02 (L126-136) | ○ |
| C-100 | diffFromFile: 元binary:true保持 | E-02 (L134) | ○ |
| C-101 | GitLabAPI constructor: 設定値初期化 | E-03 (L12-17) | ○ |
| C-102 | withAuthorizationHeaders: トークン付きヘッダー追加 | E-03 (L19-27) | ○ |
| C-103 | hasWriteAccess: 常にtrue | E-03 (L29) | ○ |
| C-104 | matchPath: パターン一致でtrue | E-04 (L21-23) | ○ |
| C-105 | matchPath: パターン不一致でfalse | E-04 (L21-23) | ○ |
| C-106 | matchPath: 空パターンでfalse | E-04 (L22) | ○ |
| C-107 | matchPath: ワイルドカードパターン動作 | E-04 (L22) | △ |
| C-108 | resourceExists: 存在でtrue | E-04 (L33-52) | ○ |
| C-109 | resourceExists: 未存在でfalse | E-04 (L46-48) | ○ |
| C-110 | resourceExists: 500でundefined | E-04 (L49-52) | ○ |
| C-111 | getTransofrmationsParams: 有効パラメータ | E-04 (L54-60) | ○ |
| C-112 | getTransofrmationsParams: false時空文字 | E-04 (L55, L59) | ○ |
| C-113 | getTransofrmationsParams: 空オブジェクト時空文字 | E-04 (L55) | ○ |
| C-114 | getTransofrmationsParams: true時空文字 | E-04 (L55) | ○ |
| C-115 | getDownloadURL: 変換付きURL取得 | E-04 (L62-88) | ○ |
| C-116 | getDownloadURL: 変換なしURL取得 | E-04 (L62-88) | ○ |
| C-117 | getDownloadURL: 失敗時フォールバック | E-04 (L84-87) | ○ |
| C-118 | uploadOperation: 変換形式 | E-04 (L90-96) | ○ |
| C-119 | uploadOperation: 空配列 | E-04 (L94) | ○ |
| C-120 | getResourceUploadURLs: URL取得 | E-04 (L98-122) | ○ |
| C-121 | getResourceUploadURLs: エラーハンドリング | E-04 (L115-117) | ○ |
| C-122 | uploadBlob: PUTアップロード | E-04 (L124-129) | ○ |
| C-123 | uploadResource: 既存スキップ | E-04 (L131-143) | ○ |
| C-124 | uploadResource: 新規アップロード | E-04 (L131-143) | ○ |
| C-125 | getClient: 有効設定でClient生成 | E-04 (L170-181) | ○ |
| C-126 | getClient: 無効設定でClient生成 | E-04 (L170-181) | ○ |
| C-127 | getClient: バインドメソッド動作 | E-04 (L148-149, L170-181) | ○ |
| C-128 | エクスポート確認 | E-05 (L1-6) | ○ |
| C-129 | getMedia: デフォルトフォルダ | E-01 (L453-455) | ○ |
| C-130 | getMedia: カスタムフォルダ | E-01 (L453) | ○ |
| C-131 | unpublishedEntries: backend委譲 | E-01 (L627-629) | ○ |
| C-132 | unpublishedEntry: backend委譲 | E-01 (L630-632) | ○ |
| C-133 | updateUnpublishedEntryStatus: backend委譲 | E-01 (L633-635) | ○ |
| C-134 | deleteUnpublishedEntry: backend委譲 | E-01 (L636-638) | ○ |
| C-135 | publishUnpublishedEntry: backend委譲 | E-01 (L639-641) | ○ |
| C-136 | traverseCursor: backend委譲 | E-01 (L642-644) | ○ |
| C-137 | unpublishedEntryDataFile: backend委譲 | E-01 (L425-427) | ○ |

## 4) 不足情報（Unknown / Missing）
- **Netlify API レスポンス仕様 (C-076〜C-079)**: getDeployPreview内でNetlify公開APIを直接呼び出しているが、レスポンス形式（deploys配列のフィールド名等）はソースコードの実装から推測している。公式ドキュメントとの照合が必要。
  - 候補：Netlify API公式ドキュメント / Netlify SDK / 実際のAPIレスポンスサンプル
- **minimatchライブラリの動作 (C-107)**: matchPathでのワイルドカードパターン（`images/**`等）の動作はminimatchライブラリのmatchBaseオプション仕様に依存する。
  - 候補：minimatch npm README / minimatch テストケース

## 5) リスクフラグ（レビュー観点）
- **1: 中リスク** - getDeployPreview内のNetlify API連携部分：外部APIの仕様変更に影響を受ける可能性がある
- **0: 低リスク** - backend委譲メソッド群（C-046〜C-049, C-074, C-129〜C-137）：実装がシンプルな委譲パターンであり、テストケースは委譲動作の確認に留まる
- **1: 中リスク** - authenticate内のロール検証（C-034, C-035）：jwtDecodeライブラリの出力形式に依存する
- **0: 低リスク** - LFSクライアント関数群（C-104〜C-127）：ソースコードから直接的に挙動が確認できる

## 6) レビュアーチェックリスト（最小）
- [ ] getDeployPreview関連テストケース（C-076〜C-079）のNetlify API仕様が最新のドキュメントと一致しているか
- [ ] authenticate内のjwtDecodeの返却値構造（app_metadata.roles）が実際のJWTトークン構造と一致しているか
- [ ] minimatchのmatchBaseオプションがmatchPath関数の期待する動作と一致するか
- [ ] 既存テスト（GitHubAPI.spec.js）とテストケース一覧の整合性が取れているか（UT-GGW-088, UT-GGW-090, UT-GGW-091, UT-GGW-098に対応）
- [ ] LargeMediaの有効/無効判定分岐が全てのメソッドで網羅されているか
- [ ] backend委譲メソッドのテストケースが、backendがnullの場合のエラーケースを考慮すべきか検討
