diff options
| author | Gab <24553253+gabrix73@users.noreply.github.com> | 2026-08-16 19:24:16 +0200 |
|---|---|---|
| committer | Gab <24553253+gabrix73@users.noreply.github.com> | 2026-08-16 19:24:16 +0200 |
| commit | 56e296e5875b10ed053cbdedbab08957fce2a461 (patch) | |
| tree | e1c49b328f1fe5142f7e2b27593b0905c5e3668a /yamn/encoder/encoder_test.go | |
| parent | 43fbddf016f94f4ba006d82c9a67dca61b5852a1 (diff) | |
| download | yamnweb-56e296e5875b10ed053cbdedbab08957fce2a461.tar.gz yamnweb-56e296e5875b10ed053cbdedbab08957fce2a461.tar.xz yamnweb-56e296e5875b10ed053cbdedbab08957fce2a461.zip | |
Diffstat (limited to 'yamn/encoder/encoder_test.go')
| -rw-r--r-- | yamn/encoder/encoder_test.go | 69 |
1 files changed, 68 insertions, 1 deletions
diff --git a/yamn/encoder/encoder_test.go b/yamn/encoder/encoder_test.go index 3509070..333b704 100644 --- a/yamn/encoder/encoder_test.go +++ b/yamn/encoder/encoder_test.go @@ -57,16 +57,83 @@ func TestValidateUsenetRequiresGatewayRecipient(t *testing.T) { func TestComposeUsenetGatewayHeaders(t *testing.T) { plain, err := composeMessage(Request{ Kind: Usenet, To: "mail2news@example.org", Subject: "test", Newsgroup: "misc.test", Body: "hello", + References: "<parent@example.org>", }) if err != nil { t.Fatal(err) } text := string(plain) - if !strings.Contains(text, "To: mail2news@example.org\n") || !strings.Contains(text, "Newsgroups: misc.test\n") { + if !strings.Contains(text, "To: mail2news@example.org\n") || + !strings.Contains(text, "Newsgroups: misc.test\n") || + !strings.Contains(text, "References: <parent@example.org>\n") || + !strings.Contains(text, "In-Reply-To: <parent@example.org>\n") { t.Fatalf("missing Usenet delivery headers: %q", text) } } +func TestComposeReferencesChainUsesLastIDAsParent(t *testing.T) { + plain, err := composeMessage(Request{ + Kind: Usenet, To: "mail2news@example.org", Subject: "test", Newsgroup: "misc.test", Body: "hello", + References: " <root@example.org> <parent@example.org> ", + }) + if err != nil { + t.Fatal(err) + } + text := string(plain) + if !strings.Contains(text, "References: <root@example.org> <parent@example.org>\n") || + !strings.Contains(text, "In-Reply-To: <parent@example.org>\n") { + t.Fatalf("thread headers were not normalized: %q", text) + } +} + +func TestValidateReferences(t *testing.T) { + tests := []struct { + name string + references string + valid bool + }{ + {name: "empty", valid: true}, + {name: "whitespace only", references: " "}, + {name: "parent", references: "<parent@example.org>", valid: true}, + {name: "thread chain", references: "<root@example.org> <parent@example.org>", valid: true}, + {name: "missing brackets", references: "parent@example.org"}, + {name: "missing local part", references: "<@example.org>"}, + {name: "multiple at signs", references: "<parent@example@org>"}, + {name: "embedded newline", references: "<root@example.org>\n<parent@example.org>"}, + {name: "header label", references: "References: <parent@example.org>"}, + {name: "too long", references: "<" + strings.Repeat("a", maxReferencesBytes) + "@example.org>"}, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + request := Request{ + Kind: Email, PublicKeyring: "/tmp/pubring.mix", Entry: "entry", Chain: []string{"entry"}, + To: "user@example.org", Body: "hello", References: test.references, + } + err := Validate(request) + if test.valid && err != nil { + t.Fatalf("expected valid References, got %v", err) + } + if !test.valid && err == nil { + t.Fatal("expected invalid References to be rejected") + } + }) + } +} + +func TestValidateReplyTo(t *testing.T) { + request := Request{ + Kind: Email, PublicKeyring: "/tmp/pubring.mix", Entry: "entry", Chain: []string{"entry"}, + To: "user@example.org", Body: "hello", ReplyTo: "Pseudonym <reply@example.org>", + } + if err := Validate(request); err != nil { + t.Fatalf("expected valid Reply-To, got %v", err) + } + request.ReplyTo = "not an address" + if err := Validate(request); err == nil { + t.Fatal("expected invalid Reply-To to be rejected") + } +} + func TestEncodeProducesYAMNArmor(t *testing.T) { keyring := testKeyring(t) result, err := Encode(Request{ |
