package internal import ( "errors" "fmt" "io" "net" "net/http" "net/http/httptest" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestClientSend_SOAPFault(t *testing.T) { ciims := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/xml; charset=UTF-8") fmt.Fprint(w, ErrMsg) })) defer ciims.Close() client, err := NewClient(10) require.NoError(t, err) resp, err := client.Send(ciims.URL+"/services/ExchangeService", "") assert.NoError(t, err) require.NotNil(t, resp) assert.True(t, resp.IsFault()) assert.Equal(t, "Can not find the event [FLOP-ESTT-ATC-ALL1]", resp.ErrorMessage()) } func TestClientSend_Success(t *testing.T) { ciims := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/xml; charset=UTF-8") fmt.Fprint(w, SendOk) })) defer ciims.Close() client, err := NewClient(10) require.NoError(t, err) resp, err := client.Send(ciims.URL+"/services/ExchangeService", "") assert.NoError(t, err) require.NotNil(t, resp) assert.Equal(t, "", resp.ErrorMessage()) } func TestClientSend_ReceiveMessages(t *testing.T) { ciims := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/xml; charset=UTF-8") fmt.Fprint(w, ReceiveResp) })) defer ciims.Close() client, err := NewClient(10) require.NoError(t, err) resp, err := client.Send(ciims.URL+"/services/ExchangeService", "") assert.NoError(t, err) require.NotNil(t, resp) msgs := resp.Messages() assert.Equal(t, 2, len(msgs)) assert.Equal(t, Msg, msgs[0]) assert.Equal(t, Msg, msgs[1]) } func TestClientSend_NetworkTimeout(t *testing.T) { listener, err := net.Listen("tcp", "127.0.0.1:0") require.NoError(t, err) addr := listener.Addr().String() go func() { conn, _ := listener.Accept() if conn != nil { io.Copy(io.Discard, conn) conn.Close() } }() client, err := NewClient(1) require.NoError(t, err) _, err = client.Send("http://"+addr+"/services/ExchangeService", "") listener.Close() assert.Error(t, err) } func TestClientSend_ServerError(t *testing.T) { client, err := NewClient(1) require.NoError(t, err) _, err = client.Send("http://127.0.0.1:1/nonexistent", "") assert.Error(t, err) } func TestClientSend_HTTPStatusError(t *testing.T) { ciims := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { http.Error(w, "backend failed", http.StatusInternalServerError) })) defer ciims.Close() client, err := NewClient(10) require.NoError(t, err) resp, err := client.Send(ciims.URL+"/services/ExchangeService", "") require.Error(t, err) require.NotNil(t, resp) var statusErr *HTTPStatusError require.True(t, errors.As(err, &statusErr)) assert.Equal(t, http.StatusInternalServerError, statusErr.StatusCode) assert.Contains(t, statusErr.Body, "backend failed") } func TestGetMsgs_Empty(t *testing.T) { msgs := GetMsgs("") assert.Equal(t, 0, len(msgs)) } func TestGetMsgs_DifferentNamespacePrefix(t *testing.T) { resp := ` <MSG/> ` msgs := GetMsgs(resp) assert.Equal(t, 1, len(msgs)) assert.Equal(t, "", msgs[0]) } func TestGetMsgs_AttributesWhitespaceAndMultiline(t *testing.T) { resp := ` <MSG> <A>1</A> </MSG> ` msgs := GetMsgs(resp) require.Len(t, msgs, 1) assert.Contains(t, msgs[0], "") assert.Contains(t, msgs[0], "1") } func TestGetErrMsg_NoError(t *testing.T) { errMsg := GetErrMsg(SendOk) assert.Equal(t, "", errMsg) } func TestGetErrMsg_Empty(t *testing.T) { errMsg := GetErrMsg("") assert.Equal(t, "", errMsg) } func TestGetErrMsg_AttributesWhitespaceAndMultiline(t *testing.T) { resp := ` Can not find the event ` errMsg := GetErrMsg(resp) assert.Contains(t, errMsg, "Can not find") assert.Contains(t, errMsg, "the event") } func TestCreateSend_XMLEscapes(t *testing.T) { result := CreateSend("user<>&\"'", "pass", 0, "event", false, "") assert.Contains(t, result, "user<>&"'") assert.Contains(t, result, "pass") assert.Contains(t, result, "<MSG/>") } func TestCreateReceive_XMLEscapes(t *testing.T) { result := CreateReceive("user<>&\"'", "pass>", 2) assert.Contains(t, result, "user<>&"'") assert.Contains(t, result, "pass>") }