// Copyright 2019 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 (
	"context"
	"net/url"
	"strings"
	"testing"

	"github.com/google/go-cmp/cmp"
	"github.com/google/safehtml"
	"github.com/google/safehtml/testconversions"
	"golang.org/x/pkgsite/internal"
	"golang.org/x/pkgsite/internal/experiment"
	"golang.org/x/pkgsite/internal/postgres"
	"golang.org/x/pkgsite/internal/source"
	"golang.org/x/pkgsite/internal/stdlib"
	"golang.org/x/pkgsite/internal/testing/sample"
)

func TestFetchOverviewDetails(t *testing.T) {
	ctx, cancel := context.WithTimeout(context.Background(), testTimeout)
	defer cancel()

	tc := struct {
		name        string
		module      *internal.Module
		wantDetails *OverviewDetails
	}{
		name:   "want expected overview details",
		module: sample.LegacyDefaultModule(),
		wantDetails: &OverviewDetails{
			ModulePath:      sample.ModulePath,
			RepositoryURL:   sample.RepositoryURL,
			ReadMe:          testconversions.MakeHTMLForTest("<p>readme</p>\n"),
			ReadMeSource:    sample.ModulePath + "@v1.0.0/README.md",
			ModuleURL:       "/mod/" + sample.ModulePath + "@v1.0.0",
			Redistributable: true,
		},
	}

	defer postgres.ResetTestDB(testDB, t)

	if err := testDB.InsertModule(ctx, tc.module); err != nil {
		t.Fatal(err)
	}

	readme := &internal.Readme{
		Filepath: sample.ReadmeFilePath,
		Contents: sample.ReadmeContents,
	}
	got, err := constructOverviewDetails(ctx, &tc.module.ModuleInfo, readme, true, true)
	if err != nil {
		t.Fatal(err)
	}
	if diff := cmp.Diff(tc.wantDetails, got, cmp.AllowUnexported(safehtml.HTML{})); diff != "" {
		t.Errorf("constructOverviewDetails(%q, %q) mismatch (-want +got):\n%s",
			tc.module.LegacyPackages[0].Path, tc.module.Version, diff)
	}
}

func TestPackageOverviewDetails(t *testing.T) {
	for _, test := range []struct {
		name           string
		dir            *internal.Unit
		versionedLinks bool
		want           *OverviewDetails
	}{
		{
			name: "redistributable",
			dir: &internal.Unit{
				UnitMeta: *sample.UnitMeta(
					"github.com/u/m/p",
					"github.com/u/m",
					"v1.2.3",
					"",
					true,
				),
				Readme: &internal.Readme{
					Filepath: "README.md",
					Contents: "readme",
				},
			},
			versionedLinks: true,
			want: &OverviewDetails{
				ModulePath:       "github.com/u/m",
				ModuleURL:        "/mod/github.com/u/m@v1.2.3",
				RepositoryURL:    "https://github.com/u/m",
				PackageSourceURL: "https://github.com/u/m/tree/v1.2.3/p",
				ReadMe:           testconversions.MakeHTMLForTest("<p>readme</p>\n"),
				ReadMeSource:     "github.com/u/m@v1.2.3/README.md",
				Redistributable:  true,
			},
		},
		{
			name: "unversioned",
			dir: &internal.Unit{
				UnitMeta: *sample.UnitMeta(
					"github.com/u/m/p",
					"github.com/u/m",
					"v1.2.3",
					"",
					true,
				),
				Readme: &internal.Readme{
					Filepath: "README.md",
					Contents: "readme",
				},
			},
			versionedLinks: false,
			want: &OverviewDetails{
				ModulePath:       "github.com/u/m",
				ModuleURL:        "/mod/github.com/u/m",
				RepositoryURL:    "https://github.com/u/m",
				PackageSourceURL: "https://github.com/u/m/tree/v1.2.3/p",
				ReadMe:           testconversions.MakeHTMLForTest("<p>readme</p>\n"),
				ReadMeSource:     "github.com/u/m@v1.2.3/README.md",
				Redistributable:  true,
			},
		},
		{
			name: "non-redistributable",
			dir: &internal.Unit{
				UnitMeta: *sample.UnitMeta(
					"github.com/u/m/p",
					"github.com/u/m",
					"v1.2.3",
					"",
					false,
				),
			},
			versionedLinks: true,
			want: &OverviewDetails{
				ModulePath:       "github.com/u/m",
				ModuleURL:        "/mod/github.com/u/m@v1.2.3",
				RepositoryURL:    "https://github.com/u/m",
				PackageSourceURL: "https://github.com/u/m/tree/v1.2.3/p",
				ReadMe:           safehtml.HTML{},
				ReadMeSource:     "",
				Redistributable:  false,
			},
		},
	} {
		t.Run(test.name, func(t *testing.T) {
			defer postgres.ResetTestDB(testDB, t)
			m := sample.LegacyModule(
				test.dir.ModulePath,
				test.dir.Version,
				internal.Suffix(test.dir.Path, test.dir.ModulePath))
			m.Units[1].IsRedistributable = test.dir.IsRedistributable
			m.SourceInfo = source.NewGitHubInfo("https://"+test.dir.ModulePath, "", test.dir.Version)

			ctx := context.Background()
			if err := testDB.InsertModule(ctx, m); err != nil {
				t.Fatal(err)
			}
			um := &internal.UnitMeta{
				Path:              test.dir.Path,
				ModulePath:        test.dir.ModulePath,
				Version:           test.dir.Version,
				IsRedistributable: test.dir.IsRedistributable,
				Name:              test.dir.Name,
				CommitTime:        test.dir.CommitTime,
				SourceInfo:        m.SourceInfo,
			}
			got, err := fetchPackageOverviewDetails(ctx, testDB, um, test.versionedLinks)
			if err != nil {
				t.Fatal(err)
			}
			if diff := cmp.Diff(test.want, got, cmp.AllowUnexported(safehtml.HTML{})); diff != "" {
				t.Errorf("mismatch (-want +got):\n%s", diff)
			}
		})
	}
}

