t3-code-android-nightly/oxlint-plugin-t3code/rules/no-native-title-tooltip.test.ts

61 lines
1.9 KiB
TypeScript

import { assert, describe } from "@effect/vitest";
import { createOxlintRuleHarness } from "../test/utils.ts";
const rule = createOxlintRuleHarness("t3code/no-native-title-tooltip", {
filename: "fixture.tsx",
});
describe("t3code/no-native-title-tooltip", () => {
rule.valid(
"allows intrinsic elements without a title attribute",
`const el = <span className="truncate">Truncated text</span>;`,
);
rule.valid(
"allows title props on custom components",
`const el = <SettingsRow id="word-wrap" title="Word wrap" description="Wrap long lines." />;`,
);
rule.valid(
"allows title on member expression components",
`const el = <Foo.Bar title="Not a native tooltip" />;`,
);
rule.valid(
"allows title as an accessible name on embedded content",
`const el = <iframe title="Embedded widget" src="https://example.com" />;`,
);
rule.valid("allows the svg title child element", `const el = <svg><title>QR code</title></svg>;`);
rule.valid("allows document.title assignments", `document.title = "Thread · T3 Code";`);
rule.invalid(
"reports title on a truncating span",
`const el = <span className="min-w-0 truncate" title="Full repository name">Repo</span>;`,
(output) => {
assert.match(output, /native title attribute/);
},
);
rule.invalid(
"reports title on a button",
`const el = <button type="button" aria-label="Scroll to end" title="Scroll to end" />;`,
(output) => {
assert.match(output, /Tooltip \+ TooltipTrigger \+ TooltipPopup/);
},
);
rule.invalid(
"reports title on a paragraph",
`const el = <p className="truncate text-xs" title={path}>src/main.ts</p>;`,
);
rule.invalid(
"reports title on a code element",
`const el = <code className="truncate" title={pairingUrl}>abc</code>;`,
);
rule.invalid("reports title on an anchor", `const el = <a href="#" title="Learn more">More</a>;`);
});