package catalogapp

import (
	"context"
	"testing"

	"github.com/DATA-DOG/go-sqlmock"
	"github.com/pingcap-inc/nexuscrm-contract/pkg/appauthority"
)

func TestVerifyStoppedSourceCapabilitiesAcceptsCanonicalNullMetadataHandler(t *testing.T) {
	db, mock, err := sqlmock.New()
	if err != nil {
		t.Fatal(err)
	}
	defer db.Close()
	authority, err := New(db, Options{})
	if err != nil {
		t.Fatal(err)
	}

	capability := appauthority.ProvidedCapability{
		CapabilityID:                "io.example.issues.metadata.v1",
		Kind:                        appauthority.CapabilityKindMetadata,
		RequiredRuntimeCapabilities: []string{},
	}
	pkg := testRegisteredRelease(t).Package.Package
	pkg.Manifest.ProvidedCapabilities = []appauthority.ProvidedCapability{capability}
	metadataDigest, err := appauthority.MetadataBundleDigest(pkg.Bundle, pkg.Manifest)
	if err != nil {
		t.Fatal(err)
	}
	pkg.Manifest.MetadataBundleDigest = metadataDigest
	verified, err := appauthority.VerifyPackage(pkg)
	if err != nil {
		t.Fatal(err)
	}
	release := registeredReleaseWithAdmission(verified, ReleaseAdmissionStoppedSource)
	required, err := marshalJSON(capability.RequiredRuntimeCapabilities)
	if err != nil {
		t.Fatal(err)
	}
	mock.ExpectQuery(`(?s)SELECT CapabilityId, Kind, HandlerRef, RequiredRuntimeCapabilities.*FROM _System_CatalogAppReleaseCapability.*ORDER BY CapabilityId`).
		WithArgs(release.AppID, release.AppReleaseDigest).
		WillReturnRows(sqlmock.NewRows([]string{
			"CapabilityId", "Kind", "HandlerRef", "RequiredRuntimeCapabilities",
		}).AddRow(capability.CapabilityID, capability.Kind, nil, required))

	if err := authority.verifyStoppedSourceCapabilities(context.Background(), release); err != nil {
		t.Fatalf("verify canonical metadata capability: %v", err)
	}
	if err := mock.ExpectationsWereMet(); err != nil {
		t.Fatal(err)
	}
}
