125 lines
3.1 KiB
Go
125 lines
3.1 KiB
Go
package redisstate
|
|
|
|
import (
|
|
"bytes"
|
|
"testing"
|
|
|
|
"galaxy/mail/internal/domain/attempt"
|
|
deliverydomain "galaxy/mail/internal/domain/delivery"
|
|
"galaxy/mail/internal/domain/idempotency"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestDeliveryCodecRoundTrip(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
record := validDelivery(t)
|
|
|
|
payload, err := MarshalDelivery(record)
|
|
require.NoError(t, err)
|
|
|
|
decoded, err := UnmarshalDelivery(payload)
|
|
require.NoError(t, err)
|
|
require.Equal(t, record, decoded)
|
|
}
|
|
|
|
func TestAttemptCodecRoundTrip(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
record := validTerminalAttempt(t, validDelivery(t).DeliveryID)
|
|
|
|
payload, err := MarshalAttempt(record)
|
|
require.NoError(t, err)
|
|
|
|
decoded, err := UnmarshalAttempt(payload)
|
|
require.NoError(t, err)
|
|
require.Equal(t, record, decoded)
|
|
}
|
|
|
|
func TestIdempotencyCodecRoundTrip(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
deliveryRecord := validDelivery(t)
|
|
record := validIdempotencyRecord(t, deliveryRecord.Source, deliveryRecord.DeliveryID, deliveryRecord.IdempotencyKey)
|
|
|
|
payload, err := MarshalIdempotency(record)
|
|
require.NoError(t, err)
|
|
|
|
decoded, err := UnmarshalIdempotency(payload)
|
|
require.NoError(t, err)
|
|
require.Equal(t, record, decoded)
|
|
}
|
|
|
|
func TestDeadLetterCodecRoundTrip(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
record := validDeadLetterEntry(t, validDelivery(t).DeliveryID)
|
|
|
|
payload, err := MarshalDeadLetter(record)
|
|
require.NoError(t, err)
|
|
|
|
decoded, err := UnmarshalDeadLetter(payload)
|
|
require.NoError(t, err)
|
|
require.Equal(t, record, decoded)
|
|
}
|
|
|
|
func TestDeliveryCodecRejectsUnknownField(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
payload, err := MarshalDelivery(validDelivery(t))
|
|
require.NoError(t, err)
|
|
|
|
payload = append(payload[:len(payload)-1], []byte(`,"extra":true}`)...)
|
|
|
|
_, err = UnmarshalDelivery(payload)
|
|
require.Error(t, err)
|
|
require.ErrorContains(t, err, "unknown field")
|
|
}
|
|
|
|
func TestAttemptCodecRejectsWrongType(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
payload, err := MarshalAttempt(validTerminalAttempt(t, validDelivery(t).DeliveryID))
|
|
require.NoError(t, err)
|
|
|
|
payload = bytes.Replace(payload, []byte(`"attempt_no":2`), []byte(`"attempt_no":"2"`), 1)
|
|
|
|
_, err = UnmarshalAttempt(payload)
|
|
require.Error(t, err)
|
|
require.ErrorContains(t, err, "cannot unmarshal")
|
|
}
|
|
|
|
func TestIdempotencyCodecRejectsTrailingJSON(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
deliveryRecord := validDelivery(t)
|
|
payload, err := MarshalIdempotency(validIdempotencyRecord(t, deliveryRecord.Source, deliveryRecord.DeliveryID, deliveryRecord.IdempotencyKey))
|
|
require.NoError(t, err)
|
|
|
|
payload = append(payload, []byte(` {}`)...)
|
|
|
|
_, err = UnmarshalIdempotency(payload)
|
|
require.Error(t, err)
|
|
require.ErrorContains(t, err, "unexpected trailing JSON input")
|
|
}
|
|
|
|
func TestDeadLetterCodecRejectsUnknownField(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
payload, err := MarshalDeadLetter(validDeadLetterEntry(t, validDelivery(t).DeliveryID))
|
|
require.NoError(t, err)
|
|
|
|
payload = append(payload[:len(payload)-1], []byte(`,"unexpected":"value"}`)...)
|
|
|
|
_, err = UnmarshalDeadLetter(payload)
|
|
require.Error(t, err)
|
|
require.ErrorContains(t, err, "unknown field")
|
|
}
|
|
|
|
var (
|
|
_ = attempt.Attempt{}
|
|
_ = deliverydomain.DeadLetterEntry{}
|
|
_ = idempotency.Record{}
|
|
)
|