You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.6 KiB
61 lines
1.6 KiB
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])
|
|
}
|
|
}
|
|
}
|
|
|