package test

import (
	"flag"
	"fmt"
	"log"
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/pingcap/enterprise-toolkit/tispector/config"
	"github.com/pingcap/enterprise-toolkit/tispector/dao"
	"github.com/pingcap/enterprise-toolkit/tispector/injection"
	"github.com/pingcap/enterprise-toolkit/tispector/service/checker"
	"github.com/pingcap/enterprise-toolkit/tispector/util/logger"
)

// initTestEnvs 初始化测试环境
func initTestEnvs() {
	var Version string
	flag.Parse()
	log.Println("version:", Version)
	config.InitConfig("E:\\go\\src\\github.com\\AllinChen\\tispector\\config\\config.yml")
	logger.InitLog(config.Conf.Server.LogDir, "dbinjection.log", config.Conf.Server.LogLevel)
	dao.InitDB()
	injection.Injection()
	checker.InitRuleStatus()
}

// TestDao dao 单元测试
func TestDao(t *testing.T) {
	initTestEnvs()

	TestDao_ListAllFiles(t)
	TestDao_GetFileByName(t)
	TestDao_AddFileInfo(t)
	TestDao_DelFileByName(t)
	TestDao_ListAllRules(t)
	TestDao_InitRuleTable(t)
	TestDao_UpdateRuleTable(t)
	TestDao_GetRuleByItem(t)
}

func TestDao_ListAllFiles(t *testing.T) {
	asst := assert.New(t)

	files, err := dao.File.ListAllFiles()
	fmt.Println(files, err)
	asst.Equal(nil, err, "Test ListAllFiles failed")
}

func TestDao_GetFileByName(t *testing.T) {
	asst := assert.New(t)

	fileInfo, err := dao.File.GetFileByName("test-1627972031.sql")
	fmt.Println(fileInfo, err)
	asst.NotEqual(nil, fileInfo, "Test GetFileByName failed")
}

func TestDao_AddFileInfo(t *testing.T) {
	asst := assert.New(t)

	file := checker.DbInjectionFile{
		Name:     "test",
		Location: "test",
		Ct:       1000000,
	}

	fileName, err := dao.File.AddFileInfo(file)
	fmt.Println(fileName, err)
	asst.Equal("test", fileName, "Test AddFileInfo failed")
}

func TestDao_DelFileByName(t *testing.T) {
	asst := assert.New(t)

	fileName := "test"

	err := dao.File.DelFileByName(fileName)
	fmt.Println(err)
	asst.Equal(nil, err, "Test DelFileByName failed")

}

func TestDao_ListAllRules(t *testing.T) {
	asst := assert.New(t)

	ruleNums := 76

	rules, err := dao.Rule.ListAllRules()
	fmt.Println(len(rules), err)
	asst.Equal(ruleNums, len(rules), "Test ListAllRules failed")
}

func TestDao_InitRuleTable(t *testing.T) {
	asst := assert.New(t)

	err := dao.Rule.InitRuleTable()
	fmt.Println(err)
	asst.Equal("0 errors occurred:\n\t\n\n\n", fmt.Sprintln(err), "Test InitRuleTable failed")
}

func TestDao_UpdateRuleTable(t *testing.T) {
	asst := assert.New(t)

	newRule := config.RuleConf{
		Item:    "ALTER.022",
		Summary: "test",
	}

	err := dao.Rule.UpdateRule(newRule)
	fmt.Println(err)
	asst.Equal("0 errors occurred:\n\t\n\n\n", fmt.Sprintln(err), "Test UpdateRule Failed")
}

func TestDao_GetRuleByItem(t *testing.T) {
	asst := assert.New(t)

	itemName := "ALTER.022"

	rule, err := dao.Rule.GetRuleByItem(itemName)
	fmt.Println(rule, err)
	asst.Equal("0 errors occurred:\n\t\n\n\n", fmt.Sprintln(err), "Test GetRuleByItem Failed")
}
