Backend: - Cobra CLI with --data-dir, --port, --host flags - Gin HTTP server with REST API for markdown CRUD operations - File storage on disk (.md files only) - Comprehensive logrus logging - Backend tests with CRUD round-trip verification Frontend: - React 18 + TypeScript + Tailwind CSS - Markdown editor with live GFM preview (react-markdown + remark-gfm) - File management UI (list, create, open, save, delete) - Theme switcher with Dark/Light/System modes - Responsive design - Frontend tests with vitest Testing: - All backend tests pass (go test ./...) - All frontend tests pass (npm test)
168 lines
3.1 KiB
Go
168 lines
3.1 KiB
Go
package storage
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func TestStorage_ListFiles(t *testing.T) {
|
|
tempDir, err := os.MkdirTemp("", "test-")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.RemoveAll(tempDir)
|
|
|
|
store, err := NewStorage(tempDir)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Create test files
|
|
files := []string{"file1.md", "file2.md", "file3.txt"}
|
|
for _, name := range files {
|
|
err = os.WriteFile(filepath.Join(tempDir, name), []byte("# Content"), 0644)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
result, err := store.ListFiles()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if len(result) != 2 {
|
|
t.Errorf("Expected 2 .md files, got %d", len(result))
|
|
}
|
|
|
|
// Verify only .md files are listed
|
|
for _, name := range result {
|
|
if !IsMarkdownFile(name) {
|
|
t.Errorf("Non-markdown file found: %s", name)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestStorage_CreateFile(t *testing.T) {
|
|
tempDir, err := os.MkdirTemp("", "test-")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.RemoveAll(tempDir)
|
|
|
|
store, err := NewStorage(tempDir)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
err = store.CreateFile("test.md", "# Test Content")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
content, err := os.ReadFile(filepath.Join(tempDir, "test.md"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if string(content) != "# Test Content" {
|
|
t.Errorf("Expected '# Test Content', got '%s'", string(content))
|
|
}
|
|
}
|
|
|
|
func TestStorage_UpdateFile(t *testing.T) {
|
|
tempDir, err := os.MkdirTemp("", "test-")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.RemoveAll(tempDir)
|
|
|
|
store, err := NewStorage(tempDir)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Create file
|
|
err = store.CreateFile("test.md", "# Original Content")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Update file
|
|
err = store.UpdateFile("test.md", "# Updated Content")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
content, err := os.ReadFile(filepath.Join(tempDir, "test.md"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if string(content) != "# Updated Content" {
|
|
t.Errorf("Expected '# Updated Content', got '%s'", string(content))
|
|
}
|
|
}
|
|
|
|
func TestStorage_DeleteFile(t *testing.T) {
|
|
tempDir, err := os.MkdirTemp("", "test-")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.RemoveAll(tempDir)
|
|
|
|
store, err := NewStorage(tempDir)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Create file
|
|
err = store.CreateFile("test.md", "# Test Content")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Delete file
|
|
err = store.DeleteFile("test.md")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
_, err = os.Stat(filepath.Join(tempDir, "test.md"))
|
|
if !os.IsNotExist(err) {
|
|
t.Error("File was not deleted")
|
|
}
|
|
}
|
|
|
|
func TestStorage_GetFile(t *testing.T) {
|
|
tempDir, err := os.MkdirTemp("", "test-")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.RemoveAll(tempDir)
|
|
|
|
store, err := NewStorage(tempDir)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Create file
|
|
err = store.CreateFile("test.md", "# Test Content")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
file, err := store.GetFile("test.md")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if file.Content != "# Test Content" {
|
|
t.Errorf("Expected '# Test Content', got '%s'", file.Content)
|
|
}
|
|
}
|
|
|
|
func IsMarkdownFile(filename string) bool {
|
|
return filepath.Ext(filename) == ".md"
|
|
} |