feat: mail service

This commit is contained in:
Ilia Denisov
2026-04-17 18:39:16 +02:00
committed by GitHub
parent 23ffcb7535
commit 5b7593e6f6
183 changed files with 31215 additions and 248 deletions
@@ -0,0 +1,76 @@
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)
}