Start adding various integration tests for accounts

This commit is contained in:
TeoV
2021-02-16 17:25:38 +02:00
committed by Dan Christian Bogos
parent 5166bfe86f
commit 812db77bd6
2 changed files with 366 additions and 12 deletions

View File

@@ -131,18 +131,6 @@ func (cB *concreteBalance) debitUsage(usage *decimal.Big,
cB.fltrS, cgrEv.Tenant, evNm); err != nil {
return
}
if costIcrm.RecurrentFee.Cmp(decimal.New(-1, 0)) == 0 &&
costIcrm.FixedFee == nil &&
len(cB.blnCfg.AttributeIDs) != 0 { // cost unknown, apply AttributeS to query from RateS
var rplyAttrS *engine.AttrSProcessEventReply
if rplyAttrS, err = processAttributeS(cB.connMgr, cgrEv, cB.attrSConns,
cB.blnCfg.AttributeIDs); err != nil {
return
}
if len(rplyAttrS.AlteredFields) != 0 { // event was altered
cgrEv = rplyAttrS.CGREvent
}
}
return maxDebitUsageFromConcretes(
[]*concreteBalance{cB}, usage,

View File

@@ -53,6 +53,10 @@ func TestAccountSv1IT(t *testing.T) {
testAccountSv1AccountProfilesForEvent,
testAccountSv1MaxUsage,
testAccountSv1DebitUsage,
testAccountSv1SimpleDebit,
testAccountSv1DebitMultipleAcc,
testAccountSv1DebitMultipleAccLimited,
testAccountSv1DebitWithAttributeS,
}
switch *dbType {
case utils.MetaInternal:
@@ -429,3 +433,365 @@ func testAccountSv1DebitUsage(t *testing.T) {
t.Errorf("Expecting : %+v \n received: %+v", utils.ToJSON(eAcnt), utils.ToJSON(reply))
}
}
func testAccountSv1SimpleDebit(t *testing.T) {
accPrfAPI := &APIAccountProfileWithCache{
APIAccountProfile: &utils.APIAccountProfile{
Tenant: "cgrates.org",
ID: "CustomAccount",
FilterIDs: []string{"*string:~*req.Account:CustomAccount"},
Weights: ";10",
Balances: map[string]*utils.APIBalance{
"Balance1": &utils.APIBalance{
ID: "Balance1",
Weights: ";10",
Type: utils.MetaConcrete,
Units: 100,
CostIncrements: []*utils.APICostIncrement{
{
Increment: utils.Float64Pointer(1),
RecurrentFee: utils.Float64Pointer(0.1),
},
},
},
},
ThresholdIDs: []string{utils.MetaNone},
},
}
var result string
expErr := utils.ErrNotFound.Error()
if err := acntSRPC.Call(utils.APIerSv1GetAccountProfile, &utils.TenantIDWithOpts{
TenantID: &utils.TenantID{Tenant: "cgrates.org", ID: "CustomAccount"}}, &result); err == nil || err.Error() != expErr {
t.Errorf("Expected error: %v received: %v", expErr, err)
}
var reply string
if err := acntSRPC.Call(utils.APIerSv1SetAccountProfile, accPrfAPI, &reply); err != nil {
t.Error(err)
} else if reply != utils.OK {
t.Error("Unexpected reply returned", reply)
}
var err error
var convAcc *utils.AccountProfile
if convAcc, err = accPrfAPI.AsAccountProfile(); err != nil {
t.Error(err)
}
var reply2 *utils.AccountProfile
if err := acntSRPC.Call(utils.APIerSv1GetAccountProfile, &utils.TenantIDWithOpts{
TenantID: &utils.TenantID{Tenant: "cgrates.org", ID: "CustomAccount"}}, &reply2); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(convAcc, reply2) {
t.Errorf("Expecting : %+v, received: %+v", convAcc, reply2)
}
var eEc *utils.ExtEventCharges
if err := acntSRPC.Call(utils.AccountSv1DebitUsage,
&utils.ArgsAccountsForEvent{CGREvent: &utils.CGREvent{
Tenant: "cgrates.org",
ID: "testAccountSv1SimpleDebit",
Event: map[string]interface{}{
utils.AccountField: "CustomAccount",
utils.Usage: "10",
}}}, &eEc); err != nil {
t.Error(err)
} else if eEc.Usage == nil || *eEc.Usage != 10.0 {
t.Fatalf("received usage: %v", *eEc.Usage)
}
if err := acntSRPC.Call(utils.APIerSv1GetAccountProfile, &utils.TenantIDWithOpts{
TenantID: &utils.TenantID{Tenant: "cgrates.org", ID: "CustomAccount"}}, &reply2); err != nil {
t.Error(err)
} else if reply2.Balances["Balance1"].Units.Cmp(decimal.New(99, 0)) != 0 {
t.Errorf("Expecting : %+v, received: %s", decimal.New(99, 0), reply2.Balances["Balance1"].Units)
}
}
func testAccountSv1DebitMultipleAcc(t *testing.T) {
accPrfAPI := &APIAccountProfileWithCache{
APIAccountProfile: &utils.APIAccountProfile{
Tenant: "cgrates.org",
ID: "CustomAccount",
FilterIDs: []string{"*string:~*req.Account:CustomAccount"},
Weights: ";20",
Balances: map[string]*utils.APIBalance{
"Balance1": &utils.APIBalance{
ID: "Balance1",
Weights: ";10",
Type: utils.MetaConcrete,
Units: 100,
CostIncrements: []*utils.APICostIncrement{
{
Increment: utils.Float64Pointer(1),
RecurrentFee: utils.Float64Pointer(0.1),
},
},
},
},
ThresholdIDs: []string{utils.MetaNone},
},
}
var reply string
if err := acntSRPC.Call(utils.APIerSv1SetAccountProfile, accPrfAPI, &reply); err != nil {
t.Error(err)
} else if reply != utils.OK {
t.Error("Unexpected reply returned", reply)
}
var err error
var convAcc *utils.AccountProfile
if convAcc, err = accPrfAPI.AsAccountProfile(); err != nil {
t.Error(err)
}
var reply2 *utils.AccountProfile
if err := acntSRPC.Call(utils.APIerSv1GetAccountProfile, &utils.TenantIDWithOpts{
TenantID: &utils.TenantID{Tenant: "cgrates.org", ID: "CustomAccount"}}, &reply2); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(convAcc, reply2) {
t.Errorf("Expecting : %+v, received: %+v", convAcc, reply2)
}
accPrfAPI2 := &APIAccountProfileWithCache{
APIAccountProfile: &utils.APIAccountProfile{
Tenant: "cgrates.org",
ID: "CustomAccount2",
FilterIDs: []string{"*string:~*req.Account:CustomAccount"},
Weights: ";10",
Balances: map[string]*utils.APIBalance{
"Balance1": &utils.APIBalance{
ID: "Balance1",
Weights: ";10",
Type: utils.MetaConcrete,
Units: 50,
CostIncrements: []*utils.APICostIncrement{
{
Increment: utils.Float64Pointer(1),
RecurrentFee: utils.Float64Pointer(0.1),
},
},
},
},
ThresholdIDs: []string{utils.MetaNone},
},
}
if err := acntSRPC.Call(utils.APIerSv1SetAccountProfile, accPrfAPI2, &reply); err != nil {
t.Error(err)
} else if reply != utils.OK {
t.Error("Unexpected reply returned", reply)
}
var convAcc2 *utils.AccountProfile
if convAcc2, err = accPrfAPI2.AsAccountProfile(); err != nil {
t.Fatal(err)
}
if err := acntSRPC.Call(utils.APIerSv1GetAccountProfile, &utils.TenantIDWithOpts{
TenantID: &utils.TenantID{Tenant: "cgrates.org", ID: "CustomAccount2"}}, &reply2); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(convAcc2, reply2) {
t.Errorf("Expecting : %+v, received: %+v", convAcc2, reply2)
}
var eEc *utils.ExtEventCharges
if err := acntSRPC.Call(utils.AccountSv1DebitUsage,
&utils.ArgsAccountsForEvent{CGREvent: &utils.CGREvent{
Tenant: "cgrates.org",
ID: "testAccountSv1SimpleDebit",
Event: map[string]interface{}{
utils.AccountField: "CustomAccount",
utils.Usage: "1400",
}}}, &eEc); err != nil {
t.Error(err)
} else if eEc.Usage == nil || *eEc.Usage != 1400.0 {
t.Fatalf("received usage: %v", *eEc.Usage)
}
if err := acntSRPC.Call(utils.APIerSv1GetAccountProfile, &utils.TenantIDWithOpts{
TenantID: &utils.TenantID{Tenant: "cgrates.org", ID: "CustomAccount"}}, &reply2); err != nil {
t.Error(err)
} else if reply2.Balances["Balance1"].Units.Cmp(decimal.New(0, 0)) != 0 {
t.Errorf("Expecting : %s, received: %s", decimal.New(0, 0), reply2.Balances["Balance1"].Units)
}
if err := acntSRPC.Call(utils.APIerSv1GetAccountProfile, &utils.TenantIDWithOpts{
TenantID: &utils.TenantID{Tenant: "cgrates.org", ID: "CustomAccount2"}}, &reply2); err != nil {
t.Error(err)
} else if reply2.Balances["Balance1"].Units.Cmp(decimal.New(10, 0)) != 0 {
t.Errorf("Expecting : %s, received: %s", decimal.New(10, 0), reply2.Balances["Balance1"].Units)
}
}
func testAccountSv1DebitMultipleAccLimited(t *testing.T) {
accPrfAPI := &APIAccountProfileWithCache{
APIAccountProfile: &utils.APIAccountProfile{
Tenant: "cgrates.org",
ID: "CustomAccount",
FilterIDs: []string{"*string:~*req.Account:CustomAccount"},
Weights: ";20",
Balances: map[string]*utils.APIBalance{
"Balance1": &utils.APIBalance{
ID: "Balance1",
Weights: ";10",
Type: utils.MetaConcrete,
Units: 100,
Opts: map[string]interface{}{
utils.MetaBalanceLimit: 50.0,
},
CostIncrements: []*utils.APICostIncrement{
{
Increment: utils.Float64Pointer(1),
RecurrentFee: utils.Float64Pointer(0.1),
},
},
},
},
ThresholdIDs: []string{utils.MetaNone},
},
}
var reply string
if err := acntSRPC.Call(utils.APIerSv1SetAccountProfile, accPrfAPI, &reply); err != nil {
t.Error(err)
} else if reply != utils.OK {
t.Error("Unexpected reply returned", reply)
}
var err error
var convAcc *utils.AccountProfile
if convAcc, err = accPrfAPI.AsAccountProfile(); err != nil {
t.Error(err)
}
var reply2 *utils.AccountProfile
if err := acntSRPC.Call(utils.APIerSv1GetAccountProfile, &utils.TenantIDWithOpts{
TenantID: &utils.TenantID{Tenant: "cgrates.org", ID: "CustomAccount"}}, &reply2); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(convAcc, reply2) {
t.Errorf("Expecting : %+v, received: %+v", convAcc, reply2)
}
accPrfAPI2 := &APIAccountProfileWithCache{
APIAccountProfile: &utils.APIAccountProfile{
Tenant: "cgrates.org",
ID: "CustomAccount2",
FilterIDs: []string{"*string:~*req.Account:CustomAccount"},
Weights: ";10",
Balances: map[string]*utils.APIBalance{
"Balance1": &utils.APIBalance{
ID: "Balance1",
Weights: ";10",
Type: utils.MetaConcrete,
Units: 50,
CostIncrements: []*utils.APICostIncrement{
{
Increment: utils.Float64Pointer(1),
RecurrentFee: utils.Float64Pointer(0.1),
},
},
},
},
ThresholdIDs: []string{utils.MetaNone},
},
}
if err := acntSRPC.Call(utils.APIerSv1SetAccountProfile, accPrfAPI2, &reply); err != nil {
t.Error(err)
} else if reply != utils.OK {
t.Error("Unexpected reply returned", reply)
}
var convAcc2 *utils.AccountProfile
if convAcc2, err = accPrfAPI2.AsAccountProfile(); err != nil {
t.Fatal(err)
}
if err := acntSRPC.Call(utils.APIerSv1GetAccountProfile, &utils.TenantIDWithOpts{
TenantID: &utils.TenantID{Tenant: "cgrates.org", ID: "CustomAccount2"}}, &reply2); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(convAcc2, reply2) {
t.Errorf("Expecting : %+v, received: %+v", convAcc2, reply2)
}
var eEc *utils.ExtEventCharges
if err := acntSRPC.Call(utils.AccountSv1DebitUsage,
&utils.ArgsAccountsForEvent{CGREvent: &utils.CGREvent{
Tenant: "cgrates.org",
ID: "testAccountSv1SimpleDebit",
Event: map[string]interface{}{
utils.AccountField: "CustomAccount",
utils.Usage: "900",
}}}, &eEc); err != nil {
t.Error(err)
} else if eEc.Usage == nil || *eEc.Usage != 900.0 {
t.Fatalf("received usage: %v", *eEc.Usage)
}
if err := acntSRPC.Call(utils.APIerSv1GetAccountProfile, &utils.TenantIDWithOpts{
TenantID: &utils.TenantID{Tenant: "cgrates.org", ID: "CustomAccount"}}, &reply2); err != nil {
t.Error(err)
} else if reply2.Balances["Balance1"].Units.Cmp(decimal.New(50, 0)) != 0 {
t.Errorf("Expecting : %s, received: %s", decimal.New(50, 0), reply2.Balances["Balance1"].Units)
}
if err := acntSRPC.Call(utils.APIerSv1GetAccountProfile, &utils.TenantIDWithOpts{
TenantID: &utils.TenantID{Tenant: "cgrates.org", ID: "CustomAccount2"}}, &reply2); err != nil {
t.Error(err)
} else if reply2.Balances["Balance1"].Units.Cmp(decimal.New(10, 0)) != 0 {
t.Errorf("Expecting : %s, received: %s", decimal.New(10, 0), reply2.Balances["Balance1"].Units)
}
}
func testAccountSv1DebitWithAttributeS(t *testing.T) {
accPrfAPI := &APIAccountProfileWithCache{
APIAccountProfile: &utils.APIAccountProfile{
Tenant: "cgrates.org",
ID: "CustomAccount",
FilterIDs: []string{"*string:~*req.Account:CustomAccount"},
Weights: ";10",
Balances: map[string]*utils.APIBalance{
"Balance1": &utils.APIBalance{
ID: "Balance1",
Weights: ";10",
Type: utils.MetaConcrete,
Units: 100,
CostIncrements: []*utils.APICostIncrement{
{
Increment: utils.Float64Pointer(1),
RecurrentFee: utils.Float64Pointer(-1),
},
},
AttributeIDs: []string{"*constant:*req.CustomField:CustomValue"},
},
},
ThresholdIDs: []string{utils.MetaNone},
},
}
var reply string
if err := acntSRPC.Call(utils.APIerSv1SetAccountProfile, accPrfAPI, &reply); err != nil {
t.Error(err)
} else if reply != utils.OK {
t.Error("Unexpected reply returned", reply)
}
var err error
var convAcc *utils.AccountProfile
if convAcc, err = accPrfAPI.AsAccountProfile(); err != nil {
t.Error(err)
}
var reply2 *utils.AccountProfile
if err := acntSRPC.Call(utils.APIerSv1GetAccountProfile, &utils.TenantIDWithOpts{
TenantID: &utils.TenantID{Tenant: "cgrates.org", ID: "CustomAccount"}}, &reply2); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(convAcc, reply2) {
t.Errorf("Expecting : %+v, received: %+v", convAcc, reply2)
}
var eEc *utils.ExtEventCharges
if err := acntSRPC.Call(utils.AccountSv1DebitUsage,
&utils.ArgsAccountsForEvent{CGREvent: &utils.CGREvent{
Tenant: "cgrates.org",
ID: "testAccountSv1SimpleDebit",
Event: map[string]interface{}{
utils.AccountField: "CustomAccount",
utils.Usage: "10",
}}}, &eEc); err != nil {
t.Error(err)
} else if eEc.Usage == nil || *eEc.Usage != 10.0 {
t.Fatalf("received usage: %v", *eEc.Usage)
}
if err := acntSRPC.Call(utils.APIerSv1GetAccountProfile, &utils.TenantIDWithOpts{
TenantID: &utils.TenantID{Tenant: "cgrates.org", ID: "CustomAccount"}}, &reply2); err != nil {
t.Error(err)
} else if reply2.Balances["Balance1"].Units.Cmp(decimal.New(99, 0)) != 0 {
t.Errorf("Expecting : %+v, received: %s", decimal.New(99, 0), reply2.Balances["Balance1"].Units)
}
}