github.com/moov-io/imagecashletter@v0.10.1/creditItem_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 11 "github.com/stretchr/testify/require" 12 ) 13 14 // mockCreditItem creates a CreditItem 15 func mockCreditItem() *CreditItem { 16 ci := NewCreditItem() 17 ci.AuxiliaryOnUs = "123456789" 18 ci.ExternalProcessingCode = "" 19 ci.PostingBankRoutingNumber = "031300012" 20 ci.OnUs = "5558881" 21 ci.ItemAmount = 100000 // 1000.00 22 ci.CreditItemSequenceNumber = "1 " 23 ci.DocumentationTypeIndicator = "G" 24 ci.AccountTypeCode = "1" 25 ci.SourceWorkCode = "01" 26 ci.UserField = " " 27 return ci 28 } 29 30 // TestMockCreditItem creates a CreditItem 31 func TestMockCreditItem(t *testing.T) { 32 ci := mockCreditItem() 33 require.NoError(t, ci.Validate()) 34 require.Equal(t, "62", ci.recordType) 35 require.Equal(t, "123456789", ci.AuxiliaryOnUs) 36 require.Equal(t, "", ci.ExternalProcessingCode) 37 require.Equal(t, "031300012", ci.PostingBankRoutingNumber) 38 require.Equal(t, "5558881", ci.OnUs) 39 require.Equal(t, 100000, ci.ItemAmount) 40 require.Equal(t, "1 ", ci.CreditItemSequenceNumber) 41 require.Equal(t, "G", ci.DocumentationTypeIndicator) 42 require.Equal(t, "1", ci.AccountTypeCode) 43 require.Equal(t, "01", ci.SourceWorkCode) 44 require.Equal(t, " ", ci.UserField) 45 } 46 47 func TestCreditItemCrash(t *testing.T) { 48 ci := &CreditItem{} 49 ci.Parse(`100000000000400000000200001010000010100000IG000000000000000000000000000000000 00`) 50 require.Equal(t, "", ci.UserField) 51 } 52 53 // TestParseCreditItem validates parsing a CreditItem 54 func TestParseCreditItem(t *testing.T) { 55 var line = "62 123456789 031300012 5558881000000001000001 G101 " 56 r := NewReader(strings.NewReader(line)) 57 r.line = line 58 clh := mockCashLetterHeader() 59 r.addCurrentCashLetter(NewCashLetter(clh)) 60 ci := mockCreditItem() 61 r.currentCashLetter.AddCreditItem(ci) 62 require.NoError(t, r.parseCreditItem()) 63 record := r.currentCashLetter.GetCreditItems()[0] 64 65 require.Equal(t, "62", record.recordType) 66 require.Equal(t, "123456789", record.AuxiliaryOnUs) 67 require.Equal(t, "", record.ExternalProcessingCode) 68 require.Equal(t, "031300012", record.PostingBankRoutingNumber) 69 require.Equal(t, "5558881", record.OnUs) 70 require.Equal(t, 100000, record.ItemAmount) 71 require.Equal(t, "1 ", record.CreditItemSequenceNumber) 72 require.Equal(t, "G", record.DocumentationTypeIndicator) 73 require.Equal(t, "1", record.AccountTypeCode) 74 require.Equal(t, "01", record.SourceWorkCode) 75 require.Equal(t, " ", record.UserField) 76 } 77 78 // testCIString validates parsing a CreditItem 79 func testCIString(t testing.TB) { 80 var line = "62 123456789 031300012 5558881000000001000001 G101 " 81 r := NewReader(strings.NewReader(line)) 82 r.line = line 83 clh := mockCashLetterHeader() 84 r.addCurrentCashLetter(NewCashLetter(clh)) 85 ci := mockCreditItem() 86 r.currentCashLetter.AddCreditItem(ci) 87 require.NoError(t, r.parseCreditItem()) 88 record := r.currentCashLetter.GetCreditItems()[0] 89 90 require.Equal(t, line, record.String()) 91 } 92 93 // TestCIString tests validating that a known parsed CheckDetail can return to a string of the same value 94 func TestCIString(t *testing.T) { 95 testCIString(t) 96 } 97 98 // BenchmarkCIString benchmarks validating that a known parsed CreditItem 99 // can return to a string of the same value 100 func BenchmarkCIString(b *testing.B) { 101 b.ReportAllocs() 102 for i := 0; i < b.N; i++ { 103 testCIString(b) 104 } 105 } 106 107 // TestCIRecordType validation 108 func TestCIRecordType(t *testing.T) { 109 ci := mockCreditItem() 110 ci.recordType = "00" 111 err := ci.Validate() 112 var e *FieldError 113 require.ErrorAs(t, err, &e) 114 require.Equal(t, "recordType", e.FieldName) 115 } 116 117 // TestCIDocumentationTypeIndicator validation 118 func TestCIDocumentationTypeIndicator(t *testing.T) { 119 ci := mockCreditItem() 120 ci.DocumentationTypeIndicator = "P" 121 err := ci.Validate() 122 var e *FieldError 123 require.ErrorAs(t, err, &e) 124 require.Equal(t, "DocumentationTypeIndicator", e.FieldName) 125 } 126 127 // TestCIDocumentationTypeIndicatorZ validation 128 func TestCIDocumentationTypeIndicatorZ(t *testing.T) { 129 ci := mockCreditItem() 130 ci.DocumentationTypeIndicator = "Z" 131 err := ci.Validate() 132 var e *FieldError 133 require.ErrorAs(t, err, &e) 134 require.Equal(t, "DocumentationTypeIndicator", e.FieldName) 135 } 136 137 // TestCIDocumentationTypeIndicatorM validation 138 func TestCIDocumentationTypeIndicatorM(t *testing.T) { 139 ci := mockCreditItem() 140 ci.DocumentationTypeIndicator = "M" 141 err := ci.Validate() 142 var e *FieldError 143 require.ErrorAs(t, err, &e) 144 require.Equal(t, "DocumentationTypeIndicator", e.FieldName) 145 } 146 147 // TestCIAccountTypeCode validation 148 func TestCIAccountTypeCode(t *testing.T) { 149 ci := mockCreditItem() 150 ci.AccountTypeCode = "Z" 151 err := ci.Validate() 152 var e *FieldError 153 require.ErrorAs(t, err, &e) 154 require.Equal(t, "AccountTypeCode", e.FieldName) 155 } 156 157 // TestCISourceWorkCode validation 158 func TestCISourceWorkCode(t *testing.T) { 159 ci := mockCreditItem() 160 ci.SourceWorkCode = "99" 161 err := ci.Validate() 162 var e *FieldError 163 require.ErrorAs(t, err, &e) 164 require.Equal(t, "SourceWorkCode", e.FieldName) 165 } 166 167 // TestCIUserField validation 168 func TestCIUserField(t *testing.T) { 169 ci := mockCreditItem() 170 ci.UserField = "®©" 171 err := ci.Validate() 172 var e *FieldError 173 require.ErrorAs(t, err, &e) 174 require.Equal(t, "UserField", e.FieldName) 175 } 176 177 // Field Inclusion 178 179 // TestCIFIRecordType validation 180 func TestCIFIRecordType(t *testing.T) { 181 ci := mockCreditItem() 182 ci.recordType = "" 183 err := ci.Validate() 184 var e *FieldError 185 require.ErrorAs(t, err, &e) 186 require.Equal(t, "recordType", e.FieldName) 187 } 188 189 // TestCIFIPostingBankRoutingNumber validation 190 func TestCIFIPostingBankRoutingNumber(t *testing.T) { 191 ci := mockCreditItem() 192 ci.PostingBankRoutingNumber = "" 193 err := ci.Validate() 194 var e *FieldError 195 require.ErrorAs(t, err, &e) 196 require.Equal(t, "PostingBankRoutingNumber", e.FieldName) 197 } 198 199 // TestCIFIPostingBankRoutingNumberZero validation 200 func TestCIFIPostingBankRoutingNumberZero(t *testing.T) { 201 ci := mockCreditItem() 202 ci.PostingBankRoutingNumber = "000000000" 203 err := ci.Validate() 204 var e *FieldError 205 require.ErrorAs(t, err, &e) 206 require.Equal(t, "PostingBankRoutingNumber", e.FieldName) 207 } 208 209 // TestCIFICreditItemSequenceNumber validation 210 func TestCIFICreditItemSequenceNumber(t *testing.T) { 211 ci := mockCreditItem() 212 ci.CreditItemSequenceNumber = "" 213 err := ci.Validate() 214 var e *FieldError 215 require.ErrorAs(t, err, &e) 216 require.Equal(t, "CreditItemSequenceNumber", e.FieldName) 217 }