package internalhttp import ( "net/http" "net/http/httptest" "testing" "time" "galaxy/mail/internal/domain/common" "galaxy/mail/internal/service/listdeliveries" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestDecodeDeliveryListInputSuccess(t *testing.T) { t.Parallel() cursor, err := EncodeDeliveryListCursor(listdeliveries.Cursor{ CreatedAt: time.Unix(1_775_122_000, 0).UTC(), DeliveryID: common.DeliveryID("delivery-123"), }) require.NoError(t, err) request := httptest.NewRequest( http.MethodGet, DeliveriesPath+"?recipient=pilot@example.com&status=sent&source=notification&template_id=template.welcome&idempotency_key=notification:delivery-123&from_created_at_ms=1775122000000&to_created_at_ms=1775122600000&limit=25&cursor="+cursor, nil, ) input, err := DecodeDeliveryListInput(request) require.NoError(t, err) require.Equal(t, 25, input.Limit) require.Equal(t, common.Email("pilot@example.com"), input.Filters.Recipient) require.Equal(t, common.TemplateID("template.welcome"), input.Filters.TemplateID) require.Equal(t, common.IdempotencyKey("notification:delivery-123"), input.Filters.IdempotencyKey) require.NotNil(t, input.Cursor) require.Equal(t, common.DeliveryID("delivery-123"), input.Cursor.DeliveryID) } func TestDecodeDeliveryListInputRejectsInvalidCursor(t *testing.T) { t.Parallel() request := httptest.NewRequest(http.MethodGet, DeliveriesPath+"?cursor=bad", nil) _, err := DecodeDeliveryListInput(request) require.Error(t, err) assert.ErrorContains(t, err, "decode cursor") } func TestDeliveryListCursorRoundTrip(t *testing.T) { t.Parallel() cursor := listdeliveries.Cursor{ CreatedAt: time.Unix(1_775_122_500, 0).UTC(), DeliveryID: common.DeliveryID("delivery-xyz"), } encoded, err := EncodeDeliveryListCursor(cursor) require.NoError(t, err) decoded, err := DecodeDeliveryListCursor(encoded) require.NoError(t, err) require.Equal(t, cursor, decoded) } func TestDecodeDeliveryIDFromPath(t *testing.T) { t.Parallel() request := httptest.NewRequest(http.MethodGet, "/api/v1/internal/deliveries/delivery-123", nil) request.SetPathValue(deliveryIDPathValue, "delivery-123") deliveryID, err := DecodeDeliveryIDFromPath(request) require.NoError(t, err) require.Equal(t, common.DeliveryID("delivery-123"), deliveryID) }