package blob

import (
	"bytes"
	"context"
	"errors"
	"io"
	"testing"

	"github.com/stretchr/testify/require"
)

func TestFilesystemStoreIsIdempotentAndImmutable(t *testing.T) {
	ctx := context.Background()
	store, err := NewFilesystem(t.TempDir())
	require.NoError(t, err)

	key := "workspaces/ws-1/runs/run-1/logs/stdout/1.log"
	require.NoError(t, store.Put(ctx, key, bytes.NewBufferString("hello"), 5))
	require.NoError(t, store.Put(ctx, key, bytes.NewBufferString("hello"), 5))
	require.ErrorIs(t, store.Put(ctx, key, bytes.NewBufferString("world"), 5), ErrAlreadyExists)

	body, err := store.Get(ctx, key)
	require.NoError(t, err)
	defer body.Close()
	payload, err := io.ReadAll(body)
	require.NoError(t, err)
	require.Equal(t, "hello", string(payload))

	require.NoError(t, store.Delete(ctx, key))
	_, err = store.Get(ctx, key)
	require.ErrorIs(t, err, ErrNotFound)
}

func TestCleanKeyRejectsEscapes(t *testing.T) {
	for _, key := range []string{"", "../x", "x/../y", "/absolute"} {
		_, err := cleanKey(key)
		require.Error(t, err, key)
	}
	_, err := cleanKey("workspaces/ws-1/blob")
	require.NoError(t, err)
	require.False(t, errors.Is(err, ErrNotFound))
}
