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

import (
	"context"
	"flag"
	"testing"

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

var (
	integration = flag.Bool("integration", false, "test with respect to current contents of vulndb")

	testRepoDir = "testdata/repo.txtar"
)

func TestNew(t *testing.T) {
	ctx := context.Background()
	testRepo, err := gitrepo.ReadTxtarRepo(testRepoDir, jan2002)
	if err != nil {
		t.Fatal(err)
	}
	got, err := New(ctx, testRepo)
	if err != nil {
		t.Fatal(err)
	}
	want := valid
	if diff := cmp.Diff(want, got); diff != "" {
		t.Errorf("unexpected diff (want-, got+):\n%s", diff)
	}
}

func TestAll(t *testing.T) {
	ctx := context.Background()
	testRepo, err := gitrepo.ReadTxtarRepo(testRepoDir, jan2002)
	if err != nil {
		t.Fatal(err)
	}
	new, err := New(ctx, testRepo)
	if err != nil {
		t.Fatal(err)
	}

	writeDir := t.TempDir()
	if err = new.Write(writeDir, true); err != nil {
		t.Fatal(err)
	}
	if err = cmpDirHashes(validDir, writeDir); err != nil {
		t.Error(err)
	}

	loaded, err := Load(writeDir)
	if err != nil {
		t.Error(err)
	}
	if diff := cmp.Diff(loaded, new); diff != "" {
		t.Errorf("unexpected diff (loaded-, new+):\n%s", diff)
	}

	if err = Validate(writeDir); err != nil {
		t.Error(err)
	}
}

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

	ctx := context.Background()

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

	writeDir := t.TempDir()
	if err = new.Write(writeDir, true); err != nil {
		t.Fatal(err)
	}

	loaded, err := Load(writeDir)
	if err != nil {
		t.Error(err)
	}

	if diff := cmp.Diff(loaded, new); diff != "" {
		t.Errorf("unexpected diff (loaded-, new+):\n%s", diff)
	}

	if err = Validate(writeDir); err != nil {
		t.Error(err)
	}
}
