// Copyright 2021 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 postgres

import (
	"context"
	"strconv"
	"strings"
	"testing"

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

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

	checkLatest := func(t *testing.T, versions []string, v1path string, version, suffix string) {
		t.Helper()
		gotPath, gotVer, err := testDB.GetLatestMajorPathForV1Path(ctx, v1path)
		if err != nil {
			t.Fatal(err)
		}
		want := sample.ModulePath
		if suffix != "" {
			want = want + "/" + suffix
		}
		var wantVer int
		if version == "" {
			wantVer = 1
		} else {
			wantVer, err = strconv.Atoi(strings.TrimPrefix(version, "v"))
			if err != nil {
				t.Fatal(err)
			}
		}
		if gotPath != want || gotVer != wantVer {
			t.Errorf("GetLatestMajorPathForV1Path(%q) = %q, %d, want %q, %d", v1path, gotPath, gotVer, want, wantVer)
		}
	}

	for _, test := range []struct {
		name, want string
		versions   []string
	}{
		{
			"want highest major version",
			"v11",
			[]string{"", "v2", "v11"},
		},
		{
			"only v1 version",
			"",
			[]string{""},
		},
		{
			"no v1 version",
			"v4",
			[]string{"v4"},
		},
	} {
		t.Run(test.name, func(t *testing.T) {
			ResetTestDB(testDB, t)
			suffix := "a/b/c"

			for _, v := range test.versions {
				modpath := sample.ModulePath
				if v != "" {
					modpath = modpath + "/" + v
				}
				if v == "" {
					v = sample.VersionString
				} else {
					v = v + ".0.0"
				}
				m := sample.Module(modpath, v, suffix)
				if err := testDB.InsertModule(ctx, m); err != nil {
					t.Fatal(err)
				}
			}
			t.Run("module", func(t *testing.T) {
				v1path := sample.ModulePath
				checkLatest(t, test.versions, v1path, test.want, test.want)
			})
			t.Run("package", func(t *testing.T) {
				want := test.want
				if test.want != "" {
					want += "/"
				}
				v1path := sample.ModulePath + "/" + suffix
				checkLatest(t, test.versions, v1path, test.want, want+suffix)
			})
		})
	}
}
