// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1

package token_file

import (
	"os"
	"path/filepath"
	"testing"

	log "github.com/hashicorp/go-hclog"
	"github.com/hashicorp/vault/command/agentproxyshared/auth"
	"github.com/hashicorp/vault/sdk/helper/logging"
)

func TestNewTokenFileAuthMethodEmptyConfig(t *testing.T) {
	logger := logging.NewVaultLogger(log.Trace)
	_, err := NewTokenFileAuthMethod(&auth.AuthConfig{
		Logger: logger.Named("auth.method"),
		Config: map[string]interface{}{},
	})
	if err == nil {
		t.Fatal("Expected error due to empty config")
	}
}

func TestNewTokenFileEmptyFilePath(t *testing.T) {
	logger := logging.NewVaultLogger(log.Trace)
	_, err := NewTokenFileAuthMethod(&auth.AuthConfig{
		Logger: logger.Named("auth.method"),
		Config: map[string]interface{}{
			"token_file_path": "",
		},
	})
	if err == nil {
		t.Fatalf("Expected error when giving empty file path")
	}
}

func TestNewTokenFileAuthenticate(t *testing.T) {
	tokenFile, err := os.Create(filepath.Join(t.TempDir(), "token_file"))
	tokenFileContents := "super-secret-token"
	if err != nil {
		t.Fatal(err)
	}
	tokenFileName := tokenFile.Name()
	tokenFile.Close() // WriteFile doesn't need it open
	os.WriteFile(tokenFileName, []byte(tokenFileContents), 0o666)
	defer os.Remove(tokenFileName)

	logger := logging.NewVaultLogger(log.Trace)
	am, err := NewTokenFileAuthMethod(&auth.AuthConfig{
		Logger: logger.Named("auth.method"),
		Config: map[string]interface{}{
			"token_file_path": tokenFileName,
		},
	})
	if err != nil {
		t.Fatal(err)
	}

	path, headers, data, err := am.Authenticate(nil, nil)
	if err != nil {
		t.Fatal(err)
	}
	if path != "auth/token/lookup-self" {
		t.Fatalf("Incorrect path, was %s", path)
	}
	if headers != nil {
		t.Fatalf("Expected no headers, instead got %v", headers)
	}
	if data == nil {
		t.Fatal("Data was nil")
	}
	tokenDataFromAuthMethod := data["token"].(string)
	if tokenDataFromAuthMethod != tokenFileContents {
		t.Fatalf("Incorrect token file contents return by auth method, expected %s, got %s", tokenFileContents, tokenDataFromAuthMethod)
	}

	_, err = os.Stat(tokenFileName)
	if err != nil {
		t.Fatal("Token file removed")
	}
}
