サンドボックスの各テンプレートが正常にロードされることを検証するシステムテストを追加

basecamp/lexxy

Lexxyのサンドボックス環境に対するシステムテストを新設し、各テンプレートのロード時エラーおよびテンプレート間ナビゲーション時のクラッシュを自動的に検出できるようになりました。

背景

今回のテスト追加は、直前にマージされた #1068 で発覚したバグへの反省から生まれました。#1068 は、ドキュメントの末尾にテーブルが配置されている場合にLexxyがロード時にクラッシュするという問題を修正したPRです。テーブルが選択された状態で TableTools がDOMノードを解決できず、Error 230が発生していました。

この問題はサンドボックスの「Tables」テンプレートを開くだけで再現できたはずですが、そのシナリオを自動テストで検証する仕組みが存在しなかったため、リグレッションとして埋もれてしまっていました。本PRはそのギャップを埋めるものです。

技術的な変更

test/system/sandbox_test.rb が新規追加され、2種類のテストシナリオをカバーしています。

1つ目は、SandboxController::ALLOWED_TEMPLATES を起点にした動的テスト生成です。each で各テンプレート名をイテレートし、test ブロックをその場で定義することで、テンプレートが追加・削除されるたびにテストケースも自動的に増減します。default テンプレートのみ /sandbox にルーティングされる特殊ケースを ternary で吸収しています。

SandboxController::ALLOWED_TEMPLATES.each do |template|
  test "sandbox/#{template} loads without console errors" do
    visit (template == "default") ? "/sandbox" : "/sandbox/#{template}"
    wait_for_editor
  end
end

2つ目は、Turbo Frame を経由したテンプレート間ナビゲーションのテストです。/sandbox から始まり、SANDBOX_BUTTON_LABELS に定義された各テンプレートのボタンをクリックして遷移し、最後に「Default」へ戻ることで、部分的なページ更新を伴うナビゲーション全体を一連のフローとして検証します。各遷移後に wait_for_editor を呼び出すことで、エディタが完全に初期化されるまで待機してからアサーションを行います。

test "navigating between sandbox templates via turbo-frame loads cleanly" do
  visit "/sandbox"
  wait_for_editor

  SANDBOX_BUTTON_LABELS.except("default").each_value do |label|
    click_on label
    wait_for_editor
  end

  click_on "Default"
  wait_for_editor
end

設計判断

テストケースの自動生成に SandboxController::ALLOWED_TEMPLATES を直接参照する方式が採用されました。テンプレート名をテストファイル内にハードコードせず、コントローラーの定数を単一の正となることで、テンプレートの追加・削除がテストの更新漏れを引き起こすリスクを排除しています。

一方、ナビゲーションテスト用の SANDBOX_BUTTON_LABELS はテストファイル内にハッシュとして定義されています。これはUIのラベル文字列(ユーザーが click_on でクリックする文字列)がコントローラー定数とは別の関心事であるためと読み取れます。テンプレート識別子とUIラベルの対応関係をテスト内で明示することで、UIの変更があった際に差異が明確になります。

まとめ

バグ修正後にその再発防止テストを追加するという一連の対応は、テストの責務を「現状の動作保証」だけでなく「過去の失敗の記憶」として機能させる設計思想を示しています。コントローラー定数を起点にしたテスト自動生成により、サンドボックスの拡張に対してテストが自律的に追従する仕組みが整いました。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
0d47d441

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

「リード文(総論)→背景・技術詳細(各論)→まとめ(結論)」という3部構成が明確に適用されており、必須要素もすべて満たされています。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライトの形式(```ruby:test/system/sandbox_test.rb)や、PR番号のリンク記法([#1068](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

「Turbo Frame」やコントローラーの定数名などの技術用語を前提として話が進んでおり、専門知識を持つエンジニアという対象読者に適合した内容です。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが総論→各論の構成になっており、各段落もトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が守られています。段落長も適切です。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用されている2つのコードブロックは、提供されたDiffの内容と完全に一致しており、正確に引用されています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「システムテスト」「リグレッション」「Turbo Frame」など、文脈に応じた技術用語が正確かつ適切に使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

テストケースが動的に生成される仕組みや、ナビゲーションテストの流れに関する説明は、提示されたコードから論理的に導かれるものであり、技術的に正確です。

事実の突合 ⚠ WARNING

PR情報による主張の裏付け(ハルシネーション検出)

PR#1068のバグ詳細(TableTools, Error 230)はPR#1069のDescriptionには直接記載されていません。しかし、関連PRとして明記されているため文脈補完として許容範囲ですが、厳密にはPR#1069の情報源のみから得られるものではありません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#1069, #1068)やファイル名(test/system/sandbox_test.rb)などの固有名詞はすべて正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトルは、PRのタイトル「Test sandbox values load cleanly」の内容を的確に日本語で表現しており、主題のズレはありません。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

バージョンサポート状況やリリース日程など、PR情報に基づかない外部知識の追加はありません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

「直前にマージされた」といった時間表現は、PRの文脈と一致しており、歪曲は見られません。