package model

import (
	"os"
	"testing"
	"time"

	"github.com/pingcap/dbaas/pkg/docker_db"
	"github.com/pingcap/log"
	"github.com/stretchr/testify/assert"
	"github.com/tidbcloud/central-sdk/db/entity"
	"gorm.io/gorm"
)

var globalDB *gorm.DB

func init() {
	log.Info("init db in unittest mode")
	var err error
	globalDB, err = docker_db.TryInitCentralDB(true)
	if err != nil {
		os.Exit(-1)
	}
}

func TestVerifyCode(t *testing.T) {
	err := InsertCode("1-s@pingcap.com", "abcd")
	assert.Nil(t, err)
	assert.False(t, ValidateCode("1-s@pingcap.com", "a"))
	assert.True(t, ValidateCode("1-s@pingcap.com", "abcd"))
	assert.False(t, ValidateCode("1-s@pingcap.com", "abcd"))

	err = InsertCode("1-s@pingcap.com", "abcdefb")
	assert.Nil(t, err)
	err = InsertCode("1-s@pingcap.com", "xaefefef")
	assert.Nil(t, err)
	assert.False(t, ValidateCode("1-s@pingcap.com", "abcdefb"))
	assert.True(t, ValidateCode("1-s@pingcap.com", "xaefefef"))
	assert.False(t, ValidateCode("1-s@pingcap.com", "xaefefef"))

	err = InsertCode("1-s@pingcap.com", "random")
	assert.Nil(t, err)
	var code entity.VerifyCode
	assert.Nil(t, entity.NewVerifyCodeQuerySet(globalDB).CodeKeyEq("1-s@pingcap.com").One(&code))
	code.ExpireTime = time.Now().Add(-time.Minute)
	assert.Nil(t, globalDB.Updates(&code).Error)
	assert.False(t, ValidateCode("1-s@pingcap.com", "random"))
	code.ExpireTime = time.Now().Add(time.Minute)
	assert.Nil(t, globalDB.Updates(&code).Error)
	assert.True(t, ValidateCode("1-s@pingcap.com", "random"))
}
