package distribution import ( "testing" "time" "hfb_sys/backend/internal/model" "gorm.io/driver/sqlite" "gorm.io/gorm" ) func distributionTestDB(t *testing.T) *gorm.DB { t.Helper() db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) if err != nil { t.Fatal(err) } if err := db.AutoMigrate(&model.ChatConversation{}, &model.RentalOrder{}, &model.DistributionSite{}, &model.DistributionRuleVersion{}, &model.DistributionOrderFinancial{}, &model.DistributionOrderParty{}, &model.DistributionSiteAccount{}, &model.DistributionSitePaymentChannel{}, &model.DistributionSettlementBatch{}, &model.DistributionSettlementItem{}); err != nil { t.Fatal(err) } return db } func TestDistributionOrderSnapshotAndQueries(t *testing.T) { db := distributionTestDB(t) repo := NewRepository(db) site := model.DistributionSite{SiteCode: "demo", SiteName: "演示站", Domain: "distribution.example.com", DisplayAccountEnabled: true, TaxRateBPS: 100} if err := db.Create(&site).Error; err != nil { t.Fatal(err) } now := time.Now() rule := model.DistributionRuleVersion{SiteID: &site.ID, Mode: ModeTwoPartyDistributorReceive, Version: 1, Status: "active", ServiceFeeValue: 0, ServiceFeeUnit: ServiceFeeUnitFixedAmount, PaymentFeeBPS: 50, TaxRateBPS: 100, EffectiveFrom: now} if err := db.Create(&rule).Error; err != nil { t.Fatal(err) } order := model.RentalOrder{OrderNo: "D-1", ListingID: 1, AccountID: 2, OwnerID: 3, RenterID: 4, Status: "completed"} if err := db.Create(&order).Error; err != nil { t.Fatal(err) } _, err := repo.CreateFinancialSnapshot(t.Context(), order.ID, CreateFinancialSnapshotRequest{SiteID: site.ID, RuleVersionID: rule.ID, GrossPaidAmountCent: 10001, RefundAmountCent: 1000, MarkupAmountCent: 300, Parties: []SnapshotPartyRequest{{PartyRole: "distributor_receive", PartyType: "site", PartyID: site.ID, IncomeAmountCent: 1000, CostAmountCent: 400}}}) if err != nil { t.Fatal(err) } page, err := repo.ListOrders(t.Context(), DistributionOrderListQuery{SiteID: site.ID, Kind: "receive", Page: 1, Size: 20}) if err != nil { t.Fatal(err) } if page.Total != 1 || len(page.Items) != 1 || page.Items[0].PaymentFeeCent != 45 || page.Items[0].NetPaidAmountCent != 9001 { t.Fatalf("unexpected page: %#v", page) } if _, err := repo.FindOrder(t.Context(), order.ID); err != nil { t.Fatal(err) } } func TestDistributionPaymentChannelAndSettlementBatch(t *testing.T) { db := distributionTestDB(t) repo := NewRepository(db) site := model.DistributionSite{SiteCode: "demo", SiteName: "演示站", Domain: "distribution.example.com", TaxRateBPS: 100} if err := db.Create(&site).Error; err != nil { t.Fatal(err) } channel, err := repo.BindPaymentChannel(t.Context(), site.ID, BindPaymentChannelRequest{ConfigID: 9, Priority: 1}) if err != nil { t.Fatal(err) } items, err := repo.ListPaymentChannels(t.Context(), site.ID) if err != nil || len(items) != 1 || items[0].ConfigID != 9 { t.Fatalf("channels = %#v, err=%v", items, err) } if err := repo.UnbindPaymentChannel(t.Context(), channel.ID); err != nil { t.Fatal(err) } start := time.Now().Add(-time.Hour) batch, err := repo.CreateSettlementBatch(t.Context(), 1, CreateSettlementBatchRequest{SiteID: site.ID, PeriodStart: start, PeriodEnd: time.Now()}) if err != nil { t.Fatal(err) } settled, err := repo.MarkSettlementBatch(t.Context(), batch.ID) if err != nil || settled.Status != "settled" { t.Fatalf("settled = %#v, err=%v", settled, err) } if _, err := repo.MarkSettlementBatch(t.Context(), batch.ID); err != ErrBatchAlreadySettled { t.Fatalf("second settle err = %v", err) } }