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

package clicontext

import (
	"testing"

	"github.com/stretchr/testify/require"
)

func TestStorage_workflow(t *testing.T) {
	require := require.New(t)

	st := TestStorage(t)

	// Initially empty
	{
		list, err := st.List()
		require.NoError(err)
		require.Empty(list)

		def, err := st.Default()
		require.NoError(err)
		require.Empty(def)
	}

	// Add a context
	cfg := &Config{}
	require.NoError(st.Set("hello", cfg))

	// Should not be empty anymore
	{
		list, err := st.List()
		require.NoError(err)
		require.Len(list, 1)
		require.Equal("hello", list[0])
	}

	{
		// Should be the default since we didn't have one before.
		def, err := st.Default()
		require.NoError(err)
		require.Equal("hello", def)
	}

	// Should be able to load
	{
		actual, err := st.Load("hello")
		require.NoError(err)
		require.Equal(cfg, actual)
	}

	// Should be able to rename
	{
		err := st.Rename("hello", "goodbye")
		require.NoError(err)

		// Should be the default since we didn't have one before.
		def, err := st.Default()
		require.NoError(err)
		require.Equal("goodbye", def)

		// Should only have this one
		list, err := st.List()
		require.NoError(err)
		require.Len(list, 1)
		require.Equal("goodbye", list[0])
	}

	// Should be able to delete
	require.NoError(st.Delete("goodbye"))

	// Should be empty again
	{
		list, err := st.List()
		require.NoError(err)
		require.Empty(list)

		def, err := st.Default()
		require.NoError(err)
		require.Empty(def)
	}
}

func TestStorage_workflowNoSymlink(t *testing.T) {
	require := require.New(t)

	st := TestStorage(t)
	st.noSymlink = true

	// Initially empty
	{
		list, err := st.List()
		require.NoError(err)
		require.Empty(list)

		def, err := st.Default()
		require.NoError(err)
		require.Empty(def)
	}

	// Add a context
	cfg := &Config{}
	require.NoError(st.Set("hello", cfg))

	// Should not be empty anymore
	{
		list, err := st.List()
		require.NoError(err)
		require.Len(list, 1)
		require.Equal("hello", list[0])
	}

	{
		// Should be the default since we didn't have one before.
		def, err := st.Default()
		require.NoError(err)
		require.Equal("hello", def)
	}

	// Should be able to load
	{
		actual, err := st.Load("hello")
		require.NoError(err)
		require.Equal(cfg, actual)
	}

	// Should be able to rename
	{
		err := st.Rename("hello", "goodbye")
		require.NoError(err)

		// Should be the default since we didn't have one before.
		def, err := st.Default()
		require.NoError(err)
		require.Equal("goodbye", def)

		// Should only have this one
		list, err := st.List()
		require.NoError(err)
		require.Len(list, 1)
		require.Equal("goodbye", list[0])
	}

	// Should be able to delete
	require.NoError(st.Delete("goodbye"))

	// Should be empty again
	{
		list, err := st.List()
		require.NoError(err)
		require.Empty(list)

		def, err := st.Default()
		require.NoError(err)
		require.Empty(def)
	}
}

func TestStorage_deleteNonExist(t *testing.T) {
	require := require.New(t)

	st := TestStorage(t)
	require.NoError(st.Delete("nope"))
}
