package templates
import (
"errors"
"os"
"path/filepath"
"testing"
"time"
"github.com/stretchr/testify/require"
)
func TestCache(t *testing.T) {
templates := NewCache()
testErr := errors.New("test error")
data, _, err := templates.Has("test")
require.Nil(t, err, "invalid value for err")
require.Nil(t, data, "invalid value for data")
item := &Template{}
templates.Store("test", item, nil, testErr)
data, _, err = templates.Has("test")
require.Equal(t, testErr, err, "invalid value for err")
require.Equal(t, item, data, "invalid value for data")
}
func TestCacheFileBased(t *testing.T) {
tempDir, err := os.MkdirTemp("", "cache_test")
require.NoError(t, err)
defer func() {
_ = os.RemoveAll(tempDir)
}()
cache := NewCache()
template := &Template{}
testFile := filepath.Join(tempDir, "test.yaml")
err = os.WriteFile(testFile, []byte("test content"), 0644)
require.NoError(t, err)
cache.Store(testFile, template, []byte("raw content"), nil)
retrieved, raw, err := cache.Has(testFile)
require.NoError(t, err)
require.Equal(t, template, retrieved)
require.Equal(t, []byte("raw content"), raw)
time.Sleep(10 * time.Millisecond)
err = os.WriteFile(testFile, []byte("modified content"), 0644)
require.NoError(t, err)
retrieved, raw, err = cache.Has(testFile)
require.NoError(t, err)
require.Nil(t, retrieved)
require.Nil(t, raw)
}
func TestCacheFileDeletion(t *testing.T) {
tempDir, err := os.MkdirTemp("", "cache_test")
require.NoError(t, err)
defer func() {
_ = os.RemoveAll(tempDir)
}()
cache := NewCache()
template := &Template{}
testFile := filepath.Join(tempDir, "test.yaml")
err = os.WriteFile(testFile, []byte("test content"), 0644)
require.NoError(t, err)
cache.Store(testFile, template, []byte("raw content"), nil)
retrieved, raw, err := cache.Has(testFile)
require.NoError(t, err)
require.Equal(t, template, retrieved)
require.Equal(t, []byte("raw content"), raw)
err = os.Remove(testFile)
require.NoError(t, err)
retrieved, raw, err = cache.Has(testFile)
require.NoError(t, err)
require.Nil(t, retrieved)
require.Nil(t, raw)
}
func TestCacheStoreWithoutRaw(t *testing.T) {
cache := NewCache()
template := &Template{}
testErr := errors.New("test error")
cache.StoreWithoutRaw("test", template, testErr)
retrieved, raw, err := cache.Has("test")
require.Equal(t, testErr, err)
require.Equal(t, template, retrieved)
require.Empty(t, raw)
}
func TestCacheGet(t *testing.T) {
cache := NewCache()
template := &Template{}
testErr := errors.New("test error")
retrieved, err := cache.Get("nonexistent")
require.NoError(t, err)
require.Nil(t, retrieved)
cache.Store("test", template, []byte("raw"), testErr)
retrieved, err = cache.Get("test")
require.Equal(t, testErr, err)
require.Equal(t, template, retrieved)
}
func TestCachePurge(t *testing.T) {
cache := NewCache()
template := &Template{}
cache.Store("test1", template, []byte("raw1"), nil)
cache.Store("test2", template, []byte("raw2"), nil)
retrieved1, _, _ := cache.Has("test1")
require.Equal(t, template, retrieved1)
retrieved2, _, _ := cache.Has("test2")
require.Equal(t, template, retrieved2)
cache.Purge()
retrieved1, _, _ = cache.Has("test1")
require.Nil(t, retrieved1)
retrieved2, _, _ = cache.Has("test2")
require.Nil(t, retrieved2)
}
func TestCacheNonFileTemplates(t *testing.T) {
cache := NewCache()
template := &Template{}
testErr := errors.New("test error")
cache.Store("nonfile", template, []byte("raw"), testErr)
retrieved, raw, err := cache.Has("nonfile")
require.Equal(t, testErr, err)
require.Equal(t, template, retrieved)
require.Equal(t, []byte("raw"), raw)
}
func TestCacheFileBasedStoreWithoutRaw(t *testing.T) {
tempDir, err := os.MkdirTemp("", "cache_test")
require.NoError(t, err)
defer func() {
_ = os.RemoveAll(tempDir)
}()
cache := NewCache()
template := &Template{}
testFile := filepath.Join(tempDir, "test.yaml")
err = os.WriteFile(testFile, []byte("test content"), 0644)
require.NoError(t, err)
cache.StoreWithoutRaw(testFile, template, nil)
retrieved, raw, err := cache.Has(testFile)
require.NoError(t, err)
require.Equal(t, template, retrieved)
require.Empty(t, raw)
}