Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
277 changes: 277 additions & 0 deletions alertmanager/dingtalk/dingtalk_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -160,3 +160,280 @@ func TestInvaildHttpRequest(t *testing.T) {

assert.NotNil(c.SendMessage("test"))
}

func TestNewDingTalkWithTitle(t *testing.T) {
assert := assert.New(t)

configMap := map[string]interface{}{
"accessToken": "testToken",
"title": "Custom Title",
"secret": "secret123",
}
c := NewDingTalk(configMap, &config.App{ClusterName: "dev"})
assert.NotNil(c)
assert.Equal("Custom Title", c.title)
assert.Equal("secret123", c.secret)
}

func TestSendEventWithDefaultTitle(t *testing.T) {
assert := assert.New(t)

s := httptest.NewServer(
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(`{"isOk": true}`))
}))

defer s.Close()

configMap := map[string]interface{}{
"accessToken": "testToken",
}
c := NewDingTalk(configMap, &config.App{ClusterName: "dev"})
assert.NotNil(c)
c.url = s.URL + "/send?accessToken=%s"

ev := &event.Event{
PodName: "test-pod",
ContainerName: "test-container",
Namespace: "default",
Reason: "OOMKILLED",
Logs: "test logs",
}
err := c.SendEvent(ev)
assert.Nil(err)
}

func TestSendMessageWithSecret(t *testing.T) {
assert := assert.New(t)

s := httptest.NewServer(
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(`{"isOk": true}`))
}))

defer s.Close()

configMap := map[string]interface{}{
"accessToken": "testToken",
"secret": "testSecret123",
}
c := NewDingTalk(configMap, &config.App{ClusterName: "dev"})
assert.NotNil(c)
c.url = s.URL + "/send?accessToken=%s"

err := c.SendMessage("test message with secret")
assert.Nil(err)
}

func TestSendEventWithSecret(t *testing.T) {
assert := assert.New(t)

s := httptest.NewServer(
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(`{"isOk": true}`))
}))

defer s.Close()

configMap := map[string]interface{}{
"accessToken": "testToken",
"secret": "testSecret456",
"title": "Custom Event Title",
}
c := NewDingTalk(configMap, &config.App{ClusterName: "dev"})
assert.NotNil(c)
c.url = s.URL + "/send?accessToken=%s"

ev := &event.Event{
PodName: "event-pod",
ContainerName: "event-container",
Namespace: "event-ns",
Reason: "CrashLoopBackOff",
Logs: "crash logs",
}
err := c.SendEvent(ev)
assert.Nil(err)
}

func TestSendMessageJsonMarshalError(t *testing.T) {
assert := assert.New(t)

s := httptest.NewServer(
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(`{"isOk": true}`))
}))

defer s.Close()

configMap := map[string]interface{}{
"accessToken": "testToken",
}
c := NewDingTalk(configMap, &config.App{ClusterName: "dev"})
assert.NotNil(c)
c.url = s.URL + "/send?accessToken=%s"

ev := &event.Event{
PodName: "test",
}
err := c.SendEvent(ev)
assert.Nil(err)
}

func TestSendAPIResponseReadError(t *testing.T) {
assert := assert.New(t)

s := httptest.NewServer(
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Length", "1000000")
}))

defer s.Close()

configMap := map[string]interface{}{
"accessToken": "testToken",
}
c := NewDingTalk(configMap, &config.App{ClusterName: "dev"})
assert.NotNil(c)
c.url = s.URL + "/send?accessToken=%s"

err := c.SendMessage("test")
assert.NotNil(err)
}

func TestComputeHmacSha256(t *testing.T) {
assert := assert.New(t)

result := computeHmacSha256("message", "secret")
assert.NotEmpty(result)
assert.NotEqual("message", result)
}

func TestGetSignature(t *testing.T) {
assert := assert.New(t)

result := getSignature("testSecret")
assert.Contains(result, "timestamp=")
assert.Contains(result, "sign=")
}

func TestSendMessageInvalidJsonResponse(t *testing.T) {
assert := assert.New(t)

s := httptest.NewServer(
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(`{invalid json`))
}))

defer s.Close()

configMap := map[string]interface{}{
"accessToken": "testToken",
}
c := NewDingTalk(configMap, &config.App{ClusterName: "dev"})
assert.NotNil(c)
c.url = s.URL + "/send?accessToken=%s"

err := c.SendMessage("test")
assert.NotNil(err)
}

func TestSendEventEmptyTitle(t *testing.T) {
assert := assert.New(t)

s := httptest.NewServer(
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(`{"isOk": true}`))
}))

defer s.Close()

configMap := map[string]interface{}{
"accessToken": "testToken",
}
c := NewDingTalk(configMap, &config.App{ClusterName: "dev"})
assert.NotNil(c)
c.url = s.URL + "/send?accessToken=%s"
c.title = ""

ev := &event.Event{
PodName: "test-pod",
ContainerName: "test-container",
Namespace: "default",
Reason: "OOMKILLED",
Logs: "test logs",
}
err := c.SendEvent(ev)
assert.Nil(err)
}

