go-common/app/job/main/growup/service/charge/run_test.go
2019-04-22 18:49:16 +08:00

370 lines
15 KiB
Go

package charge
import (
"context"
"fmt"
"strings"
"testing"
"time"
model "go-common/app/job/main/growup/model/charge"
xtime "go-common/library/time"
. "github.com/smartystreets/goconvey/convey"
)
func Test_AvCharge(t *testing.T) {
Convey("Test av weekly and monthly charge\n", t, func() {
c := context.Background()
deleteAll(c)
ac1 := insertAvDailyCharge(c, "2018-06-01", "2018-06-01 15:02:03", 1101, 110, 10)
ac2 := insertAvDailyCharge(c, "2018-06-01", "2018-06-01 15:02:03", 1102, 110, 10)
d, _ := time.ParseInLocation("2006-01-02", "2018-06-01", time.Local)
err := s.runVideo(c, d, nil)
So(err, ShouldBeNil)
checkAvWeeklyCharge(c, ac1, 30, 10, 10)
checkAvWeeklyCharge(c, ac2, 30, 10, 10)
checkAvMonthlyCharge(c, ac1, 30, 10, 10)
checkAvMonthlyCharge(c, ac2, 30, 10, 10)
ac1 = insertAvDailyCharge(c, "2018-06-02", "2018-06-01 15:02:03", 1101, 110, 10)
ac2 = insertAvDailyCharge(c, "2018-06-02", "2018-06-01 15:02:03", 1102, 110, 20)
d, _ = time.ParseInLocation("2006-01-02", "2018-06-02", time.Local)
err = s.runVideo(c, d, nil)
So(err, ShouldBeNil)
checkAvWeeklyCharge(c, ac1, 60, 20, 20)
checkAvWeeklyCharge(c, ac2, 90, 30, 30)
checkAvMonthlyCharge(c, ac1, 60, 20, 20)
checkAvMonthlyCharge(c, ac2, 90, 30, 30)
ac1 = insertAvDailyCharge(c, "2018-06-05", "2018-06-01 15:02:03", 1101, 110, 15)
d, _ = time.ParseInLocation("2006-01-02", "2018-06-05", time.Local)
err = s.runVideo(c, d, nil)
So(err, ShouldBeNil)
checkAvWeeklyCharge(c, ac1, 45, 15, 15)
checkAvMonthlyCharge(c, ac1, 105, 35, 35)
})
}
func Test_AvChargeDateStatis(t *testing.T) {
Convey("Test av charge date statis\n", t, func() {
c := context.Background()
deleteAll(c)
insertAvDailyCharge(c, "2018-06-01", "2018-06-01 15:02:03", 1101, 110, 10)
insertAvDailyCharge(c, "2018-06-01", "2018-06-01 15:02:03", 1102, 110, 10)
insertAvDailyCharge(c, "2018-06-01", "2018-06-01 15:02:03", 1103, 110, 3500)
d, _ := time.ParseInLocation("2006-01-02", "2018-06-01", time.Local)
err := s.runVideo(c, d, nil)
So(err, ShouldBeNil)
checkAvChargeDateStatis(c, 0, 2, 1, 3520, 12, d, "av_charge_daily_statis")
checkAvChargeDateStatis(c, 1, 1, 1, 3520, 12, d, "av_charge_daily_statis")
weekD := getStartWeeklyDate(d)
checkAvChargeDateStatis(c, 0, 2, 1, 3520, 12, weekD, "av_charge_weekly_statis")
checkAvChargeDateStatis(c, 1, 1, 1, 3520, 12, weekD, "av_charge_weekly_statis")
monthD := getStartMonthlyDate(d)
checkAvChargeDateStatis(c, 0, 2, 1, 3520, 12, monthD, "av_charge_monthly_statis")
checkAvChargeDateStatis(c, 1, 1, 1, 3520, 12, monthD, "av_charge_monthly_statis")
insertAvDailyCharge(c, "2018-06-02", "2018-06-01 15:02:03", 1101, 110, 1000)
insertAvDailyCharge(c, "2018-06-02", "2018-06-01 15:02:03", 1102, 110, 1000)
insertAvDailyCharge(c, "2018-06-02", "2018-06-01 15:02:03", 1103, 110, 4000)
d, _ = time.ParseInLocation("2006-01-02", "2018-06-02", time.Local)
err = s.runVideo(c, d, nil)
So(err, ShouldBeNil)
checkAvChargeDateStatis(c, 0, 2, 1, 6000, 12, d, "av_charge_daily_statis")
checkAvChargeDateStatis(c, 1, 1, 1, 6000, 12, d, "av_charge_daily_statis")
weekD = getStartWeeklyDate(d)
charge := 6000 + 3520
checkAvChargeDateStatis(c, 0, 2, 1, charge, 12, weekD, "av_charge_weekly_statis")
checkAvChargeDateStatis(c, 1, 0, 1, charge, 12, weekD, "av_charge_weekly_statis")
checkAvChargeDateStatis(c, 2, 1, 1, charge, 12, weekD, "av_charge_weekly_statis")
monthD = getStartMonthlyDate(d)
checkAvChargeDateStatis(c, 0, 2, 1, charge, 12, monthD, "av_charge_monthly_statis")
checkAvChargeDateStatis(c, 1, 0, 1, charge, 12, monthD, "av_charge_monthly_statis")
checkAvChargeDateStatis(c, 2, 1, 1, charge, 12, monthD, "av_charge_monthly_statis")
insertAvDailyCharge(c, "2018-06-10", "2018-06-01 15:02:03", 1101, 110, 15000)
insertAvDailyCharge(c, "2018-06-10", "2018-06-01 15:02:03", 1102, 110, 15000)
insertAvDailyCharge(c, "2018-06-10", "2018-06-01 15:02:03", 1103, 110, 40000)
d, _ = time.ParseInLocation("2006-01-02", "2018-06-10", time.Local)
err = s.runVideo(c, d, nil)
So(err, ShouldBeNil)
checkAvChargeDateStatis(c, 0, 0, 1, 70000, 12, d, "av_charge_daily_statis")
checkAvChargeDateStatis(c, 1, 0, 1, 70000, 12, d, "av_charge_daily_statis")
checkAvChargeDateStatis(c, 3, 2, 1, 70000, 12, d, "av_charge_daily_statis")
checkAvChargeDateStatis(c, 4, 1, 1, 70000, 12, d, "av_charge_daily_statis")
weekD = getStartWeeklyDate(d)
checkAvChargeDateStatis(c, 0, 0, 1, 70000, 12, weekD, "av_charge_weekly_statis")
checkAvChargeDateStatis(c, 1, 0, 1, 70000, 12, weekD, "av_charge_weekly_statis")
checkAvChargeDateStatis(c, 3, 2, 1, 70000, 12, weekD, "av_charge_weekly_statis")
checkAvChargeDateStatis(c, 4, 1, 1, 70000, 12, weekD, "av_charge_weekly_statis")
monthD = getStartMonthlyDate(d)
checkAvChargeDateStatis(c, 0, 0, 1, 79520, 12, monthD, "av_charge_monthly_statis")
checkAvChargeDateStatis(c, 1, 0, 1, 79520, 12, monthD, "av_charge_monthly_statis")
checkAvChargeDateStatis(c, 3, 2, 1, 79520, 12, monthD, "av_charge_monthly_statis")
checkAvChargeDateStatis(c, 4, 1, 1, 79520, 12, monthD, "av_charge_monthly_statis")
insertAvDailyCharge(c, "2018-07-10", "2018-06-01 15:02:03", 1101, 110, 100)
d, _ = time.ParseInLocation("2006-01-02", "2018-07-10", time.Local)
err = s.runVideo(c, d, nil)
So(err, ShouldBeNil)
monthD = getStartMonthlyDate(d)
checkAvChargeDateStatis(c, 0, 1, 1, 100, 12, monthD, "av_charge_monthly_statis")
checkAvChargeDateStatis(c, 1, 0, 1, 100, 12, monthD, "av_charge_monthly_statis")
})
}
func Test_AvChargeStatis(t *testing.T) {
Convey("Test av charge statis\n", t, func() {
c := context.Background()
deleteAll(c)
ac1 := insertAvDailyCharge(c, "2018-06-01", "2018-06-01 15:02:03", 1101, 110, 1000)
ac2 := insertAvDailyCharge(c, "2018-06-01", "2018-06-01 15:02:03", 1102, 110, 1000)
d, _ := time.ParseInLocation("2006-01-02", "2018-06-01", time.Local)
err := s.runVideo(c, d, nil)
So(err, ShouldBeNil)
checkAvChargeStatis(c, ac1, 1000)
checkAvChargeStatis(c, ac2, 1000)
ac1 = insertAvDailyCharge(c, "2018-06-02", "2018-06-01 15:02:03", 1101, 110, 1000)
ac2 = insertAvDailyCharge(c, "2018-06-02", "2018-06-01 15:02:03", 1102, 110, 1000)
ac3 := insertAvDailyCharge(c, "2018-06-02", "2018-06-01 15:02:03", 1103, 110, 1000)
d, _ = time.ParseInLocation("2006-01-02", "2018-06-02", time.Local)
err = s.runVideo(c, d, nil)
So(err, ShouldBeNil)
checkAvChargeStatis(c, ac1, 2000)
checkAvChargeStatis(c, ac2, 2000)
checkAvChargeStatis(c, ac3, 1000)
ac2 = insertAvDailyCharge(c, "2018-07-03", "2018-06-01 15:02:03", 1102, 110, 1000)
ac3 = insertAvDailyCharge(c, "2018-07-03", "2018-06-01 15:02:03", 1103, 110, 1000)
ac4 := insertAvDailyCharge(c, "2018-07-03", "2018-06-01 15:02:03", 1104, 110, 1000)
d, _ = time.ParseInLocation("2006-01-02", "2018-07-03", time.Local)
err = s.runVideo(c, d, nil)
So(err, ShouldBeNil)
checkAvChargeStatis(c, ac1, 2000)
checkAvChargeStatis(c, ac2, 3000)
checkAvChargeStatis(c, ac3, 2000)
checkAvChargeStatis(c, ac4, 1000)
})
}
// up_charge
func Test_UpCharge(t *testing.T) {
Convey("Test up daily weekly monthly charge\n", t, func() {
c := context.Background()
deleteAll(c)
ac1 := insertAvDailyCharge(c, "2018-06-01", "2018-06-01 20:02:03", 1101, 110, 10)
ac2 := insertAvDailyCharge(c, "2018-06-01", "2018-06-01 20:02:03", 1102, 110, 10)
d, _ := time.ParseInLocation("2006-01-02", "2018-06-01", time.Local)
err := s.runVideo(c, d, nil)
So(err, ShouldBeNil)
acs := []*model.AvCharge{ac1, ac2}
checkUpDailyCharge(c, acs, 2, 20, "up_daily_charge", "2018-06-01")
checkUpWeeklyCharge(c, acs, 2, 20)
checkUpMonthlyCharge(c, acs, 2, 20)
ac11 := insertAvDailyCharge(c, "2018-06-02", "2018-06-01 20:02:03", 1101, 110, 10)
ac21 := insertAvDailyCharge(c, "2018-06-02", "2018-06-01 20:02:03", 1102, 110, 10)
d, _ = time.ParseInLocation("2006-01-02", "2018-06-02", time.Local)
err = s.runVideo(c, d, nil)
So(err, ShouldBeNil)
acs = append(acs, []*model.AvCharge{ac11, ac21}...)
checkUpDailyCharge(c, []*model.AvCharge{ac11, ac21}, 2, 20, "up_daily_charge", "2018-06-01")
checkUpWeeklyCharge(c, acs, 2, 40)
checkUpMonthlyCharge(c, acs, 2, 40)
ac12 := insertAvDailyCharge(c, "2018-06-05", "2018-06-01 20:02:03", 1101, 110, 10)
d, _ = time.ParseInLocation("2006-01-02", "2018-06-05", time.Local)
err = s.runVideo(c, d, nil)
So(err, ShouldBeNil)
acs = append(acs, []*model.AvCharge{ac12}...)
checkUpDailyCharge(c, []*model.AvCharge{ac12}, 1, 10, "up_daily_charge", "2018-06-05")
checkUpWeeklyCharge(c, []*model.AvCharge{ac12}, 1, 10)
checkUpMonthlyCharge(c, acs, 2, 50)
ac13 := insertAvDailyCharge(c, "2018-07-05", "2018-06-01 20:02:03", 1101, 110, 10)
d, _ = time.ParseInLocation("2006-01-02", "2018-07-05", time.Local)
err = s.runVideo(c, d, nil)
So(err, ShouldBeNil)
checkUpDailyCharge(c, []*model.AvCharge{ac13}, 1, 10, "up_daily_charge", "2018-07-05")
checkUpWeeklyCharge(c, []*model.AvCharge{ac13}, 1, 10)
checkUpMonthlyCharge(c, []*model.AvCharge{ac13}, 1, 10)
})
}
func checkAvWeeklyCharge(c context.Context, ac *model.AvCharge, totalPlayCount, incCharge, totalCharge int64) {
avWeeklyCharge, err := s.GetAvCharge(c, startWeeklyDate, s.dao.AvWeeklyCharge)
So(err, ShouldBeNil)
var aw *model.AvCharge
for _, av := range avWeeklyCharge {
if av.AvID == ac.AvID {
aw = av
break
}
}
So(ac.AvID, ShouldEqual, aw.AvID)
So(ac.MID, ShouldEqual, aw.MID)
So(ac.TagID, ShouldEqual, aw.TagID)
So(ac.IsOriginal, ShouldEqual, aw.IsOriginal)
So(ac.UploadTime, ShouldEqual, aw.UploadTime)
So(totalPlayCount, ShouldEqual, aw.TotalPlayCount)
So(totalCharge, ShouldEqual, aw.TotalCharge)
So(incCharge, ShouldEqual, aw.IncCharge)
So(xtime.Time(getStartWeeklyDate(ac.Date.Time()).Unix()), ShouldEqual, aw.Date)
}
func checkAvMonthlyCharge(c context.Context, ac *model.AvCharge, totalPlayCount, incCharge, totalCharge int64) {
avCharge, err := s.GetAvCharge(c, startMonthlyDate, s.dao.AvMonthlyCharge)
So(err, ShouldBeNil)
var aw *model.AvCharge
for _, av := range avCharge {
if av.AvID == ac.AvID {
aw = av
break
}
}
So(ac.AvID, ShouldEqual, aw.AvID)
So(ac.MID, ShouldEqual, aw.MID)
So(ac.TagID, ShouldEqual, aw.TagID)
So(ac.IsOriginal, ShouldEqual, aw.IsOriginal)
So(ac.UploadTime, ShouldEqual, aw.UploadTime)
So(totalPlayCount, ShouldEqual, aw.TotalPlayCount)
So(totalCharge, ShouldEqual, aw.TotalCharge)
So(incCharge, ShouldEqual, aw.IncCharge)
So(xtime.Time(getStartMonthlyDate(ac.Date.Time()).Unix()), ShouldEqual, aw.Date)
}
func checkAvChargeStatis(c context.Context, ac *model.AvCharge, totalCharge int64) {
ai := &model.AvChargeStatis{}
err := s.dao.QueryRow(c, fmt.Sprintf("select av_id,mid,tag_id,is_original,upload_time,total_charge from av_charge_statis where av_id = %d", ac.AvID)).Scan(
&ai.AvID, &ai.MID, &ai.TagID, &ai.IsOriginal, &ai.UploadTime, &ai.TotalCharge)
So(err, ShouldBeNil)
So(ac.AvID, ShouldEqual, ai.AvID)
So(ac.MID, ShouldEqual, ai.MID)
So(ac.TagID, ShouldEqual, ai.TagID)
So(ac.IsOriginal, ShouldEqual, ai.IsOriginal)
So(ac.UploadTime, ShouldEqual, ai.UploadTime)
So(totalCharge, ShouldEqual, ai.TotalCharge)
}
func checkUpDailyCharge(c context.Context, acs []*model.AvCharge, count, total int64, table, date string) {
if len(acs) == 0 {
return
}
if date == "" {
date = acs[0].Date.Time().Format(_layout)
}
var incCharge int64
for _, ac := range acs {
incCharge += ac.IncCharge
}
up := &model.UpCharge{}
err := s.dao.QueryRow(c, fmt.Sprintf("select av_count,inc_charge, total_charge from %s where mid = %d and date = '%s'", table, acs[0].MID, date)).Scan(
&up.AvCount, &up.IncCharge, &up.TotalCharge)
So(err, ShouldBeNil)
So(total, ShouldEqual, up.TotalCharge)
So(incCharge, ShouldEqual, up.IncCharge)
}
func checkUpWeeklyCharge(c context.Context, avs []*model.AvCharge, count, total int64) {
m := make(map[string][]*model.AvCharge)
for _, av := range avs {
d := getStartWeeklyDate(av.Date.Time()).Format(_layout)
if _, ok := m[d]; !ok {
m[d] = make([]*model.AvCharge, 0)
}
m[d] = append(m[d], av)
}
for date, avs := range m {
checkUpDailyCharge(c, avs, count, total, "up_weekly_charge", date)
}
}
func checkUpMonthlyCharge(c context.Context, avs []*model.AvCharge, count, total int64) {
m := make(map[string][]*model.AvCharge)
for _, av := range avs {
d := getStartMonthlyDate(av.Date.Time()).Format(_layout)
if _, ok := m[d]; !ok {
m[d] = make([]*model.AvCharge, 0)
}
m[d] = append(m[d], av)
}
for date, avs := range m {
checkUpDailyCharge(c, avs, count, total, "up_monthly_charge", date)
}
}
func checkAvChargeDateStatis(c context.Context, section, avs, categoryID, charge, count int, d time.Time, table string) {
xd := xtime.Time(d.Unix())
ads := &model.DateStatis{}
err := s.dao.QueryRow(c, fmt.Sprintf("select avs,charge,cdate from %s where money_section = %d and category_id = %d and cdate = '%s'", table, section, categoryID, d.Format(_layout))).Scan(
&ads.Count, &ads.Charge, &ads.CDate)
So(err, ShouldBeNil)
So(charge, ShouldEqual, ads.Charge)
So(xd, ShouldEqual, ads.CDate)
So(avs, ShouldEqual, ads.Count)
var ccount int64
err = s.dao.QueryRow(c, fmt.Sprintf("select count(*) from %s where category_id = %d and cdate = '%s'", table, categoryID, d.Format(_layout))).Scan(&ccount)
So(err, ShouldBeNil)
So(count, ShouldEqual, ccount)
}
func deleteAll(c context.Context) {
s.dao.Exec(c, "truncate av_daily_charge_06")
s.dao.Exec(c, "truncate av_daily_charge_07")
s.dao.Exec(c, "truncate av_weekly_charge")
s.dao.Exec(c, "truncate av_monthly_charge")
s.dao.Exec(c, "truncate av_charge_statis")
s.dao.Exec(c, "truncate up_daily_charge")
s.dao.Exec(c, "truncate up_weekly_charge")
s.dao.Exec(c, "truncate up_monthly_charge")
s.dao.Exec(c, "truncate av_charge_daily_statis")
s.dao.Exec(c, "truncate av_charge_weekly_statis")
s.dao.Exec(c, "truncate av_charge_monthly_statis")
}
func getAvDailyChargeStruct(date string, uploadDate string, avID, mid, charge int64) *model.AvCharge {
d, _ := time.ParseInLocation(_layout, date, time.Local)
upD, _ := time.ParseInLocation(_layoutSec, uploadDate, time.Local)
ac := &model.AvCharge{
AvID: avID,
MID: mid,
TagID: 1,
IsOriginal: 1,
DanmakuCount: charge,
CommentCount: charge,
CollectCount: charge,
CoinCount: charge,
ShareCount: charge,
ElecPayCount: charge,
TotalPlayCount: charge * int64(3),
WebPlayCount: charge,
AppPlayCount: charge,
H5PlayCount: charge,
LvUnknown: charge,
Lv0: charge,
Lv1: charge,
Lv2: charge,
Lv3: charge,
Lv4: charge,
Lv5: charge,
Lv6: charge,
VScore: charge,
IncCharge: charge,
TotalCharge: 0,
Date: xtime.Time(d.Unix()),
UploadTime: xtime.Time(upD.Unix()),
DBState: _dbInsert,
}
return ac
}
func insertAvDailyCharge(c context.Context, date string, uploadDate string, avID, mid, charge int64) *model.AvCharge {
s.dao.Exec(c, fmt.Sprintf("insert into task_status(type,date,status) values(1,'%s',1) on duplicate key update date=values(date)", date))
ac := getAvDailyChargeStruct(date, uploadDate, avID, mid, charge)
_, err := s.avChargeBatchInsert(c, []*model.AvCharge{ac}, fmt.Sprintf("av_daily_charge_%s", strings.Split(date, "-")[1]))
So(err, ShouldBeNil)
return ac
}