package alarmsocket import ( "context" "net" "path/filepath" "strings" "testing" "time" "tera-clone/services/tera-api/internal/alarmdelivery" ) func TestClientServerDeliveryRoundTrip(t *testing.T) { listener, err := net.Listen("unix", filepath.Join(t.TempDir(), "alarm.sock")) if err != nil { t.Fatal(err) } defer listener.Close() server := Server{Controller: alarmdelivery.MockController{Clock: func() time.Time { return time.Date(2026, 7, 23, 1, 2, 3, 0, time.UTC) }}} done := make(chan error, 1) go func() { done <- server.Serve(listener) }() client := NewClient(listener.Addr().String()) result, err := client.Deliver(context.Background(), alarmdelivery.Request{ Message: "test", Channels: []string{"web"}, RetryIntervalSeconds: 1, QueueLimit: 10, }) if err != nil { t.Fatal(err) } if result.State != "delivered" || result.DeliveryID != "mock_alarm_delivery" || result.Attempts != 1 { t.Fatalf("delivery result = %+v", result) } _ = listener.Close() if err := <-done; err != nil { t.Fatal(err) } } func TestServerRejectsUnknownFieldsAndActions(t *testing.T) { for _, payload := range []string{ `{"action":"deliver","unknown":true}` + "\n", `{"action":"delete"}` + "\n", } { serverSide, clientSide := net.Pipe() go Server{Controller: alarmdelivery.MockController{}}.handle(serverSide) if _, err := clientSide.Write([]byte(payload)); err != nil { t.Fatal(err) } buffer := make([]byte, 1024) count, err := clientSide.Read(buffer) if err != nil { t.Fatal(err) } _ = clientSide.Close() if !strings.Contains(string(buffer[:count]), "validation_failed") { t.Fatalf("response = %q", buffer[:count]) } } }