Files
warmbly/internal/pkg/humanlint/humanlint_test.go
T
Matthew Meszaros f96bdfd2c1 feat: improve warmup content safeguards
Use subject-specific humanization so short warmup subjects are not mangled by body-level opener stripping.

Add rDNS verification logging after provisioning and remove the unused public campaign breaker interface method.
2026-06-03 11:32:19 +02:00

116 lines
3.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package humanlint
import (
"strings"
"testing"
"github.com/warmbly/warmbly/internal/pkg/warmlint"
)
func TestHumanizeStripsEmDash(t *testing.T) {
out := Humanize("I tried the new setup — it worked great.", 1)
if strings.ContainsAny(out, "—–") {
t.Fatalf("em-dash not removed: %q", out)
}
}
func TestHumanizeStripsClicheOpener(t *testing.T) {
out := Humanize("I hope this email finds you well. How did the demo go?", 1)
if strings.Contains(strings.ToLower(out), "hope this email finds you well") {
t.Fatalf("cliche opener not stripped: %q", out)
}
if !strings.Contains(out, "demo") {
t.Fatalf("content after opener was lost: %q", out)
}
}
func TestHumanizeSwapsAIVocabulary(t *testing.T) {
out := strings.ToLower(Humanize("Can we leverage the robust new framework?", 1))
if strings.Contains(out, "leverage") || strings.Contains(out, "robust") {
t.Fatalf("AI vocabulary not swapped: %q", out)
}
}
func TestHumanizeFlattensNotOnlyButAlso(t *testing.T) {
out := strings.ToLower(Humanize("It was not only fast but also cheap.", 1))
if strings.Contains(out, "not only") || strings.Contains(out, "but also") {
t.Fatalf("not-only-but-also not flattened: %q", out)
}
}
func TestHumanizeNormalizesQuotes(t *testing.T) {
out := Humanize("Its the “best” one…", 1)
if strings.ContainsAny(out, "‘’“”…") {
t.Fatalf("smart punctuation not normalized: %q", out)
}
}
func TestHumanizeAppliesSomeContractions(t *testing.T) {
// Across several seeds at least one should contract (probabilistic ~0.72).
in := "I am sure you do not mind. It is fine."
contracted := false
for seed := int64(0); seed < 20; seed++ {
if strings.Contains(Humanize(in, seed), "'") {
contracted = true
break
}
}
if !contracted {
t.Fatal("no contractions applied across 20 seeds")
}
}
func TestHumanizeSubjectDoesNotFabricateReplyPrefix(t *testing.T) {
// A short subject starting with a stock-opener fragment must NOT have the
// opener stripped into a stray "Re ..." prefix.
for seed := int64(0); seed < 5; seed++ {
out := HumanizeSubject("I'm reaching out re Tuesday", seed)
if strings.HasPrefix(out, "Re ") || strings.HasPrefix(strings.ToLower(out), "re:") {
t.Fatalf("subject mangled into reply-prefix: %q", out)
}
}
// The defensive guard also protects plain Humanize on subject-shaped text
// (short, no sentence terminator): the opener must not be clause-stripped.
if got := Humanize("I'm reaching out re Tuesday", 1); strings.HasPrefix(got, "Re ") {
t.Fatalf("short opener-stripping not guarded: %q", got)
}
}
func TestHumanizeIsDeterministic(t *testing.T) {
in := "I am reaching out. It is not only fast but also smooth — really."
if Humanize(in, 42) != Humanize(in, 42) {
t.Fatal("Humanize is not deterministic for a fixed seed")
}
}
func TestHumanizeDoesNotIntroduceSpam(t *testing.T) {
// Humanizing clean warmup-ish copy must never trip the spam gate.
inputs := []string{
"I hope this email finds you well. I wanted to reach out about the deck.",
"We should leverage the robust framework — it is seamless.",
"How did Tuesday go? No rush, just curious.",
}
for _, in := range inputs {
out := Humanize(in, 7)
if err := warmlint.Check("quick note", out, false); err != nil {
t.Fatalf("humanized output tripped warmlint for %q -> %q: %v", in, out, err)
}
}
}
func TestScoreFlagsRoboticHigherThanHuman(t *testing.T) {
robotic := "I hope this email finds you well. I wanted to reach out to underscore that our robust, seamless, and comprehensive framework will leverage synergy. It is worth noting that this is not only pivotal but also transformative."
human := "hey, how did Tuesday go? no rush. I'll send the second draft over after lunch."
rs, _ := Score(robotic)
hs, _ := Score(human)
if rs <= hs {
t.Fatalf("expected robotic (%d) > human (%d)", rs, hs)
}
if !LooksRobotic(robotic) {
t.Fatalf("robotic text not flagged (score %d)", rs)
}
if LooksRobotic(human) {
t.Fatalf("human text wrongly flagged (score %d)", hs)
}
}