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

import (
	"context"
	"fmt"
	"net/http"
	"testing"

	"golang.org/x/pkgsite/internal/postgres"
)

func TestFrontendFetchForMasterVersion(t *testing.T) {
	defer postgres.ResetTestDB(testDB, t)

	// Add a module to the database.
	// Check that GET of the module's path returns a 200.
	ctx := context.Background()
	q, teardown := setupQueue(ctx, t, testModules[:1])
	const modulePath = "example.com/basic"
	defer teardown()
	ts := setupFrontend(ctx, t, q, nil)

	for _, req := range []struct {
		method, urlPath string
		status          int
	}{
		// Validate that the modulePath does not exist in the database.
		{http.MethodGet, modulePath, http.StatusNotFound},
		// Insert the latest version of the module using the frontend fetch
		// endpoint.
		{http.MethodPost, fmt.Sprintf("fetch/%s", modulePath), http.StatusOK},
		// Validate that modulePath@master does not exist in the
		// database. GET /modulePath@master should return a 404.
		{http.MethodGet, fmt.Sprintf("%s@master", modulePath), http.StatusNotFound},
		// Insert the master version of the module using the frontend fetch
		// endpoint.
		{http.MethodPost, fmt.Sprintf("fetch/%s@master", modulePath), http.StatusOK},
		// Check that GET /modulePath@master now returns a 200.
		{http.MethodGet, fmt.Sprintf("%s@master", modulePath), http.StatusOK},
		// Check that GET /mod/modulePath@master also returns a 200.
		{http.MethodGet, fmt.Sprintf("mod/%s@master", modulePath), http.StatusOK},
	} {
		testURL := ts.URL + "/" + req.urlPath
		validateResponse(t, req.method, testURL, req.status, nil)
	}
}
