package grpcapi import ( "context" "encoding/json" "net" "testing" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/status" "google.golang.org/grpc/test/bufconn" "git.5iot.com/iotlcm-public/iotlcm-sms/api/pb" "git.5iot.com/iotlcm-public/iotlcm-sms/internal/sms" ) type fakeSender struct { config sms.Config message sms.Message result sms.Result } func (f *fakeSender) Send(_ context.Context, config sms.Config, message sms.Message) (sms.Result, error) { f.config = config f.message = message return f.result, nil } func TestSend(t *testing.T) { fake := &fakeSender{result: sms.Result{Code: 0, Message: "发送成功"}} client, closeServer := newTestClient(t, fake) defer closeServer() config, _ := json.Marshal(sms.Config{ServiceType: sms.ServiceAliyun}) params, _ := json.Marshal(sms.Message{PhoneNumber: "138****8000", MsgContent: `{"code":"123456"}`}) response, err := client.Send(context.Background(), &pb.SendReq{ Head: &pb.HeadReq{RouterId: 42, TraceId: "trace-1"}, Config: config, Params: params, }) if err != nil { t.Fatal(err) } if response.Head.Code != 0 || response.Head.RouterId != 42 || response.Head.TraceId != "trace-1" { t.Fatalf("unexpected response: %+v", response.Head) } 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) { client, closeServer := newTestClient(t, &fakeSender{}) defer closeServer() _, err := client.Send(context.Background(), &pb.SendReq{Config: []byte(`{`), Params: []byte(`{}`)}) if status.Code(err) != codes.InvalidArgument { t.Fatalf("code = %v, want %v; err=%v", status.Code(err), codes.InvalidArgument, err) } } func newTestClient(t *testing.T, sender Sender) (pb.NoticeClient, func()) { t.Helper() listener := bufconn.Listen(1024 * 1024) server := grpc.NewServer() pb.RegisterNoticeServer(server, NewServer(sender)) go func() { _ = server.Serve(listener) }() conn, err := grpc.NewClient( "passthrough:///bufnet", grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) { return listener.Dial() }), ) if err != nil { t.Fatal(err) } return pb.NewNoticeClient(conn), func() { _ = conn.Close() server.Stop() _ = listener.Close() } }