package upstreamapi import ( "context" "encoding/json" "net/http/httptest" "strings" "testing" "github.com/gogf/gf/v2/net/ghttp" "git.5iot.com/iotlcm-public/iotlcm-upstream-proxy/internal/model" ) type apnPassthroughTestChannel struct{ reqData json.RawMessage } func (c *apnPassthroughTestChannel) SimBase(_ context.Context, input *model.SimBaseReqJson) (model.SimBaseResJson, error) { c.reqData = append(json.RawMessage(nil), input.ReqData...) return model.SimBaseResJson{&model.SimBaseRes[json.RawMessage]{SimKey: input.SimKeys[0], Code: 0, Message: "已受理", ResData: json.RawMessage(`{"orderNum":"job-persisted","pending":true,"uncertain":false}`)}}, nil } func TestAPNProxyUnknownChannelPreservesUncertain(t *testing.T) { api := NewUpstreamAPI() out, err := api.SimBase((&ghttp.Request{Request: httptest.NewRequest("POST", "/sim/change/sim-apn", nil)}).Context(), &model.SimBaseReqJson{ SimKeys: []*model.SimKey{{ChanKey: "missing_chan", ICCID: "test"}}, ReqData: json.RawMessage(`{"operationId":"stable-id","submitOnly":true}`), }) if err != nil || len(out) != 1 || !strings.Contains(string(out[0].ResData), `"uncertain":true`) { t.Fatalf("未知通道不能误报业务失败: result=%+v err=%v", out, err) } } func TestNonAPNProxySameNamedFieldsKeepLegacyFailure(t *testing.T) { api := NewUpstreamAPI() ctx := (&ghttp.Request{Request: httptest.NewRequest("POST", "/sim/change/sim-status", nil)}).Context() out, err := api.SimBase(ctx, &model.SimBaseReqJson{SimKeys: []*model.SimKey{{ChanKey: "missing_chan", ICCID: "test"}}, ReqData: json.RawMessage(`{"operationId":"other-domain","submitOnly":true,"recoverOnly":true,"queryJobId":"unrelated"}`)}) if err != nil || len(out) != 1 || string(out[0].ResData) != `{"status":"-2"}` { t.Fatalf("非APN同名字段改变既有失败语义:%+v %v", out, err) } } func TestAPNProxyPreservesOperationAndAsyncFields(t *testing.T) { api := NewUpstreamAPI() instance := &apnPassthroughTestChannel{} api.RegisterChan("test_chan", "test", &model.SimCardChannelCache{Instance: instance}) req := json.RawMessage(`{"operationId":"stable-id","submitOnly":true,"recoverOnly":false,"operType":"1"}`) out, err := api.SimBase((&ghttp.Request{Request: httptest.NewRequest("POST", "/sim/change/sim-apn", nil)}).Context(), &model.SimBaseReqJson{SimKeys: []*model.SimKey{{ChanKey: "test_chan", ICCID: "test"}}, ReqData: req}) if err != nil || len(out) != 1 { t.Fatalf("proxy请求错误:%v %+v", err, out) } if !strings.Contains(string(instance.reqData), `"operationId":"stable-id"`) { t.Fatalf("operationId丢失:%s", instance.reqData) } if !strings.Contains(string(out[0].ResData), `"pending":true`) || !strings.Contains(string(out[0].ResData), `"orderNum":"job-persisted"`) { t.Fatalf("受理标识丢失:%s", out[0].ResData) } }