test: add comprehensive testing infrastructure with critical bug fixes

- Add Vitest testing framework with 88 passing tests across 4 test files
- Fix critical entity validator bug (service array index)
- Implement validator architecture with 'matched but invalid' state support
- Add strict IPv4/IPv6 validation with detailed error messages
- Add case-insensitive domain and ASN matching
- Add explicit validator priority ordering (url→json→tld→ip→domain)
- Add integration tests with real IANA registry validation
- Add AutnumCard component for AS number display
- Update dependencies: prettier 2.8.1→2.8.8

Test coverage:
- helpers.test.ts: IPv4/IPv6 CIDR matching (27 tests)
- helpers.asn.test.ts: ASN range validation (22 tests)
- rdap.test.ts: Type detection with edge cases (36 tests)
- rdap.integration.test.ts: Real IANA registry tests (3 tests)

Bug fixes:
- Entity validator now correctly uses service[1] for tags (0=email, 1=tags, 2=urls)
- IPv4 validation rejects octets >255 with specific error messages
- IPv6 validation checks for invalid hex chars and multiple ::
- Domain regex supports multi-label domains (a.b.c.d.example.net)
- Type detection priority prevents URL/JSON false matches as domains
This commit is contained in:
2025-10-22 01:23:15 -05:00
parent 09cd0bf49b
commit 5fb095a498
27 changed files with 4559 additions and 1745 deletions

View File

@@ -14,17 +14,25 @@ const Index: NextPage = () => {
const [detectedType, setDetectedType] = useState<Maybe<TargetType>>(
Maybe.nothing()
);
const [response, setResponse] = useState<Maybe<MetaParsedGeneric>>(Maybe.nothing());
const [response, setResponse] = useState<Maybe<MetaParsedGeneric>>(
Maybe.nothing()
);
const [isLoading, setLoading] = useState<boolean>(false);
return (
<>
<Head>
<title>rdap.xevion.dev</title>
<meta name="description" content="A custom, private RDAP lookup client built by Xevion." />
<meta
name="description"
content="A custom, private RDAP lookup client built by Xevion."
/>
<meta property="og:url" content="https://rdap.xevion.dev" />
<meta property="og:title" content="RDAP | by Xevion.dev" />
<meta property="og:description" content="A custom, private RDAP lookup client built by Xevion." />
<meta
property="og:description"
content="A custom, private RDAP lookup client built by Xevion."
/>
<meta property="og:site_name" content="rdap.xevion.dev" />
<meta property="og:type" content="website" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
@@ -34,8 +42,17 @@ const Index: NextPage = () => {
/>
</Head>
<nav className="bg-zinc-850 px-5 py-4 shadow-sm">
<span className="text-white text-xl font-medium" style={{ fontSize: "larger" }}>
<a href="https://github.com/Xevion/rdap">rdap</a><a href={"https://xevion.dev"} className="text-zinc-400 hover:animate-pulse">.xevion.dev</a>
<span
className="text-xl font-medium text-white"
style={{ fontSize: "larger" }}
>
<a href="https://github.com/Xevion/rdap">rdap</a>
<a
href={"https://xevion.dev"}
className="text-zinc-400 hover:animate-pulse"
>
.xevion.dev
</a>
</span>
</nav>
<div className="mx-auto max-w-screen-sm px-5 lg:max-w-screen-md xl:max-w-screen-lg">