github.com/moov-io/imagecashletter@v0.10.1/checkDetailAddendumA_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 // mockCheckDetailAddendumA creates a CheckDetailAddendumA 16 func mockCheckDetailAddendumA() CheckDetailAddendumA { 17 cdAddendumA := NewCheckDetailAddendumA() 18 cdAddendumA.RecordNumber = 1 19 cdAddendumA.ReturnLocationRoutingNumber = "121042882" 20 cdAddendumA.BOFDEndorsementDate = time.Now() 21 cdAddendumA.BOFDItemSequenceNumber = "1 " 22 cdAddendumA.BOFDAccountNumber = "938383" 23 cdAddendumA.BOFDBranchCode = "01" 24 cdAddendumA.PayeeName = "Test Payee" 25 cdAddendumA.TruncationIndicator = "Y" 26 cdAddendumA.BOFDConversionIndicator = "1" 27 cdAddendumA.BOFDCorrectionIndicator = 0 28 cdAddendumA.UserField = "" 29 return cdAddendumA 30 } 31 32 func TestCheckDetailAddendumParseErr(t *testing.T) { 33 var c CheckDetailAddendumA 34 c.Parse("asdshfaksjs") 35 require.Equal(t, 0, c.RecordNumber) 36 } 37 38 // TestMockCheckDetailAddendumA creates a CheckDetailAddendumA 39 func TestMockCheckDetailAddendumA(t *testing.T) { 40 cdAddendumA := mockCheckDetailAddendumA() 41 require.NoError(t, cdAddendumA.Validate()) 42 require.Equal(t, "26", cdAddendumA.recordType) 43 require.Equal(t, 1, cdAddendumA.RecordNumber) 44 require.Equal(t, "121042882", cdAddendumA.ReturnLocationRoutingNumber) 45 require.Equal(t, "1 ", cdAddendumA.BOFDItemSequenceNumber) 46 require.Equal(t, "938383", cdAddendumA.BOFDAccountNumber) 47 require.Equal(t, "01", cdAddendumA.BOFDBranchCode) 48 require.Equal(t, "Test Payee", cdAddendumA.PayeeName) 49 require.Equal(t, "Y", cdAddendumA.TruncationIndicator) 50 require.Equal(t, "1", cdAddendumA.BOFDConversionIndicator) 51 require.Equal(t, 0, cdAddendumA.BOFDCorrectionIndicator) 52 require.Equal(t, "", cdAddendumA.UserField) 53 } 54 55 // TestParseCheckDetailAddendumA validates parsing a CheckDetailAddendumA 56 func TestParseCheckDetailAddendumA(t *testing.T) { 57 var line = "261121042882201809051 938383 01 Test Payee Y10 " 58 r := NewReader(strings.NewReader(line)) 59 r.line = line 60 clh := mockCashLetterHeader() 61 r.addCurrentCashLetter(NewCashLetter(clh)) 62 bh := mockBundleHeader() 63 b := NewBundle(bh) 64 r.currentCashLetter.AddBundle(b) 65 r.addCurrentBundle(b) 66 cd := mockCheckDetail() 67 r.currentCashLetter.currentBundle.AddCheckDetail(cd) 68 69 require.NoError(t, r.parseCheckDetailAddendumA()) 70 record := r.currentCashLetter.currentBundle.GetChecks()[0].CheckDetailAddendumA[0] 71 72 require.Equal(t, "26", record.recordType) 73 require.Equal(t, "1", record.RecordNumberField()) 74 require.Equal(t, "121042882", record.ReturnLocationRoutingNumberField()) 75 require.Equal(t, "20180905", record.BOFDEndorsementDateField()) 76 require.Equal(t, "1 ", record.BOFDItemSequenceNumberField()) 77 require.Equal(t, "938383 ", record.BOFDAccountNumberField()) 78 require.Equal(t, "01 ", record.BOFDBranchCodeField()) 79 require.Equal(t, "Test Payee ", record.PayeeNameField()) 80 require.Equal(t, "Y", record.TruncationIndicatorField()) 81 require.Equal(t, "1", record.BOFDConversionIndicatorField()) 82 require.Equal(t, "0", record.BOFDCorrectionIndicatorField()) 83 require.Equal(t, " ", record.UserFieldField()) 84 require.Equal(t, " ", record.reservedField()) 85 } 86 87 // testCDAddendumAString validates that a known parsed CheckDetailAddendumA can return to a string of the same value 88 func testCDAddendumAString(t testing.TB) { 89 var line = "261121042882201809051 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 b := NewBundle(bh) 96 r.currentCashLetter.AddBundle(b) 97 r.addCurrentBundle(b) 98 cd := mockCheckDetail() 99 r.currentCashLetter.currentBundle.AddCheckDetail(cd) 100 101 require.NoError(t, r.parseCheckDetailAddendumA()) 102 record := r.currentCashLetter.currentBundle.GetChecks()[0].CheckDetailAddendumA[0] 103 104 require.Equal(t, line, record.String()) 105 } 106 107 // TestCDAddendumAString tests validating that a known parsed CheckDetailAddendumA can return to a string of the 108 // same value 109 func TestCDAddendumAString(t *testing.T) { 110 testCDAddendumAString(t) 111 } 112 113 // BenchmarkCDAddendumAString benchmarks validating that a known parsed CheckDetailAddendumA 114 // can return to a string of the same value 115 func BenchmarkCDAddendumAString(b *testing.B) { 116 b.ReportAllocs() 117 for i := 0; i < b.N; i++ { 118 testCDAddendumAString(b) 119 } 120 } 121 122 // TestCDAddendumARecordType validation 123 func TestCDAddendumARecordType(t *testing.T) { 124 cdAddendumA := mockCheckDetailAddendumA() 125 cdAddendumA.recordType = "00" 126 err := cdAddendumA.Validate() 127 var e *FieldError 128 require.ErrorAs(t, err, &e) 129 require.Equal(t, "recordType", e.FieldName) 130 } 131 132 // TestCDAddendumAReturnLocationRoutingNumber validation 133 func TestCDAddendumAReturnLocationRoutingNumber(t *testing.T) { 134 cdAddendumA := mockCheckDetailAddendumA() 135 cdAddendumA.ReturnLocationRoutingNumber = "X" 136 err := cdAddendumA.Validate() 137 var e *FieldError 138 require.ErrorAs(t, err, &e) 139 require.Equal(t, "ReturnLocationRoutingNumber", e.FieldName) 140 } 141 142 // TestCDAddendumABOFDAccountNumber validation 143 func TestCDAddendumABOFDAccountNumber(t *testing.T) { 144 cdAddendumA := mockCheckDetailAddendumA() 145 cdAddendumA.BOFDAccountNumber = "®©" 146 err := cdAddendumA.Validate() 147 var e *FieldError 148 require.ErrorAs(t, err, &e) 149 require.Equal(t, "BOFDAccountNumber", e.FieldName) 150 } 151 152 // TestCDAddendumABOFDBranchCode validation 153 func TestCDAddendumABOFDBranchCode(t *testing.T) { 154 cdAddendumA := mockCheckDetailAddendumA() 155 cdAddendumA.BOFDBranchCode = "®©" 156 err := cdAddendumA.Validate() 157 var e *FieldError 158 require.ErrorAs(t, err, &e) 159 require.Equal(t, "BOFDBranchCode", e.FieldName) 160 } 161 162 // TestCDAddendumAPayeeName validation 163 func TestCDAddendumAPayeeName(t *testing.T) { 164 cdAddendumA := mockCheckDetailAddendumA() 165 cdAddendumA.PayeeName = "®©" 166 err := cdAddendumA.Validate() 167 var e *FieldError 168 require.ErrorAs(t, err, &e) 169 require.Equal(t, "PayeeName", e.FieldName) 170 } 171 172 // TestCDAddendumATruncationIndicator validation 173 func TestCDAddendumATruncationIndicator(t *testing.T) { 174 cdAddendumA := mockCheckDetailAddendumA() 175 cdAddendumA.TruncationIndicator = "A" 176 err := cdAddendumA.Validate() 177 var e *FieldError 178 require.ErrorAs(t, err, &e) 179 require.Equal(t, "TruncationIndicator", e.FieldName) 180 } 181 182 // TestCDAddendumABOFDConversionIndicator validation 183 func TestCDAddendumABOFDConversionIndicator(t *testing.T) { 184 cdAddendumA := mockCheckDetailAddendumA() 185 cdAddendumA.BOFDConversionIndicator = "99" 186 err := cdAddendumA.Validate() 187 var e *FieldError 188 require.ErrorAs(t, err, &e) 189 require.Equal(t, "BOFDConversionIndicator", e.FieldName) 190 } 191 192 // TestCDAddendumABOFDCorrectionIndicator validation 193 func TestCDAddendumABOFDCorrectionIndicator(t *testing.T) { 194 cdAddendumA := mockCheckDetailAddendumA() 195 cdAddendumA.BOFDCorrectionIndicator = 10 196 err := cdAddendumA.Validate() 197 var e *FieldError 198 require.ErrorAs(t, err, &e) 199 require.Equal(t, "BOFDCorrectionIndicator", e.FieldName) 200 } 201 202 // TestCDAddendumAUserField validation 203 func TestCDAddendumAUserField(t *testing.T) { 204 cdAddendumA := mockCheckDetailAddendumA() 205 cdAddendumA.UserField = "®©" 206 err := cdAddendumA.Validate() 207 var e *FieldError 208 require.ErrorAs(t, err, &e) 209 require.Equal(t, "UserField", e.FieldName) 210 } 211 212 // Field Inclusion 213 214 // TestCDAddendumAFIRecordType validation 215 func TestCDAddendumAFIRecordType(t *testing.T) { 216 cdAddendumA := mockCheckDetailAddendumA() 217 cdAddendumA.recordType = "" 218 err := cdAddendumA.Validate() 219 var e *FieldError 220 require.ErrorAs(t, err, &e) 221 require.Equal(t, "recordType", e.FieldName) 222 } 223 224 // TestCDAddendumAFIRecordNumber validation 225 func TestCDAddendumAFIRecordNumber(t *testing.T) { 226 cdAddendumA := mockCheckDetailAddendumA() 227 cdAddendumA.RecordNumber = 0 228 err := cdAddendumA.Validate() 229 var e *FieldError 230 require.ErrorAs(t, err, &e) 231 require.Equal(t, "RecordNumber", e.FieldName) 232 } 233 234 // TestCDAddendumAFIReturnLocationRoutingNumber validation 235 func TestCDAddendumAFIReturnLocationRoutingNumber(t *testing.T) { 236 cdAddendumA := mockCheckDetailAddendumA() 237 cdAddendumA.ReturnLocationRoutingNumber = "" 238 err := cdAddendumA.Validate() 239 var e *FieldError 240 require.ErrorAs(t, err, &e) 241 require.Equal(t, "ReturnLocationRoutingNumber", e.FieldName) 242 } 243 244 // TestCDAddendumAFIReturnLocationRoutingNumberZero validation 245 func TestCDAddendumAFIReturnLocationRoutingNumberZero(t *testing.T) { 246 cdAddendumA := mockCheckDetailAddendumA() 247 cdAddendumA.ReturnLocationRoutingNumber = "000000000" 248 err := cdAddendumA.Validate() 249 var e *FieldError 250 require.ErrorAs(t, err, &e) 251 require.Equal(t, "ReturnLocationRoutingNumber", e.FieldName) 252 } 253 254 // TestCDAddendumAFIBOFDEndorsementDate validation 255 func TestCDAddendumAFIBOFDEndorsementDate(t *testing.T) { 256 cdAddendumA := mockCheckDetailAddendumA() 257 cdAddendumA.BOFDEndorsementDate = time.Time{} 258 err := cdAddendumA.Validate() 259 var e *FieldError 260 require.ErrorAs(t, err, &e) 261 require.Equal(t, "BOFDEndorsementDate", e.FieldName) 262 } 263 264 // TestCDAddendumAFIBOFDItemSequenceNumber validation 265 func TestCDAddendumAFIBOFDItemSequenceNumber(t *testing.T) { 266 cdAddendumA := mockCheckDetailAddendumA() 267 cdAddendumA.BOFDItemSequenceNumber = " " 268 err := cdAddendumA.Validate() 269 var e *FieldError 270 require.ErrorAs(t, err, &e) 271 require.Equal(t, "BOFDItemSequenceNumber", e.FieldName) 272 } 273 274 // TestCDAddendumAFITruncationIndicator validation 275 func TestCDAddendumAFITruncationIndicator(t *testing.T) { 276 cdAddendumA := mockCheckDetailAddendumA() 277 cdAddendumA.TruncationIndicator = "" 278 err := cdAddendumA.Validate() 279 var e *FieldError 280 require.ErrorAs(t, err, &e) 281 require.Equal(t, "TruncationIndicator", e.FieldName) 282 } 283 284 // End FieldInclusion 285 286 // TestAlphaFieldTrim validation 287 func TestAlphaFieldTrim(t *testing.T) { 288 cdAddendumA := mockCheckDetailAddendumA() 289 cdAddendumA.PayeeName = "Payee Name James Steel" 290 require.Len(t, cdAddendumA.PayeeNameField(), 15) 291 } 292 293 // TestStringFieldTrim validation 294 func TestStringFieldTrim(t *testing.T) { 295 cdAddendumA := mockCheckDetailAddendumA() 296 cdAddendumA.ReturnLocationRoutingNumber = "12345678912345" 297 require.Len(t, cdAddendumA.ReturnLocationRoutingNumberField(), 9) 298 }