// Copyright (c) The OpenTofu Authors
// SPDX-License-Identifier: MPL-2.0
// Copyright (c) 2023 HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

package getproviders

import (
	"path/filepath"
	"testing"

	"github.com/google/go-cmp/cmp"
	"github.com/opentofu/opentofu/internal/addrs"
)

func TestSearchLocalDirectory(t *testing.T) {
	tests := []struct {
		Fixture string
		Subdir  string
		Want    map[addrs.Provider]PackageMetaList
	}{
		{
			"symlinks",
			"symlink",
			map[addrs.Provider]PackageMetaList{
				addrs.MustParseProviderSourceString("example.com/foo/bar"): {
					{
						Provider:       addrs.MustParseProviderSourceString("example.com/foo/bar"),
						Version:        MustParseVersion("1.0.0"),
						TargetPlatform: Platform{OS: "linux", Arch: "amd64"},
						Filename:       "terraform-provider-bar_1.0.0_linux_amd64.zip",
						Location:       PackageLocalDir(filepath.FromSlash("testdata/search-local-directory/symlinks/real/example.com/foo/bar/1.0.0/linux_amd64")),
					},
				},
				// This search doesn't find example.net/foo/bar because only
				// the top-level search directory is supported as being a
				// symlink, and so we ignore the example.net symlink to
				// example.com that is one level deeper.
			},
		},
	}

	for _, test := range tests {
		t.Run(test.Fixture, func(t *testing.T) {
			fullDir := filepath.Join("testdata/search-local-directory", test.Fixture, test.Subdir)
			got, err := SearchLocalDirectory(fullDir)
			if err != nil {
				t.Errorf("unexpected error: %s", err)
			}
			want := test.Want

			if diff := cmp.Diff(want, got); diff != "" {
				t.Errorf("wrong result\n%s", diff)
			}
		})
	}
}
