Files
grafana/apps/provisioning/pkg/safepath/trie_test.go
T
Roberto Jiménez Sánchez 93a35fc7be Provisioning: Move apifmt, loki and safepath to provisioning app (#110226)
* Move apifmt

* Move safepath

* Move Loki package

* Regenerate Loki mock

* Missing file for Loki
2025-08-27 13:26:48 -05:00

126 lines
3.3 KiB
Go

package safepath
import (
"fmt"
"testing"
"github.com/stretchr/testify/require"
)
func TestTrie(t *testing.T) {
tests := []struct {
name string
pathsToAdd []string
pathsToCheck []string
expectedExist []bool
expectedError error
}{
{
name: "empty trie",
pathsToAdd: []string{},
pathsToCheck: []string{"test", "test/"},
expectedExist: []bool{false, false},
expectedError: nil,
},
{
name: "single file",
pathsToAdd: []string{"test.json"},
pathsToCheck: []string{"test.json", "test.json/"},
expectedExist: []bool{true, false},
expectedError: nil,
},
{
name: "single directory",
pathsToAdd: []string{"test/"},
pathsToCheck: []string{"test", "test/"},
expectedExist: []bool{false, true},
expectedError: nil,
},
{
name: "nested structure",
pathsToAdd: []string{"folder/", "folder/file.txt", "folder/subfolder/", "folder/subfolder/test.json"},
pathsToCheck: []string{"folder/", "folder/file.txt", "folder/file.txt/", "folder/subfolder/", "folder/subfolder/test.json", "folder/subfolder/test.json/"},
expectedExist: []bool{true, true, false, true, true, false},
expectedError: nil,
},
{
name: "partial paths",
pathsToAdd: []string{"a/b/c/d/"},
pathsToCheck: []string{"a/", "a/b/", "a/b/c/", "a/b/c/d/"},
expectedExist: []bool{true, true, true, true},
expectedError: nil,
},
{
name: "file in middle of path",
pathsToAdd: []string{"a/file.txt", "a/file.txt/b/"},
pathsToCheck: []string{},
expectedExist: []bool{},
expectedError: fmt.Errorf("path %q exists but is not a directory", "a/file.txt"),
},
{
name: "empty path",
pathsToAdd: []string{""},
pathsToCheck: []string{""},
expectedExist: []bool{true},
expectedError: nil,
},
{
name: "root directory",
pathsToAdd: []string{"/"},
pathsToCheck: []string{"/", ""},
expectedExist: []bool{true, true},
expectedError: nil,
},
{
name: "duplicate paths",
pathsToAdd: []string{"test/", "test/"},
pathsToCheck: []string{"test/"},
expectedExist: []bool{true},
expectedError: nil,
},
{
name: "file to directory conversion not allowed",
pathsToAdd: []string{"test.txt", "test.txt/file.txt"},
pathsToCheck: []string{},
expectedExist: []bool{},
expectedError: fmt.Errorf("path %q exists but is not a directory", "test.txt"),
},
{
name: "directory to file conversion not allowed",
pathsToAdd: []string{"test/", "test"},
pathsToCheck: []string{},
expectedExist: []bool{},
expectedError: fmt.Errorf("path %q exists but is not a file", "test"),
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
trie := NewTrie()
// Add paths
var lastErr error
for _, path := range tt.pathsToAdd {
err := trie.Add(path)
if err != nil {
lastErr = err
break
}
}
if tt.expectedError != nil {
require.Error(t, lastErr)
require.Equal(t, tt.expectedError.Error(), lastErr.Error())
return
}
require.NoError(t, lastErr)
// Check existence
for i, path := range tt.pathsToCheck {
exists := trie.Exists(path)
require.Equal(t, tt.expectedExist[i], exists, "path: %s", path)
}
})
}
}