package controlplane

import (
	"database/sql"
	"reflect"
	"testing"

	"github.com/nexuscrm/metadata"
)

func TestActiveGenerationSearchScopePreservesInstalledOrderAndRejectsConflicts(t *testing.T) {
	decl := func(pack, raw string) sourceBackedPackGeneration {
		return sourceBackedPackGeneration{packName: pack, runtimeSearchScope: sql.NullString{String: raw, Valid: true}}
	}
	generations := []sourceBackedPackGeneration{
		decl("a-installed", `[{"name":"WorkItem","label":"Work"},{"name":"Workspace","label":"Workspace"}]`),
		decl("b-installed", `[{"name":"Collection","label":"Collection"}]`),
	}
	got, err := searchScopeOrderFromGenerations(generations)
	want := []metadata.SearchScopeOrderItem{{Name: "WorkItem", Label: "Work"}, {Name: "Workspace", Label: "Workspace"}, {Name: "Collection", Label: "Collection"}}
	if err != nil || !reflect.DeepEqual(got, want) {
		t.Fatalf("installed scope = %#v, %v", got, err)
	}
	for _, raw := range []string{`[{"name":"workspace"}]`, `[{"name":""}]`, `{}`} {
		if _, err := searchScopeOrderFromGenerations(append(generations[:1:1], decl("conflict", raw))); err == nil {
			t.Fatalf("accepted conflicting or malformed installed declaration: %s", raw)
		}
	}
}
