github.com/moov-io/imagecashletter@v0.10.1/returnDetailAddendumB_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 "encoding/json" 9 "strings" 10 "testing" 11 "time" 12 13 "github.com/stretchr/testify/assert" 14 "github.com/stretchr/testify/require" 15 ) 16 17 // mockReturnDetailAddendumB creates a ReturnDetailAddendumB 18 func mockReturnDetailAddendumB() ReturnDetailAddendumB { 19 rdAddendumB := NewReturnDetailAddendumB() 20 rdAddendumB.PayorBankName = "Payor Bank Name" 21 rdAddendumB.AuxiliaryOnUs = "123456789" 22 rdAddendumB.PayorBankSequenceNumber = "1 " 23 rdAddendumB.PayorBankBusinessDate = time.Now() 24 rdAddendumB.PayorAccountName = "Payor Account Name" 25 return rdAddendumB 26 } 27 28 func TestReturnDetailAddendumBParseErr(t *testing.T) { 29 var r ReturnDetailAddendumB 30 r.Parse("Asdjashfakjfa") 31 require.Equal(t, "", r.PayorBankName) 32 } 33 34 // TestMockReturnDetailAddendumB creates a ReturnDetailAddendumB 35 func TestMockReturnDetailAddendumB(t *testing.T) { 36 rdAddendumB := mockReturnDetailAddendumB() 37 require.NoError(t, rdAddendumB.Validate()) 38 require.Equal(t, "33", rdAddendumB.recordType) 39 require.Equal(t, "Payor Bank Name", rdAddendumB.PayorBankName) 40 require.Equal(t, "123456789", rdAddendumB.AuxiliaryOnUs) 41 require.Equal(t, "1 ", rdAddendumB.PayorBankSequenceNumber) 42 require.Equal(t, "Payor Account Name", rdAddendumB.PayorAccountName) 43 } 44 45 // TestParseReturnDetailAddendumB validates parsing a ReturnDetailAddendumB 46 func TestParseReturnDetailAddendumB(t *testing.T) { 47 var line = "33Payor Bank Name 1234567891 20180905Payor Account Name " 48 r := NewReader(strings.NewReader(line)) 49 r.line = line 50 clh := mockCashLetterHeader() 51 r.addCurrentCashLetter(NewCashLetter(clh)) 52 bh := mockBundleHeader() 53 rb := NewBundle(bh) 54 r.currentCashLetter.AddBundle(rb) 55 r.addCurrentBundle(rb) 56 rd := mockReturnDetail() 57 r.currentCashLetter.currentBundle.AddReturnDetail(rd) 58 59 require.NoError(t, r.parseReturnDetailAddendumB()) 60 record := r.currentCashLetter.currentBundle.GetReturns()[0].ReturnDetailAddendumB[0] 61 62 require.Equal(t, "33", record.recordType) 63 require.Equal(t, "Payor Bank Name ", record.PayorBankNameField()) 64 require.Equal(t, " 123456789", record.AuxiliaryOnUsField()) 65 require.Equal(t, "1 ", record.PayorBankSequenceNumberField()) 66 require.Equal(t, "Payor Account Name ", record.PayorAccountNameField()) 67 } 68 69 // testRDAddendumBString validates that a known parsed ReturnDetailAddendumB can return to a string of the same value 70 func testRDAddendumBString(t testing.TB) { 71 var line = "33Payor Bank Name 1234567891 20180905Payor Account Name " 72 r := NewReader(strings.NewReader(line)) 73 r.line = line 74 clh := mockCashLetterHeader() 75 r.addCurrentCashLetter(NewCashLetter(clh)) 76 bh := mockBundleHeader() 77 rb := NewBundle(bh) 78 r.currentCashLetter.AddBundle(rb) 79 r.addCurrentBundle(rb) 80 rd := mockReturnDetail() 81 r.currentCashLetter.currentBundle.AddReturnDetail(rd) 82 83 require.NoError(t, r.parseReturnDetailAddendumB()) 84 record := r.currentCashLetter.currentBundle.GetReturns()[0].ReturnDetailAddendumB[0] 85 86 require.Equal(t, line, record.String()) 87 } 88 89 // TestParseAddendumBJSONWith3339Date tests parsing ReturnAddendumB with a PayorBankBusinessDate in RFC3339 format 90 func TestParseAddendumBJSONWith3339Date(t *testing.T) { 91 addB := ReturnDetailAddendumB{} 92 var testBusinessDateJSON = `{ 93 "id": "", 94 "payorBankName": "", 95 "auxiliaryOnUs": "", 96 "payorBankSequenceNumber": "3713365076", 97 "payorAccountName": "", 98 "payorBankBusinessDate": "2021-01-21T00:00:00Z" 99 }` 100 assert.NoError( 101 t, 102 json.Unmarshal([]byte(testBusinessDateJSON), &addB), 103 "Unable to unmarshal ReturnDetailAddendumB", 104 ) 105 assert.Equal( 106 t, 107 "3713365076", 108 addB.PayorBankSequenceNumber, 109 "PayorBankSequenceNumber should match JSON", 110 ) 111 parsedTime, timeParseErr := time.Parse( 112 time.RFC3339, 113 "2021-01-21T00:00:00Z", 114 ) 115 assert.NoError(t, timeParseErr, "Unable to parse test time") 116 assert.True(t, addB.PayorBankBusinessDate.Equal(parsedTime), "PayorBankBusinessDate should match JSON") 117 118 marshalled, marshalErr := json.Marshal(addB) 119 assert.NoError(t, marshalErr, "Unable to marshal ReturnDetailAddendumB to JSON") 120 assert.Contains( 121 t, 122 string(marshalled), 123 "2021-01-21T00:00:00Z", 124 "JSON should contain PayorBankBusinessDate", 125 ) 126 } 127 128 // TestParseAddendumBJSONWithX9Date tests parsing ReturnAddendumB with a PayorBankBusinessDate in X9's YYYYMMDD format 129 func TestParseAddendumBJSONWithX9Date(t *testing.T) { 130 addB := ReturnDetailAddendumB{} 131 var testBusinessDateJSON = `{ 132 "id": "", 133 "payorBankName": "", 134 "auxiliaryOnUs": "", 135 "payorBankSequenceNumber": "3713365076", 136 "payorAccountName": "", 137 "payorBankBusinessDate": "20210121" 138 }` 139 assert.NoError( 140 t, 141 json.Unmarshal([]byte(testBusinessDateJSON), &addB), 142 "Unable to unmarshal ReturnDetailAddendumB", 143 ) 144 assert.Equal( 145 t, 146 "3713365076", 147 addB.PayorBankSequenceNumber, 148 "PayorBankSequenceNumber should match JSON", 149 ) 150 parsedTime, timeParseErr := time.Parse( 151 time.RFC3339, 152 "2021-01-21T00:00:00Z", 153 ) 154 assert.NoError(t, timeParseErr, "Unable to parse test time") 155 assert.True(t, addB.PayorBankBusinessDate.Equal(parsedTime), "PayorBankBusinessDate should match JSON") 156 157 marshalled, marshalErr := json.Marshal(addB) 158 assert.NoError(t, marshalErr, "Unable to marshal ReturnDetailAddendumB to JSON") 159 assert.Contains( 160 t, 161 string(marshalled), 162 "2021-01-21T00:00:00Z", 163 "JSON should contain PayorBankBusinessDate", 164 ) 165 } 166 167 // TestParseAddendumBJSONWith3339Date tests parsing ReturnAddendumB with a PayorBankBusinessDate that is empty 168 func TestParseAddendumBJSONWithEmptyDate(t *testing.T) { 169 addB := ReturnDetailAddendumB{} 170 var testNoBusinessDateJSON = `{ 171 "id": "", 172 "payorBankName": "", 173 "auxiliaryOnUs": "", 174 "payorBankSequenceNumber": "3713365088", 175 "payorAccountName": "", 176 "payorBankBusinessDate": "" 177 }` 178 179 assert.NoError( 180 t, 181 json.Unmarshal([]byte(testNoBusinessDateJSON), &addB), 182 "Unable to unmarshal ReturnDetailAddendumB", 183 ) 184 assert.Equal( 185 t, 186 "3713365088", 187 addB.PayorBankSequenceNumber, 188 "PayorBankSequenceNumber should match JSON", 189 ) 190 assert.True( 191 t, 192 addB.PayorBankBusinessDate.IsZero(), 193 "PayorBankBusinessDate should be a time.Time zero value", 194 ) 195 196 marshalled, marshalErr := json.Marshal(addB) 197 assert.NoError(t, marshalErr, "Unable to marshal ReturnDetailAddendumB to JSON") 198 assert.NotContains( 199 t, 200 string(marshalled), 201 "0001-01-01", 202 "JSON should not contain a time.Time zero value", 203 ) 204 } 205 206 // TestRDAddendumBString tests validating that a known parsed ReturnDetailAddendumB can return to a string of the 207 // same value 208 func TestRDAddendumBString(t *testing.T) { 209 testRDAddendumBString(t) 210 } 211 212 // BenchmarkRDAddendumBString benchmarks validating that a known parsed ReturnDetailAddendumB 213 // can return to a string of the same value 214 func BenchmarkRDAddendumBString(b *testing.B) { 215 b.ReportAllocs() 216 for i := 0; i < b.N; i++ { 217 testRDAddendumBString(b) 218 } 219 } 220 221 // TestRDAddendumBRecordType validation 222 func TestRDAddendumBRecordType(t *testing.T) { 223 rdAddendumB := mockReturnDetailAddendumB() 224 rdAddendumB.recordType = "00" 225 err := rdAddendumB.Validate() 226 var e *FieldError 227 require.ErrorAs(t, err, &e) 228 require.Equal(t, "recordType", e.FieldName) 229 } 230 231 // TestRDAddendumBPayorBankName validation 232 func TestRDAddendumBPayorBankName(t *testing.T) { 233 rdAddendumB := mockReturnDetailAddendumB() 234 rdAddendumB.PayorBankName = "®©" 235 err := rdAddendumB.Validate() 236 var e *FieldError 237 require.ErrorAs(t, err, &e) 238 require.Equal(t, "PayorBankName", e.FieldName) 239 } 240 241 // TestRDAddendumBPayorAccountName validation 242 func TestRDAddendumBPayorAccountName(t *testing.T) { 243 rdAddendumB := mockReturnDetailAddendumB() 244 rdAddendumB.PayorAccountName = "®©" 245 err := rdAddendumB.Validate() 246 var e *FieldError 247 require.ErrorAs(t, err, &e) 248 require.Equal(t, "PayorAccountName", e.FieldName) 249 } 250 251 // Field Inclusion 252 253 // TestRDAddendumBFIRecordType validation 254 func TestRDAddendumBFIRecordType(t *testing.T) { 255 rdAddendumB := mockReturnDetailAddendumB() 256 rdAddendumB.recordType = "" 257 err := rdAddendumB.Validate() 258 var e *FieldError 259 require.ErrorAs(t, err, &e) 260 require.Equal(t, "recordType", e.FieldName) 261 } 262 263 // TestRDAddendumBFIPayorBankSequenceNumber validation 264 func TestRDAddendumBFIPayorBankSequenceNumber(t *testing.T) { 265 rdAddendumB := mockReturnDetailAddendumB() 266 rdAddendumB.PayorBankSequenceNumber = " " 267 err := rdAddendumB.Validate() 268 var e *FieldError 269 require.ErrorAs(t, err, &e) 270 require.Equal(t, "PayorBankSequenceNumber", e.FieldName) 271 } 272 273 // TestRDAddendumBFIPayorBankBusinessDate validation 274 func TestRDAddendumPayorBankBusinessDate(t *testing.T) { 275 rdAddendumB := mockReturnDetailAddendumB() 276 date := time.Date(1990, time.January, 1, 0, 0, 0, 0, time.UTC) 277 rdAddendumB.PayorBankBusinessDate = date 278 err := rdAddendumB.Validate() 279 var e *FieldError 280 require.ErrorAs(t, err, &e) 281 require.Equal(t, "PayorBankBusinessDate", e.FieldName) 282 require.Contains(t, e.Msg, msgInvalidDate) 283 }