package auth

import (
	"testing"

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

func TestParseOrgIDAndClusterID(t *testing.T) {
	Convey("valid paths", t, func() {
		validPaths := []string{
			"orgs/1/clusters/123/pd/dashboard/api/statements/stmt_types",
			"orgs/1/clusters/123/terminal/root/",
		}

		for _, each := range validPaths {
			orgID, clusterID, err := ParseOrgIDAndClusterID(each)
			So(err, ShouldBeNil)
			So(orgID, ShouldEqual, 1)
			So(clusterID, ShouldEqual, 123)
		}
	})

	Convey("invalid paths", t, func() {
		invalidPaths := []string{
			"orgs/-1/clusters/123/pd/dashboard/api/statements/stmt_types",
			"orgs/1/clusters/-1/pd/dashboard/api/statements/stmt_types",
			"tenants/1/clusters/pd/dashboard/api/statements/stmt_types",
			"orgs/1/cluster/123/pd/dashboard/api/statements/stmt_types",
			"aaa/orgs/1/clusters/123/pd/dashboard/api/statements/stmt_types",
		}

		for _, each := range invalidPaths {
			orgID, clusterID, err := ParseOrgIDAndClusterID(each)
			So(err, ShouldNotBeNil)
			So(orgID, ShouldEqual, 0)
			So(clusterID, ShouldEqual, 0)
		}
	})
}

func TestIsDashboardPath(t *testing.T) {
	Convey("isDashboardPath", t, func() {
		paths := []struct {
			path    string
			success bool
		}{
			{
				path:    "orgs/1/clusters/123/pd/dashboard/",
				success: true,
			},
			{
				path:    "orgs/1/clusters/123/pd/dashboard/api/metrics/query",
				success: true,
			},
			{
				path:    "orgs/1/clusters/123/pd/dashboard/api/statements/stmt_types",
				success: true,
			},
			{
				path:    "orgs/1/clusters/123/pd/dashboard/api/keyvisual/heatmaps",
				success: true,
			},
			{
				path:    "orgs/1/clusters/123/prometheus/api/v1/query_range",
				success: false,
			},
		}

		for _, each := range paths {
			So(IsDashboardPath(each.path), ShouldEqual, each.success)
		}
	})
}

func TestIsOldTiDBDashboardPath(t *testing.T) {
	Convey("IsOldTiDBDashboardPath", t, func() {
		paths := []struct {
			path    string
			success bool
		}{
			{
				path:    "cluster/123/pd/dashboard/",
				success: true,
			},
			{
				path:    "cluster/123/pd/dashboard/api/metrics/query",
				success: true,
			},
			{
				path:    "cluster/123/pd/dashboard/api/statements/stmt_types",
				success: true,
			},
			{
				path:    "cluster/123/pd/dashboard/api/keyvisual/heatmaps",
				success: true,
			},
			{
				path:    "orgs/1/clusters/123/pd/dashboard/api/metrics/query",
				success: false,
			},
		}

		for _, each := range paths {
			So(IsOldTiDBDashboardPath(each.path), ShouldEqual, each.success)
		}
	})
}
