// Copyright 2023 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 scan

import (
	"net/http"
	"net/url"
	"testing"

	"github.com/google/go-cmp/cmp"
	"golang.org/x/pkgsite-metrics/internal/version"
)

func TestParseScanRequest(t *testing.T) {
	for _, test := range []struct {
		name string
		url  string
		want Request
	}{
		{
			name: "ValidScanURL",
			url:  "https://worker.com/scan/module/@v/v1.0.0?importedby=50",
			want: Request{
				Module:     "module",
				Version:    "v1.0.0",
				ImportedBy: 50,
				Mode:       "",
			},
		},
		{
			name: "ValidImportsOnlyScanURL",
			url:  "https://worker.com/scan/module/@v/v1.0.0-abcdefgh?importedby=100&mode=mode1",
			want: Request{
				Module:     "module",
				Version:    "v1.0.0-abcdefgh",
				ImportedBy: 100,
				Mode:       "mode1",
			},
		},
		{
			name: "Module@Version",
			url:  "https://worker.com/scan/module@v1.2.3?importedby=1",
			want: Request{
				Module:     "module",
				Version:    "v1.2.3",
				ImportedBy: 1,
				Mode:       "",
			},
		},
		{
			name: "Module@Version suffix",
			url:  "https://worker.com/scan/module@v1.2.3/path/to/dir?importedby=1",
			want: Request{
				Module:     "module",
				Version:    "v1.2.3",
				Suffix:     "path/to/dir",
				ImportedBy: 1,
				Mode:       "",
			},
		},
	} {
		t.Run(test.name, func(t *testing.T) {
			u, err := url.Parse(test.url)
			if err != nil {
				t.Errorf("url.Parse(%q): %v", test.url, err)
			}
			r := &http.Request{URL: u}
			got, err := ParseRequest(r, "/scan")
			if err != nil {
				t.Fatal(err)
			}
			if g, w := *got, test.want; g != w {
				t.Errorf("\ngot  %+v\nwant %+v", g, w)
			}
		})
	}
}

func TestParseScanRequestError(t *testing.T) {
	for _, test := range []struct {
		name string
		url  string
		want string
	}{
		{
			name: "InvalidScanURL",
			url:  "/",
			want: `invalid path "/": missing '@'`,
		},
		{
			name: "InvalidScanURLNoModule",
			url:  "/@v/version",
			want: `invalid path "/@v/version": missing module`,
		},
		{
			name: "InvalidScanURLNoVersion",
			url:  "/module/@v/",
			want: `invalid path "/module/@v/": missing version`,
		},
		{
			name: "NoVersion",
			url:  "/module@",
			want: `invalid path "/module@": missing version`,
		},
		{
			name: "NoVersionSuffix",
			url:  "/module@/suffix",
			want: `invalid path "/module@/suffix": missing version`,
		},
		{
			name: "MissingImportedBy",
			url:  "/module/@v/v1.0.0",
			want: `missing query param "importedby"`,
		},
		{
			name: "BadImportedBy",
			url:  "/module@v1?importedby=1a",
			want: `want integer for "importedby" query param, got "1a"`,
		},
	} {
		t.Run(test.name, func(t *testing.T) {
			u, err := url.Parse(test.url)
			if err != nil {
				t.Errorf("url.Parse(%q): %v", test.url, err)
			}
			r := &http.Request{URL: u}
			if _, err := ParseRequest(r, "/scan"); err != nil {
				if got := err.Error(); got != test.want {
					t.Fatalf("\ngot  %s\nwant %s", got, test.want)
				}
			} else {
				t.Fatalf("error = nil; want = (%v)", test.want)
			}
		})
	}
}

func TestParseCorpusFile(t *testing.T) {
	const file = "testdata/modules.txt"
	got, err := ParseCorpusFile(file, 1)
	if err != nil {
		t.Fatal(err)
	}
	want := []ModuleSpec{
		{"m1", "v1.0.0", 18},
		{"m2", "v2.3.4", 5},
		{"m3", version.Latest, 1},
	}

	if !cmp.Equal(got, want) {
		t.Errorf("\n got %v\nwant %v", got, want)
	}

	got, err = ParseCorpusFile(file, 10)
	if err != nil {
		t.Fatal(err)
	}
	want = want[:1]
	if !cmp.Equal(got, want) {
		t.Errorf("\n got %v\nwant %v", got, want)
	}
}
