// 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 (
	"strings"
	"testing"

	"golang.org/x/vulndb/internal/osv"
)

var existingDir = "testdata/db/existing"

func TestValidate(t *testing.T) {
	t.Run("valid", func(t *testing.T) {
		// validDir contains a new entry and correct modified and
		// published timestamps with respect to existing.
		if err := Validate(validDir, existingDir); err != nil {
			t.Error(err)
		}
	})

	t.Run("old on new fails", func(t *testing.T) {
		// Attempting to deploy the existing database on top of the new
		// database should fail, as an entry is missing and timestamps are
		// incorrect.
		if err := Validate(existingDir, validDir); err == nil {
			t.Error("expected error, got nil")
		}
	})
}

func newTestDB(entries ...*osv.Entry) *Database {
	d := newEmpty()
	for _, entry := range entries {
		d.addEntry(entry)
	}
	return d
}

func TestValidateInternal(t *testing.T) {
	successTests := []struct {
		name  string
		newDB *Database
		oldDB *Database
	}{
		{
			name: "valid updates ok",
			oldDB: newTestDB(
				&osv.Entry{
					ID:        "GO-1999-0001",
					Published: jan1999,
					Modified:  jan1999,
				}),
			newDB: newTestDB(&osv.Entry{
				ID:        "GO-1999-0001",
				Published: jan1999,
				Modified:  jan2000,
			}, &osv.Entry{
				ID:        "GO-1999-0002",
				Published: jan2000,
				Modified:  jan2000,
			}),
		},
		{
			name:  "same db ok",
			oldDB: valid,
			newDB: valid,
		},
	}
	for _, test := range successTests {
		t.Run(test.name, func(t *testing.T) {
			if err := validate(test.newDB, test.oldDB); err != nil {
				t.Errorf("validate(): unexpected error %v", err)
			}
		})
	}

	failTests := []struct {
		name    string
		newDB   *Database
		oldDB   *Database
		wantErr string
	}{
		{
			name: "published time changed",
			oldDB: newTestDB(
				&osv.Entry{
					ID:        "GO-1999-0001",
					Published: jan1999,
					Modified:  jan1999,
				}),
			newDB: newTestDB(&osv.Entry{
				ID:        "GO-1999-0001",
				Published: jan2000,
				Modified:  jan2000,
			}),
			wantErr: "published time cannot change",
		},
		{
			name: "deleted entry",
			oldDB: newTestDB(
				&osv.Entry{
					ID:        "GO-1999-0001",
					Published: jan1999,
					Modified:  jan1999,
				}),
			newDB:   newTestDB(),
			wantErr: "GO-1999-0001 is not present in new database",
		},
		{
			name: "modified time decreased",
			oldDB: newTestDB(
				&osv.Entry{
					ID:       "GO-1999-0001",
					Modified: jan2000,
				}),
			newDB: newTestDB(&osv.Entry{
				ID:       "GO-1999-0001",
				Modified: jan1999,
			}),
			wantErr: "modified time cannot decrease",
		},
	}
	for _, test := range failTests {
		t.Run(test.name, func(t *testing.T) {
			if err := validate(test.newDB, test.oldDB); err == nil || !strings.Contains(err.Error(), test.wantErr) {
				t.Errorf("validate(): want error containing %q, got %v", test.wantErr, err)
			}
		})
	}
}
