package packageprice import ( "context" "testing" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model/entity" ) type fakePriceStore struct { parents map[int64]int64 prices map[priceKey]*entity.TSimFlowPackagePrice } type priceKey struct { deptID int64 scopeType int targetAgentID int64 packageCode string } func (s fakePriceStore) ParentDeptID(ctx context.Context, tenantID string, deptID int64) (int64, error) { return s.parents[deptID], nil } func (s fakePriceStore) PriceOverride(ctx context.Context, tenantID string, deptID int64, scopeType int, targetAgentID int64, packageCode string) (*entity.TSimFlowPackagePrice, error) { return s.prices[priceKey{ deptID: deptID, scopeType: scopeType, targetAgentID: targetAgentID, packageCode: packageCode, }], nil } func TestResolveEffectiveSalePriceUsesRecursiveParentCost(t *testing.T) { store := fakePriceStore{ parents: map[int64]int64{ 117: 100, 131: 117, }, prices: map[priceKey]*entity.TSimFlowPackagePrice{ {deptID: 100, scopeType: 1, targetAgentID: 117, packageCode: "yd-100m-3y"}: { Id: 86, AgentCostRatio: 1, AgentCostProfit: 4, UserCostRatio: 1, UserCostProfit: 4, }, {deptID: 117, scopeType: 0, targetAgentID: 0, packageCode: "yd-100m-3y"}: { Id: 91, AgentCostRatio: 1, AgentCostProfit: 1, UserCostRatio: 1, UserCostProfit: 1, }, {deptID: 117, scopeType: 1, targetAgentID: 131, packageCode: "yd-100m-3y"}: { Id: 92, AgentCostRatio: 1, AgentCostProfit: 5, UserCostRatio: 1, UserCostProfit: 5, }, }, } got, err := resolveEffectiveSalePrice( context.Background(), store, "000000", 117, 131, Source{ PackageCode: "yd-100m-3y", CostPrice: 10, TerminalCost: 10, SysDefaultRatio: 1, }, ) if err != nil { t.Fatalf("resolveEffectiveSalePrice() error = %v", err) } if got.Base.AgentCost != 14 { t.Fatalf("base agent cost = %.2f, want 14.00", got.Base.AgentCost) } if got.AgentShipmentPrice != 19 { t.Fatalf("agent shipment price = %.2f, want 19.00", got.AgentShipmentPrice) } if got.Rule.PriceSource != "target" || got.Rule.TargetPriceId != 92 { t.Fatalf("rule = %+v, want target price 92", got.Rule) } }