//go:build integration

package catalogapp

import (
	"context"
	"testing"
)

func TestCatalogAppTiDBRepairsMissingReleaseAdmissionConstraints(t *testing.T) {
	db, cleanup := openCatalogTiDB(t)
	defer cleanup()

	for _, statement := range []string{
		`CREATE TABLE _System_CatalogAppRelease (
AppId VARCHAR(128) NOT NULL, AppReleaseDigest VARCHAR(71) NOT NULL,
PublisherId VARCHAR(128) NOT NULL, SemanticVersion VARCHAR(255) NOT NULL,
MetadataBundleDigest VARCHAR(71) NOT NULL, CanonicalManifest JSON NOT NULL, CanonicalBundle JSON NOT NULL,
CanonicalizationProfile VARCHAR(64) NOT NULL, ArtifactMediaType VARCHAR(255) NOT NULL,
AdmissionKind VARCHAR(32) NOT NULL DEFAULT 'SIGNED_PUBLISHER',
AttestationKeyId VARCHAR(128) NULL, AttestationDigest VARCHAR(71) NULL, AttestationVerifiedAt DATETIME(6) NULL,
CreatedDate DATETIME(6) NOT NULL, PRIMARY KEY (AppId, AppReleaseDigest),
UNIQUE KEY ux_catalog_app_semver (AppId, SemanticVersion))`,
		`CREATE TABLE _System_CatalogAppReleaseSourceReceipt (
AppId VARCHAR(128) NOT NULL, AppReleaseDigest VARCHAR(71) NOT NULL,
ReceiptSchema VARBINARY(64) NOT NULL, SourceRepository VARBINARY(1024) NOT NULL,
SourceCommit VARBINARY(40) NOT NULL, PackageContentDigest VARCHAR(71) NOT NULL,
PromotionDisposition VARBINARY(32) NOT NULL, ReceiptDigest VARCHAR(71) NOT NULL,
CreatedDate DATETIME(6) NOT NULL, PRIMARY KEY (AppId, AppReleaseDigest))`,
	} {
		if _, err := db.ExecContext(context.Background(), statement); err != nil {
			t.Fatal(err)
		}
	}

	authority, err := New(db, Options{})
	if err != nil {
		t.Fatal(err)
	}
	if err := authority.EnsureSchema(context.Background()); err != nil {
		t.Fatalf("repair legacy Catalog AppRelease constraints: %v", err)
	}

	found, err := readReleaseAdmissionConstraints(context.Background(), db)
	if err != nil {
		t.Fatal(err)
	}
	for _, name := range []string{releaseAdmissionConstraint, releaseSourceReceiptConstraint} {
		if _, ok := found[name]; !ok {
			t.Fatalf("Catalog AppRelease constraint %s is absent after EnsureSchema", name)
		}
	}
}
