github.com/danil/iso8583@v0.21.0/codec8583/mastercard_unmarshal_test.go (about)

     1  package codec8583_test
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"runtime"
     7  	"strconv"
     8  	"testing"
     9  
    10  	"github.com/danil/equal4"
    11  	"github.com/danil/iso8583/codec8583"
    12  )
    13  
    14  var MastercardUnmarshalerUnmarshalTestCases = []struct {
    15  	encoded   []byte
    16  	decoded   iso8583Msg
    17  	line      int
    18  	benchmark bool
    19  }{
    20  	{
    21  		encoded:   []byte{0xf0, 0xf1, 0xf0, 0xf0, 0x76, 0x7f, 0x46, 0x1, 0xa8, 0xe1, 0xba, 0xa, 0xf1, 0xf6, 0xf5, 0xf3, 0xf2, 0xf1, 0xf3, 0xf0, 0xf0, 0xf3, 0xf6, 0xf7, 0xf8, 0xf5, 0xf6, 0xf2, 0xf3, 0xf9, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf3, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf5, 0xf1, 0xf3, 0xf1, 0xf0, 0xf1, 0xf4, 0xf0, 0xf9, 0xf4, 0xf6, 0xf0, 0xf4, 0xf7, 0xf1, 0xf7, 0xf0, 0xf9, 0xf8, 0xf1, 0xf0, 0xf2, 0xf3, 0xf2, 0xf9, 0xf0, 0xf5, 0xf1, 0xf2, 0xf4, 0xf6, 0xf0, 0xf4, 0xf1, 0xf0, 0xf1, 0xf4, 0xf2, 0xf3, 0xf1, 0xf0, 0xf1, 0xf0, 0xf1, 0xf4, 0xf1, 0xf0, 0xf1, 0xf3, 0xf7, 0xf9, 0xf9, 0xf1, 0xf0, 0xf5, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf6, 0xf0, 0xf0, 0xf2, 0xf1, 0xf1, 0xf9, 0xf0, 0xf6, 0xf2, 0xf0, 0xf0, 0xf1, 0xf7, 0xf6, 0xf3, 0xf7, 0xf5, 0xf3, 0xf2, 0xf1, 0xf3, 0xf0, 0xf0, 0xf3, 0xf6, 0xf7, 0xf8, 0xf5, 0xf6, 0xf2, 0xf3, 0xf9, 0x7e, 0xf2, 0xf3, 0xf1, 0xf0, 0xf2, 0xf0, 0xf1, 0xf1, 0xf1, 0xf2, 0xf6, 0xf5, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf5, 0xf4, 0xf1, 0xf9, 0xf2, 0xf8, 0xf7, 0xf1, 0xf2, 0xf2, 0xf3, 0xf2, 0xf9, 0xf0, 0xf5, 0xd7, 0xe2, 0xf6, 0xf5, 0xf7, 0xf5, 0xf7, 0xf0, 0xf0, 0xf3, 0xf4, 0xf5, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf2, 0xf8, 0xf2, 0xf2, 0xf4, 0xd2, 0xe4, 0xd3, 0xe3, 0xe4, 0xd9, 0x40, 0xc1, 0x4b, 0xe2, 0x4b, 0x40, 0xd4, 0xc9, 0xd5, 0xc9, 0xc1, 0xe3, 0xe4, 0xd9, 0x40, 0x40, 0x40, 0xc9, 0xe2, 0xe3, 0xc1, 0xd5, 0xc2, 0xe4, 0xd3, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xe3, 0xe4, 0xd9, 0xf0, 0xf1, 0xf6, 0xd9, 0xf6, 0xf1, 0xf0, 0xf5, 0xf0, 0xf0, 0xf0, 0xf0, 0xf1, 0xf8, 0xf0, 0xf0, 0xf2, 0xe3, 0xe5, 0xf9, 0xf4, 0xf9, 0xf8, 0xf4, 0xf0, 0x92, 0x4d, 0x46, 0x2d, 0xcd, 0xe6, 0x55, 0x99, 0xf9, 0xf7, 0xf0, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf1, 0xf4, 0xf5, 0x9f, 0x26, 0x8, 0xd9, 0x4, 0x8b, 0x76, 0xb4, 0xe4, 0x8a, 0x55, 0x9f, 0x27, 0x1, 0x80, 0x9f, 0x10, 0x12, 0x1, 0x10, 0xa0, 0x40, 0x3, 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x9f, 0x37, 0x4, 0xfc, 0xad, 0x27, 0x1e, 0x9f, 0x36, 0x2, 0x0, 0x42, 0x95, 0x5, 0x0, 0x0, 0x4, 0x80, 0x0, 0x9a, 0x3, 0x19, 0x10, 0x14, 0x9c, 0x1, 0x0, 0x9f, 0x2, 0x6, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x5f, 0x2a, 0x2, 0x9, 0x49, 0x82, 0x2, 0x39, 0x0, 0x9f, 0x1a, 0x2, 0x7, 0x92, 0x9f, 0x3, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x33, 0x3, 0xe0, 0xf0, 0x48, 0x9f, 0x34, 0x3, 0x42, 0x3, 0x0, 0x9f, 0x35, 0x1, 0x22, 0x9f, 0x1e, 0x8, 0x32, 0x37, 0x37, 0x30, 0x32, 0x32, 0x36, 0x37, 0x9f, 0x53, 0x1, 0x52, 0x84, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x4, 0x10, 0x10, 0x9f, 0x9, 0x2, 0x0, 0x2, 0x9f, 0x41, 0x2, 0x34, 0x40, 0xf0, 0xf2, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf5, 0xf0, 0xf0, 0xf7, 0xf9, 0xf2, 0xf3, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf9, 0xe3, 0xd5, 0xe6, 0xf4, 0xf5, 0xe8, 0xe5, 0xd3, 0xe5},
    22  		decoded:   iso8583Msg{MTIMessageTypeIndicator: "0100", PANPrimaryAccountNumber2: "5321300367856239", ProcessingCode3: "000000", AmountTransaction4: "000000003000", AmountCardholderBilling6: "000000000513", TransmissionDateTime7: "1014094604", ConversionRateCardholderBilling10: "71709810", SystemTraceAuditNumber11: "232905", LocalTransactionTime12: "124604", LocalTransactionDate13: "1014", ExpirationDate14: "2310", SettlementDate15: "1014", CurrencyConversionDate16: "1013", MerchantTypeOrMerchantCategoryCode18: "7991", POSPointOfServiceEntryMode22: "051", ApplicationPANSequenceNumber23: "000", AcquiringInstitutionIdentificationCode32: "002119", ForwardingInstitutionIdentificationCode33: "200176", Track2Data35: "5321300367856239=23102011126500000541", RetrievalReferenceNumber37: "928712232905", CardAcceptorTerminalIdentification41: "PS657570", CardAcceptorIdentificationCode42: "034500000028224", CardAcceptorNameLocation43: "KULTUR A.S. MINIATUR   ISTANBUL      TUR", AdditionalDataPrivate48: "2fbx8PXw8PDw8fjw8PLj5Q==", CurrencyCodeTransaction49: "949", CurrencyCodeCardholderBilling51: "840", PersonalIdentificationNumberData52: "kk1GLc3mVZk=", SecurityRelatedControlInformation53: "9701100001000000", ICCData55: "nyYI2QSLdrTkilWfJwGAnxASARCgQAMkAAAAAAAAAAAAAAD/nzcE/K0nHp82AgBClQUAAASAAJoDGRAUnAEAnwIGAAAAADAAXyoCCUmCAjkAnxoCB5KfAwYAAAAAAACfMwPg8EifNANCAwCfNQEinx4IMjc3MDIyNjefUwFShAegAAAABBAQnwkCAAKfQQI0QA==", ReservedPrivate1_61: "000000000050079234000", ReservedPrivate3_63: "TNW45YVLV"},
    23  		line:      func() int { _, _, l, _ := runtime.Caller(1); return l }(),
    24  		benchmark: true,
    25  	},
    26  }
    27  
    28  func TestMastercardUnmarshalerUnmarshal(t *testing.T) {
    29  	_, testFile, _, _ := runtime.Caller(0)
    30  	for _, tc := range MastercardUnmarshalerUnmarshalTestCases {
    31  		tc := tc
    32  		t.Run(strconv.Itoa(tc.line), func(t *testing.T) {
    33  			t.Parallel()
    34  			linkToExample := fmt.Sprintf("%s:%d", testFile, tc.line)
    35  			dec := iso8583Msg{}
    36  			err := codec8583.MastercardUnmarshaler.Unmarshal(tc.encoded, &dec)
    37  			if err != nil {
    38  				t.Fatalf("unexpected error: %#v - %s", err, linkToExample)
    39  			}
    40  			if dec != tc.decoded {
    41  				t.Errorf("[decoded message] expected: %#v, received: %#v - %s", tc.decoded, dec, linkToExample)
    42  			}
    43  		})
    44  	}
    45  }
    46  
    47  func TestMastercardUnmarshalerUnmarshalSmallMessage(t *testing.T) {
    48  	v := iso8583Msg{}
    49  	expectedError := errors.New("ISO 8583 unmarshal: message too small to read: 6 < 12, message: []byte{0x46, 0x6f, 0x6f, 0x62, 0x61, 0x72}")
    50  	err := codec8583.MastercardUnmarshaler.Unmarshal([]byte("Foobar"), &v)
    51  	if !equal4.ErrorEqual(err, expectedError) {
    52  		t.Errorf("[error] expected: %#v, received: %#v", expectedError, err)
    53  	}
    54  }
    55  
    56  func TestMastercardUnmarshalerUnmarshalWithoutMTI(t *testing.T) {
    57  	type withoutMTI struct {
    58  		PrimaryAccountNumber string `iso8583:"2"`
    59  	}
    60  	v := withoutMTI{}
    61  	expectedError := errors.New("ISO 8583 unmarshal: decode MTI: struct must have MTI field, message: []byte{0xf0, 0xf1, 0xf0, 0xf0, 0x76, 0x7f, 0x46, 0x1, 0xa8, 0xe1, 0xa2, 0xa, 0xf1, 0xf6, 0xf5, 0xf3, 0xf2, 0xf1, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xf6, 0xf3, 0xf3, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf2, 0xf0, 0xf1, 0xf2, 0xf6, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf3, 0xf1, 0xf0, 0xf1, 0xf0, 0xf0, 0xf8, 0xf0, 0xf5, 0xf3, 0xf1, 0xf3, 0xf7, 0xf7, 0xf0, 0xf1, 0xf5, 0xf4, 0xf2, 0xf5, 0xf9, 0xf1, 0xf9, 0xf6, 0xf8, 0xf4, 0xf2, 0xf0, 0xf8, 0xf3, 0xf1, 0xf3, 0xf7, 0xf1, 0xf0, 0xf0, 0xf8, 0xf2, 0xf3, 0xf1, 0xf2, 0xf1, 0xf0, 0xf0, 0xf8, 0xf1, 0xf0, 0xf0, 0xf8, 0xf5, 0xf4, 0xf1, 0xf1, 0xf0, 0xf7, 0xf1, 0xf0, 0xf0, 0xf1, 0xf0, 0xf6, 0xf0, 0xf0, 0xf5, 0xf0, 0xf3, 0xf7, 0xf0, 0xf6, 0xf2, 0xf0, 0xf0, 0xf1, 0xf5, 0xf4, 0xf3, 0xf7, 0xf5, 0xf3, 0xf2, 0xf1, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xf6, 0xf3, 0xf3, 0xf4, 0xc4, 0xf2, 0xf3, 0xf1, 0xf2, 0xf2, 0xf0, 0xf1, 0xf1, 0xf9, 0xf6, 0xf9, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf3, 0xf7, 0xf7, 0xf5, 0xf1, 0xf9, 0xf9, 0xf3, 0xf9, 0xf7, 0xf2, 0xf7, 0xf0, 0xf2, 0xf3, 0xf1, 0xf0, 0xf7, 0xf4, 0xf7, 0xf0, 0xf0, 0xf7, 0xf9, 0xf9, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf2, 0xf6, 0xf6, 0xf2, 0xf2, 0x40, 0x40, 0x40, 0xd7, 0xe8, 0xc1, 0xe3, 0xc5, 0xd9, 0xd6, 0xc3, 0xc8, 0xd2, 0xc1, 0x40, 0xf7, 0xf9, 0xf0, 0xf4, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xd7, 0x96, 0x84, 0x96, 0x93, 0xa2, 0x92, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xd9, 0xe4, 0xe2, 0xf0, 0xf1, 0xf6, 0xd9, 0xf2, 0xf3, 0xf0, 0xf2, 0xf0, 0xf0, 0xf6, 0xf1, 0xf0, 0xf5, 0xf0, 0xf0, 0xf0, 0xf0, 0xf1, 0xf6, 0xf4, 0xf3, 0xf8, 0xf4, 0xf0, 0xf1, 0xf1, 0xf6, 0x5f, 0x2a, 0x2, 0x6, 0x43, 0x82, 0x2, 0x19, 0x80, 0x84, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x4, 0x10, 0x10, 0x95, 0x5, 0x0, 0x0, 0x0, 0x80, 0x0, 0x9a, 0x3, 0x19, 0x10, 0x8, 0x9c, 0x1, 0x0, 0x9f, 0x2, 0x6, 0x0, 0x0, 0x0, 0x2, 0x1, 0x26, 0x9f, 0x3, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x10, 0x12, 0x1, 0x10, 0xa0, 0x40, 0x3, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x9f, 0x1a, 0x2, 0x6, 0x43, 0x9f, 0x26, 0x8, 0x2, 0x5f, 0x1a, 0x91, 0x8b, 0x20, 0xdc, 0x91, 0x9f, 0x27, 0x1, 0x80, 0x9f, 0x33, 0x3, 0xe0, 0x8, 0xc8, 0x9f, 0x34, 0x3, 0x1f, 0x3, 0x0, 0x9f, 0x36, 0x2, 0x1, 0x60, 0x9f, 0x37, 0x4, 0xcf, 0x25, 0x9a, 0x1f, 0xf0, 0xf2, 0xf2, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf3, 0xf0, 0xf0, 0xf6, 0xf4, 0xf3, 0xf1, 0xf4, 0xf2, 0xf1, 0xf0, 0xf3, 0xf0, 0xf0, 0xf9, 0xe3, 0xd5, 0xe6, 0xc7, 0xc1, 0xd7, 0xf4, 0xf0, 0xf5}")
    62  	err := codec8583.MastercardUnmarshaler.Unmarshal(iso8583Bytes[0], &v)
    63  	if !equal4.ErrorEqual(err, expectedError) {
    64  		t.Errorf("[error] expected: %#v, received: %#v", expectedError, err)
    65  	}
    66  }
    67  
    68  func TestMastercardUnmarshalerUnmarshalWithoutPAN(t *testing.T) {
    69  	type withoutPan struct {
    70  		MTI string `iso8583:"MTI"`
    71  	}
    72  	v := withoutPan{}
    73  	expectedError := errors.New(`ISO 8583 unmarshal: decode field: 2, struct does not have a field with tag: 2, the message in field: 2, has a value: "5321XXXXXXXX6334", all fields: [2 3 4 6 7 10 11 12 13 14 15 16 18 22 23 32 33 35 37 41 42 43 48 49 51 55 61 63], message: []byte{0xf0, 0xf1, 0xf0, 0xf0, 0x76, 0x7f, 0x46, 0x1, 0xa8, 0xe1, 0xa2, 0xa, 0xf1, 0xf6, 0xf5, 0xf3, 0xf2, 0xf1, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xf6, 0xf3, 0xf3, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf2, 0xf0, 0xf1, 0xf2, 0xf6, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf3, 0xf1, 0xf0, 0xf1, 0xf0, 0xf0, 0xf8, 0xf0, 0xf5, 0xf3, 0xf1, 0xf3, 0xf7, 0xf7, 0xf0, 0xf1, 0xf5, 0xf4, 0xf2, 0xf5, 0xf9, 0xf1, 0xf9, 0xf6, 0xf8, 0xf4, 0xf2, 0xf0, 0xf8, 0xf3, 0xf1, 0xf3, 0xf7, 0xf1, 0xf0, 0xf0, 0xf8, 0xf2, 0xf3, 0xf1, 0xf2, 0xf1, 0xf0, 0xf0, 0xf8, 0xf1, 0xf0, 0xf0, 0xf8, 0xf5, 0xf4, 0xf1, 0xf1, 0xf0, 0xf7, 0xf1, 0xf0, 0xf0, 0xf1, 0xf0, 0xf6, 0xf0, 0xf0, 0xf5, 0xf0, 0xf3, 0xf7, 0xf0, 0xf6, 0xf2, 0xf0, 0xf0, 0xf1, 0xf5, 0xf4, 0xf3, 0xf7, 0xf5, 0xf3, 0xf2, 0xf1, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xf6, 0xf3, 0xf3, 0xf4, 0xc4, 0xf2, 0xf3, 0xf1, 0xf2, 0xf2, 0xf0, 0xf1, 0xf1, 0xf9, 0xf6, 0xf9, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf3, 0xf7, 0xf7, 0xf5, 0xf1, 0xf9, 0xf9, 0xf3, 0xf9, 0xf7, 0xf2, 0xf7, 0xf0, 0xf2, 0xf3, 0xf1, 0xf0, 0xf7, 0xf4, 0xf7, 0xf0, 0xf0, 0xf7, 0xf9, 0xf9, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf2, 0xf6, 0xf6, 0xf2, 0xf2, 0x40, 0x40, 0x40, 0xd7, 0xe8, 0xc1, 0xe3, 0xc5, 0xd9, 0xd6, 0xc3, 0xc8, 0xd2, 0xc1, 0x40, 0xf7, 0xf9, 0xf0, 0xf4, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xd7, 0x96, 0x84, 0x96, 0x93, 0xa2, 0x92, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xd9, 0xe4, 0xe2, 0xf0, 0xf1, 0xf6, 0xd9, 0xf2, 0xf3, 0xf0, 0xf2, 0xf0, 0xf0, 0xf6, 0xf1, 0xf0, 0xf5, 0xf0, 0xf0, 0xf0, 0xf0, 0xf1, 0xf6, 0xf4, 0xf3, 0xf8, 0xf4, 0xf0, 0xf1, 0xf1, 0xf6, 0x5f, 0x2a, 0x2, 0x6, 0x43, 0x82, 0x2, 0x19, 0x80, 0x84, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x4, 0x10, 0x10, 0x95, 0x5, 0x0, 0x0, 0x0, 0x80, 0x0, 0x9a, 0x3, 0x19, 0x10, 0x8, 0x9c, 0x1, 0x0, 0x9f, 0x2, 0x6, 0x0, 0x0, 0x0, 0x2, 0x1, 0x26, 0x9f, 0x3, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x10, 0x12, 0x1, 0x10, 0xa0, 0x40, 0x3, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x9f, 0x1a, 0x2, 0x6, 0x43, 0x9f, 0x26, 0x8, 0x2, 0x5f, 0x1a, 0x91, 0x8b, 0x20, 0xdc, 0x91, 0x9f, 0x27, 0x1, 0x80, 0x9f, 0x33, 0x3, 0xe0, 0x8, 0xc8, 0x9f, 0x34, 0x3, 0x1f, 0x3, 0x0, 0x9f, 0x36, 0x2, 0x1, 0x60, 0x9f, 0x37, 0x4, 0xcf, 0x25, 0x9a, 0x1f, 0xf0, 0xf2, 0xf2, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf3, 0xf0, 0xf0, 0xf6, 0xf4, 0xf3, 0xf1, 0xf4, 0xf2, 0xf1, 0xf0, 0xf3, 0xf0, 0xf0, 0xf9, 0xe3, 0xd5, 0xe6, 0xc7, 0xc1, 0xd7, 0xf4, 0xf0, 0xf5}`)
    74  	err := codec8583.MastercardUnmarshaler.Unmarshal(iso8583Bytes[0], &v)
    75  	if !equal4.ErrorEqual(err, expectedError) {
    76  		t.Errorf("[error] expected: %#v, received: %#v", expectedError, err)
    77  	}
    78  }