func TestGoldmarkReadmeHTML(t *testing.T) {
	ctx := experiment.NewContext(context.Background(), internal.ExperimentGoldmark)
	mod := &internal.ModuleInfo{
		Version:    sample.VersionString,
		SourceInfo: source.NewGitHubInfo(sample.ModulePath, "", "v1.2.3"),
	}
	for _, tc := range []struct {
		name   string
		mi     *internal.ModuleInfo
		readme *internal.Readme
		want   string
	}{
		{
			name: "Top level heading is h3 from ####, and following header levels become hN-1",
			mi:   mod,
			readme: &internal.Readme{
				Filepath: sample.ReadmeFilePath,
				Contents: "#### Heading Rank 4\n\n##### Heading Rank 5",
			},
			want: "<h3 class=\"h4\" id=\"heading-rank-4\">Heading Rank 4</h3>\n<h4 class=\"h5\" id=\"heading-rank-5\">Heading Rank 5</h4>",
		},
		{
			name: "Github markdown emoji markup is properly rendered",
			mi:   mod,
			readme: &internal.Readme{
				Filepath: sample.ReadmeFilePath,
				Contents: "# :zap: Zap \n\n :joy:",
			},
			want: "<h3 class=\"h1\" id=\"zap-zap\">⚡ Zap</h3>\n<p>😂</p>",
		},
	} {
		t.Run(tc.name, func(t *testing.T) {
			hgot, err := ReadmeHTML(ctx, tc.mi, tc.readme)
			if err != nil {
				t.Fatal(err)
			}
			got := strings.TrimSpace(hgot.String())
			if diff := cmp.Diff(tc.want, got); diff != "" {
				t.Errorf("readmeHTML(%v) mismatch (-want +got):\n%s", tc.mi, diff)
			}
		})
	}
}

