package attachment

import (
	"testing"

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

func TestBuildSelectUnclaimedAttachmentIDsForGCQueryAvoidsSkipLocked(t *testing.T) {
	t.Parallel()

	query := BuildSelectUnclaimedAttachmentIDsForGCQuery()
	require.Contains(t, query, "ORDER BY created_at ASC, id ASC")
	require.Contains(t, query, "LIMIT $2")
	require.NotContains(t, query, "SKIP LOCKED")
}

func TestBuildDeleteUnclaimedAttachmentForGCQueryGuardsMessageID(t *testing.T) {
	t.Parallel()

	query, args, err := BuildDeleteUnclaimedAttachmentsForGCQuery([]string{"att-1", "att-2"})
	require.NoError(t, err)
	require.Equal(t, []any{"att-1", "att-2"}, args)
	require.Contains(t, query, "WITH attachment_ids AS (")
	require.Contains(t, query, "SELECT $1 AS attachment_id")
	require.Contains(t, query, "SELECT $2 AS attachment_id")
	require.Contains(t, query, "DELETE FROM attachments")
	require.Contains(t, query, "attachment_ids.attachment_id = attachments.id")
	require.Contains(t, query, "AND message_id IS NULL")
	require.NotContains(t, query, "RETURNING")
	require.NotContains(t, query, "ANY(")
}

func TestBuildSelectExistingAttachmentsForGCQueryUsesPortableValueCTE(t *testing.T) {
	t.Parallel()

	query, args, err := BuildSelectExistingAttachmentsForGCQuery([]string{"att-1", "att-2"})
	require.NoError(t, err)
	require.Equal(t, []any{"att-1", "att-2"}, args)
	require.Contains(t, query, "WITH attachment_ids AS (")
	require.Contains(t, query, "SELECT $1 AS attachment_id")
	require.Contains(t, query, "SELECT $2 AS attachment_id")
	require.Contains(t, query, "FROM attachments AS a")
	require.Contains(t, query, "JOIN attachment_ids ON attachment_ids.attachment_id = a.id")
	require.NotContains(t, query, "RETURNING")
	require.NotContains(t, query, "ANY(")
}
