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{} )