package rbac

import (
	"context"
	"encoding/json"
	"fmt"
	"testing"

	"github.com/smartystreets/goconvey/convey"
)

const (
	resourceUri = "/orgs/100/create"
	url         = "/orgs/100/create"
	system      = "admin"
	desc        = "create org"
)

func TestCreateRbacPrivilege(t *testing.T) {

	dao := &RbacDao{}
	ctx := context.TODO()

	convey.Convey("CreateRbacPrivilege", t, func() {
		rbacPrivilege, err := dao.CreateRbacPrivilege(ctx, db, resourceUri, url, system, desc)
		convey.So(err, convey.ShouldBeNil)
		convey.So(rbacPrivilege, convey.ShouldNotBeNil)
	})

}

func TestListRbacPrivilege(t *testing.T) {
	dao := &RbacDao{}
	ctx := context.TODO()

	insertOneData()

	param := ListPrivilegeParam{}

	convey.Convey("ListRbacPrivilege", t, func() {
		privilege, err := dao.ListRbacPrivileges(ctx, db, param)
		fmt.Println("privilege count: ", len(privilege.List))
		convey.So(err, convey.ShouldBeNil)
		//convey.So(len(privilege), convey.ShouldEqual, 1)
		convey.So(privilege.List[0].ResourceUri, convey.ShouldEqual, resourceUri)
	})

}

func insertOneData() {
	dao := &RbacDao{}
	ctx := context.TODO()

	//resourceUri := "/orgs/100/create"
	//url := "/orgs/100/create"
	//system := "admin"
	//desc := "create org"
	_, err := dao.CreateRbacPrivilege(ctx, db, resourceUri, url, system, desc)
	if err != nil {
		fmt.Println(err.Error())
	}
}

func TestGetRbacPrivilegeByID(t *testing.T) {
	dao := &RbacDao{}
	ctx := context.TODO()

	//insertOneData()

	convey.Convey("GetRbacPrivilegeByID", t, func() {
		r, _ := dao.CreateRbacPrivilege(ctx, db, resourceUri, url, system, desc)
		privilege, err := dao.GetRbacPrivilegeByID(ctx, db, r.GetID().Uint64())
		marshal, _ := json.Marshal(privilege)
		fmt.Println(string(marshal))
		convey.So(err, convey.ShouldBeNil)
		convey.So(privilege.ResourceUri, convey.ShouldEqual, resourceUri)
	})

}
func TestUpdateRbacPrivilege(t *testing.T) {
	dao := &RbacDao{}
	ctx := context.TODO()

	insertOneData()

	convey.Convey("UpdateRbacPrivilege", t, func() {
		err := dao.UpdateRbacPrivilege(ctx, db, ddbClient, 1, "/orgs/101/create", "", "", "")
		convey.So(err, convey.ShouldBeNil)
	})
	convey.Convey("GetRbacPrivilegeByID", t, func() {
		privilege, err := dao.GetRbacPrivilegeByID(ctx, db, 1)
		convey.So(err, convey.ShouldBeNil)
		convey.So(privilege.ResourceUri, convey.ShouldEqual, "/orgs/101/create")
	})
}

/*
func TestDeleteRbacPrivilege(t *testing.T) {
	dao := &RbacDao{}
	ctx := context.TODO()

	insertOneData()

	convey.Convey("DeleteRbacPrivilege", t, func() {
		err := dao.DeleteRbacPrivilege(ctx, db, 1)
		convey.So(err, convey.ShouldBeNil)
	})
	convey.Convey("ListRbacPrivilege", t, func() {
		privilege, err := dao.ListRbacPrivileges(ctx, db)
		convey.So(err, convey.ShouldBeNil)
		convey.So(len(privilege), convey.ShouldEqual, 0)
	})
}
*/
