github.com/moov-io/imagecashletter@v0.10.1/returnDetail_test.go (about) 1 // Copyright 2020 The Moov Authors 2 // Use of this source code is governed by an Apache License 3 // license that can be found in the LICENSE file. 4 5 package imagecashletter 6 7 import ( 8 "strings" 9 "testing" 10 "time" 11 12 "github.com/stretchr/testify/require" 13 ) 14 15 // mockReturnDetail creates a ReturnDetail 16 func mockReturnDetail() *ReturnDetail { 17 rd := NewReturnDetail() 18 rd.PayorBankRoutingNumber = "03130001" 19 rd.PayorBankCheckDigit = "2" 20 rd.OnUs = "5558881" 21 rd.ItemAmount = 100000 22 rd.ReturnReason = "A" 23 rd.AddendumCount = 4 24 rd.DocumentationTypeIndicator = "G" 25 rd.ForwardBundleDate = time.Now() 26 rd.EceInstitutionItemSequenceNumber = "1 " 27 rd.ExternalProcessingCode = "" 28 rd.ReturnNotificationIndicator = "2" 29 rd.ArchiveTypeIndicator = "B" 30 rd.TimesReturned = 0 31 return rd 32 } 33 34 func TestReturnDetailParse(t *testing.T) { 35 var r ReturnDetail 36 r.Parse("asshafaksjfas") 37 require.Equal(t, "", r.PayorBankRoutingNumber) 38 } 39 40 // TestMockReturnDetail creates a ReturnDetail 41 func TestMockReturnDetail(t *testing.T) { 42 rd := mockReturnDetail() 43 require.NoError(t, rd.Validate()) 44 require.Equal(t, "31", rd.recordType) 45 require.Equal(t, "03130001", rd.PayorBankRoutingNumber) 46 require.Equal(t, "2", rd.PayorBankCheckDigit) 47 require.Equal(t, "5558881", rd.OnUs) 48 require.Equal(t, 100000, rd.ItemAmount) 49 require.Equal(t, "A", rd.ReturnReason) 50 require.Equal(t, 4, rd.AddendumCount) 51 require.Equal(t, "G", rd.DocumentationTypeIndicator) 52 require.Equal(t, "1 ", rd.EceInstitutionItemSequenceNumber) 53 require.Equal(t, "", rd.ExternalProcessingCode) 54 require.Equal(t, "2", rd.ReturnNotificationIndicator) 55 require.Equal(t, "B", rd.ArchiveTypeIndicator) 56 require.Equal(t, 0, rd.TimesReturned) 57 } 58 59 // TestParseReturnDetail validates parsing a ReturnDetail 60 func TestParseReturnDetail(t *testing.T) { 61 var line = "31031300012 55588810000100000A04G201809051 2B0 " 62 r := NewReader(strings.NewReader(line)) 63 r.line = line 64 clh := mockCashLetterHeader() 65 r.addCurrentCashLetter(NewCashLetter(clh)) 66 bh := mockBundleHeader() 67 rb := NewBundle(bh) 68 r.currentCashLetter.AddBundle(rb) 69 r.addCurrentBundle(rb) 70 71 require.NoError(t, r.parseReturnDetail()) 72 record := r.currentCashLetter.currentBundle.GetReturns()[0] 73 74 require.Equal(t, "31", record.recordType) 75 require.Equal(t, "03130001", record.PayorBankRoutingNumberField()) 76 require.Equal(t, "2", record.PayorBankCheckDigitField()) 77 require.Equal(t, " 5558881", record.OnUsField()) 78 require.Equal(t, "0000100000", record.ItemAmountField()) 79 require.Equal(t, "A", record.ReturnReasonField()) 80 require.Equal(t, "04", record.AddendumCountField()) 81 require.Equal(t, "G", record.DocumentationTypeIndicatorField()) 82 require.Equal(t, "1 ", record.EceInstitutionItemSequenceNumberField()) 83 require.Equal(t, " ", record.ExternalProcessingCodeField()) 84 require.Equal(t, "2", record.ReturnNotificationIndicatorField()) 85 require.Equal(t, "B", record.ArchiveTypeIndicatorField()) 86 require.Equal(t, "0", record.TimesReturnedField()) 87 88 } 89 90 // testReturnDetailString validates that a known parsed ReturnDetail can return to a string of the same value 91 func testReturnDetailString(t testing.TB) { 92 var line = "31031300012 55588810000100000A04G201809051 2B0 " 93 r := NewReader(strings.NewReader(line)) 94 r.line = line 95 clh := mockCashLetterHeader() 96 r.addCurrentCashLetter(NewCashLetter(clh)) 97 bh := mockBundleHeader() 98 rb := NewBundle(bh) 99 r.currentCashLetter.AddBundle(rb) 100 r.addCurrentBundle(rb) 101 102 require.NoError(t, r.parseReturnDetail()) 103 record := r.currentCashLetter.currentBundle.GetReturns()[0] 104 105 require.Equal(t, line, record.String()) 106 } 107 108 // TestReturnDetailString tests validating that a known parsed ReturnDetail can return to a string of the 109 // same value 110 func TestReturnDetailString(t *testing.T) { 111 testReturnDetailString(t) 112 } 113 114 // BenchmarkReturnDetailString benchmarks validating that a known parsed ReturnDetailAddendumB 115 // can return to a string of the same value 116 func BenchmarkReturnDetailString(b *testing.B) { 117 b.ReportAllocs() 118 for i := 0; i < b.N; i++ { 119 testReturnDetailString(b) 120 } 121 } 122 123 // TestRDRecordType validation 124 func TestRDRecordType(t *testing.T) { 125 rd := mockReturnDetail() 126 rd.recordType = "00" 127 err := rd.Validate() 128 var e *FieldError 129 require.ErrorAs(t, err, &e) 130 require.Equal(t, "recordType", e.FieldName) 131 } 132 133 // TestRDDocumentationTypeIndicator validation 134 func TestRDDocumentationTypeIndicator(t *testing.T) { 135 rd := mockReturnDetail() 136 rd.DocumentationTypeIndicator = "P" 137 err := rd.Validate() 138 var e *FieldError 139 require.ErrorAs(t, err, &e) 140 require.Equal(t, "DocumentationTypeIndicator", e.FieldName) 141 } 142 143 // TestRDDocumentationTypeIndicatorZ validation 144 func TestRDDocumentationTypeIndicatorZ(t *testing.T) { 145 rd := mockReturnDetail() 146 rd.DocumentationTypeIndicator = "Z" 147 err := rd.Validate() 148 var e *FieldError 149 require.ErrorAs(t, err, &e) 150 require.Equal(t, "DocumentationTypeIndicator", e.FieldName) 151 } 152 153 // TestRDReturnNotificationIndicator validation 154 func TestRDReturnNotificationIndicator(t *testing.T) { 155 rd := mockReturnDetail() 156 rd.ReturnNotificationIndicator = "0" 157 err := rd.Validate() 158 var e *FieldError 159 require.ErrorAs(t, err, &e) 160 require.Equal(t, "ReturnNotificationIndicator", e.FieldName) 161 } 162 163 // TestRDArchiveTypeIndicator validation 164 func TestRDArchiveTypeIndicator(t *testing.T) { 165 rd := mockReturnDetail() 166 rd.ArchiveTypeIndicator = "W" 167 err := rd.Validate() 168 var e *FieldError 169 require.ErrorAs(t, err, &e) 170 require.Equal(t, "ArchiveTypeIndicator", e.FieldName) 171 } 172 173 // TestRDTimesReturned validation 174 func TestRDTimesReturned(t *testing.T) { 175 rd := mockReturnDetail() 176 rd.TimesReturned = 5 177 err := rd.Validate() 178 var e *FieldError 179 require.ErrorAs(t, err, &e) 180 require.Equal(t, "TimesReturned", e.FieldName) 181 } 182 183 // TestReturnReasonInvalid validation 184 func TestReturnReasonInvalid(t *testing.T) { 185 rd := mockReturnDetail() 186 rd.ReturnReason = "88" 187 err := rd.Validate() 188 var e *FieldError 189 require.ErrorAs(t, err, &e) 190 require.Equal(t, "ReturnReason", e.FieldName) 191 } 192 193 // Field Inclusion 194 195 // TestRDFIRecordType validation 196 func TestRDFIRecordType(t *testing.T) { 197 rd := mockReturnDetail() 198 rd.recordType = "" 199 err := rd.Validate() 200 var e *FieldError 201 require.ErrorAs(t, err, &e) 202 require.Equal(t, "recordType", e.FieldName) 203 } 204 205 // TestRDFIPayorBankRoutingNumber validation 206 func TestRDFIPayorBankRoutingNumber(t *testing.T) { 207 rd := mockReturnDetail() 208 rd.PayorBankRoutingNumber = "" 209 err := rd.Validate() 210 var e *FieldError 211 require.ErrorAs(t, err, &e) 212 require.Equal(t, "PayorBankRoutingNumber", e.FieldName) 213 } 214 215 // TestRDFIPayorBankRoutingNumberZero validation 216 func TestRDFIPayorBankRoutingNumberZero(t *testing.T) { 217 rd := mockReturnDetail() 218 rd.PayorBankRoutingNumber = "00000000" 219 err := rd.Validate() 220 var e *FieldError 221 require.ErrorAs(t, err, &e) 222 require.Equal(t, "PayorBankRoutingNumber", e.FieldName) 223 } 224 225 // TestRDFIPayorBankCheckDigit validation 226 func TestRDFIPayorBankCheckDigit(t *testing.T) { 227 rd := mockReturnDetail() 228 rd.PayorBankCheckDigit = "" 229 err := rd.Validate() 230 var e *FieldError 231 require.ErrorAs(t, err, &e) 232 require.Equal(t, "PayorBankCheckDigit", e.FieldName) 233 } 234 235 // TestRDFIReturnReason validation 236 func TestRDFIReturnReason(t *testing.T) { 237 rd := mockReturnDetail() 238 rd.ReturnReason = "" 239 err := rd.Validate() 240 var e *FieldError 241 require.ErrorAs(t, err, &e) 242 require.Equal(t, "ReturnReason", e.FieldName) 243 } 244 245 // TestRDFIEceInstitutionItemSequenceNumber validation 246 func TestRDFIEceInstitutionItemSequenceNumber(t *testing.T) { 247 rd := mockReturnDetail() 248 rd.EceInstitutionItemSequenceNumber = " " 249 err := rd.Validate() 250 var e *FieldError 251 require.ErrorAs(t, err, &e) 252 require.Equal(t, "EceInstitutionItemSequenceNumber", e.FieldName) 253 }