func TestBlackfridayReadmeHTML(t *testing.T) {
	ctx := context.Background()
	aModule := &internal.ModuleInfo{
		Version:    "v1.2.3",
		SourceInfo: source.NewGitHubInfo("https://github.com/some/repo", "", "v1.2.3"),
	}
	tests := []struct {
		name         string
		mi           *internal.ModuleInfo
		readme       *internal.Readme
		want         string
		wantUnitPage string
	}{
		{
			name: "valid markdown readme",
			mi:   &internal.ModuleInfo{},
			readme: &internal.Readme{
				Filepath: "README.md",
				Contents: "This package collects pithy sayings.\n\n" +
					"It's part of a demonstration of\n" +
					"[package versioning in Go](https://research.swtch.com/vgo1).",
			},
			want: "<p>This package collects pithy sayings.</p>\n\n" +
				"<p>It’s part of a demonstration of\n" +
				`<a href="https://research.swtch.com/vgo1" rel="nofollow">package versioning in Go</a>.</p>`,
		},
		{
			name: "valid markdown readme with alternative case and extension",
			mi:   &internal.ModuleInfo{},
			readme: &internal.Readme{
				Filepath: "README.MARKDOWN",
				Contents: "This package collects pithy sayings.\n\n" +
					"It's part of a demonstration of\n" +
					"[package versioning in Go](https://research.swtch.com/vgo1).",
			},
			want: "<p>This package collects pithy sayings.</p>\n\n" +
				"<p>It’s part of a demonstration of\n" +
				`<a href="https://research.swtch.com/vgo1" rel="nofollow">package versioning in Go</a>.</p>`,
		},
		{
			name: "valid markdown readme with CRLF",
			mi:   &internal.ModuleInfo{},
			readme: &internal.Readme{
				Filepath: "README.md",
				Contents: "This package collects pithy sayings.\r\n\r\n" +
					"- It's part of a demonstration of\r\n" +
					"- [package versioning in Go](https://research.swtch.com/vgo1).",
			},
			want: "<p>This package collects pithy sayings.</p>\n\n" +
				"<ul>\n" +
				"<li>It’s part of a demonstration of</li>\n" +
				`<li><a href="https://research.swtch.com/vgo1" rel="nofollow">package versioning in Go</a>.</li>` + "\n" +
				"</ul>",
		},
		{
			name: "not markdown readme",
			mi:   &internal.ModuleInfo{},
			readme: &internal.Readme{
				Filepath: "README.rst",
				Contents: "This package collects pithy sayings.\n\n" +
					"It's part of a demonstration of\n" +
					"[package versioning in Go](https://research.swtch.com/vgo1).",
			},
			want: "<pre class=\"readme\">This package collects pithy sayings.\n\nIt&#39;s part of a demonstration of\n[package versioning in Go](https://research.swtch.com/vgo1).</pre>",
		},
		{
			name: "empty readme",
			mi:   &internal.ModuleInfo{},
			want: "",
		},
		{
			name: "sanitized readme",
			mi:   &internal.ModuleInfo{},
			readme: &internal.Readme{
				Filepath: "README",
				Contents: `<a onblur="alert(secret)" href="http://www.google.com">Google</a>`,
			},
			want: `<pre class="readme">&lt;a onblur=&#34;alert(secret)&#34; href=&#34;http://www.google.com&#34;&gt;Google&lt;/a&gt;</pre>`,
		},
		{
			name: "relative image markdown is made absolute for GitHub",
			mi: &internal.ModuleInfo{
				SourceInfo: source.NewGitHubInfo("http://github.com/golang/go", "", "master"),
			},
			readme: &internal.Readme{
				Filepath: "README.md",
				Contents: "![Go logo](doc/logo.png)",
			},
			want: `<p><img src="http://github.com/golang/go/raw/master/doc/logo.png" alt="Go logo"/></p>`,
		},
		{
			name: "relative image markdown is left alone for unknown origins",
			mi:   &internal.ModuleInfo{},
			readme: &internal.Readme{
				Filepath: "README.md",
				Contents: "![Go logo](doc/logo.png)",
			},
			want: `<p><img src="doc/logo.png" alt="Go logo"/></p>`,
		},
		{
			name: "module versions are referenced in relative images",
			mi:   aModule,
			readme: &internal.Readme{
				Filepath: "README.md",
				Contents: "![Hugo logo](doc/logo.png)",
			},
			want: `<p><img src="https://github.com/some/repo/raw/v1.2.3/doc/logo.png" alt="Hugo logo"/></p>`,
		},
		{
			name: "image URLs relative to README directory",
			mi:   aModule,
			readme: &internal.Readme{
				Filepath: "dir/sub/README.md",
				Contents: "![alt](img/thing.png)",
			},
			want: `<p><img src="https://github.com/some/repo/raw/v1.2.3/dir/sub/img/thing.png" alt="alt"/></p>`,
		},
		{
			name: "non-image links relative to README directory",
			mi:   aModule,
			readme: &internal.Readme{
				Filepath: "dir/sub/README.md",
				Contents: "[something](doc/thing.md)",
			},
			want: `<p><a href="https://github.com/some/repo/blob/v1.2.3/dir/sub/doc/thing.md" rel="nofollow">something</a></p>`,
		},
		{
			name: "image link in embedded HTML",
			mi:   aModule,
			readme: &internal.Readme{
				Filepath: "README.md",
				Contents: "<img src=\"resources/logoSmall.png\" />\n\n# Heading\n",
			},
			want:         `<p><img src="https://github.com/some/repo/raw/v1.2.3/resources/logoSmall.png"/></p>` + "\n\n" + `<h1 id="heading">Heading</h1>`,
			wantUnitPage: `<p><img src="https://github.com/some/repo/raw/v1.2.3/resources/logoSmall.png"/></p>` + "\n\n" + `<h1 id="readme-heading">Heading</h1>`,
		},
		{
			name: "image link in embedded HTML with surrounding p tag",
			mi:   aModule,
			readme: &internal.Readme{
				Filepath: "README.md",
				Contents: "<p align=\"center\"><img src=\"foo.png\" /></p>\n\n# Heading",
			},
			want:         `<p align="center"><img src="https://github.com/some/repo/raw/v1.2.3/foo.png"/></p>` + "\n\n" + `<h1 id="heading">Heading</h1>`,
			wantUnitPage: `<p align="center"><img src="https://github.com/some/repo/raw/v1.2.3/foo.png"/></p>` + "\n\n" + `<h1 id="readme-heading">Heading</h1>`,
		},
		{
			name: "image link in embedded HTML with surrounding div",
			mi:   aModule,
			readme: &internal.Readme{
				Filepath: "README.md",
				Contents: "<div align=\"center\"><img src=\"foo.png\" /></div>\n\n# Heading",
			},
			want:         `<div align="center"><img src="https://github.com/some/repo/raw/v1.2.3/foo.png"/></div>` + "\n\n" + `<h1 id="heading">Heading</h1>`,
			wantUnitPage: `<div align="center"><img src="https://github.com/some/repo/raw/v1.2.3/foo.png"/></div>` + "\n\n" + `<h1 id="readme-heading">Heading</h1>`,
		},
		{
			name: "image link with bad URL",
			mi: &internal.ModuleInfo{
				Version:    "v1.2.3",
				SourceInfo: source.NewGitHubInfo("https://github.com/some/<script>", "", "v1.2.3"),
			},
			readme: &internal.Readme{
				Filepath: "README.md",
				Contents: "<div align=\"center\"><img src=\"foo.png\" /></div>\n\n# Heading",
			},
			want:         `<div align="center"><img src="https://github.com/some/%3Cscript%3E/raw/v1.2.3/foo.png"/></div>` + "\n\n" + `<h1 id="heading">Heading</h1>`,
			wantUnitPage: `<div align="center"><img src="https://github.com/some/%3Cscript%3E/raw/v1.2.3/foo.png"/></div>` + "\n\n" + `<h1 id="readme-heading">Heading</h1>`,
		},
		{
			name: "body has more than one child",
			mi:   aModule,
			readme: &internal.Readme{
				Filepath: "dir/sub/README.md",
				// The final newline here is important for creating the right markdown tree; do not remove it.
				Contents: `<p><img src="./foo.png"></p><p><img src="../bar.png"</p>` + "\n",
			},
			want: `<p><img src="https://github.com/some/repo/raw/v1.2.3/dir/sub/foo.png"/></p><p><img src="https://github.com/some/repo/raw/v1.2.3/dir/bar.png"/></p>`,
		},
		{
			name: "escaped image source",
			mi:   aModule,
			readme: &internal.Readme{
				Filepath: "README.md",
				Contents: `<img src="./images/Jupyter%20Notebook_sparkline.svg">`,
			},
			want: `<p><img src="https://github.com/some/repo/raw/v1.2.3/images/Jupyter%20Notebook_sparkline.svg"/></p>`,
		},
	}
	checkReadme := func(ctx context.Context, t *testing.T, mi *internal.ModuleInfo, readme *internal.Readme, want string) {
		hgot, err := ReadmeHTML(ctx, mi, readme)
		if err != nil {
			t.Fatal(err)
		}
		got := strings.TrimSpace(hgot.String())
		if diff := cmp.Diff(want, got); diff != "" {
			t.Errorf("readmeHTML(%v) mismatch (-want +got):\n%s", mi, diff)
		}
	}
	for _, test := range tests {
		t.Run("no experiments "+test.name, func(t *testing.T) {
			checkReadme(ctx, t, test.mi, test.readme, test.want)
		})
		t.Run("unit page "+test.name, func(t *testing.T) {
			ctx := experiment.NewContext(ctx, internal.ExperimentUnitPage)
			if test.wantUnitPage == "" {
				test.wantUnitPage = test.want
			}
			checkReadme(ctx, t, test.mi, test.readme, test.wantUnitPage)
		})
	}
}

func TestTrimmedEscapedPath(t *testing.T) {
	for _, test := range []struct {
		in, want string
	}{
		{"a.png", "a.png"},
		{" a.png   ", "a.png"},
		{"a b.png", "a%20b.png"},
		{" a b.png ", "a%20b.png"},
		{".a/b.gif", ".a/b.gif"},
	} {
		u, err := url.Parse(test.in)
		if err != nil {
			t.Fatal(err)
		}
		got := trimmedEscapedPath(u)
		if got != test.want {
			t.Errorf("escapePath(%q) = %q, want %q", test.in, got, test.want)
		}
	}
}

func TestPackageSubdir(t *testing.T) {
	for _, test := range []struct {
		pkgPath, modulePath string
		want                string
	}{
		// package at module root
		{"github.com/pkg/errors", "github.com/pkg/errors", ""},
		// package inside module
		{"github.com/google/go-cmp/cmp", "github.com/google/go-cmp", "cmp"},
		// stdlib package
		{"context", stdlib.ModulePath, "context"},
	} {
		got := internal.Suffix(test.pkgPath, test.modulePath)
		if got != test.want {
			t.Errorf("internal.Suffix(%q, %q) = %q, want %q", test.pkgPath, test.modulePath, got, test.want)
		}
	}
}
