casbin / gorm-adapter

GORM adapter for Casbin, see extended version of GORM Adapter Ex at: https://github.com/casbin/gorm-adapter-ex
https://github.com/casbin/casbin
Apache License 2.0
678 stars 206 forks source link

Unit test when using Transaction #225

Closed andre-fajar-n closed 5 months ago

andre-fajar-n commented 8 months ago

I have used transaction like this

err := r.enforcer.GetAdapter().(*gormadapter.Adapter).Transaction(r.enforcer, func(i casbin.IEnforcer) error {
    allPolicies := i.GetFilteredPolicy(1, domainName)

    ok, err := i.RemovePolicies(allPolicies)
    if err != nil {
        return err
    }

    if !ok {
        err := fmt.Errorf("cannot delete this rbac config")
        return err
    }

    allGroupPolicies := enforcer.GetFilteredGroupingPolicy(2, domainName)

    ok, err := i.RemoveGroupingPolicies(allGroupPolicies)
    if err != nil {
        return err
    }

    if !ok {
        err := fmt.Errorf("cannot delete this grouping policies")
        return err
    }

    return nil
})

Then I want to write unit test of this function, but I don't know how to mock the Transaction. Any solution for my problem?

MuZhou233 commented 5 months ago

Currently Transaction can not be mocked, but you can try this way

func YourFunc() {
    // other logic
    r.enforcer.GetAdapter().(*gormadapter.Adapter).Transaction(r.enforcer, TransactionFunc("domainName"))
    // other logic
}

func TransactionFunc(domainName string) func(i casbin.IEnforcer) error {
    return func(i casbin.IEnforcer) error {
        allPolicies := i.GetFilteredPolicy(1, domainName)

        ok, err := i.RemovePolicies(allPolicies)
        if err != nil {
            return err
        }

        if !ok {
            err := fmt.Errorf("cannot delete this rbac config")
            return err
        }

        allGroupPolicies := i.GetFilteredGroupingPolicy(2, domainName)

        ok, err := i.RemoveGroupingPolicies(allGroupPolicies)
        if err != nil {
            return err
        }

        if !ok {
            err := fmt.Errorf("cannot delete this grouping policies")
            return err
        }

        return nil
    }
}

func Test_TransactionFunc(t *testing.T) {
    // other logic
    err := TransactionFunc(domainName)(enforcer)
    // other logic
}
hsluoyz commented 5 months ago

@andre-fajar-n closed as resolved