package main import ( "bytes" "net/http" "net/http/httptest" "strings" "testing" ) func TestUnwrapJSONP(t *testing.T) { got := unwrapJSONP([]byte(" callback_1( {\"code\":0} ); ")) if string(got) != `{"code":0}` { t.Fatalf("unexpected JSONP body: %q", got) } } func TestQQClientSearchUsesFixedShape(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Header.Get("Origin") != "https://y.qq.com" || r.Header.Get("Referer") != "https://y.qq.com/" { t.Fatal("required upstream headers were not set") } if r.URL.Query().Get("w") != "起风了" || r.URL.Query().Get("n") != "2" { t.Fatalf("unexpected query: %s", r.URL.RawQuery) } _, _ = w.Write([]byte(`{"code":0,"data":{"song":{"list":[{"songname":"歌","songmid":"0004jPDk2eB2dt","albumname":"专辑","interval":215,"singer":[{"name":"歌手"}]}]}}}`)) })) defer server.Close() client := newQQClient() client.searchEndpoint = server.URL songs, err := client.Search("起风了", 2) if err != nil { t.Fatal(err) } if len(songs) != 1 || songs[0].MID != "0004jPDk2eB2dt" || songs[0].Singer != "歌手" { t.Fatalf("unexpected songs: %#v", songs) } } func TestQQClientRejectsOversizedResponse(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { _, _ = w.Write(bytes.Repeat([]byte("x"), maxUpstreamBytes+1)) })) defer server.Close() client := newQQClient() client.lyricsEndpoint = server.URL _, err := client.Lyrics("0004jPDk2eB2dt") if err == nil || !strings.Contains(err.Error(), "safety limit") { t.Fatalf("expected response limit error, got %v", err) } }