BOM付きCSVファイルのMIMEタイプ誤検出に対するフィクスチャ追加
BOM(Byte Order Mark)付きCSVファイルが text/csv ではなく text/plain として誤検出されていた問題に対し、リグレッション防止を目的としたテストフィクスチャが追加されました。
背景
BOM付きCSVファイルのMIMEタイプ検出が正しく機能しないという問題が #103 で報告されていました。BOMとはUnicodeファイルの先頭に付加される特殊バイト列(UTF-8では EF BB BF)で、Windowsのエクセルなどで作成されたCSVファイルに含まれることがあります。
#103 によると、通常のCSVは text/csv と正しく検出される一方、BOM付きCSVは text/plain と誤検出されていました。このPRの作者は、この問題がすでに修正済みである可能性を指摘しており、hexdump -C test/fixtures/name/text/csv/bom.csv コマンドでBOMバイト列が実際にファイル先頭に存在することを確認できます。
技術的な変更
変更はテストフィクスチャファイルの追加のみです。test/fixtures/name/text/csv/ ディレクトリに bom.csv が新たに追加されました。
marcelのテストフィクスチャは test/fixtures/name/{type}/{subtype}/{filename} という命名規則に従っており、ファイルの配置場所そのものが「このファイルは text/csv として検出されるべき」というアサーションを表しています。追加されたファイルの内容は以下のとおりです。
Name,Age,Occupation
Marcel Marceau,94,Mime
ファイル先頭の (表示上は見えない)がUTF-8 BOMバイト列(EF BB BF)に対応しており、GitHubのファイルビュー上では通常のCSVと区別できませんが、hexdump -C で確認するとバイト列の差異が確認できます。
設計判断
フィクスチャベースのテスト戦略 により、実際のバイナリ内容を持つファイルをリポジトリに含める形でリグレッションテストが構成されています。ディレクトリパスが期待するMIMEタイプを示す命名規則を採用することで、テストコードを追加せずにフィクスチャファイルを配置するだけでテストケースを追加できる設計になっています。
BOMのようなファイル先頭の特殊バイト列は、テキストとして記述することが難しいため、実際のバイト列を持つファイルをフィクスチャとして保持することは合理的な選択です。
まとめ
BOM付きCSVを text/csv として正しく検出できることをフィクスチャとして明示することで、将来の変更によるリグレッションを防ぐ安全網が追加されました。コード変更を伴わないこの追加は、既存の検出ロジックが正しく動作していることの証左であるとともに、その動作を継続的に保証する仕組みを組み込んだ変更です。