Source identity
| Field | Recorded value |
|---|---|
| Source type | GitHub source |
| Original record | Janady13/missionmatch / internal/modules/recruiting/messaging_test.go |
| Date | Not specified in source |
| Repository | Janady13/missionmatch |
| Revision | 720d47fae476b0d38477ae4401697d372b1ea2bc |
| Branch | feature/opportunity-to-outcome |
| Path or archive member | internal/modules/recruiting/messaging_test.go |
| Original SHA-256 | 9ef14e3d8b12e933b4651db6f93ca31b5338c7364c1ade51ffc5ad14c4420e92 |
| Git blob SHA | 0e9edaccb157b520a9a857ff295dfe960acd3ce8 |
| Reading-copy SHA-256 | 9ef14e3d8b12e933b4651db6f93ca31b5338c7364c1ade51ffc5ad14c4420e92 |
Recovered source transcript
Download complete source text ↓129 lines · 4.7 KB
package recruiting
import (
"strings"
"testing"
)
// A placeholder must NEVER render empty. "Hi ," is worse than no personalisation, and it is the thing a
// candidate notices instantly.
func TestPlaceholdersNeverRenderEmpty(t *testing.T) {
cases := []struct {
name string
r recipient
want string
}{
{"a full name", recipient{name: "Dana Reyes", email: "d@x.test"}, "Dana"},
{"one word name", recipient{name: "Prince", email: "p@x.test"}, "Prince"},
{"whitespace only", recipient{name: " ", email: "w@x.test"}, "there"},
{"empty name", recipient{name: "", email: "e@x.test"}, "there"},
}
for _, c := range cases {
got := ExpandPlaceholders("Hi {{first_name}},", c.r, "Acme")
if !strings.Contains(got, c.want) {
t.Errorf("%s: expanded to %q, expected it to contain %q", c.name, got, c.want)
}
if strings.Contains(got, "Hi ,") {
t.Errorf("%s: rendered an empty greeting: %q", c.name, got)
}
if strings.Contains(got, "{{") {
t.Errorf("%s: left an unexpanded token: %q", c.name, got)
}
}
}
func TestExpandAllPlaceholders(t *testing.T) {
r := recipient{name: "Dana Reyes", email: "dana@example.test"}
got := ExpandPlaceholders(
"{{first_name}}|{{full_name}}|{{email}}|{{sender_name}}", r, "Acme Recruiting")
want := "Dana|Dana Reyes|dana@example.test|Acme Recruiting"
if got != want {
t.Errorf("expansion wrong:\n got %q\nwant %q", got, want)
}
// Every token the system advertises must actually expand. A published placeholder that does nothing is
// worse than one that does not exist, because somebody will use it.
for _, p := range Placeholders() {
if out := ExpandPlaceholders(p, r, "Acme"); strings.Contains(out, "{{") {
t.Errorf("advertised placeholder %s did not expand, it rendered %q", p, out)
}
}
}
// A template carrying a token this system cannot fill must be REFUSED at authoring time. Letting it through
// means a candidate receives a message with a visible curly brace in it, which reads as a broken mail merge.
func TestUnknownPlaceholdersRefused(t *testing.T) {
for _, bad := range []string{
"Hi {{firstname}},", "{{ first_name }}", "{{salary}}", "{{company}}",
"Hello {{first_name}} about {{req_title}}",
} {
if got := unknownPlaceholders(bad); got == "" {
t.Errorf("%q carries a token this system cannot fill and was accepted", bad)
}
}
for _, good := range []string{
"", "Hi there", "Hi {{first_name}},", "{{first_name}} {{full_name}} {{email}} {{sender_name}}",
"a { single brace } is fine",
} {
if got := unknownPlaceholders(good); got != "" {
t.Errorf("%q is valid and was refused for %q", good, got)
}
}
}
// An unterminated token must not hang or panic. It is the input a person types halfway through editing.
func TestUnterminatedPlaceholderTerminates(t *testing.T) {
done := make(chan string, 1)
go func() { done <- unknownPlaceholders("Hi {{first_name") }()
select {
case got := <-done:
if got == "" {
t.Error("an unterminated token should be reported, not silently accepted")
}
default:
// The goroutine already returned or is about to; a real hang fails the test binary's own timeout.
}
if got := unknownPlaceholders("{{"); got == "" {
t.Error("a bare opening token should be reported")
}
}
func TestTemplateValidation(t *testing.T) {
ok := templateRequest{Name: "First outreach", Audience: "candidate", Subject: "Hello", Body: "Hi {{first_name}},"}
if f, err := validTemplate(ok); err != nil {
t.Errorf("a valid template was refused on %q: %v", f, err)
}
cases := []struct {
name string
in templateRequest
field string
}{
{"no name", templateRequest{Audience: "candidate", Body: "x"}, "name"},
{"bad audience", templateRequest{Name: "n", Audience: "everyone", Body: "x"}, "audience"},
{"no body", templateRequest{Name: "n", Audience: "candidate", Body: " "}, "body"},
{"unknown token", templateRequest{Name: "n", Audience: "candidate", Body: "Hi {{nickname}}"}, "body"},
{"oversized subject", templateRequest{Name: "n", Audience: "candidate",
Subject: strings.Repeat("x", 301), Body: "x"}, "subject"},
}
for _, c := range cases {
f, err := validTemplate(c.in)
if err == nil {
t.Errorf("%s should be refused", c.name)
continue
}
if f != c.field {
t.Errorf("%s reported field %q, expected %q", c.name, f, c.field)
}
}
}
// A transport error can echo the credentials it was rejecting, and that text is stored on the message row and
// returned over the API.
func TestScrubRemovesCredentials(t *testing.T) {
out := scrub("535 auth failed for svc-mailer using hunter2000seven", "svc-mailer", "hunter2000seven")
for _, secret := range []string{"svc-mailer", "hunter2000seven"} {
if strings.Contains(out, secret) {
t.Errorf("%q survived scrubbing: %q", secret, out)
}
}
}