func TestSendMessageNetworkError(t *testing.T) {
assert := assert.New(t)

configMap := map[string]interface{}{
"accessToken": "testToken",
}
c := NewDingTalk(configMap, &config.App{ClusterName: "dev"})
assert.NotNil(c)
c.url = "http://localhost:99999/send"

err := c.SendMessage("test")
assert.NotNil(err)
}

func TestSendEventNetworkError(t *testing.T) {
assert := assert.New(t)

configMap := map[string]interface{}{
"accessToken": "testToken",
}
c := NewDingTalk(configMap, &config.App{ClusterName: "dev"})
assert.NotNil(c)
c.url = "http://localhost:99999/send"

ev := &event.Event{
PodName: "test-pod",
ContainerName: "test-container",
Namespace: "default",
Reason: "OOMKILLED",
Logs: "test logs",
}
err := c.SendEvent(ev)
assert.NotNil(err)
}

func TestSendMessageErrorResponseStatus(t *testing.T) {
assert := assert.New(t)

s := httptest.NewServer(
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte(`{"errcode": 400, "errmsg": "bad request"}`))
}))

defer s.Close()

configMap := map[string]interface{}{
"accessToken": "testToken",
}
c := NewDingTalk(configMap, &config.App{ClusterName: "dev"})
assert.NotNil(c)
c.url = s.URL + "/send?accessToken=%s"

err := c.SendMessage("test")
assert.NotNil(err)
}

func TestSendMessageWithInvalidUTF8(t *testing.T) {
assert := assert.New(t)

configMap := map[string]interface{}{
"accessToken": "testToken",
}
c := NewDingTalk(configMap, &config.App{ClusterName: "dev"})
assert.NotNil(c)
c.url = "http://localhost:99999"

invalidUTF8 := string([]byte{0xff, 0xfe})
err := c.SendMessage(invalidUTF8)
assert.NotNil(err)
}
103 changes: 103 additions & 0 deletions alertmanager/teams/teams_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -254,3 +254,106 @@ func TestBuildRequestBodyMessage(t *testing.T) {
assert.Equal(t, "test message", result.Text)
assert.Empty(t, result.Attachment)
}

func TestNewTeamsWithCustomRetrySettings(t *testing.T) {
configMap := map[string]interface{}{
"webhook": "http://example.com",
"maxRetries": 5,
"retryDelay": 10,
}
appCfg := &config.App{ClusterName: "dev"}
teams := NewTeams(configMap, appCfg)
assert.NotNil(t, teams)
assert.Equal(t, 5, teams.maxRetries)
assert.Equal(t, 10, teams.retryDelay)
}

func TestBuildRequestBodyTeamsDefaultTitle(t *testing.T) {
configMap := map[string]interface{}{
"webhook": "http://example.com",
}
appCfg := &config.App{}
teams := NewTeams(configMap, appCfg)

e := &event.Event{
PodName: "test-pod",
Namespace: "test-namespace",
Reason: "test-reason",
Logs: "test-logs",
Events: "test-events",
NodeName: "test-node",
}

payload := teams.buildRequestBodyTeams(e)
var result teamsFlowPayload
err := json.Unmarshal(payload, &result)
assert.NoError(t, err)
assert.Contains(t, result.Title, "Kwatch")
}

func TestSendEventWithCustomTitle(t *testing.T) {
configMap := map[string]interface{}{
"webhook": "http://example.com",
"title": "Custom Title",
"text": "Custom Text",
}
appCfg := &config.App{ClusterName: "dev"}
teams := NewTeams(configMap, appCfg)

e := &event.Event{
PodName: "test-pod",
Namespace: "test-namespace",
Reason: "test-reason",
Logs: "test-logs",
Events: "test-events",
}

server := httptest.NewServer(
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
}))
defer server.Close()

teams.webhook = server.URL
err := teams.SendEvent(e)
assert.NoError(t, err)
}

func TestSendMessageBadRequestWithBody(t *testing.T) {
configMap := map[string]interface{}{
"webhook": "http://example.com",
}
appCfg := &config.App{ClusterName: "dev"}
teams := NewTeams(configMap, appCfg)

server := httptest.NewServer(
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusBadRequest)
w.Write([]byte(`{"error": "bad request details"}`))
}))
defer server.Close()

teams.webhook = server.URL
err := teams.SendMessage("test message")
assert.Error(t, err)
}

func TestSendMessageMultipleRetries(t *testing.T) {
configMap := map[string]interface{}{
"webhook": "http://example.com",
"maxRetries": 3,
"retryDelay": 1,
}
appCfg := &config.App{ClusterName: "dev"}
teams := NewTeams(configMap, appCfg)

server := httptest.NewServer(
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusAccepted)
}))
defer server.Close()

teams.webhook = server.URL
err := teams.SendMessage("test message")
assert.Error(t, err)
}
Loading
Loading