// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package frontend

import (
	"testing"

	"golang.org/x/pkgsite/internal"
	"golang.org/x/pkgsite/internal/frontend/versions"
	"golang.org/x/pkgsite/internal/testing/sample"
)

func TestUnitURLPath(t *testing.T) {
	for _, test := range []struct {
		path, modpath, version, want string
	}{
		{
			"m.com/p", "m.com", "latest",
			"/m.com/p",
		},
		{
			"m.com/p", "m.com", "v1.2.3",
			"/m.com@v1.2.3/p",
		},
		{
			"math", "std", "latest",
			"/math",
		},
		{
			"math", "std", "v1.2.3",
			"/math@go1.2.3",
		},
		{
			"math", "std", "go1.2.3",
			"/math@go1.2.3",
		},
	} {
		got := versions.ConstructUnitURL(test.path, test.modpath, test.version)
		if got != test.want {
			t.Errorf("unitURLPath(%q, %q, %q) = %q, want %q", test.path, test.modpath, test.version, got, test.want)
		}
	}
}

func TestCanonicalURLPath(t *testing.T) {
	for _, test := range []struct {
		path, modpath, version, want string
	}{

		{
			"m.com/p", "m.com", "v1.2.3",
			"/m.com@v1.2.3/p",
		},

		{
			"math", "std", "v1.2.3",
			"/math@go1.2.3",
		},
		{
			"math", "std", "go1.2.3",
			"/math@go1.2.3",
		},
	} {
		got := canonicalURLPath(test.path, test.modpath, test.version, test.version)
		if got != test.want {
			t.Errorf("canonicalURLPath(%q, %q, %q) = %q, want %q", test.path, test.modpath, test.version, got, test.want)
		}
	}
}

func TestIsValidTab(t *testing.T) {
	testTabs := []string{
		tabMain,
		tabVersions,
		tabImports,
		tabImportedBy,
		tabLicenses,
	}
	for _, test := range []struct {
		name     string
		um       *internal.UnitMeta
		wantTabs []string
		details  any
	}{
		{
			name:     "module",
			um:       sample.UnitMeta(sample.ModulePath, sample.ModulePath, sample.VersionString, "", true),
			wantTabs: []string{tabMain, tabVersions, tabLicenses},
			details:  &LicensesDetails{IsRedistributable: true},
		},
		{
			name:     "directory",
			um:       sample.UnitMeta(sample.ModulePath+"/go", sample.ModulePath, sample.VersionString, "", true),
			wantTabs: []string{tabMain, tabVersions, tabLicenses},
			details:  &LicensesDetails{IsRedistributable: true},
		},
		{
			name:     "package",
			um:       sample.UnitMeta(sample.ModulePath+"/go/packages", sample.ModulePath, sample.VersionString, "packages", true),
			wantTabs: []string{tabMain, tabVersions, tabImports, tabImportedBy, tabLicenses},
			details:  &LicensesDetails{IsRedistributable: true},
		},
		{
			name:     "command",
			um:       sample.UnitMeta(sample.ModulePath+"/cmd", sample.ModulePath, sample.VersionString, "main", true),
			wantTabs: []string{tabMain, tabVersions, tabImports, tabImportedBy, tabLicenses},
			details:  &LicensesDetails{IsRedistributable: true},
		},
		{
			name:     "non-redist pkg",
			um:       sample.UnitMeta(sample.ModulePath+"/go/packages", sample.ModulePath, sample.VersionString, "packages", false),
			wantTabs: []string{tabMain, tabVersions, tabImports, tabImportedBy},
			details:  &LicensesDetails{IsRedistributable: false},
		},
	} {
		validTabs := map[string]bool{}
		for _, w := range test.wantTabs {
			validTabs[w] = true
		}
		for _, tab := range testTabs {
			t.Run(test.name, func(t *testing.T) {
				got := isValidTabForUnit(tab, test.um, test.details)
				_, want := validTabs[tab]
				if got != want {
					t.Errorf("mismatch for %q on tab %q: got %t; want %t", test.um.Path, tab, got, want)
				}
			})
		}
	}
}

func TestMetaDescription(t *testing.T) {
	for _, test := range []struct {
		synopsis, want string
	}{
		{
			synopsis: "",
			want:     "",
		},
		{
			synopsis: "Hello, world.",
			want:     `<meta name="Description" content="Hello, world.">`,
		},
		{
			synopsis: `"><script>alert();</script><br`,
			want:     `<meta name="Description" content="&#34;&gt;&lt;script&gt;alert();&lt;/script&gt;&lt;br">`,
		},
	} {
		got := metaDescription(test.synopsis).String()
		if got != test.want {
			t.Errorf("metaDescription(%q) = %q, want %q", test.synopsis, got, test.want)
		}
	}
}
