# Issue 02: チュートリアルのTDD体験改善

## 概要

チュートリアルの後半（Step 2以降）でTDD的な流れを導入し、テスト更新が自然な開発フローの一部になるようにする。

## 設計方針: 段階的な学習体験

### Step 1: まず「動く」を体験
- シンプルなHello World的なノード
- テストは `pytest.skip()` 付きで生成（壊れない）
- **目標**: フレームワークの簡単さを実感

### Step 2以降: TDDスタイルを導入
- fetch_data, process_data などの実践的なノード
- テストを先に書く → 実装する流れを学ぶ
- **目標**: 本格的な開発フローを習得

## 現状の問題

1. `railway new node` で汎用的なテストが自動生成される
2. Step 2 でノードの実装を変更するが、テスト更新の指示がない
3. 結果として `pytest` が失敗し、ユーザーが混乱する

## 改善後のチュートリアル構成

```
Step 1: Hello Railway（シンプル）
  └─ validate_name, create_greeting
  └─ テストは skip 状態で生成
  └─ 「動いた！」という成功体験

Step 2: データ処理パイプライン（TDDスタイル）
  └─ fetch_data, process_data
  └─ テストを先に書く → 実装する
  └─ Red → Green → Refactor を体験

Step 3: エラーハンドリング
  └─ TDDで異常系も含めて実装

Step 4: 設定とリトライ
  └─ 実践的な機能の追加
```

## 実装タスク

### 1. テストテンプレートの変更

**改善後のテンプレート:**
```python
import pytest
from src.nodes.{node_name} import {node_name}

def test_{node_name}_basic():
    """TODO: Define expected behavior and implement test.

    Example:
        result = {node_name}(your_input)
        assert result == expected_output
    """
    pytest.skip("Implement this test based on your node's specification")
```

### 2. チュートリアルの改訂

**Step 1（シンプルな成功体験）:**
```markdown
## Step 1: 最初のパイプライン

### 1.1 ノードを作成

```bash
railway new node validate_name
railway new node create_greeting
```

### 1.2 ノードを実装

`src/nodes/validate_name.py`:
```python
@node
def validate_name(name: str) -> str:
    if not name or not name.strip():
        raise ValueError("Name cannot be empty")
    return name.strip()
```

### 1.3 動かしてみる

```bash
uv run railway run greet -- --name "Railway"
# Hello, Railway!
```

> 💡 テストファイルも生成されていますが、まずは動くことを確認しましょう。
> テストの書き方は Step 2 で学びます。
```

**Step 2（TDDスタイル導入）:**
```markdown
## Step 2: データ処理パイプライン（TDDスタイル）

ここからは、テスト駆動開発（TDD）のスタイルで進めます。

### TDDとは？
1. **Red**: まずテストを書く（失敗する）
2. **Green**: テストが通る最小限の実装をする
3. **Refactor**: コードを整理する

### 2.1 ノードのスケルトンを生成

```bash
railway new node fetch_data
```

### 2.2 テストを先に書く（Red）

`tests/nodes/test_fetch_data.py` を開き、期待する動作を定義：

```python
def test_fetch_data_returns_user_info():
    result = fetch_data(123)

    assert "user_id" in result
    assert result["user_id"] == 123
    assert "name" in result
```

テストを実行（まだ失敗します）：
```bash
uv run pytest tests/nodes/test_fetch_data.py -v
# FAILED ✗ - これが正常です！
```

### 2.3 実装する（Green）

`src/nodes/fetch_data.py`:
```python
@node
def fetch_data(user_id: int) -> dict:
    return {
        "user_id": user_id,
        "name": f"User {user_id}",
    }
```

### 2.4 テスト成功を確認

```bash
uv run pytest tests/nodes/test_fetch_data.py -v
# PASSED ✓
```
```

### 3. 生成時のメッセージ

```
✓ Created src/nodes/fetch_data.py
✓ Created tests/nodes/test_fetch_data.py (skeleton)

💡 TDD style workflow:
   1. Write tests in tests/nodes/test_fetch_data.py
   2. Run: uv run pytest tests/nodes/test_fetch_data.py (expect failure)
   3. Implement src/nodes/fetch_data.py
   4. Run tests again (expect success)
```

## 期待される効果

1. **Step 1で成功体験** → フレームワークへの好印象
2. **Step 2でTDD導入** → 実践的なスキル習得
3. **テスト失敗が「バグ」ではなく「プロセス」として認識される**
4. **チュートリアル完了時にすべてのテストが通る**

## 関連ファイル

- `src/railway/templates/test_node.py.jinja2`: テストテンプレート
- `src/railway/templates/TUTORIAL.md`: チュートリアルテンプレート
- `src/railway/cli/new.py`: 生成コマンド

## 優先度

**High** - チュートリアル体験に直接影響し、フレームワークの印象を左右する
