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

import (
	"testing"
	"time"

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

var (
	r1 = Report{
		Modules: []*Module{
			{Module: "std"},
		},
		CVEMetadata: &CVEMeta{
			ID: "CVE-9999-0001",
		},
	}
	r2 = Report{
		Modules: []*Module{
			{Module: "example.com/fake/module"},
		},
		CVEMetadata: &CVEMeta{
			ID: "CVE-9999-0002",
		},
	}
	r4 = Report{
		Modules: []*Module{
			{Module: "example.com/another/module"},
		},

		GHSAs: []string{
			"GHSA-9999-abcd-efgh",
		},
	}
	r5 = Report{
		Modules: []*Module{
			{Module: "example.com/adiff/module"},
		},
		CVEs: []string{"CVE-9999-0005"},
	}
)

func TestAll(t *testing.T) {

	wantByIssue := map[int]*Report{1: &r1, 2: &r2, 4: &r4, 5: &r5}
	wantByFile := map[string]*Report{
		"data/reports/GO-9999-0001.yaml":  &r1,
		"data/excluded/GO-9999-0002.yaml": &r2,
		"data/reports/GO-9999-0004.yaml":  &r4,
		"data/reports/GO-9999-0005.yaml":  &r5,
	}

	repo, err := gitrepo.ReadTxtarRepo("testdata/repo.txtar", time.Now())
	if err != nil {
		t.Fatal(err)
	}

	gotByIssue, gotByFile, err := All(repo)
	if err != nil {
		t.Fatalf("All() error = %v, ", err)
	}
	if diff := cmp.Diff(gotByIssue, wantByIssue); diff != "" {
		t.Errorf("All(): byIssue mismatch (-got, +want): %s", diff)
	}

	if diff := cmp.Diff(gotByFile, wantByFile); diff != "" {
		t.Errorf("All() byFile mismatch (-got, +want): %s", diff)
	}
}

func TestXRef(t *testing.T) {
	existingByFile := map[string]*Report{
		"data/reports/GO-9999-0001.yaml":  &r1,
		"data/excluded/GO-9999-0002.yaml": &r2,
		"data/reports/GO-9999-0004.yaml":  &r4,
		"data/reports/GO-9999-0005.yaml":  &r5,
	}

	type args struct {
		r              *Report
		existingByFile map[string]*Report
	}
	tests := []struct {
		name        string
		args        args
		wantMatches map[string][]string
	}{
		{
			name: "No matches",
			args: args{
				r: &Report{
					Modules: []*Module{
						{Module: "example.com/unused/module"},
					},
					CVEMetadata: &CVEMeta{
						ID: "CVE-9999-0003",
					},
				},
				existingByFile: existingByFile,
			},
			wantMatches: map[string][]string{},
		},
		{
			name: "Ignores std lib modules",
			args: args{
				r: &Report{
					Modules: []*Module{
						{Module: "std"},
					},
					CVEs: []string{"CVE-9999-0003"},
				},
				existingByFile: existingByFile,
			},
			wantMatches: map[string][]string{},
		},
		{
			name: "Match on CVE (ignores std module)",
			args: args{
				r: &Report{
					Modules: []*Module{
						{Module: "std"},
					},
					CVEs: []string{"CVE-9999-0001"},
				},
				existingByFile: existingByFile,
			},
			wantMatches: map[string][]string{
				"data/reports/GO-9999-0001.yaml": {"CVE-9999-0001"},
			},
		},
		{
			name: "Match on GHSA & module",
			args: args{
				r:              &r4,
				existingByFile: existingByFile,
			},
			wantMatches: map[string][]string{
				"data/reports/GO-9999-0004.yaml": {
					"GHSA-9999-abcd-efgh",
					"Module example.com/another/module",
				},
			},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			gotMatches := XRef(tt.args.r, tt.args.existingByFile)
			if diff := cmp.Diff(gotMatches, tt.wantMatches); diff != "" {
				t.Errorf("XRef(): matches mismatch (-got, +want): %s", diff)
			}
		})
	}
}

func TestAliases(t *testing.T) {
	repo, err := gitrepo.ReadTxtarRepo("testdata/repo.txtar", time.Now())
	if err != nil {
		t.Fatal(err)
	}

	got, err := Aliases(repo)
	if err != nil {
		t.Fatal(err)
	}

	want := []string{"CVE-9999-0001",
		"CVE-9999-0002",
		"CVE-9999-0005",
		"GHSA-9999-abcd-efgh"}

	if diff := cmp.Diff(want, got); diff != "" {
		t.Errorf("Aliases() mismatch (-want, +got): %s", diff)
	}
}
