Skip to content

Commit 77500bd

Browse files
committed
Add unit tests
1 parent 13ce1ed commit 77500bd

File tree

2 files changed

+121
-2
lines changed

2 files changed

+121
-2
lines changed

wfe2/wfe.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -682,7 +682,7 @@ func (wfe *WebFrontEndImpl) contactsToEmails(contacts []string) ([]string, error
682682

683683
err = policy.ValidEmail(parsed.Opaque)
684684
if err != nil {
685-
continue
685+
return nil, err
686686
}
687687

688688
emails = append(emails, parsed.Opaque)

wfe2/wfe_test.go

Lines changed: 120 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,7 @@ func setupWFE(t *testing.T) (WebFrontEndImpl, clock.FakeClock, requestSigner) {
429429
blog.NewMock(),
430430
10*time.Second,
431431
10*time.Second,
432+
2,
432433
&MockRegistrationAuthority{clk: fc},
433434
mockSA,
434435
nil,
@@ -1647,6 +1648,124 @@ func TestNewAccountNoID(t *testing.T) {
16471648
}`)
16481649
}
16491650

1651+
func TestContactsToEmails(t *testing.T) {
1652+
t.Parallel()
1653+
wfe, _, _ := setupWFE(t)
1654+
1655+
for _, tc := range []struct {
1656+
name string
1657+
contacts []string
1658+
want []string
1659+
wantErr string
1660+
}{
1661+
{
1662+
name: "no contacts",
1663+
contacts: []string{},
1664+
want: []string{},
1665+
},
1666+
{
1667+
name: "happy path",
1668+
contacts: []string{"mailto:[email protected]", "mailto:[email protected]"},
1669+
want: []string{"[email protected]", "[email protected]"},
1670+
},
1671+
{
1672+
name: "empty url",
1673+
contacts: []string{""},
1674+
wantErr: "empty contact",
1675+
},
1676+
{
1677+
name: "too many contacts",
1678+
contacts: []string{"mailto:[email protected]", "mailto:[email protected]", "mailto:[email protected]"},
1679+
wantErr: "too many contacts",
1680+
},
1681+
{
1682+
name: "unknown scheme",
1683+
contacts: []string{"ansible:earth.sol.milkyway.laniakea/letsencrypt"},
1684+
wantErr: "contact scheme",
1685+
},
1686+
{
1687+
name: "malformed email",
1688+
contacts: []string{"mailto:admin.com"},
1689+
wantErr: "unable to parse email address",
1690+
},
1691+
{
1692+
name: "non-ascii email",
1693+
contacts: []string{"mailto:señ[email protected]"},
1694+
wantErr: "contains non-ASCII characters",
1695+
},
1696+
{
1697+
name: "unarseable email",
1698+
contacts: []string{"mailto:[email protected], [email protected]"},
1699+
wantErr: "unable to parse email address",
1700+
},
1701+
{
1702+
name: "forbidden example domain",
1703+
contacts: []string{"mailto:[email protected]"},
1704+
wantErr: "forbidden",
1705+
},
1706+
{
1707+
name: "forbidden non-public domain",
1708+
contacts: []string{"mailto:admin@localhost"},
1709+
wantErr: "needs at least one dot",
1710+
},
1711+
{
1712+
name: "forbidden non-iana domain",
1713+
contacts: []string{"mailto:[email protected]"},
1714+
wantErr: "does not end with a valid public suffix",
1715+
},
1716+
{
1717+
name: "forbidden ip domain",
1718+
contacts: []string{"mailto:[email protected]"},
1719+
wantErr: "value is an IP address",
1720+
},
1721+
{
1722+
name: "forbidden bracketed ip domain",
1723+
contacts: []string{"mailto:admin@[1.2.3.4]"},
1724+
wantErr: "contains an invalid character",
1725+
},
1726+
{
1727+
name: "query parameter",
1728+
contacts: []string{"mailto:[email protected]?no-reminder-emails"},
1729+
wantErr: "contains a question mark",
1730+
},
1731+
{
1732+
name: "empty query parameter",
1733+
contacts: []string{"mailto:[email protected]?"},
1734+
wantErr: "contains a question mark",
1735+
},
1736+
{
1737+
name: "fragment url",
1738+
contacts: []string{"mailto:[email protected]#optional"},
1739+
wantErr: "contains a '#'",
1740+
},
1741+
{
1742+
name: "empty frament url",
1743+
contacts: []string{"mailto:[email protected]#"},
1744+
wantErr: "contains a '#'",
1745+
},
1746+
} {
1747+
t.Run(tc.name, func(t *testing.T) {
1748+
t.Parallel()
1749+
got, err := wfe.contactsToEmails(tc.contacts)
1750+
if tc.wantErr != "" {
1751+
if err == nil {
1752+
t.Fatalf("contactsToEmails(%#v) = nil, but want %q", tc.contacts, tc.wantErr)
1753+
}
1754+
if !strings.Contains(err.Error(), tc.wantErr) {
1755+
t.Errorf("contactsToEmails(%#v) = %q, but want %q", tc.contacts, err.Error(), tc.wantErr)
1756+
}
1757+
} else {
1758+
if err != nil {
1759+
t.Fatalf("contactsToEmails(%#v) = %q, but want %#v", tc.contacts, err.Error(), tc.want)
1760+
}
1761+
if !slices.Equal(got, tc.want) {
1762+
t.Errorf("contactsToEmails(%#v) = %#v, but want %#v", tc.contacts, got, tc.want)
1763+
}
1764+
}
1765+
})
1766+
}
1767+
}
1768+
16501769
func TestGetAuthorizationHandler(t *testing.T) {
16511770
wfe, _, signer := setupWFE(t)
16521771

@@ -4189,7 +4308,7 @@ func TestNewAccountCreatesContacts(t *testing.T) {
41894308
{
41904309
name: "One valid email, one invalid email",
41914310
contacts: []string{"mailto:[email protected]", "mailto:lol@%mail.com"},
4192-
expected: []string{"[email protected]"},
4311+
expected: []string{},
41934312
},
41944313
{
41954314
name: "Valid email with non-email prefix",

0 commit comments

Comments
 (0)