@@ -88,6 +88,76 @@ func TestSubscribeEventsContextCancelClosesEvents(t *testing.T) {
8888 }
8989}
9090
91+func TestSendMessageAcceptsStatusAccepted(t *testing.T) {
92+ t.Parallel()
93+
94+ srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
95+ w.WriteHeader(http.StatusAccepted)
96+ }))
97+ defer srv.Close()
98+
99+ c := captureClient(t, srv)
100+ require.NoError(t, c.SendMessage(context.Background(), "ws1", "sess1", "", "hello"))
101+}
102+
103+func TestSendMessageAcceptsStatusOK(t *testing.T) {
104+ t.Parallel()
105+
106+ srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
107+ w.WriteHeader(http.StatusOK)
108+ }))
109+ defer srv.Close()
110+
111+ c := captureClient(t, srv)
112+ require.NoError(t, c.SendMessage(context.Background(), "ws1", "sess1", "", "hello"))
113+}
114+
115+func TestSendMessageDecodesErrorBody(t *testing.T) {
116+ t.Parallel()
117+
118+ srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
119+ w.WriteHeader(http.StatusBadRequest)
120+ _ = json.NewEncoder(w).Encode(proto.Error{Message: "session id is required"})
121+ }))
122+ defer srv.Close()
123+
124+ c := captureClient(t, srv)
125+ err := c.SendMessage(context.Background(), "ws1", "", "", "hello")
126+ require.Error(t, err)
127+ require.Contains(t, err.Error(), "status code 400")
128+ require.Contains(t, err.Error(), "session id is required")
129+}
130+
131+func TestSendMessageFallsBackOnMalformedErrorBody(t *testing.T) {
132+ t.Parallel()
133+
134+ srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
135+ w.WriteHeader(http.StatusInternalServerError)
136+ _, _ = w.Write([]byte("not json"))
137+ }))
138+ defer srv.Close()
139+
140+ c := captureClient(t, srv)
141+ err := c.SendMessage(context.Background(), "ws1", "sess1", "", "hello")
142+ require.Error(t, err)
143+ require.Contains(t, err.Error(), "status code 500")
144+ require.NotContains(t, err.Error(), "not json")
145+}
146+
147+func TestSendMessageFallsBackOnEmptyErrorBody(t *testing.T) {
148+ t.Parallel()
149+
150+ srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
151+ w.WriteHeader(http.StatusInternalServerError)
152+ }))
153+ defer srv.Close()
154+
155+ c := captureClient(t, srv)
156+ err := c.SendMessage(context.Background(), "ws1", "sess1", "", "hello")
157+ require.Error(t, err)
158+ require.Contains(t, err.Error(), "status code 500")
159+}
160+
91161func marshalSSEPayload(t *testing.T) []byte {
92162 t.Helper()
93163