package http import ( "fmt" "sync" "testing" "context" . "github.com/smartystreets/goconvey/convey" "go-common/app/service/live/wallet/conf" "go-common/app/service/live/wallet/dao" "go-common/app/service/live/wallet/model" "go-common/app/service/live/wallet/service" httpx "go-common/library/net/http/blademaster" "math/rand" "net/url" "strconv" "time" ) const ( _getURL = "http://localhost:9901/x/internal/livewallet/wallet/get" _delCacheURL = "http://localhost:9901/x/internal/livewallet/wallet/delCache" _getAllURL = "http://localhost:9901/x/internal/livewallet/wallet/getAll" _getTidURL = "http://localhost:9901/x/internal/livewallet/wallet/getTid" _rechargeURL = "http://localhost:9901/x/internal/livewallet/wallet/recharge" _payURL = "http://localhost:9901/x/internal/livewallet/wallet/pay" _exchangeURL = "http://localhost:9901/x/internal/livewallet/wallet/exchange" _queryURL = "http://localhost:9901/x/internal/livewallet/wallet/query" ) var ( once sync.Once client *httpx.Client r *rand.Rand ) type RechargeRes struct { Code int `json:"code"` Resp *model.MelonseedResp `json:"data"` } func getTestRandUid() int64 { return r.Int63n(10000000) } func getTestExtendTid() string { return fmt.Sprintf("test:ex:%d", r.Int31n(1000000)) } func getTestRechargeOrPayForm(t *testing.T, serviceType int32, uid int64, coinType string, coinNum int64, tid interface{}) *model.RechargeOrPayForm { if tid == nil { res := queryGetTid(t, serviceType, getTestParamsJson()) if res.Code != 0 { t.Errorf("get tid failed code : %d", res.Code) t.FailNow() } tid = res.Resp.TransactionId } return &model.RechargeOrPayForm{ Uid: uid, CoinType: coinType, CoinNum: coinNum, ExtendTid: getTestExtendTid(), Timestamp: time.Now().Unix(), TransactionId: tid.(string), } } func queryRecharge(t *testing.T, form *model.RechargeOrPayForm, platform string) *RechargeRes { params := url.Values{} params.Set("uid", fmt.Sprintf("%d", form.Uid)) params.Set("coin_type", form.CoinType) params.Set("coin_num", fmt.Sprintf("%d", form.CoinNum)) params.Set("extend_tid", form.ExtendTid) params.Set("timestamp", fmt.Sprintf("%d", form.Timestamp)) params.Set("transaction_id", form.TransactionId) params.Set("biz_reason", "2") params.Set("version", "1") req, _ := client.NewRequest("POST", _rechargeURL, "127.0.0.1", params) req.Header.Set("platform", platform) var res RechargeRes err := client.Do(context.TODO(), req, &res) if err != nil { t.Errorf("client.Do() error(%v)", err) t.FailNow() } return &res } func startHTTP() { if err := conf.Init(); err != nil { panic(fmt.Errorf("conf.Init() error(%v)", err)) } svr := service.New(conf.Conf) client = httpx.NewClient(conf.Conf.HTTPClient) Init(conf.Conf, svr) r = rand.New(rand.NewSource(time.Now().UnixNano())) } func getIntCoinForTest(coinStr string) int64 { coin, _ := strconv.Atoi(coinStr) return int64(coin) } func TestRecharge(t *testing.T) { Convey("recharge normal 先调用get接口 再调用recharge 再调用get接口 比较用户钱包数据", t, testWith(func() { platforms := []string{"pc", "android", "ios"} var num int64 = 1000 uid := getTestRandUid() d := dao.New(conf.Conf) for _, platform := range platforms { beforeWallet := getTestWallet(t, uid, platform) resTid := queryGetTid(t, int32(model.RECHARGETYPE), getTestParamsJson()) if resTid.Code != 0 { t.Errorf("get tid failed code : %d", resTid.Code) t.FailNow() } tid := resTid.Resp.TransactionId res := queryRecharge(t, getTestRechargeOrPayForm(t, int32(model.RECHARGETYPE), uid, "gold", num, tid), platform) So(res.Code, ShouldEqual, 0) So(getIntCoinForTest(res.Resp.Gold)-getIntCoinForTest(beforeWallet.Gold), ShouldEqual, num) record, err := d.GetCoinStreamByTidAndOffset(context.TODO(), tid, 0) So(err, ShouldBeNil) So(record.Reserved1, ShouldEqual, 2) So(record.Version, ShouldEqual, 1) res = queryRecharge(t, getTestRechargeOrPayForm(t, int32(model.RECHARGETYPE), uid, "silver", num, nil), platform) So(res.Code, ShouldEqual, 0) So(getIntCoinForTest(res.Resp.Silver)-getIntCoinForTest(beforeWallet.Silver), ShouldEqual, num) afterWallet := getTestWallet(t, uid, platform) So(getIntCoinForTest(afterWallet.Gold)-getIntCoinForTest(beforeWallet.Gold), ShouldEqual, num) So(getIntCoinForTest(afterWallet.Silver)-getIntCoinForTest(beforeWallet.Silver), ShouldEqual, num) } })) }