package store

import (
	"testing"
	"time"

	"github.com/stretchr/testify/assert"

	"github.com/pingcap/test-infra/common/model"
	"github.com/pingcap/test-infra/services/tcms/service/store/v2/ent/triage"

	"github.com/pingcap/test-infra/services/tcms/utils"
)

func TestCalcResourceDuration(t *testing.T) {
	s := setup(t)
	defer s.Shutdown()
	ent, resourceDurationSvc := s.Ent, s.ResourceDuration.(*resourceDurationService)
	ctx := utils.FakeCtx()

	assert.NoError(t, resourceDurationSvc.ProcessResourceDuration(ctx, 2))
	resourceDurations, err := resourceDurationSvc.Get(ctx, 2)
	assert.NoError(t, err)
	if assert.Equal(t, 4, len(resourceDurations)) {
		assert.Equal(t, 6, int(resourceDurations[0].CpuDuration))
		assert.Equal(t, model.PrepareErrorDuration, resourceDurations[0].Type)
		assert.Equal(t, 2, int(resourceDurations[1].CpuDuration))
		assert.Equal(t, model.PrepareDuration, resourceDurations[1].Type)
		assert.Equal(t, 4, int(resourceDurations[2].CpuDuration))
		assert.Equal(t, model.RunningDuration, resourceDurations[2].Type)
		assert.Equal(t, 19, int(resourceDurations[3].CpuDuration))
		assert.Equal(t, model.WaitTriageDuration, resourceDurations[3].Type)
	}

	triage, err := ent.Triage.Query().Where(triage.PlanExecutionID(2)).Only(ctx.Request().Context())
	assert.NoError(t, err)
	// 2021-05-26 08:00:00
	assert.NoError(t, triage.Update().
		SetStartedAt(time.Date(2021, 05, 26, 8, 0, 0, 0,
			time.UTC)).
		Exec(ctx.Request().Context()))

	assert.NoError(t, resourceDurationSvc.ProcessResourceDuration(ctx, 2))

	resourceDurations, err = resourceDurationSvc.Get(ctx, 2)
	assert.NoError(t, err)
	if assert.Equal(t, 5, len(resourceDurations)) {
		assert.Equal(t, 6, int(resourceDurations[0].CpuDuration))
		assert.Equal(t, model.PrepareErrorDuration, resourceDurations[0].Type)
		assert.Equal(t, 2, int(resourceDurations[1].CpuDuration))
		assert.Equal(t, model.PrepareDuration, resourceDurations[1].Type)
		assert.Equal(t, 4, int(resourceDurations[2].CpuDuration))
		assert.Equal(t, model.RunningDuration, resourceDurations[2].Type)
		assert.Equal(t, 2, int(resourceDurations[3].CpuDuration))
		assert.Equal(t, model.WaitTriageDuration, resourceDurations[3].Type)
		assert.Equal(t, 20, int(resourceDurations[4].CpuDuration))
		assert.Equal(t, model.TriageDuration, resourceDurations[4].Type)
	}
}
