github.com/moov-io/imagecashletter@v0.10.1/bundleHeader_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 // mockBundleHeader creates a BundleHeader 16 func mockBundleHeader() *BundleHeader { 17 bh := NewBundleHeader() 18 bh.CollectionTypeIndicator = "01" 19 bh.DestinationRoutingNumber = "231380104" 20 bh.ECEInstitutionRoutingNumber = "121042882" 21 bh.BundleBusinessDate = time.Now() 22 bh.BundleCreationDate = time.Now() 23 bh.BundleID = "9999" 24 bh.BundleSequenceNumber = "1" 25 bh.CycleNumber = "01" 26 bh.UserField = "" 27 return bh 28 } 29 30 // testMockBundleHeader creates a BundleHeader 31 func testMockBundleHeader(t testing.TB) { 32 bh := mockBundleHeader() 33 require.NoError(t, bh.Validate()) 34 require.Equal(t, "20", bh.recordType) 35 require.Equal(t, "01", bh.CollectionTypeIndicator) 36 require.Equal(t, "231380104", bh.DestinationRoutingNumber) 37 require.Equal(t, "121042882", bh.ECEInstitutionRoutingNumber) 38 require.Equal(t, "9999", bh.BundleID) 39 require.Equal(t, "1", bh.BundleSequenceNumber) 40 require.Equal(t, "01", bh.CycleNumber) 41 require.Equal(t, "", bh.UserField) 42 } 43 44 // TestMockBundleHeader tests creating a BundleHeader 45 func TestMockBundleHeader(t *testing.T) { 46 testMockBundleHeader(t) 47 } 48 49 // BenchmarkMockBundleHeader benchmarks creating a BundleHeader 50 func BenchmarkMockBundleHeader(b *testing.B) { 51 b.ReportAllocs() 52 for i := 0; i < b.N; i++ { 53 testMockBundleHeader(b) 54 } 55 } 56 57 // parseBundleHeader validates parsing a BundleHeader 58 func parseBundleHeader(t testing.TB) { 59 var line = "200123138010412104288220180905201809059999 1 01 " 60 r := NewReader(strings.NewReader(line)) 61 r.line = line 62 clh := mockCashLetterHeader() 63 r.addCurrentCashLetter(NewCashLetter(clh)) 64 bh := mockBundleHeader() 65 r.currentCashLetter.AddBundle(NewBundle(bh)) 66 67 require.NoError(t, r.parseBundleHeader()) 68 69 record := r.currentCashLetter.currentBundle.BundleHeader 70 require.Equal(t, "20", record.recordType) 71 require.Equal(t, "01", record.CollectionTypeIndicatorField()) 72 require.Equal(t, "231380104", record.DestinationRoutingNumberField()) 73 require.Equal(t, "121042882", record.ECEInstitutionRoutingNumberField()) 74 require.Equal(t, "20180905", record.BundleBusinessDateField()) 75 require.Equal(t, "20180905", record.BundleCreationDateField()) 76 require.Equal(t, "9999 ", record.BundleIDField()) 77 require.Equal(t, "1 ", record.BundleSequenceNumberField()) 78 require.Equal(t, "01", record.CycleNumberField()) 79 require.Equal(t, " ", record.ReturnLocationRoutingNumberField()) 80 require.Equal(t, " ", record.UserFieldField()) 81 require.Equal(t, " ", record.reservedField()) 82 } 83 84 // TestParseBundleHeader tests validating parsing a BundleHeader 85 func TestParseBundleHeader(t *testing.T) { 86 parseBundleHeader(t) 87 } 88 89 // BenchmarkParseBundleHeader benchmarks validating parsing a BundleHeader 90 func BenchmarkParseBundleHeader(b *testing.B) { 91 b.ReportAllocs() 92 for i := 0; i < b.N; i++ { 93 parseBundleHeader(b) 94 } 95 } 96 97 // testBHString validates that a known parsed BundleHeader can return to a string of the same value 98 func testBHString(t testing.TB) { 99 var line = "200123138010412104288220180905201809059999 1 01 " 100 r := NewReader(strings.NewReader(line)) 101 r.line = line 102 clh := mockCashLetterHeader() 103 r.addCurrentCashLetter(NewCashLetter(clh)) 104 bh := mockBundleHeader() 105 r.currentCashLetter.AddBundle(NewBundle(bh)) 106 require.NoError(t, r.parseBundleHeader()) 107 record := r.currentCashLetter.currentBundle.BundleHeader 108 require.Equal(t, line, record.String()) 109 } 110 111 // TestBHString tests validating that a known parsed BundleHeader can return to a string of the same value 112 func TestBHString(t *testing.T) { 113 testBHString(t) 114 } 115 116 // BenchmarkBHString benchmarks validating that a known parsed BundleHeader 117 // can return to a string of the same value 118 func BenchmarkBHString(b *testing.B) { 119 b.ReportAllocs() 120 for i := 0; i < b.N; i++ { 121 testBHString(b) 122 } 123 } 124 125 // TestBHRecordType validation 126 func TestBHRecordType(t *testing.T) { 127 bh := mockBundleHeader() 128 bh.recordType = "00" 129 err := bh.Validate() 130 var e *FieldError 131 require.ErrorAs(t, err, &e) 132 require.Equal(t, "recordType", e.FieldName) 133 } 134 135 // TestBHCollectionTypeIndicator validation 136 func TestBHCollectionTypeIndicator(t *testing.T) { 137 bh := mockBundleHeader() 138 bh.CollectionTypeIndicator = "87" 139 err := bh.Validate() 140 var e *FieldError 141 require.ErrorAs(t, err, &e) 142 require.Equal(t, "CollectionTypeIndicator", e.FieldName) 143 } 144 145 // TestBundleID validation 146 func TestBundleID(t *testing.T) { 147 bh := mockBundleHeader() 148 bh.BundleID = "--" 149 err := bh.Validate() 150 var e *FieldError 151 require.ErrorAs(t, err, &e) 152 require.Equal(t, "BundleID", e.FieldName) 153 } 154 155 // TestCycleNumber validation 156 func TestCycleNumber(t *testing.T) { 157 bh := mockBundleHeader() 158 bh.CycleNumber = "--" 159 err := bh.Validate() 160 var e *FieldError 161 require.ErrorAs(t, err, &e) 162 require.Equal(t, "CycleNumber", e.FieldName) 163 } 164 165 // TestBHUserField validation 166 func TestBHUserFieldI(t *testing.T) { 167 bh := mockBundleHeader() 168 bh.UserField = "®©" 169 err := bh.Validate() 170 var e *FieldError 171 require.ErrorAs(t, err, &e) 172 require.Equal(t, "UserField", e.FieldName) 173 } 174 175 // TestBHFieldInclusionRecordType validates FieldInclusion 176 func TestBHFieldInclusionRecordType(t *testing.T) { 177 bh := mockBundleHeader() 178 bh.recordType = "" 179 err := bh.Validate() 180 var e *FieldError 181 require.ErrorAs(t, err, &e) 182 require.Equal(t, "recordType", e.FieldName) 183 } 184 185 // TestBHFieldInclusionCollectionTypeIndicator validates FieldInclusion 186 func TestBHFieldInclusionCollectionTypeIndicator(t *testing.T) { 187 bh := mockBundleHeader() 188 bh.CollectionTypeIndicator = "" 189 err := bh.Validate() 190 var e *FieldError 191 require.ErrorAs(t, err, &e) 192 require.Equal(t, "CollectionTypeIndicator", e.FieldName) 193 } 194 195 // TestBHFieldInclusionDestinationRoutingNumber validates FieldInclusion 196 func TestBHFieldInclusionDestinationRoutingNumber(t *testing.T) { 197 bh := mockBundleHeader() 198 bh.DestinationRoutingNumber = "" 199 err := bh.Validate() 200 var e *FieldError 201 require.ErrorAs(t, err, &e) 202 require.Equal(t, "DestinationRoutingNumber", e.FieldName) 203 } 204 205 // TestBHFieldInclusionDestinationRoutingNumberZero validates FieldInclusion 206 func TestBHFieldInclusionDestinationRoutingNumberZero(t *testing.T) { 207 bh := mockBundleHeader() 208 bh.DestinationRoutingNumber = "000000000" 209 err := bh.Validate() 210 var e *FieldError 211 require.ErrorAs(t, err, &e) 212 require.Equal(t, "DestinationRoutingNumber", e.FieldName) 213 } 214 215 // TestBHFieldInclusionECEInstitutionRoutingNumber validates FieldInclusion 216 func TestBHFieldInclusionECEInstitutionRoutingNumber(t *testing.T) { 217 bh := mockBundleHeader() 218 bh.ECEInstitutionRoutingNumber = "" 219 err := bh.Validate() 220 var e *FieldError 221 require.ErrorAs(t, err, &e) 222 require.Equal(t, "ECEInstitutionRoutingNumber", e.FieldName) 223 } 224 225 // TestBHFieldInclusionECEInstitutionRoutingNumberZero validates FieldInclusion 226 func TestBHFieldInclusionECEInstitutionRoutingNumberZero(t *testing.T) { 227 bh := mockBundleHeader() 228 bh.ECEInstitutionRoutingNumber = "000000000" 229 err := bh.Validate() 230 var e *FieldError 231 require.ErrorAs(t, err, &e) 232 require.Equal(t, "ECEInstitutionRoutingNumber", e.FieldName) 233 } 234 235 // TestBHFieldInclusionBundleBusinessDate validates FieldInclusion 236 func TestBHFieldInclusionBundleBusinessDate(t *testing.T) { 237 bh := mockBundleHeader() 238 bh.BundleBusinessDate = time.Time{} 239 err := bh.Validate() 240 var e *FieldError 241 require.ErrorAs(t, err, &e) 242 require.Equal(t, "BundleBusinessDate", e.FieldName) 243 } 244 245 // TestBHFieldInclusionBundleCreationDate validates FieldInclusion 246 func TestBHFieldInclusionBundleCreationDate(t *testing.T) { 247 bh := mockBundleHeader() 248 bh.BundleCreationDate = time.Time{} 249 err := bh.Validate() 250 var e *FieldError 251 require.ErrorAs(t, err, &e) 252 require.Equal(t, "BundleCreationDate", e.FieldName) 253 } 254 255 // TestBHFieldInclusionBundleSequenceNumber validates FieldInclusion 256 func TestBHFieldInclusionBundleSequenceNumber(t *testing.T) { 257 bh := mockBundleHeader() 258 bh.BundleSequenceNumber = " " 259 err := bh.Validate() 260 var e *FieldError 261 require.ErrorAs(t, err, &e) 262 require.Equal(t, "BundleSequenceNumber", e.FieldName) 263 } 264 265 // TestBundleHeaderRuneCountInString validates RuneCountInString 266 func TestBundleHeaderRuneCountInString(t *testing.T) { 267 bh := NewBundleHeader() 268 var line = "20" 269 bh.Parse(line) 270 271 require.Equal(t, "", bh.CycleNumber) 272 }