// @vitest-environment jsdom
import { describe, it, expect } from 'vitest';
import { buildDumpHtmlScript } from './browser.js';
/**
* dumpHtml がページ内で走らせる文字列を jsdom の上で実際に評価して、
* 生の HTML に入力欄の中身が載らないことを見る(issue #1236 レビュー)。
*
* 入力した文字列を `value` **属性**へ書き戻すページ(React の制御された
* input など)では、打ち込んだ値がそのまま HTML に現れる。ここはその形を
* 直接置いて確かめる。ブラウザを通す経路の確認は
* browser.recording-secret.e2e.test.ts(http サーバ + 本物の Chromium)。
*/
function dump(html: string, selector?: string, depth = 3): string {
document.body.innerHTML = html;
return (0, eval)(buildDumpHtmlScript(selector, depth)) as string;
}
describe('buildDumpHtmlScript — value 属性に残った中身', () => {
it('パスワード欄の value 属性を伏せる', () => {
const out = dump('');
expect(out).not.toContain('hunter2-topsecret');
expect(out).toContain('value="[masked]"');
});
it('ふつうの欄の value 属性はそのまま残す(伏せ過ぎの回帰)', () => {
const out = dump('');
expect(out).toContain('value="alice-visible"');
expect(out).not.toContain('[masked]');
});
it('選んだ要素そのものが入力欄でも伏せる(根は querySelectorAll に出ない)', () => {
const out = dump(
'',
'#pw',
);
expect(out).not.toContain('hunter2-topsecret');
expect(out).toContain('value="[masked]"');
});
it('名札だけが手掛かりの欄も伏せる(「表示」で伏せ字を解いた欄)', () => {
const out = dump('');
expect(out).not.toContain('hunter2-topsecret');
expect(out).toContain('value="[masked]"');
});
it('`