From 3987368df43d5d60716e0173f7fabd9619bb6236 Mon Sep 17 00:00:00 2001 From: Artem Muterko Date: Sun, 1 Mar 2026 13:43:28 +0100 Subject: [PATCH] Expand Google Chat provider test coverage Add constructor validation tests (valid URL, proxy, invalid URL), error severity formatting (red font color), empty metadata handling (single section), and server error response test. Signed-off-by: Ioannis Polyzos Signed-off-by: Artem Muterko --- internal/notifier/google_chat_test.go | 90 +++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/internal/notifier/google_chat_test.go b/internal/notifier/google_chat_test.go index cb0b4c9d3..6637ae39d 100644 --- a/internal/notifier/google_chat_test.go +++ b/internal/notifier/google_chat_test.go @@ -23,10 +23,36 @@ import ( "net/http" "net/http/httptest" "testing" + "time" + eventv1 "github.com/fluxcd/pkg/apis/event/v1beta1" . "github.com/onsi/gomega" ) +func TestNewGoogleChat(t *testing.T) { + t.Run("valid URL", func(t *testing.T) { + g := NewWithT(t) + gc, err := NewGoogleChat("https://chat.googleapis.com/v1/spaces/test/messages?key=key&token=token", "") + g.Expect(err).ToNot(HaveOccurred()) + g.Expect(gc.URL).To(Equal("https://chat.googleapis.com/v1/spaces/test/messages?key=key&token=token")) + g.Expect(gc.ProxyURL).To(BeEmpty()) + }) + + t.Run("with proxy", func(t *testing.T) { + g := NewWithT(t) + gc, err := NewGoogleChat("https://chat.googleapis.com/v1/spaces/test/messages", "http://proxy:8080") + g.Expect(err).ToNot(HaveOccurred()) + g.Expect(gc.ProxyURL).To(Equal("http://proxy:8080")) + }) + + t.Run("invalid URL", func(t *testing.T) { + g := NewWithT(t) + _, err := NewGoogleChat("not a url", "") + g.Expect(err).To(HaveOccurred()) + g.Expect(err.Error()).To(ContainSubstring("invalid Google Chat hook URL")) + }) +} + func TestGoogleChat_Post(t *testing.T) { g := NewWithT(t) ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -36,6 +62,7 @@ func TestGoogleChat_Post(t *testing.T) { err = json.Unmarshal(b, &payload) g.Expect(err).ToNot(HaveOccurred()) + g.Expect(payload.Cards).To(HaveLen(1)) g.Expect(payload.Cards[0].Header.Title).To(Equal("gitrepository/webapp.gitops-system")) g.Expect(payload.Cards[0].Header.SubTitle).To(Equal("source-controller")) g.Expect(payload.Cards[0].Sections[0].Widgets[0].TextParagraph.Text).To(Equal("message")) @@ -50,3 +77,66 @@ func TestGoogleChat_Post(t *testing.T) { err = google_chat.Post(context.TODO(), testEvent()) g.Expect(err).ToNot(HaveOccurred()) } + +func TestGoogleChat_PostErrorSeverity(t *testing.T) { + g := NewWithT(t) + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + b, err := io.ReadAll(r.Body) + g.Expect(err).ToNot(HaveOccurred()) + var payload = GoogleChatPayload{} + err = json.Unmarshal(b, &payload) + g.Expect(err).ToNot(HaveOccurred()) + + g.Expect(payload.Cards[0].Sections[0].Widgets[0].TextParagraph.Text).To(ContainSubstring(`color="#ff0000"`)) + g.Expect(payload.Cards[0].Sections[0].Widgets[0].TextParagraph.Text).To(ContainSubstring("message")) + })) + defer ts.Close() + + gc, err := NewGoogleChat(ts.URL, "") + g.Expect(err).ToNot(HaveOccurred()) + + event := testEvent() + event.Severity = eventv1.EventSeverityError + err = gc.Post(context.TODO(), event) + g.Expect(err).ToNot(HaveOccurred()) +} + +func TestGoogleChat_PostNoMetadata(t *testing.T) { + g := NewWithT(t) + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + b, err := io.ReadAll(r.Body) + g.Expect(err).ToNot(HaveOccurred()) + var payload = GoogleChatPayload{} + err = json.Unmarshal(b, &payload) + g.Expect(err).ToNot(HaveOccurred()) + + // Only message section, no metadata section + g.Expect(payload.Cards[0].Sections).To(HaveLen(1)) + })) + defer ts.Close() + + gc, err := NewGoogleChat(ts.URL, "") + g.Expect(err).ToNot(HaveOccurred()) + + event := testEvent() + event.Metadata = nil + err = gc.Post(context.TODO(), event) + g.Expect(err).ToNot(HaveOccurred()) +} + +func TestGoogleChat_PostServerError(t *testing.T) { + g := NewWithT(t) + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusInternalServerError) + })) + defer ts.Close() + + gc, err := NewGoogleChat(ts.URL, "") + g.Expect(err).ToNot(HaveOccurred()) + + ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) + defer cancel() + err = gc.Post(ctx, testEvent()) + g.Expect(err).To(HaveOccurred()) + g.Expect(err.Error()).To(ContainSubstring("postMessage failed")) +}