github.com/moov-io/imagecashletter@v0.10.1/returnDetailAddendumA_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 // mockReturnDetailAddendumA creates a ReturnDetailAddendumA 16 func mockReturnDetailAddendumA() ReturnDetailAddendumA { 17 rdAddendumA := NewReturnDetailAddendumA() 18 rdAddendumA.RecordNumber = 1 19 rdAddendumA.ReturnLocationRoutingNumber = "121042882" 20 rdAddendumA.BOFDEndorsementDate = time.Now() 21 rdAddendumA.BOFDItemSequenceNumber = "1 " 22 rdAddendumA.BOFDAccountNumber = "938383" 23 rdAddendumA.BOFDBranchCode = "01" 24 rdAddendumA.PayeeName = "Test Payee" 25 rdAddendumA.TruncationIndicator = "Y" 26 rdAddendumA.BOFDConversionIndicator = "1" 27 rdAddendumA.BOFDCorrectionIndicator = 0 28 rdAddendumA.UserField = "" 29 return rdAddendumA 30 } 31 32 // mockReturnDetailAddendumAWithoutBOFDItemSequenceNumber creates a ReturnDetailAddendumA 33 func mockReturnDetailAddendumAWithoutBOFDItemSequenceNumber() ReturnDetailAddendumA { 34 rdAddendumA := NewReturnDetailAddendumA() 35 rdAddendumA.RecordNumber = 1 36 rdAddendumA.ReturnLocationRoutingNumber = "121042882" 37 rdAddendumA.BOFDEndorsementDate = time.Now() 38 rdAddendumA.BOFDAccountNumber = "938383" 39 rdAddendumA.BOFDBranchCode = "01" 40 rdAddendumA.PayeeName = "Test Payee" 41 rdAddendumA.TruncationIndicator = "Y" 42 rdAddendumA.BOFDConversionIndicator = "1" 43 rdAddendumA.BOFDCorrectionIndicator = 0 44 rdAddendumA.UserField = "" 45 return rdAddendumA 46 } 47 48 func TestReturnDetailAddendumAParseErr(t *testing.T) { 49 var r ReturnDetailAddendumA 50 r.Parse("asdlsajhfakjfa") 51 require.Equal(t, 0, r.RecordNumber) 52 } 53 54 // TestMockReturnDetailAddendumA creates a ReturnDetailAddendumA 55 func TestMockReturnDetailAddendumA(t *testing.T) { 56 rdAddendumA := mockReturnDetailAddendumA() 57 require.NoError(t, rdAddendumA.Validate()) 58 require.Equal(t, "32", rdAddendumA.recordType) 59 require.Equal(t, 1, rdAddendumA.RecordNumber) 60 require.Equal(t, "121042882", rdAddendumA.ReturnLocationRoutingNumber) 61 require.Equal(t, "1 ", rdAddendumA.BOFDItemSequenceNumber) 62 require.Equal(t, "938383", rdAddendumA.BOFDAccountNumber) 63 require.Equal(t, "01", rdAddendumA.BOFDBranchCode) 64 require.Equal(t, "Test Payee", rdAddendumA.PayeeName) 65 require.Equal(t, "Y", rdAddendumA.TruncationIndicator) 66 require.Equal(t, "1", rdAddendumA.BOFDConversionIndicator) 67 require.Equal(t, 0, rdAddendumA.BOFDCorrectionIndicator) 68 require.Equal(t, "", rdAddendumA.UserField) 69 } 70 71 // TestMockReturnDetailAddendumA creates a ReturnDetailAddendumA 72 func TestMockReturnDetailAddendumAWithoutBOFDItemSequenceNumber(t *testing.T) { 73 rdAddendumA := mockReturnDetailAddendumAWithoutBOFDItemSequenceNumber() 74 require.NoError(t, rdAddendumA.Validate()) 75 require.Equal(t, "32", rdAddendumA.recordType) 76 require.Equal(t, 1, rdAddendumA.RecordNumber) 77 require.Equal(t, "121042882", rdAddendumA.ReturnLocationRoutingNumber) 78 require.Equal(t, "938383", rdAddendumA.BOFDAccountNumber) 79 require.Equal(t, "01", rdAddendumA.BOFDBranchCode) 80 require.Equal(t, "Test Payee", rdAddendumA.PayeeName) 81 require.Equal(t, "Y", rdAddendumA.TruncationIndicator) 82 require.Equal(t, "1", rdAddendumA.BOFDConversionIndicator) 83 require.Equal(t, 0, rdAddendumA.BOFDCorrectionIndicator) 84 require.Equal(t, "", rdAddendumA.UserField) 85 } 86 87 // TestParseReturnDetailAddendumAWithoutBOFDItemSequenceNumber validates parsing a ReturnDetailAddendumA 88 func TestParseReturnDetailAddendumAWithoutBOFDItemSequenceNumber(t *testing.T) { 89 var line = "32112104288220180905 938383 01 Test Payee Y10 " 90 r := NewReader(strings.NewReader(line)) 91 r.line = line 92 clh := mockCashLetterHeader() 93 r.addCurrentCashLetter(NewCashLetter(clh)) 94 bh := mockBundleHeader() 95 rb := NewBundle(bh) 96 r.currentCashLetter.AddBundle(rb) 97 r.addCurrentBundle(rb) 98 rd := mockReturnDetail() 99 r.currentCashLetter.currentBundle.AddReturnDetail(rd) 100 101 require.NoError(t, r.parseReturnDetailAddendumA()) 102 record := r.currentCashLetter.currentBundle.GetReturns()[0].ReturnDetailAddendumA[0] 103 104 require.Equal(t, "32", record.recordType) 105 require.Equal(t, "1", record.RecordNumberField()) 106 require.Equal(t, "121042882", record.ReturnLocationRoutingNumberField()) 107 require.Equal(t, "20180905", record.BOFDEndorsementDateField()) 108 require.Equal(t, " ", record.BOFDItemSequenceNumberField()) 109 require.Equal(t, "938383 ", record.BOFDAccountNumberField()) 110 require.Equal(t, "01 ", record.BOFDBranchCodeField()) 111 require.Equal(t, "Test Payee ", record.PayeeNameField()) 112 require.Equal(t, "Y", record.TruncationIndicatorField()) 113 require.Equal(t, "1", record.BOFDConversionIndicatorField()) 114 require.Equal(t, "0", record.BOFDCorrectionIndicatorField()) 115 require.Equal(t, " ", record.UserFieldField()) 116 require.Equal(t, " ", record.reservedField()) 117 } 118 119 // TestParseReturnDetailAddendumA validates parsing a ReturnDetailAddendumA 120 func TestParseReturnDetailAddendumA(t *testing.T) { 121 var line = "321121042882201809051 938383 01 Test Payee Y10 " 122 r := NewReader(strings.NewReader(line)) 123 r.line = line 124 clh := mockCashLetterHeader() 125 r.addCurrentCashLetter(NewCashLetter(clh)) 126 bh := mockBundleHeader() 127 rb := NewBundle(bh) 128 r.currentCashLetter.AddBundle(rb) 129 r.addCurrentBundle(rb) 130 rd := mockReturnDetail() 131 r.currentCashLetter.currentBundle.AddReturnDetail(rd) 132 133 require.NoError(t, r.parseReturnDetailAddendumA()) 134 record := r.currentCashLetter.currentBundle.GetReturns()[0].ReturnDetailAddendumA[0] 135 136 require.Equal(t, "32", record.recordType) 137 require.Equal(t, "1", record.RecordNumberField()) 138 require.Equal(t, "121042882", record.ReturnLocationRoutingNumberField()) 139 require.Equal(t, "20180905", record.BOFDEndorsementDateField()) 140 require.Equal(t, "1 ", record.BOFDItemSequenceNumberField()) 141 require.Equal(t, "938383 ", record.BOFDAccountNumberField()) 142 require.Equal(t, "01 ", record.BOFDBranchCodeField()) 143 require.Equal(t, "Test Payee ", record.PayeeNameField()) 144 require.Equal(t, "Y", record.TruncationIndicatorField()) 145 require.Equal(t, "1", record.BOFDConversionIndicatorField()) 146 require.Equal(t, "0", record.BOFDCorrectionIndicatorField()) 147 require.Equal(t, " ", record.UserFieldField()) 148 require.Equal(t, " ", record.reservedField()) 149 } 150 151 // testRDAddendumAString validates that a known parsed ReturnDetailAddendumA can return to a string of the same value 152 func testRDAddendumAString(t testing.TB) { 153 var line = "321121042882201809051 938383 01 Test Payee Y10 " 154 r := NewReader(strings.NewReader(line)) 155 r.line = line 156 clh := mockCashLetterHeader() 157 r.addCurrentCashLetter(NewCashLetter(clh)) 158 bh := mockBundleHeader() 159 rb := NewBundle(bh) 160 r.currentCashLetter.AddBundle(rb) 161 r.addCurrentBundle(rb) 162 rd := mockReturnDetail() 163 r.currentCashLetter.currentBundle.AddReturnDetail(rd) 164 165 require.NoError(t, r.parseReturnDetailAddendumA()) 166 record := r.currentCashLetter.currentBundle.GetReturns()[0].ReturnDetailAddendumA[0] 167 168 require.Equal(t, line, record.String()) 169 170 } 171 172 // TestRDAddendumAString tests validating that a known parsed ReturnDetailAddendumA can return to a string of the 173 // same value 174 func TestRDAddendumAString(t *testing.T) { 175 testRDAddendumAString(t) 176 } 177 178 // BenchmarkRDAddendumAString benchmarks validating that a known parsed ReturnDetailAddendumA 179 // can return to a string of the same value 180 func BenchmarkRDAddendumAString(b *testing.B) { 181 b.ReportAllocs() 182 for i := 0; i < b.N; i++ { 183 testRDAddendumAString(b) 184 } 185 } 186 187 // TestRDAddendumARecordType validation 188 func TestRDAddendumARecordType(t *testing.T) { 189 rdAddendumA := mockReturnDetailAddendumA() 190 rdAddendumA.recordType = "00" 191 err := rdAddendumA.Validate() 192 var e *FieldError 193 require.ErrorAs(t, err, &e) 194 require.Equal(t, "recordType", e.FieldName) 195 } 196 197 // TestRDAddendumAReturnLocationRoutingNumber validation 198 func TestRDAddendumAReturnLocationRoutingNumber(t *testing.T) { 199 rdAddendumA := mockReturnDetailAddendumA() 200 rdAddendumA.ReturnLocationRoutingNumber = "X" 201 err := rdAddendumA.Validate() 202 var e *FieldError 203 require.ErrorAs(t, err, &e) 204 require.Equal(t, "ReturnLocationRoutingNumber", e.FieldName) 205 } 206 207 // TestRDAddendumABOFDAccountNumber validation 208 func TestRDAddendumABOFDAccountNumber(t *testing.T) { 209 rdAddendumA := mockReturnDetailAddendumA() 210 rdAddendumA.BOFDAccountNumber = "®©" 211 err := rdAddendumA.Validate() 212 var e *FieldError 213 require.ErrorAs(t, err, &e) 214 require.Equal(t, "BOFDAccountNumber", e.FieldName) 215 } 216 217 // TestRDAddendumABOFDBranchCode validation 218 func TestRDAddendumABOFDBranchCode(t *testing.T) { 219 rdAddendumA := mockReturnDetailAddendumA() 220 rdAddendumA.BOFDBranchCode = "®©" 221 err := rdAddendumA.Validate() 222 var e *FieldError 223 require.ErrorAs(t, err, &e) 224 require.Equal(t, "BOFDBranchCode", e.FieldName) 225 } 226 227 // TestRDAddendumAPayeeName validation 228 func TestRDAddendumAPayeeName(t *testing.T) { 229 rdAddendumA := mockReturnDetailAddendumA() 230 rdAddendumA.PayeeName = "®©" 231 err := rdAddendumA.Validate() 232 var e *FieldError 233 require.ErrorAs(t, err, &e) 234 require.Equal(t, "PayeeName", e.FieldName) 235 } 236 237 // TestRDAddendumATruncationIndicator validation 238 func TestRDAddendumATruncationIndicator(t *testing.T) { 239 rdAddendumA := mockReturnDetailAddendumA() 240 rdAddendumA.TruncationIndicator = "A" 241 err := rdAddendumA.Validate() 242 var e *FieldError 243 require.ErrorAs(t, err, &e) 244 require.Equal(t, "TruncationIndicator", e.FieldName) 245 } 246 247 // TestRDAddendumABOFDConversionIndicator validation 248 func TestRDAddendumABOFDConversionIndicator(t *testing.T) { 249 rdAddendumA := mockReturnDetailAddendumA() 250 rdAddendumA.BOFDConversionIndicator = "99" 251 err := rdAddendumA.Validate() 252 var e *FieldError 253 require.ErrorAs(t, err, &e) 254 require.Equal(t, "BOFDConversionIndicator", e.FieldName) 255 } 256 257 // TestRDAddendumABOFDCorrectionIndicator validation 258 func TestRDAddendumABOFDCorrectionIndicator(t *testing.T) { 259 rdAddendumA := mockReturnDetailAddendumA() 260 rdAddendumA.BOFDCorrectionIndicator = 10 261 err := rdAddendumA.Validate() 262 var e *FieldError 263 require.ErrorAs(t, err, &e) 264 require.Equal(t, "BOFDCorrectionIndicator", e.FieldName) 265 } 266 267 // TestRDAddendumAUserField validation 268 func TestRDAddendumAUserField(t *testing.T) { 269 rdAddendumA := mockReturnDetailAddendumA() 270 rdAddendumA.UserField = "®©" 271 err := rdAddendumA.Validate() 272 var e *FieldError 273 require.ErrorAs(t, err, &e) 274 require.Equal(t, "UserField", e.FieldName) 275 } 276 277 // Field Inclusion 278 279 // TestRDAddendumAFIRecordType validation 280 func TestRDAddendumAFIRecordType(t *testing.T) { 281 rdAddendumA := mockReturnDetailAddendumA() 282 rdAddendumA.recordType = "" 283 err := rdAddendumA.Validate() 284 var e *FieldError 285 require.ErrorAs(t, err, &e) 286 require.Equal(t, "recordType", e.FieldName) 287 } 288 289 // TestRDAddendumAFIRecordNumber validation 290 func TestRDAddendumAFIRecordNumber(t *testing.T) { 291 rdAddendumA := mockReturnDetailAddendumA() 292 rdAddendumA.RecordNumber = 0 293 err := rdAddendumA.Validate() 294 var e *FieldError 295 require.ErrorAs(t, err, &e) 296 require.Equal(t, "RecordNumber", e.FieldName) 297 } 298 299 // TestRDAddendumAFIReturnLocationRoutingNumber validation 300 func TestRDAddendumAFIReturnLocationRoutingNumber(t *testing.T) { 301 rdAddendumA := mockReturnDetailAddendumA() 302 rdAddendumA.ReturnLocationRoutingNumber = "" 303 err := rdAddendumA.Validate() 304 var e *FieldError 305 require.ErrorAs(t, err, &e) 306 require.Equal(t, "ReturnLocationRoutingNumber", e.FieldName) 307 } 308 309 // TestRDAddendumAFIReturnLocationRoutingNumberZero validation 310 func TestRDAddendumAFIReturnLocationRoutingNumberZero(t *testing.T) { 311 rdAddendumA := mockReturnDetailAddendumA() 312 rdAddendumA.ReturnLocationRoutingNumber = "000000000" 313 err := rdAddendumA.Validate() 314 var e *FieldError 315 require.ErrorAs(t, err, &e) 316 require.Equal(t, "ReturnLocationRoutingNumber", e.FieldName) 317 } 318 319 // TestRDAddendumAFIBOFDEndorsementDate validation 320 func TestRDAddendumAFIBOFDEndorsementDate(t *testing.T) { 321 rdAddendumA := mockReturnDetailAddendumA() 322 rdAddendumA.BOFDEndorsementDate = time.Time{} 323 err := rdAddendumA.Validate() 324 var e *FieldError 325 require.ErrorAs(t, err, &e) 326 require.Equal(t, "BOFDEndorsementDate", e.FieldName) 327 } 328 329 // TestRDAddendumAFITruncationIndicator validation 330 func TestRDAddendumAFITruncationIndicator(t *testing.T) { 331 rdAddendumA := mockReturnDetailAddendumA() 332 rdAddendumA.TruncationIndicator = "" 333 err := rdAddendumA.Validate() 334 var e *FieldError 335 require.ErrorAs(t, err, &e) 336 require.Equal(t, "TruncationIndicator", e.FieldName) 337 }