package httpapi import ( "context" "encoding/json" "errors" "net/http" "net/http/httptest" "strings" "testing" "git.5iot.com/iotlcm-public/iotlcm-sms/internal/sms" ) type fakeSender struct { config sms.Config message sms.Message result sms.Result err error } func (f *fakeSender) Send(_ context.Context, config sms.Config, message sms.Message) (sms.Result, error) { f.config = config f.message = message return f.result, f.err } func TestSendSuccess(t *testing.T) { fake := &fakeSender{result: sms.Result{Code: 0, Message: "发送成功"}} server := httptest.NewServer(NewHandler(fake)) defer server.Close() body := `{"config":{"serviceType":"1","accessKeyId":"id","accessKeySecret":"secret","signName":"测试签名","templateId":"SMS_1"},"params":{"phoneNumber":"138****8000","msgContent":"{\"code\":\"123456\"}"}}` response, err := http.Post(server.URL+"/api/v1/sms/send", "application/json", strings.NewReader(body)) if err != nil { t.Fatal(err) } defer response.Body.Close() if response.StatusCode != http.StatusOK { t.Fatalf("status = %d, want %d", response.StatusCode, http.StatusOK) } if fake.config.ServiceType != sms.ServiceAliyun || fake.message.PhoneNumber != "138****8000" { t.Fatalf("unexpected request: config=%+v message=%+v", fake.config, fake.message) } } func TestSendRejectsInvalidJSON(t *testing.T) { request := httptest.NewRequest(http.MethodPost, "/api/v1/sms/send", strings.NewReader(`{"unknown":true}`)) recorder := httptest.NewRecorder() NewHandler(&fakeSender{}).ServeHTTP(recorder, request) if recorder.Code != http.StatusBadRequest { t.Fatalf("status = %d, want %d", recorder.Code, http.StatusBadRequest) } } func TestSendMapsProviderError(t *testing.T) { fake := &fakeSender{ result: sms.Result{Code: 502, Message: "provider failed"}, err: errors.New("provider failed"), } request := httptest.NewRequest(http.MethodPost, "/api/v1/sms/send", strings.NewReader(`{"config":{},"params":{}}`)) recorder := httptest.NewRecorder() NewHandler(fake).ServeHTTP(recorder, request) if recorder.Code != http.StatusBadGateway { t.Fatalf("status = %d, want %d", recorder.Code, http.StatusBadGateway) } var result sms.Result if err := json.NewDecoder(recorder.Body).Decode(&result); err != nil { t.Fatal(err) } if result.Code != 502 { t.Fatalf("code = %d, want 502", result.Code) } }