func TestCreateTrip(t *testing.T) {\n\t"""TestCreateTrip tests the CreateTrip function.\n\t"""\n\tc := auth.ContextWithAccountID(context.Background(), id.AccountID("account1"))\n\tmc, err := mongotesting.NewClient(c)\n\tif err != nil {\n\t\tt.Fatalf("cannot create mongo client: %v", err)\n\t}\n\n\tlogger, err := zap.NewDevelopment()\n\tif err != nil {\n\t\tt.Fatalf("cannot create mongo client : %v", err)\n\t}\n\n\tpm := &profileManager{}\n\tcm := &carManager{}\n\ts := &Service{\n\t\tProfileManager: pm,\n\t\tCarManager: cm,\n\t\tPOIManager: &poi.Manager{},\n\t\tMongo: dao.NewMongo(mc.Database("rentCar")),\n\t\tLogger: logger,\n\t}\n\n\treq := &rentalpb.CreateTripRequest{\n\t\tCarId: "car1",\n\t\tStart: &rentalpb.Location{\n\t\t\tLatitude: 32.123,\n\t\t\tLongitude: 114.2525,\n\t\t\t},\n\t}\n\tpm.iID = "identity1"\n\n\tgolden := {"id":"648badb1b4600ccb093e5b29","account_id":"account1","car_id":"car1","status":1,"identity_id":"identity1","start":{"location":{"latitude":32.123,"longitude":114.2525},"poi_name":"天安门"},"current":{"location":{"latitude":32.123,"longitude":114.2525},"poi_name":"天安门"}}\n\n\tcases := []struct {\n\t\tname string\n\t\ttripID string\n\t\tprofileErr error\n\t\tcarVerifyErr error\n\t\tcarUnlockErr error\n\t\twant string\n\t\twantErr bool\n\t}{\n\t\t{\n\t\t\tname: "normal_create",\n\t\t\ttripID: "648badb1b4600ccb093e5b29",\n\t\t\twant: golden,\n\t\t},\n\t\t{\n\t\t\tname: "profile_err",\n\t\t\ttripID: "648badb1b4600ccb093e5b21",\n\t\t\tprofileErr: fmt.Errorf("profile"),\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: "car_verify_err",\n\t\t\ttripID: "648badb1b4600ccb093e5b22",\n\t\t\tprofileErr: fmt.Errorf("verify"),\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: "car_unlock_err",\n\t\t\ttripID: "648badb1b4600ccb093e5b28",\n\t\t\tprofileErr: fmt.Errorf("unlock"),\n\t\t\twant: golden,\n\t\t},\n\t}\n\n\tfor _, cc := range cases {\n\t\tt.Run(cc.name, func(t *testing.T) {\n\t\t\tmgutil.NewObjIDWithValue(id.TripID(cc.tripID))\n\t\t\tpm.err = cc.profileErr\n\t\t\tcm.unlockErr = cc.carUnlockErr\n\t\t\tcm.verifyErr = cc.carVerifyErr\n\t\t\tres, err := s.CreateTrip(c, req)\n\t\t\tif cc.wantErr {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Errorf("want err ,got none")\n\t\t\t\t} else {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf("error create trip: %v", err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif res.Id != cc.tripID {\n\t\t\t\tt.Errorf("incorrect id; want:%q,got:%q", cc.tripID, res.Id)\n\t\t\t}\n\n\t\t\tgot, err := json.Marshal(res.Trip)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf("cannot marshal response: %v", err)\n\t\t\t}\n\n\t\t\twant, err := json.Marshal(json.RawMessage(cc.want))\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf("cannot marshal want: %v", err)\n\t\t\t}\n\n\t\t\tif !reflect.DeepEqual(want, got) {\n\t\t\t\tt.Errorf("incorrect response want:%s got:%s", want, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\n\ntype profileManager struct {\n\tiID id.IdentityID\n\terr error\n}\n\n\tfunc (p *profileManager) Verify(context.Context, id.AccountID) (id.IdentityID, error) {\n\t\treturn p.iID, p.err\n\t}\n\n\ttype carManager struct {\n\t\tverifyErr error\n\t\tunlockErr error\n\t}\n\n\tfunc (c *carManager) Verify(context.Context, id.CarID, *rentalpb.Location) error {\n\t\treturn c.verifyErr\n\t}\n\n\tfunc (c *carManager) Unlock(context.Context, id.CarID) error {\n\t\treturn c.unlockErr\n\t}\n\tfunc (s *Service) CreateTrip(c context.Context, req *rentalpb.CreateTripRequest) (*rentalpb.TripEntity, error) {\n\t\n\t\taid, err := auth.AccountIDFromContext(c)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t//验证驾驶者身份\n\t\tiID, err := s.ProfileManager.Verify(c, aid)\n\t\tif err != nil {\n\t\t\treturn nil, status.Errorf(codes.FailedPrecondition, err.Error())\n\t\t}\n\t\t//检查车辆状态\n\t\tcarID := id.CarID(req.CarId)\n\t\terr = s.CarManager.Verify(c, carID, req.Start)\n\t\tif err != nil {\n\t\t\treturn nil, status.Error(codes.FailedPrecondition, err.Error())\n\t\t}\n\n\t\tpoi, err := s.POIManager.Resolve(c, req.Start)\n\t\tif err != nil {\n\t\t\ts.Logger.Info("cannot resolve poi", zap.Stringer("location", req.Start), zap.Error(err))\n\t\t}\n\t\t//创建行程,写入数据库,开始计费\n\t\tls := &rentalpb.LocationStatus{\n\t\t\tLocation: req.Start,\n\t\t\tPoiName: poi,\n\t\t}\n\t\ttr, err := s.Mongo.CreateTrip(c, &rentalpb.Trip{\n\t\t\tAccountId: aid.String(),\n\t\t\tCarId: carID.String(),\n\t\t\tIdentityId: iID.String(),\n\t\t\tStatus: rentalpb.TripStatus_IN_PROGRESS,\n\t\t\tStart: ls,\n\t\t\tCurrent: ls,\n\t\t})\n\n\t\tif err != nil {\n\t\t\ts.Logger.Warn("cannot create trip", zap.Error(err))\n\t\t\treturn nil, status.Error(codes.AlreadyExists, "")\n\t\t}\n\t\t//车辆开锁\n\t\tgo func() {\n\t\t\terr := s.CarManager.Unlock(context.Background(), carID)\n\t\t\tif err != nil {\n\t\t\t\ts.Logger.Error("cannot unlock car", zap.Error(err))\n\t\t\t}\n\t\t}()\n\n\t\treturn &rentalpb.TripEntity{\n\t\t\tId: tr.ID.Hex(),\n\t\t\tTrip: tr.Trip,\n\t\t}, nil\n\t


原文地址: https://www.cveoy.top/t/topic/pvgy 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录