package storage

import (
	"context"
	"io"
	"strings"
	"testing"
)

func TestLocalPutGetDelete(t *testing.T) {
	dir := t.TempDir()
	l, err := NewLocal(dir)
	if err != nil {
		t.Fatal(err)
	}
	ctx := context.Background()

	if err := l.Put(ctx, "a/b/file.txt", strings.NewReader("hello")); err != nil {
		t.Fatalf("put: %v", err)
	}
	ok, err := l.Exists(ctx, "a/b/file.txt")
	if err != nil || !ok {
		t.Fatalf("exists: ok=%v err=%v", ok, err)
	}
	rc, err := l.Get(ctx, "a/b/file.txt")
	if err != nil {
		t.Fatalf("get: %v", err)
	}
	b, _ := io.ReadAll(rc)
	rc.Close()
	if string(b) != "hello" {
		t.Fatalf("content = %q", b)
	}
	if err := l.Delete(ctx, "a/b/file.txt"); err != nil {
		t.Fatalf("delete: %v", err)
	}
	if _, err := l.Get(ctx, "a/b/file.txt"); err != ErrNotFound {
		t.Fatalf("get after delete = %v, want ErrNotFound", err)
	}
	if err := l.Delete(ctx, "a/b/file.txt"); err != nil {
		t.Fatalf("delete missing = %v, want nil", err)
	}
}

func TestLocalRejectsTraversal(t *testing.T) {
	l, err := NewLocal(t.TempDir())
	if err != nil {
		t.Fatal(err)
	}
	ctx := context.Background()
	for _, key := range []string{"../etc/passwd", "..\\windows", "/", ""} {
		if err := l.Put(ctx, key, strings.NewReader("x")); err != ErrInvalidKey {
			t.Errorf("put %q = %v, want ErrInvalidKey", key, err)
		}
	}
}
