package knowledgeqa

import (
	"testing"

	"github.com/stretchr/testify/require"
)

func TestKnowledgeQACitationTargetCoversEveryRootKind(t *testing.T) {
	tests := []struct {
		name     string
		citation Citation
		want     string
	}{
		{
			name: "primary immutable file",
			citation: Citation{
				KnowledgeBaseID: "kb_1", SourceID: "src_1", RootKind: "primary",
				RepoRole: "primary", Revision: "sha/old", Path: "docs/design notes.md",
				ResolvedRef: "v7.1.9-0", ResolvedRefKind: "tag",
				LineStart: 4, LineEnd: 6,
			},
			want: "/kb/kb_1/sources/src_1/blob/sha%2Fold/docs/design%20notes.md?sourceRef=v7.1.9-0&sourceRefKind=tag#L4",
		},
		{
			name: "generated insights page",
			citation: Citation{
				KnowledgeBaseID: "kb_1", SourceID: "src_1", RootKind: "insights",
				RepoRole: "insights", Revision: "wiki-sha", Path: "runbooks/release.md",
			},
			want: "/kb/kb_1/sources/src_1/wiki/runbooks%2Frelease",
		},
		{
			name: "knowledge base lexicon",
			citation: Citation{
				KnowledgeBaseID: "kb_1", RootKind: "lexicon", RepoRole: "wiki",
				Revision: "lexicon-sha", Path: "glossary.md",
			},
			want: "/kb/kb_1",
		},
	}
	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			target, ok := knowledgeQACitationTarget(test.citation)
			require.True(t, ok)
			require.Equal(t, test.want, target)
		})
	}
}

func TestKnowledgeQACitationTargetRejectsUnrepresentableMetadata(t *testing.T) {
	for _, filePath := range []string{"../secret", "docs/../secret", "docs\\secret", "docs/\x00secret"} {
		_, ok := knowledgeQACitationTarget(Citation{
			KnowledgeBaseID: "kb_1", SourceID: "src_1", RootKind: "primary",
			RepoRole: "primary", Revision: "sha", Path: filePath,
		})
		require.False(t, ok, filePath)
	}
}
