mirror of
https://github.com/danielmiessler/Fabric.git
synced 2026-02-12 06:55:08 -05:00
### CHANGES - Introduce `cmd` directory for all main application binaries. - Move all Go packages into the `internal` directory. - Rename the `restapi` package to `server` for clarity. - Consolidate patterns and strategies into a new `data` directory. - Group all auxiliary scripts into a new `scripts` directory. - Move all documentation and images into a `docs` directory. - Update all Go import paths to reflect the new structure. - Adjust CI/CD workflows and build commands for new layout.
285 lines
7.1 KiB
Go
285 lines
7.1 KiB
Go
package fsdb
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func setupTestPatternsEntity(t *testing.T) (*PatternsEntity, func()) {
|
|
// Create a temporary directory for test patterns
|
|
tmpDir, err := os.MkdirTemp("", "test-patterns-*")
|
|
require.NoError(t, err)
|
|
|
|
entity := &PatternsEntity{
|
|
StorageEntity: &StorageEntity{
|
|
Dir: tmpDir,
|
|
Label: "patterns",
|
|
ItemIsDir: true,
|
|
},
|
|
SystemPatternFile: "system.md",
|
|
}
|
|
|
|
// Return cleanup function
|
|
cleanup := func() {
|
|
os.RemoveAll(tmpDir)
|
|
}
|
|
|
|
return entity, cleanup
|
|
}
|
|
|
|
// Helper to create a test pattern file
|
|
func createTestPattern(t *testing.T, entity *PatternsEntity, name, content string) {
|
|
patternDir := filepath.Join(entity.Dir, name)
|
|
err := os.MkdirAll(patternDir, 0755)
|
|
require.NoError(t, err)
|
|
|
|
err = os.WriteFile(filepath.Join(patternDir, entity.SystemPatternFile), []byte(content), 0644)
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
func TestApplyVariables(t *testing.T) {
|
|
entity := &PatternsEntity{}
|
|
|
|
tests := []struct {
|
|
name string
|
|
pattern *Pattern
|
|
variables map[string]string
|
|
input string
|
|
want string
|
|
wantErr bool
|
|
}{
|
|
{
|
|
name: "pattern with explicit input placement",
|
|
pattern: &Pattern{
|
|
Pattern: "You are a {{role}}.\n{{input}}\nPlease analyze.",
|
|
},
|
|
variables: map[string]string{
|
|
"role": "security expert",
|
|
},
|
|
input: "Check this code",
|
|
want: "You are a security expert.\nCheck this code\nPlease analyze.",
|
|
},
|
|
{
|
|
name: "pattern without input variable gets input appended",
|
|
pattern: &Pattern{
|
|
Pattern: "You are a {{role}}.\nPlease analyze.",
|
|
},
|
|
variables: map[string]string{
|
|
"role": "code reviewer",
|
|
},
|
|
input: "Review this PR",
|
|
want: "You are a code reviewer.\nPlease analyze.\nReview this PR",
|
|
},
|
|
// ... previous test cases ...
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
err := entity.applyVariables(tt.pattern, tt.variables, tt.input)
|
|
|
|
if tt.wantErr {
|
|
assert.Error(t, err)
|
|
return
|
|
}
|
|
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, tt.want, tt.pattern.Pattern)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestGetApplyVariables(t *testing.T) {
|
|
entity, cleanup := setupTestPatternsEntity(t)
|
|
defer cleanup()
|
|
|
|
// Create a test pattern
|
|
createTestPattern(t, entity, "test-pattern", "You are a {{role}}.\n{{input}}")
|
|
|
|
tests := []struct {
|
|
name string
|
|
source string
|
|
variables map[string]string
|
|
input string
|
|
want string
|
|
wantErr bool
|
|
}{
|
|
{
|
|
name: "basic pattern with variables and input",
|
|
source: "test-pattern",
|
|
variables: map[string]string{
|
|
"role": "reviewer",
|
|
},
|
|
input: "check this code",
|
|
want: "You are a reviewer.\ncheck this code",
|
|
},
|
|
{
|
|
name: "pattern with missing variable",
|
|
source: "test-pattern",
|
|
variables: map[string]string{},
|
|
input: "test input",
|
|
wantErr: true,
|
|
},
|
|
{
|
|
name: "non-existent pattern",
|
|
source: "non-existent",
|
|
wantErr: true,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
result, err := entity.GetApplyVariables(tt.source, tt.variables, tt.input)
|
|
|
|
if tt.wantErr {
|
|
assert.Error(t, err)
|
|
return
|
|
}
|
|
|
|
require.NoError(t, err)
|
|
assert.Equal(t, tt.want, result.Pattern)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestPatternsEntity_Save(t *testing.T) {
|
|
entity, cleanup := setupTestPatternsEntity(t)
|
|
defer cleanup()
|
|
|
|
name := "new-pattern"
|
|
content := []byte("test pattern content")
|
|
require.NoError(t, entity.Save(name, content))
|
|
|
|
patternDir := filepath.Join(entity.Dir, name)
|
|
info, err := os.Stat(patternDir)
|
|
require.NoError(t, err)
|
|
assert.True(t, info.IsDir())
|
|
|
|
data, err := os.ReadFile(filepath.Join(patternDir, entity.SystemPatternFile))
|
|
require.NoError(t, err)
|
|
assert.Equal(t, content, data)
|
|
}
|
|
|
|
func TestPatternsEntity_CustomPatterns(t *testing.T) {
|
|
// Create main patterns directory
|
|
mainDir, err := os.MkdirTemp("", "test-main-patterns-*")
|
|
require.NoError(t, err)
|
|
defer os.RemoveAll(mainDir)
|
|
|
|
// Create custom patterns directory
|
|
customDir, err := os.MkdirTemp("", "test-custom-patterns-*")
|
|
require.NoError(t, err)
|
|
defer os.RemoveAll(customDir)
|
|
|
|
entity := &PatternsEntity{
|
|
StorageEntity: &StorageEntity{
|
|
Dir: mainDir,
|
|
Label: "patterns",
|
|
ItemIsDir: true,
|
|
},
|
|
SystemPatternFile: "system.md",
|
|
CustomPatternsDir: customDir,
|
|
}
|
|
|
|
// Create a pattern in main directory
|
|
createTestPattern(t, &PatternsEntity{
|
|
StorageEntity: &StorageEntity{
|
|
Dir: mainDir,
|
|
Label: "patterns",
|
|
ItemIsDir: true,
|
|
},
|
|
SystemPatternFile: "system.md",
|
|
}, "main-pattern", "Main pattern content")
|
|
|
|
// Create a pattern in custom directory
|
|
createTestPattern(t, &PatternsEntity{
|
|
StorageEntity: &StorageEntity{
|
|
Dir: customDir,
|
|
Label: "patterns",
|
|
ItemIsDir: true,
|
|
},
|
|
SystemPatternFile: "system.md",
|
|
}, "custom-pattern", "Custom pattern content")
|
|
|
|
// Create a pattern with same name in both directories (custom should override)
|
|
createTestPattern(t, &PatternsEntity{
|
|
StorageEntity: &StorageEntity{
|
|
Dir: mainDir,
|
|
Label: "patterns",
|
|
ItemIsDir: true,
|
|
},
|
|
SystemPatternFile: "system.md",
|
|
}, "shared-pattern", "Main shared pattern")
|
|
|
|
createTestPattern(t, &PatternsEntity{
|
|
StorageEntity: &StorageEntity{
|
|
Dir: customDir,
|
|
Label: "patterns",
|
|
ItemIsDir: true,
|
|
},
|
|
SystemPatternFile: "system.md",
|
|
}, "shared-pattern", "Custom shared pattern")
|
|
|
|
// Test GetNames includes both directories
|
|
names, err := entity.GetNames()
|
|
require.NoError(t, err)
|
|
assert.Contains(t, names, "main-pattern")
|
|
assert.Contains(t, names, "custom-pattern")
|
|
assert.Contains(t, names, "shared-pattern")
|
|
|
|
// Test that custom pattern overrides main pattern
|
|
pattern, err := entity.getFromDB("shared-pattern")
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "Custom shared pattern", pattern.Pattern)
|
|
|
|
// Test that main pattern is accessible when not overridden
|
|
pattern, err = entity.getFromDB("main-pattern")
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "Main pattern content", pattern.Pattern)
|
|
|
|
// Test that custom pattern is accessible
|
|
pattern, err = entity.getFromDB("custom-pattern")
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "Custom pattern content", pattern.Pattern)
|
|
}
|
|
|
|
func TestPatternsEntity_CustomPatternsEmpty(t *testing.T) {
|
|
// Test behavior when custom patterns directory is empty or doesn't exist
|
|
mainDir, err := os.MkdirTemp("", "test-main-patterns-*")
|
|
require.NoError(t, err)
|
|
defer os.RemoveAll(mainDir)
|
|
|
|
entity := &PatternsEntity{
|
|
StorageEntity: &StorageEntity{
|
|
Dir: mainDir,
|
|
Label: "patterns",
|
|
ItemIsDir: true,
|
|
},
|
|
SystemPatternFile: "system.md",
|
|
CustomPatternsDir: "/nonexistent/directory",
|
|
}
|
|
|
|
// Create a pattern in main directory
|
|
createTestPattern(t, &PatternsEntity{
|
|
StorageEntity: &StorageEntity{
|
|
Dir: mainDir,
|
|
Label: "patterns",
|
|
ItemIsDir: true,
|
|
},
|
|
SystemPatternFile: "system.md",
|
|
}, "main-pattern", "Main pattern content")
|
|
|
|
// Test GetNames works even with nonexistent custom directory
|
|
names, err := entity.GetNames()
|
|
require.NoError(t, err)
|
|
assert.Contains(t, names, "main-pattern")
|
|
|
|
// Test that main pattern is accessible
|
|
pattern, err := entity.getFromDB("main-pattern")
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "Main pattern content", pattern.Pattern)
|
|
}
|