package store

import (
	"io/ioutil"
	"os"
	"testing"

	"gotest.tools/v3/assert"
)

func TestTlsCreateUpdateGetRemove(t *testing.T) {
	testDir, err := ioutil.TempDir("", "TestTlsCreateUpdateGetRemove")
	assert.NilError(t, err)
	defer os.RemoveAll(testDir)
	testee := tlsStore{root: testDir}
	_, err = testee.getData("test-ctx", "test-ep", "test-data")
	assert.Equal(t, true, IsErrTLSDataDoesNotExist(err))

	err = testee.createOrUpdate("test-ctx", "test-ep", "test-data", []byte("data"))
	assert.NilError(t, err)
	data, err := testee.getData("test-ctx", "test-ep", "test-data")
	assert.NilError(t, err)
	assert.Equal(t, string(data), "data")
	err = testee.createOrUpdate("test-ctx", "test-ep", "test-data", []byte("data2"))
	assert.NilError(t, err)
	data, err = testee.getData("test-ctx", "test-ep", "test-data")
	assert.NilError(t, err)
	assert.Equal(t, string(data), "data2")

	err = testee.remove("test-ctx", "test-ep", "test-data")
	assert.NilError(t, err)
	err = testee.remove("test-ctx", "test-ep", "test-data")
	assert.NilError(t, err)

	_, err = testee.getData("test-ctx", "test-ep", "test-data")
	assert.Equal(t, true, IsErrTLSDataDoesNotExist(err))
}

func TestTlsListAndBatchRemove(t *testing.T) {
	testDir, err := ioutil.TempDir("", "TestTlsListAndBatchRemove")
	assert.NilError(t, err)
	defer os.RemoveAll(testDir)
	testee := tlsStore{root: testDir}

	all := map[string]EndpointFiles{
		"ep1": {"f1", "f2", "f3"},
		"ep2": {"f1", "f2", "f3"},
		"ep3": {"f1", "f2", "f3"},
	}

	ep1ep2 := map[string]EndpointFiles{
		"ep1": {"f1", "f2", "f3"},
		"ep2": {"f1", "f2", "f3"},
	}

	for name, files := range all {
		for _, file := range files {
			err = testee.createOrUpdate("test-ctx", name, file, []byte("data"))
			assert.NilError(t, err)
		}
	}

	resAll, err := testee.listContextData("test-ctx")
	assert.NilError(t, err)
	assert.DeepEqual(t, resAll, all)

	err = testee.removeAllEndpointData("test-ctx", "ep3")
	assert.NilError(t, err)
	resEp1ep2, err := testee.listContextData("test-ctx")
	assert.NilError(t, err)
	assert.DeepEqual(t, resEp1ep2, ep1ep2)

	err = testee.removeAllContextData("test-ctx")
	assert.NilError(t, err)
	resEmpty, err := testee.listContextData("test-ctx")
	assert.NilError(t, err)
	assert.DeepEqual(t, resEmpty, map[string]EndpointFiles{})
}
