(t *testing.T)
| 349 | } |
| 350 | |
| 351 | func TestHeartbeat_StoreAndIndex(t *testing.T) { |
| 352 | ctx := context.Background() |
| 353 | phone := setupPhone(ctx, t, 60) |
| 354 | |
| 355 | // Store a heartbeat via phone API key (retry to allow async phone-API-key association) |
| 356 | storePayload := map[string]interface{}{ |
| 357 | "phone_numbers": []string{phone.PhoneNumber}, |
| 358 | "charging": true, |
| 359 | } |
| 360 | |
| 361 | url := apiBaseURL + "/v1/heartbeats" |
| 362 | var respBody []byte |
| 363 | var statusCode int |
| 364 | deadline := time.Now().Add(15 * time.Second) |
| 365 | for time.Now().Before(deadline) { |
| 366 | body, err := json.Marshal(storePayload) |
| 367 | require.NoError(t, err) |
| 368 | |
| 369 | req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, bytes.NewReader(body)) |
| 370 | require.NoError(t, err) |
| 371 | req.Header.Set("Content-Type", "application/json") |
| 372 | req.Header.Set("x-api-key", phone.PhoneAPIKey) |
| 373 | |
| 374 | resp, err := http.DefaultClient.Do(req) |
| 375 | require.NoError(t, err) |
| 376 | |
| 377 | respBody, err = io.ReadAll(resp.Body) |
| 378 | resp.Body.Close() |
| 379 | require.NoError(t, err) |
| 380 | |
| 381 | statusCode = resp.StatusCode |
| 382 | if statusCode == http.StatusCreated { |
| 383 | break |
| 384 | } |
| 385 | time.Sleep(500 * time.Millisecond) |
| 386 | } |
| 387 | require.Equal(t, http.StatusCreated, statusCode, "store heartbeat failed: %s", string(respBody)) |
| 388 | |
| 389 | // Read heartbeats back via user API key |
| 390 | client := newAPIClient() |
| 391 | heartbeats, indexResp, err := client.Heartbeats.Index(ctx, &httpsms.HeartbeatIndexParams{ |
| 392 | Owner: phone.PhoneNumber, |
| 393 | Limit: 1, |
| 394 | }) |
| 395 | require.NoError(t, err) |
| 396 | require.Equal(t, http.StatusOK, indexResp.HTTPResponse.StatusCode) |
| 397 | |
| 398 | require.NotNil(t, heartbeats) |
| 399 | require.GreaterOrEqual(t, len(heartbeats.Data), 1, "expected at least 1 heartbeat") |
| 400 | |
| 401 | hb := heartbeats.Data[0] |
| 402 | assert.Equal(t, phone.PhoneNumber, hb.Owner) |
| 403 | assert.True(t, hb.Charging) |
| 404 | assert.False(t, hb.Timestamp.IsZero(), "timestamp should not be zero") |
| 405 | } |
| 406 | |
| 407 | func TestBulkSMS_CSV(t *testing.T) { |
| 408 | ctx := context.Background() |
nothing calls this directly
no test coverage detected