0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ブックマークHTMLの出力を「一件の不正URLで全件中止」にする境界テスト

0
Last updated at Posted at 2026-10-11

一覧画面のファイル書き出しでは、選択した30件のうち1件だけURLが壊れていたときに、残り29件だけのファイルを黙って渡すべきではありません。私は韓国の住所・リンク集サービス JUSOMOUM を運営しています。公式サイトを選んでHTML/JSONに書き出すツールのHTML生成境界で、この失敗をどう扱うかを実装と小さなテストで確認しました。選択UIのフィルタやChromeへの取り込み手順ではなく、生成関数の例外とダウンロード前の順序に焦点を当てます。

先に全選択行を検査してから文字列を組み立てる

実装のmakeHtml(selected)は、各行をカテゴリ別のMapへ積む前にURLを解釈し、HTTPS以外なら例外を投げます。

for (const row of selected) {
  if (new URL(row.url).protocol !== 'https:') {
    throw new Error('Invalid URL');
  }
  if (!groups.has(row.category)) groups.set(row.category, []);
  groups.get(row.category).push(row);
}

new URL(...)自体が解釈できない文字列で例外を投げる点も境界です。Mapに一部の行が入っていても、ファイル文字列を返す処理には進みません。download()ではmakeHtmlが正常に戻った後に初めてBlobを作り、URL.createObjectURLを呼びます。try/catchは失敗時に画面のフィードバックを出します。したがって、このHTML経路については失敗した選択から部分ファイルを生成しない構造です。

実際の関数を小さい入力で走らせる

2026-10-11 KSTに、公開済みのapps/web/bookmarks.jsのmakeHtmlをNodeのvmへ読み込み、DOM依存部分だけを小さなスタブにして3件の入力を確認しました。ブラウザダウンロード全体や別ブラウザの挙動を試したものではありません。

入力 観測結果
https://example.org/search?q=A&B=1、表示名A&B<Guide> <A HREF="https://example.org/search?q=A&amp;B=1">A&amp;B&lt;Guide&gt;</A>を生成
http://example.org/ Error: Invalid URLで生成中止
https://[bad/ new URLのTypeErrorで生成中止

確認用コードは実装文字列をローカルで読み、末尾のクロージャにテスト用のmakeHtml参照だけを付けて呼びました。公開サイトのデータやサーバー設定は変更していません。HTTPS形式の確認はリンク先の真正性・稼働状態の確認ではありません。

HTMLとJSONの保証を混同しない

ここでいう追加のURLチェックはHTML出力経路のものです。JSON出力は選択行をJSON.stringifyし、この関数のHTTPS再検査は通りません。一方、サイト生成時の元データには別の検証があります。両経路が同じ安全性保証だと書くのは不正確です。将来ユーザーが任意のURLを追加できる仕様へ変えるなら、両経路の共通境界で検証する設計と、失敗時にダウンロードが起こらない統合テストが必要になります。

この記事の再現対象はHTML生成関数の3入力と例外境界だけであり、リンク先の接続可否や検索順位は測定していません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?