サンドボックスの各テンプレートが正常にロードされることを検証するシステムテストを追加
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の変更があった際に差異が明確になります。
まとめ
バグ修正後にその再発防止テストを追加するという一連の対応は、テストの責務を「現状の動作保証」だけでなく「過去の失敗の記憶」として機能させる設計思想を示しています。コントローラー定数を起点にしたテスト自動生成により、サンドボックスの拡張に対してテストが自律的に追従する仕組みが整いました。