E-mail addresses and URLs test values
Addresses that are formally valid but extreme, and ones that only look valid. 12 values, each with what it breaks and what a correct application does instead.
Type them one at a time with AltShiftN
in the palette, or take them all into a script with nkb emit emails-urls.
Plus tag in the local part
emails-urls/plus-tag
jan+test@example.com
jan+test@example.com
- 20 graphemes
- 20 code points
- 20 bytes
- 20 UTF-16 units
- What it breaks
- A perfectly valid address rejected by a surprising number of forms, which breaks the tagging people rely on.
- What a correct application does
- Accepted; the plus sign is a legal character in the local part.
Uppercase local part
emails-urls/uppercase-local
JAN@example.com
JAN@example.com
- 15 graphemes
- 15 code points
- 15 bytes
- 15 UTF-16 units
- What it breaks
- The local part is case-sensitive in principle and treated as case-insensitive in practice; uniqueness checks disagree between layers.
- What a correct application does
- One consistent rule, applied at sign-up and at sign-in alike.
Internationalised domain
emails-urls/unicode-domain
jan@zażółć.example
jan@zażółć.example
- 18 graphemes
- 18 code points
- 22 bytes
- 18 UTF-16 units
- What it breaks
- Internationalised domains must be converted before use; a form that skips this rejects legitimate addresses.
- What a correct application does
- Accepted and converted, or rejected with a message that says why.
Two at signs
emails-urls/double-at
jan@@example.com
jan@@example.com
- 16 graphemes
- 16 code points
- 16 bytes
- 16 UTF-16 units
- What it breaks
- The shortest invalid address that many simple validators accept.
- What a correct application does
- Rejected.
Address without an at sign
emails-urls/no-at
jan.example.com
jan.example.com
- 15 graphemes
- 15 code points
- 15 bytes
- 15 UTF-16 units
- What it breaks
- A domain typed into an e-mail field; accepted by validators that only check for a dot.
- What a correct application does
- Rejected.
Trailing dot after the domain
emails-urls/trailing-dot-domain
jan@example.com.
jan@example.com.
- 16 graphemes
- 16 code points
- 16 bytes
- 16 UTF-16 units
- What it breaks
- A trailing dot is technically valid in a domain name and rejected by nearly every form.
- What a correct application does
- Accepted and normalised, or rejected consistently.
Local part of 64 characters
emails-urls/very-long-local
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@example.com
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@example.com
- 76 graphemes
- 76 code points
- 76 bytes
- 76 UTF-16 units
- What it breaks
- The boundary of the local part length; one character more must be rejected.
- What a correct application does
- The limit enforced with a message, not by truncation.
Quoted local part with a space
emails-urls/quoted-local
"jankowalski"@example.com
"jan kowalski"@example.com
- 26 graphemes
- 26 code points
- 26 bytes
- 26 UTF-16 units
- What it breaks
- A quoted local part containing a space is legal and almost never handled.
- What a correct application does
- Accepted, or rejected with a message stating the supported subset.
Link without a scheme
emails-urls/url-no-scheme
example.com
example.com
- 11 graphemes
- 11 code points
- 11 bytes
- 11 UTF-16 units
- What it breaks
- A link typed the way people type links; storing it without a scheme produces a broken link everywhere it is used.
- What a correct application does
- Normalised with a scheme, or rejected with an example of the expected form.
Link with credentials
emails-urls/url-with-credentials
https://user:pass@example.com
https://user:pass@example.com
- 29 graphemes
- 29 code points
- 29 bytes
- 29 UTF-16 units
- What it breaks
- A URL carrying credentials; displaying it anywhere reveals them, and storing it keeps them.
- What a correct application does
- Rejected, or stored with the credentials stripped and the user told.
Link of 2000 characters
emails-urls/url-very-long
https://example.com/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
2,000 code points in all, cut in the middle
https://example.com/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
- 2,000 graphemes
- 2,000 code points
- 2,000 bytes
- 2,000 UTF-16 units
- What it breaks
- Long links break storage limits, logs and every column that displays them.
- What a correct application does
- Accepted up to a stated limit, and truncated for display only.
Link with a non-ASCII path
emails-urls/url-unicode-path
https://example.com/zażółć
https://example.com/zażółć
- 26 graphemes
- 26 code points
- 30 bytes
- 26 UTF-16 units
- What it breaks
- Non-ASCII paths must be encoded; a layer that skips it produces links that work in one place and not another.
- What a correct application does
- Encoded once and consistently; the link works after a round trip.