// Copyright 2022 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.

package migrations

import (
	"testing"

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

	"gogs.io/gogs/internal/dbtest"
)

type actionPreV21 struct {
	ID           int64 `gorm:"primaryKey"`
	UserID       int64
	OpType       int
	ActUserID    int64
	ActUserName  string
	RepoID       int64 `gorm:"index"`
	RepoUserName string
	RepoName     string
	RefName      string
	IsPrivate    bool `gorm:"not null;default:FALSE"`
	Content      string
	CreatedUnix  int64
}

func (*actionPreV21) TableName() string {
	return "action"
}

type actionV21 struct {
	ID           int64 `gorm:"primaryKey"`
	UserID       int64 `gorm:"index"`
	OpType       int
	ActUserID    int64
	ActUserName  string
	RepoID       int64 `gorm:"index"`
	RepoUserName string
	RepoName     string
	RefName      string
	IsPrivate    bool `gorm:"not null;default:FALSE"`
	Content      string
	CreatedUnix  int64
}

func (*actionV21) TableName() string {
	return "action"
}

func TestAddIndexToActionUserID(t *testing.T) {
	if testing.Short() {
		t.Skip()
	}
	t.Parallel()

	db := dbtest.NewDB(t, "addIndexToActionUserID", new(actionPreV21))
	err := db.Create(
		&actionPreV21{
			ID:           1,
			UserID:       1,
			OpType:       1,
			ActUserID:    1,
			ActUserName:  "alice",
			RepoID:       1,
			RepoUserName: "alice",
			RepoName:     "example",
			RefName:      "main",
			IsPrivate:    false,
			CreatedUnix:  db.NowFunc().Unix(),
		},
	).Error
	require.NoError(t, err)
	assert.False(t, db.Migrator().HasIndex(&actionV21{}, "UserID"))

	err = addIndexToActionUserID(db)
	require.NoError(t, err)
	assert.True(t, db.Migrator().HasIndex(&actionV21{}, "UserID"))

	// Re-run should be skipped
	err = addIndexToActionUserID(db)
	require.Equal(t, errMigrationSkipped, err)
}