package ali

import (
	"fmt"
	"testing"
	"time"

	"github.com/stretchr/testify/assert"
)

var aliCli AliCli

var rLimiter RateLimiter

func TestMain(m *testing.M) {
	var err error
	aliCli, err = NewDefaultClient()
	if err != nil {
		panic(err)
	}
	rLimiter = NewRateLimiter()
	m.Run()
}

func TestRateLimiter(t *testing.T) {
	err := rLimiter.InsertRecord("1", time.Now())
	fmt.Print(rLimiter.DisplayStatus())
	assert.NoError(t, err)
	ok := rLimiter.CheckRecord("1", time.Now())
	fmt.Print(rLimiter.DisplayStatus())
	assert.False(t, ok)
	ok = rLimiter.CheckRecord("1", time.Now().Add(time.Minute))
	fmt.Print(rLimiter.DisplayStatus())
	assert.True(t, ok)
	err = rLimiter.InsertRecord("1", time.Now().Add(1*time.Minute))
	fmt.Print(rLimiter.DisplayStatus())
	assert.NoError(t, err)
	err = rLimiter.InsertRecord("1", time.Now().Add(2*time.Minute))
	fmt.Print(rLimiter.DisplayStatus())
	assert.NoError(t, err)
	err = rLimiter.InsertRecord("1", time.Now().Add(3*time.Minute))
	fmt.Print(rLimiter.DisplayStatus())
	assert.NoError(t, err)
	err = rLimiter.InsertRecord("1", time.Now().Add(4*time.Minute))
	fmt.Print(rLimiter.DisplayStatus())
	assert.NoError(t, err)
	ok = rLimiter.CheckRecord("1", time.Now().Add(6*time.Minute))
	fmt.Print(rLimiter.DisplayStatus())
	assert.False(t, ok)
	ok = rLimiter.CheckRecord("2", time.Now().Add(6*time.Minute))
	fmt.Print(rLimiter.DisplayStatus())
	err = rLimiter.InsertRecord("2", time.Now().Add(8*time.Minute))
	fmt.Print(rLimiter.DisplayStatus())
	assert.NoError(t, err)
	assert.True(t, ok)
	err = rLimiter.InsertRecord("1", time.Now().Add(8*time.Minute))
	fmt.Print(rLimiter.DisplayStatus())
	assert.NoError(t, err)
	err = rLimiter.InsertRecord("1", time.Now().Add(10*time.Minute))
	fmt.Print(rLimiter.DisplayStatus())
	assert.NoError(t, err)
	err = rLimiter.InsertRecord("1", time.Now().Add(12*time.Minute))
	fmt.Print(rLimiter.DisplayStatus())
	assert.NoError(t, err)
}
