// Copyright 2022 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 legacydb

import (
	"context"
	"os"
	"testing"

	"github.com/google/go-cmp/cmp"
	"golang.org/x/vulndb/internal/gitrepo"
)

func TestGenerate(t *testing.T) {
	ctx := context.Background()
	testRepo, err := gitrepo.ReadTxtarRepo(testRepoDir, jan2002.Time)
	if err != nil {
		t.Fatal(err)
	}
	tmpDir := t.TempDir()
	err = Generate(ctx, testRepo, tmpDir, true)
	if err != nil {
		t.Fatal(err)
	}
	if err = cmpDirHashes(tmpDir, validDir); err != nil {
		t.Error(err)
	}
}

func TestGenerateIntegration(t *testing.T) {
	if !*integration {
		t.Skip("Skipping integration tests, use flag -integration to run")
	}

	moveToVulnDBRoot(t)

	ctx := context.Background()

	repo, err := gitrepo.Open(ctx, ".")
	if err != nil {
		t.Fatal(err)
	}

	genDir := t.TempDir()
	err = Generate(ctx, repo, genDir, false)
	if err != nil {
		t.Fatal(err)
	}

	new, err := New(ctx, repo)
	if err != nil {
		t.Fatal(err)
	}

	t.Run("Generate equivalent to New then Write", func(t *testing.T) {
		writeDir := t.TempDir()
		if err = new.Write(writeDir, false); err != nil {
			t.Fatal(err)
		}
		if err = cmpDirHashes(genDir, writeDir); err != nil {
			t.Error(err)
		}
	})

	t.Run("New equivalent to Generate then Load", func(t *testing.T) {
		loaded, err := Load(genDir)
		if err != nil {
			t.Fatal(err)
		}
		if diff := cmp.Diff(loaded, new); diff != "" {
			t.Errorf("unexpected diff (loaded-, new+):\n%s", diff)
		}
	})
}

func moveToVulnDBRoot(t *testing.T) {
	// Store current working directory and move into vulndb/ folder.
	wd, err := os.Getwd()
	if err != nil {
		t.Fatal(err)
	}
	if err := os.Chdir("../.."); err != nil {
		t.Fatal(err)
	}

	// Restore state from before test.
	t.Cleanup(func() {
		if err = os.Chdir(wd); err != nil {
			t.Log(err)
		}
	})
}
