package service import ( "bytes" "encoding/json" "net/http" "net/http/httptest" "testing" ) func TestChanQueryEndpoints(t *testing.T) { service, err := NewService(t.TempDir()+"/onelink_mock.db") if err != nil { t.Fatal(err) } if _, err := service.store.GenerateCards(2); err != nil { t.Fatal(err) } cards := service.store.Snapshot().Cards body, _ := json.Marshal(map[string]any{ "simKeys": []map[string]string{{"chanKey": "channel_yd_mock", "iccid": cards[0].ICCID, "imsi": cards[0].IMSI, "msisdn": cards[0].MSISDN}}, "reqData": map[string]string{"queryDate": "20260101"}, }) paths := []string{ "/sim/query/sim-basic-info", "/sim/query/sim-session", "/sim/query/sim-status", "/sim/query/sim-status-batch", "/sim/query/sim-card-bind-status", "/sim/query/sim-device-status", "/sim/query/sim-region-limit-status", "/sim/query/sim-imei", "/sim/query/sim-datausage", "/sim/query/sim-datausage-monthly", "/sim/query/sim-datausage-monthly-batch", "/sim/query/sim-datausage-daily", "/sim/query/sim-datausage-daily-batch", "/sim/query/sim-apn-info", } for _, path := range paths { t.Run(path, func(t *testing.T) { req := httptest.NewRequest(http.MethodPost, path, bytes.NewReader(body)) req.Header.Set("Content-Type", "application/json") res := httptest.NewRecorder() service.Router().ServeHTTP(res, req) if res.Code != http.StatusOK { t.Fatalf("status = %d body=%s", res.Code, res.Body.String()) } var responses []struct { Code int `json:"code"` SimKey chanSimKey `json:"simKey"` } if err := json.Unmarshal(res.Body.Bytes(), &responses); err != nil { t.Fatal(err) } if len(responses) != 1 || responses[0].Code != chanSuccessCode || responses[0].SimKey.ICCID != cards[0].ICCID { t.Fatalf("responses = %#v", responses) } }) } } func TestChanBatchAndQueryStringCompatibility(t *testing.T) { service, err := NewService(t.TempDir()+"/onelink_mock.db") if err != nil { t.Fatal(err) } if _, err := service.store.GenerateCards(2); err != nil { t.Fatal(err) } cards := service.store.Snapshot().Cards req := httptest.NewRequest(http.MethodGet, "/sim/query/sim-status-batch?iccids="+cards[0].ICCID+"_"+cards[1].ICCID, nil) res := httptest.NewRecorder() service.Router().ServeHTTP(res, req) if res.Code != http.StatusOK { t.Fatalf("status = %d body=%s", res.Code, res.Body.String()) } var responses []chanResponse[chanCardStatus] if err := json.Unmarshal(res.Body.Bytes(), &responses); err != nil { t.Fatal(err) } if len(responses) != 2 || responses[0].Code != chanSuccessCode || responses[1].Code != chanSuccessCode { t.Fatalf("responses = %#v", responses) } } func TestChanChangesPersistAndCreateOrders(t *testing.T) { service, err := NewService(t.TempDir()+"/onelink_mock.db") if err != nil { t.Fatal(err) } if _, err := service.store.GenerateCards(1); err != nil { t.Fatal(err) } card := service.store.Snapshot().Cards[0] statusBody := []byte(`{"simKeys":[{"iccid":"` + card.ICCID + `"}],"reqData":{"operType":"0"}}`) res := httptest.NewRecorder() req := httptest.NewRequest(http.MethodPost, "/sim/change/sim-status", bytes.NewReader(statusBody)) service.Router().ServeHTTP(res, req) if res.Code != http.StatusOK { t.Fatalf("status change status = %d body=%s", res.Code, res.Body.String()) } if got := service.store.Snapshot().Cards[0].CardStatus; got != "4" { t.Fatalf("card status = %s, want 4", got) } apnBody := []byte(`{"simKeys":[{"iccid":"` + card.ICCID + `"}],"reqData":{"apnName":"TEST_APN","operType":"0"}}`) res = httptest.NewRecorder() req = httptest.NewRequest(http.MethodPost, "/sim/change/sim-apn", bytes.NewReader(apnBody)) service.Router().ServeHTTP(res, req) if res.Code != http.StatusOK { t.Fatalf("apn change status = %d body=%s", res.Code, res.Body.String()) } updated := service.store.Snapshot() if len(updated.Orders) != 2 { t.Fatalf("orders = %d, want 2", len(updated.Orders)) } found := false for _, apn := range updated.Cards[0].APNs { if apn.Name == "TEST_APN" && apn.Status == "1" { found = true } } if !found { t.Fatalf("updated APNs = %#v", updated.Cards[0].APNs) } }