package service

import (
	"errors"
	"testing"
)

func TestRepositoryMigrationCapabilitiesAreUnavailable(t *testing.T) {
	svc := &Service{}
	proof := &RepositoryMigrationProof{}
	abort := &RepositoryMigrationAbortCapability{}
	tests := []struct {
		name string
		run  func() (*RepositoryMigrationProof, error)
	}{
		{name: "seal", run: func() (*RepositoryMigrationProof, error) {
			return svc.SealRepositoryForMigration(t.Context(), 1, "main")
		}},
		{name: "renew", run: func() (*RepositoryMigrationProof, error) {
			return svc.RenewRepositoryMigrationProof(t.Context(), proof)
		}},
		{name: "validate", run: func() (*RepositoryMigrationProof, error) {
			return nil, svc.ValidateRepositoryMigrationProof(t.Context(), proof)
		}},
		{name: "abort sealed", run: func() (*RepositoryMigrationProof, error) {
			return nil, svc.AbortRepositoryMigrationSealBeforeImport(t.Context(), proof)
		}},
		{name: "abort failed seal", run: func() (*RepositoryMigrationProof, error) {
			return nil, svc.AbortFailedRepositorySeal(t.Context(), abort)
		}},
	}
	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			issued, err := test.run()
			if !errors.Is(err, ErrRepositoryMigrationUnavailable) {
				t.Fatalf("error = %v, want ErrRepositoryMigrationUnavailable", err)
			}
			if issued != nil {
				t.Fatalf("issued migration proof while unavailable: %#v", issued)
			}
		})
	}
}
