- Priority 1: Test NewSendEmailTask + NewSendPushTask (5 tests) - Priority 2: Test customHTTPErrorHandler — all 15+ branches (21 tests) - Priority 3: Extract Enqueuer interface + payload builders in worker pkg (5 tests) - Priority 4: Extract ClassifyFile/ComputeRelPath in migrate-encrypt (6 tests) - Priority 5: Define Handler interfaces, refactor to accept them, mock-based tests (14 tests) - Fix .gitignore: /worker instead of worker to stop ignoring internal/worker/ Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
111 lines
3.0 KiB
Go
111 lines
3.0 KiB
Go
package worker
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
)
|
|
|
|
// --- Payload roundtrip tests ---
|
|
|
|
func TestWelcomeEmailPayload_MarshalRoundtrip(t *testing.T) {
|
|
original := WelcomeEmailPayload{
|
|
EmailPayload: EmailPayload{To: "a@b.com", FirstName: "Alice"},
|
|
ConfirmationCode: "ABC123",
|
|
}
|
|
data, err := json.Marshal(original)
|
|
if err != nil {
|
|
t.Fatalf("marshal: %v", err)
|
|
}
|
|
var got WelcomeEmailPayload
|
|
if err := json.Unmarshal(data, &got); err != nil {
|
|
t.Fatalf("unmarshal: %v", err)
|
|
}
|
|
if got.To != original.To || got.FirstName != original.FirstName || got.ConfirmationCode != original.ConfirmationCode {
|
|
t.Errorf("roundtrip mismatch: got %+v, want %+v", got, original)
|
|
}
|
|
}
|
|
|
|
func TestVerificationEmailPayload_MarshalRoundtrip(t *testing.T) {
|
|
original := VerificationEmailPayload{
|
|
EmailPayload: EmailPayload{To: "b@c.com", FirstName: "Bob"},
|
|
Code: "999888",
|
|
}
|
|
data, err := json.Marshal(original)
|
|
if err != nil {
|
|
t.Fatalf("marshal: %v", err)
|
|
}
|
|
var got VerificationEmailPayload
|
|
if err := json.Unmarshal(data, &got); err != nil {
|
|
t.Fatalf("unmarshal: %v", err)
|
|
}
|
|
if got.To != original.To || got.FirstName != original.FirstName || got.Code != original.Code {
|
|
t.Errorf("roundtrip mismatch: got %+v, want %+v", got, original)
|
|
}
|
|
}
|
|
|
|
func TestPasswordResetEmailPayload_MarshalRoundtrip(t *testing.T) {
|
|
original := PasswordResetEmailPayload{
|
|
EmailPayload: EmailPayload{To: "c@d.com", FirstName: "Carol"},
|
|
Code: "XYZ",
|
|
ResetToken: "tok-abc-123",
|
|
}
|
|
data, err := json.Marshal(original)
|
|
if err != nil {
|
|
t.Fatalf("marshal: %v", err)
|
|
}
|
|
var got PasswordResetEmailPayload
|
|
if err := json.Unmarshal(data, &got); err != nil {
|
|
t.Fatalf("unmarshal: %v", err)
|
|
}
|
|
if got.To != original.To || got.FirstName != original.FirstName || got.Code != original.Code || got.ResetToken != original.ResetToken {
|
|
t.Errorf("roundtrip mismatch: got %+v, want %+v", got, original)
|
|
}
|
|
}
|
|
|
|
func TestPasswordChangedEmailPayload_MarshalRoundtrip(t *testing.T) {
|
|
original := EmailPayload{To: "d@e.com", FirstName: "Dave"}
|
|
data, err := json.Marshal(original)
|
|
if err != nil {
|
|
t.Fatalf("marshal: %v", err)
|
|
}
|
|
var got EmailPayload
|
|
if err := json.Unmarshal(data, &got); err != nil {
|
|
t.Fatalf("unmarshal: %v", err)
|
|
}
|
|
if got.To != original.To || got.FirstName != original.FirstName {
|
|
t.Errorf("roundtrip mismatch: got %+v, want %+v", got, original)
|
|
}
|
|
}
|
|
|
|
// --- Task type constant tests ---
|
|
|
|
func TestTaskTypeConstants_Unique(t *testing.T) {
|
|
types := []string{
|
|
TypeWelcomeEmail,
|
|
TypeVerificationEmail,
|
|
TypePasswordResetEmail,
|
|
TypePasswordChangedEmail,
|
|
}
|
|
seen := make(map[string]bool)
|
|
for _, typ := range types {
|
|
if seen[typ] {
|
|
t.Errorf("duplicate task type: %q", typ)
|
|
}
|
|
seen[typ] = true
|
|
}
|
|
}
|
|
|
|
func TestTaskTypeConstants_EmailPrefix(t *testing.T) {
|
|
types := []string{
|
|
TypeWelcomeEmail,
|
|
TypeVerificationEmail,
|
|
TypePasswordResetEmail,
|
|
TypePasswordChangedEmail,
|
|
}
|
|
for _, typ := range types {
|
|
if len(typ) < 6 || typ[:6] != "email:" {
|
|
t.Errorf("task type %q does not have 'email:' prefix", typ)
|
|
}
|
|
}
|
|
}
|