// 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 integration

import (
	"context"
	"encoding/json"
	"fmt"
	"testing"

	"golang.org/x/pkgsite/internal"
	"golang.org/x/pkgsite/internal/experiment"
	"golang.org/x/pkgsite/internal/frontend"
	"golang.org/x/pkgsite/internal/postgres"
	"golang.org/x/pkgsite/internal/symbol"
)

func TestSymbols(t *testing.T) {
	defer postgres.ResetTestDB(testDB, t)
	for _, exp := range []struct {
		name string
		exps []string
	}{
		{
			"no experiment",
			[]string{
				internal.ExperimentSymbolHistoryVersionsPage,
			},
		},
		{
			"experiment insert and read symbol_history",
			[]string{
				internal.ExperimentReadSymbolHistory,
				internal.ExperimentSymbolHistoryVersionsPage,
			},
		},
	} {
		t.Run(exp.name, func(t *testing.T) {
			exps := append(exp.exps, internal.ExperimentInsertSymbolSearchDocuments)
			processVersions(
				experiment.NewContext(context.Background(), exps...),
				t, testModules)

			for _, test := range []struct {
				name, pkgPath, modulePath string
			}{
				{
					"test v1 module (rsc.io quote)",
					"rsc.io/quote",
					"rsc.io/quote",
				},
				{
					"test v3 module (rsc.io quote v3)",
					"rsc.io/quote/v3",
					"rsc.io/quote/v3",
				},
			} {
				t.Run(test.name, func(t *testing.T) {
					// Get api data.
					files, err := symbol.LoadAPIFiles(test.pkgPath, "../../symbol/testdata")
					if err != nil {
						t.Fatal(err)
					}
					apiVersions, err := symbol.ParsePackageAPIInfo(files)
					if err != nil {
						t.Fatal(err)
					}

					// Get frontend data.
					urlPath := fmt.Sprintf("/%s?tab=versions&m=json", test.pkgPath)
					body := getFrontendPage(t, urlPath, exps...)
					var vd frontend.VersionsDetails
					if err := json.Unmarshal([]byte(body), &vd); err != nil {
						t.Fatalf("json.Unmarshal: %v\n %s", err, body)
					}
					sh, err := frontend.ParseVersionsDetails(vd)
					if err != nil {
						t.Fatal(err)
					}

					// Compare the output of these two data sources.
					errs, err := symbol.CompareAPIVersions(test.pkgPath,
						apiVersions[test.pkgPath], sh)
					if err != nil {
						t.Fatal(err)
					}
					for _, e := range errs {
						t.Error(e)
					}
				})
			}
		})
	}
}
