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 }