# 通知設計書 19-テスト中断通知

## 概要

本ドキュメントは、Jestテストフレームワークにおけるテスト中断通知機能の設計について記載する。SummaryReporterクラスの`onRunComplete`メソッドによって実装され、テスト実行が中断された場合に「Test run was interrupted.」メッセージを出力する。

### 本通知の処理概要

**業務上の目的・背景**：テスト実行中にユーザーが中断操作（Ctrl+C等）を行った場合、テストが正常に完了していないことを明示する必要がある。この通知により、開発者はテスト結果が不完全であることを認識し、必要に応じてテストを再実行できる。

**通知の送信タイミング**：テスト実行完了時に`onRunComplete`メソッドが呼び出され、`aggregatedResults.wasInterrupted`がtrueの場合に出力される。silentモードでない場合のみ表示される。

**通知の受信者**：コンソールを監視している開発者。CI/CD環境ではビルドログに記録される。

**通知内容の概要**：赤字の太字で「Test run was interrupted.」と表示される。このメッセージはテストサマリーの最後に出力され、中断が発生したことを強調する。

**期待されるアクション**：開発者はテストが中断されたことを認識し、必要に応じてテストを再実行する。CI/CD環境では中断の原因（タイムアウト、手動キャンセル等）を調査する。

## 通知種別

コンソール出力（標準出力）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期 |
| 優先度 | 高 |
| リトライ | なし |

### 送信先決定ロジック

標準出力（this.log）に直接出力される。

## 通知テンプレート

### コンソール出力形式

| 項目 | 内容 |
|-----|------|
| 出力先 | 標準出力（stdout） |
| 形式 | テキスト（ANSIカラーコード付き） |

### 本文テンプレート

```
Test run was interrupted.
```

スタイル: `chalk.bold.red`（赤太字）

### 添付ファイル

なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| wasInterrupted | テスト中断フラグ | aggregatedResults.wasInterrupted | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| テスト完了後 | onRunComplete | wasInterrupted=true & !silent | SummaryReporter.onRunComplete()で実行 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| wasInterrupted=false | テストが正常に完了した場合 |
| silentモード | _globalConfig.silentがtrueの場合 |
| テストスイートなし | numTotalTestSuitesが0の場合 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[onRunComplete呼び出し] --> B{numTotalTestSuites > 0?}
    B -->|No| Z[終了]
    B -->|Yes| C[_printSummary]
    C --> D[_printSnapshotSummary]
    D --> E[getSummary]
    E --> F{silent?}
    F -->|Yes| G[messageに追加しない]
    F -->|No| H{wasInterrupted?}
    H -->|Yes| I[chalk.bold.red: Test run was interrupted.]
    H -->|No| J[_getTestSummary]
    I --> K[message += 中断メッセージ]
    J --> L[message += テストサマリー]
    K --> M[this.log出力]
    L --> M
    G --> M
    M --> Z
```

## データベース参照・更新仕様

### 参照テーブル一覧

本機能はデータベースを使用しない。

### テーブル別参照項目詳細

該当なし

### 更新テーブル一覧

該当なし

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 特になし | - | - |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0（リトライなし） |
| リトライ間隔 | - |
| リトライ対象エラー | - |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | なし |
| 1日あたり上限 | なし |

### 配信時間帯

制限なし

## セキュリティ考慮事項

- 固定メッセージのため、機密情報漏洩のリスクなし

## 備考

- wasInterruptedはjest-coreのTestSchedulerで設定される
- 中断はCtrl+C、SIGINT、SIGTERMなどで発生する
- watchモードでは'q'キーで中断可能

---

## コードリーディングガイド

本通知を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

中断通知で扱うデータ構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | test-result/types | `packages/jest-test-result/src/types.ts` | AggregatedResult.wasInterruptedの定義 |

**読解のコツ**: wasInterruptedはbooleanで、テストが中断された場合にtrueになる。

#### Step 2: エントリーポイントを理解する

処理の起点となるonRunCompleteメソッドを特定。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | SummaryReporter.ts | `packages/jest-reporters/src/SummaryReporter.ts` | L101-140: onRunCompleteメソッド |

**主要処理フロー**:
1. **L105**: wasInterruptedを取得
2. **L106**: numTotalTestSuitesの存在チェック
3. **L119**: _printSummary
4. **L120-123**: _printSnapshotSummary
5. **L125-129**: getSummaryでサマリー構築
6. **L131-137**: silentでなければ中断メッセージまたはテストサマリーを追加
7. **L138**: this.logで出力

#### Step 3: 中断メッセージの出力

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | SummaryReporter.ts | `packages/jest-reporters/src/SummaryReporter.ts` | L131-137: 条件分岐 |

**主要処理フロー**:
- **L131**: `if (!this._globalConfig.silent)`でsilentモードチェック
- **L132-136**: wasInterruptedの判定
- **L134**: `chalk.bold.red('Test run was interrupted.')`で赤太字メッセージ
- **L135**: 通常時は_getTestSummaryを呼び出し

### プログラム呼び出し階層図

```
SummaryReporter.onRunComplete (L101)
    │
    ├─ numTotalTestSuitesチェック (L106)
    │
    ├─ _printSummary (L119)
    │
    ├─ _printSnapshotSummary (L120-123)
    │
    ├─ getSummary (L125-129)
    │
    ├─ 条件分岐 (L131-137)
    │      │
    │      ├─ [silent] スキップ
    │      │
    │      ├─ [wasInterrupted]
    │      │      │
    │      │      └─ chalk.bold.red('Test run was interrupted.') (L134)
    │      │
    │      └─ [通常]
    │             │
    │             └─ _getTestSummary (L135)
    │
    └─ this.log (L138)
```

### データフロー図

```
[入力]                      [処理]                           [出力]

aggregatedResults ─────────▶ onRunComplete
    │                              │
    │ wasInterrupted               │
    │ numTotalTestSuites           │
    │ testResults                  │
    │                              ▼
    │                       numTotalTestSuites > 0?
    │                              │
    │                              ▼
    │                       _printSummary
    │                              │
    │                              ▼
    │                       _printSnapshotSummary
    │                              │
    │                              ▼
    │                       getSummary
    │                              │
    │                              ▼
    │                       silent?
    │                              │
    │                    ┌─────────┼─────────┐
    │                    │         │         │
    │                    ▼         ▼         ▼
    │               [silent]   [interrupted] [normal]
    │                    │         │         │
    │                    │         ▼         ▼
    │                    │   chalk.bold.red  _getTestSummary
    │                    │         │         │
    │                    └─────────┴─────────┘
    │                              │
    │                              ▼
    └─────────────────────────▶ this.log
                                   │
                                   ▼
                                stdout
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| SummaryReporter.ts | `packages/jest-reporters/src/SummaryReporter.ts` | ソース | メイン実装ファイル |
| BaseReporter.ts | `packages/jest-reporters/src/BaseReporter.ts` | ソース | Reporterインターフェースの基底実装 |
| getSummary.ts | `packages/jest-reporters/src/getSummary.ts` | ソース | テストサマリー生成 |
| @jest/test-result | `packages/jest-test-result/` | 型定義 | AggregatedResult型（wasInterrupted） |
