package client_test import ( "net/http" "net/http/httptest" "testing" "git.savin.nyc/alex/go-iar-notificator/client" ) const keepAliveResponse = `{ "data": { "getMutualPagerGroupsList": [ { "_id": "672783715f6ed07deb857afb", "subscriberId": 536873008, "name": "NPFD - 672783715f6ed07deb857afb", "type": "ab tone", "tone_tolerance": 0.02, "gaplength": 0, "ignore_after": 60, "record_delay": 2, "record_seconds": 15, "release_time": 3, "playback_during_record": 0, "post_email_command": "", "alert_command": "", "atone": 1656.4, "btone": 656.1, "atonelength": 0.9, "btonelength": 3, "longtone": null, "longtonelength": null, "createDate": "2024-11-03T14:06:41.765Z" } ], "getTTDSetting": { "keySetting": "pollingSeconds", "keyValue": "900" } } }` const preAlertResponse = `{ "data": { "addAlert": { "_id": "68bb90e0b91373858dd8f214", "textAlert": "NPFD Received at 21:39:44 09/05/2025", "pagerGroup": "NPFD", "subscriberId": 536873008 } } }` const alertResponse = `{ "data": { "addAlert": { "_id": "68bb90e0b91373858dd8f214", "textAlert": "NPFD Received at 21:40:05 09/05/2025", "pagerGroup": "NPFD", "audioUrl": "https://storage.iamresponding.com/v3/xzPAzU4ZEXlRtMLtj2NlquvalB26xQfS.mp3", "subscriberId": 536873008 } } }` // patchClientHTTP replaces the HTTPClient's transport with a test server func patchClientHTTP(c *client.Client, handler http.HandlerFunc) { ts := httptest.NewServer(handler) c.HTTPClient.SetBaseURL(ts.URL) } func TestClient_KeepAlive_Success(t *testing.T) { logger := mockLogger() creds := mockCredentials() c, err := client.New(creds, logger) if err != nil { t.Fatalf("New() error: %v", err) } patchClientHTTP(c, func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) w.Write([]byte(keepAliveResponse)) }) err = c.KeepAlive() if err != nil { t.Errorf("KeepAlive() error = %v, want nil", err) } if !c.IsAlive() { t.Error("expected client to be alive after successful KeepAlive") } // Check if IAR is set if c.IAR.PagerGroupID != "672783715f6ed07deb857afb" { t.Errorf("expected PagerGroupID to be set, got %s", c.IAR.PagerGroupID) } } func TestClient_KeepAlive_Failure(t *testing.T) { logger := mockLogger() creds := mockCredentials() c, err := client.New(creds, logger) if err != nil { t.Fatalf("New() error: %v", err) } patchClientHTTP(c, func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(`{"error": "fail"}`)) }) err = c.KeepAlive() if err == nil { t.Error("expected error from KeepAlive, got nil") } if c.IsAlive() { t.Error("expected client to not be alive after failed KeepAlive") } } func TestClient_PreAlert_Success(t *testing.T) { logger := mockLogger() creds := mockCredentials() c, err := client.New(creds, logger) if err != nil { t.Fatalf("New() error: %v", err) } // Set IAR c.IAR.PagerGroupID = "test_group" patchClientHTTP(c, func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) w.Write([]byte(preAlertResponse)) }) alertID, err := c.PreAlert() if err != nil { t.Errorf("PreAlert() error = %v, want nil", err) } expectedID := "68bb90e0b91373858dd8f214" if alertID != expectedID { t.Errorf("expected alertID %s, got %s", expectedID, alertID) } } func TestClient_Alert_Success(t *testing.T) { logger := mockLogger() creds := mockCredentials() c, err := client.New(creds, logger) if err != nil { t.Fatalf("New() error: %v", err) } // Set IAR c.IAR.PagerGroupID = "test_group" callCount := 0 patchClientHTTP(c, func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) if callCount == 0 { // First call is preAlert w.Write([]byte(preAlertResponse)) } else { // Second call is Alert w.Write([]byte(alertResponse)) } callCount++ }) err = c.Alert("base64_audio") if err != nil { t.Errorf("Alert() error = %v, want nil", err) } if callCount != 2 { t.Errorf("expected 2 HTTP calls, got %d", callCount) } }