package clustersearch

import "testing"

func TestAllowTextSearchBySnapshot(t *testing.T) {
	cleanup := SetSnapshotForTest(true, true, []uint{101, 202})
	defer cleanup()

	if AllowTextSearch(101) {
		t.Fatal("expected text search to be disabled for large org")
	}
	if !AllowTextSearch(303) {
		t.Fatal("expected text search to be allowed for small org")
	}

	disabledOrgIDs, ok := DisabledOrgIDsForTextSearch()
	if !ok {
		t.Fatal("expected text search policy to be loaded")
	}
	if len(disabledOrgIDs) != 2 {
		t.Fatalf("expected 2 disabled org IDs, got %d", len(disabledOrgIDs))
	}
}

func TestTextSearchFailsClosedWhenSnapshotLoadFailed(t *testing.T) {
	cleanup := SetSnapshotForTest(true, false, nil)
	defer cleanup()

	if AllowTextSearch(101) {
		t.Fatal("expected text search to fail closed")
	}

	_, ok := DisabledOrgIDsForTextSearch()
	if ok {
		t.Fatal("expected dashboard text search to fail closed")
	}

	if err := RequirePolicyForQuery("abc"); err != ErrTextSearchPolicyUnavailable {
		t.Fatalf("expected policy unavailable error, got %v", err)
	}
	if err := RequirePolicyForQuery("123"); err != nil {
		t.Fatalf("expected ID-like search to bypass unavailable policy, got %v", err)
	}
}

func TestTextSearchAllowsByDefaultBeforeCacheStarts(t *testing.T) {
	cleanup := SetSnapshotForTest(false, true, nil)
	defer cleanup()

	if !AllowTextSearch(101) {
		t.Fatal("expected text search to be allowed before cache starts")
	}

	_, ok := DisabledOrgIDsForTextSearch()
	if !ok {
		t.Fatal("expected dashboard text search to be allowed before cache starts")
	}
}
