package db

import "testing"

func TestRepositoryMigrationFreezeUpgradeAndRepositoryDelete(t *testing.T) {
	gdb := openTiDB(t)

	// Model an existing AGS deployment before the freeze table exists.
	if err := gdb.AutoMigrate(&User{}, &Repository{}); err != nil {
		t.Fatalf("create legacy repository schema: %v", err)
	}
	owner := User{Login: "freeze-upgrade-owner", Type: TypeUser}
	if err := gdb.Create(&owner).Error; err != nil {
		t.Fatalf("create owner: %v", err)
	}
	repository := Repository{OwnerID: owner.ID, Name: "repo", FullName: "freeze-upgrade-owner/repo", DefaultBranch: "main"}
	if err := gdb.Create(&repository).Error; err != nil {
		t.Fatalf("create repository: %v", err)
	}

	if err := Migrate(gdb); err != nil {
		t.Fatalf("upgrade Migrate: %v", err)
	}
	freeze := RepositoryMigrationFreeze{RepositoryID: repository.ID, State: "sealed", Epoch: 8}
	if err := gdb.Create(&freeze).Error; err != nil {
		t.Fatalf("create freeze: %v", err)
	}
	if err := gdb.Delete(&repository).Error; err != nil {
		t.Fatalf("delete repository: %v", err)
	}
	var retained RepositoryMigrationFreeze
	if err := gdb.First(&retained, "repository_id = ?", repository.ID).Error; err != nil {
		t.Fatalf("freeze row must survive repository deletion: %v", err)
	}
	if retained.State != "sealed" || retained.Epoch != 8 {
		t.Fatalf("retained freeze = %+v", retained)
	}
}
