1package api23import (4 "encoding/json"5 "net/http"6 "net/http/httptest"7 "strings"8 "testing"910 "airwaves/internal/phase"11)1213// TestMetrics: the app's channel change times are kept by kind, and read14// back as each kind's recent times.15func TestMetrics(t *testing.T) {16 srv := httptest.NewServer((&Server{Backend: &fake{}}).Handler())17 defer srv.Close()18 for _, body := range []string{19 `{"number":"1.4","kind":"jellyfin","firstFrameMs":1500}`,20 `{"number":"1.4","kind":"jellyfin","firstFrameMs":2500}`,21 `{"number":"9.9","kind":"made up","firstFrameMs":100}`,22 } {23 resp, err := http.Post(srv.URL+"/api/metrics", "application/json", strings.NewReader(body))24 if err != nil {25 t.Fatal(err)26 }27 resp.Body.Close()28 if resp.StatusCode != http.StatusOK {29 t.Fatalf("POST %s: HTTP %d", body, resp.StatusCode)30 }31 }32 resp, err := http.Get(srv.URL + "/api/metrics")33 if err != nil {34 t.Fatal(err)35 }36 defer resp.Body.Close()37 var got []phase.Summary38 if err := json.NewDecoder(resp.Body).Decode(&got); err != nil {39 t.Fatal(err)40 }41 var jf *phase.Summary42 for i, s := range got {43 if s.Kind == "made up" {44 t.Errorf("kept an unknown kind: %+v", s)45 }46 if s.Kind == "jellyfin" && s.Measure == phase.FirstFrame {47 jf = &got[i]48 }49 }50 if jf == nil || jf.Count < 2 || jf.Max < 2.5 {51 t.Errorf("jellyfin first frames: %+v in %+v", jf, got)52 }53}