github.com/moov-io/imagecashletter@v0.10.1/cashLetterControl_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 // mockCashLetterControl creates a CashLetterControl 16 func mockCashLetterControl() *CashLetterControl { 17 clc := NewCashLetterControl() 18 clc.CashLetterBundleCount = 1 19 clc.CashLetterItemsCount = 7 20 clc.CashLetterTotalAmount = 100000 // 1000.00 21 clc.CashLetterImagesCount = 1 22 clc.ECEInstitutionName = "Wells Fargo" 23 clc.SettlementDate = time.Now() 24 clc.CreditTotalIndicator = 0 25 return clc 26 } 27 28 // TestMockCashLetterControl creates a CashLetterControl 29 func TestMockCashLetterControl(t *testing.T) { 30 clc := mockCashLetterControl() 31 require.NoError(t, clc.Validate()) 32 require.Equal(t, "90", clc.recordType) 33 require.Equal(t, 1, clc.CashLetterBundleCount) 34 require.Equal(t, 7, clc.CashLetterItemsCount) 35 require.Equal(t, 100000, clc.CashLetterTotalAmount) 36 require.Equal(t, 1, clc.CashLetterImagesCount) 37 require.Equal(t, "Wells Fargo", clc.ECEInstitutionName) 38 require.Equal(t, 0, clc.CreditTotalIndicator) 39 } 40 41 // TestParseCashLetterControl parses a known CashLetterControl record string 42 func TestParseCashLetterControl(t *testing.T) { 43 var line = "900000010000000100000000100000000000000Wells Fargo 201809050 " 44 r := NewReader(strings.NewReader(line)) 45 r.line = line 46 clh := mockCashLetterHeader() 47 r.addCurrentCashLetter(NewCashLetter(clh)) 48 require.NoError(t, r.parseCashLetterControl()) 49 record := r.currentCashLetter.CashLetterControl 50 51 require.Equal(t, "90", record.recordType) 52 require.Equal(t, "000001", record.CashLetterBundleCountField()) 53 require.Equal(t, "00000001", record.CashLetterItemsCountField()) 54 require.Equal(t, "00000000100000", record.CashLetterTotalAmountField()) 55 require.Equal(t, "000000000", record.CashLetterImagesCountField()) 56 require.Equal(t, "Wells Fargo ", record.ECEInstitutionNameField()) 57 require.Equal(t, "20180905", record.SettlementDateField()) 58 require.Equal(t, "0", record.CreditTotalIndicatorField()) 59 require.Equal(t, " ", record.reservedField()) 60 } 61 62 // testCLCString validates that a known parsed CashLetterControl can be return to a string of the same value 63 func testCLCString(t testing.TB) { 64 var line = "900000010000000100000000100000000000000Wells Fargo 201809050 " 65 r := NewReader(strings.NewReader(line)) 66 r.line = line 67 clh := mockCashLetterHeader() 68 r.addCurrentCashLetter(NewCashLetter(clh)) 69 require.NoError(t, r.parseCashLetterControl()) 70 record := r.currentCashLetter.CashLetterControl 71 require.Equal(t, line, record.String()) 72 } 73 74 // TestCLCString tests validating that a known parsed CashLetterControl can be return to a string of the same value 75 func TestCLCString(t *testing.T) { 76 testCLCString(t) 77 } 78 79 // BenchmarkCLCString benchmarks validating that a known parsed CashLetterControl can be return to a string of the same value 80 func BenchmarkCLCString(b *testing.B) { 81 b.ReportAllocs() 82 for i := 0; i < b.N; i++ { 83 testCLCString(b) 84 } 85 } 86 87 // TestCLCRecordType validation 88 func TestCLCRecordType(t *testing.T) { 89 clc := mockCashLetterControl() 90 clc.recordType = "00" 91 err := clc.Validate() 92 var fieldErr *FieldError 93 require.ErrorAs(t, err, &fieldErr) 94 require.Equal(t, "recordType", fieldErr.FieldName) 95 } 96 97 // TestECEInstitutionName validation 98 func TestECEInstitutionName(t *testing.T) { 99 clc := mockCashLetterControl() 100 clc.ECEInstitutionName = "®©" 101 err := clc.Validate() 102 var fieldErr *FieldError 103 require.ErrorAs(t, err, &fieldErr) 104 require.Equal(t, "ECEInstitutionName", fieldErr.FieldName) 105 } 106 107 // TestCLCCreditTotalIndicator validation 108 func TestCLCCreditTotalIndicator(t *testing.T) { 109 clc := mockCashLetterControl() 110 clc.CreditTotalIndicator = 9 111 err := clc.Validate() 112 var fieldErr *FieldError 113 require.ErrorAs(t, err, &fieldErr) 114 require.Equal(t, "CreditTotalIndicator", fieldErr.FieldName) 115 } 116 117 // TestCLCFieldInclusionRecordType validates FieldInclusion 118 func TestCLCFieldInclusionRecordType(t *testing.T) { 119 clc := mockCashLetterControl() 120 clc.recordType = "" 121 err := clc.Validate() 122 var fieldErr *FieldError 123 require.ErrorAs(t, err, &fieldErr) 124 require.Equal(t, "recordType", fieldErr.FieldName) 125 } 126 127 // TestFieldInclusionCashLetterItemsCount validates FieldInclusion 128 func TestFieldInclusionCashLetterItemsCount(t *testing.T) { 129 clc := mockCashLetterControl() 130 clc.CashLetterItemsCount = 0 131 err := clc.Validate() 132 var fieldErr *FieldError 133 require.ErrorAs(t, err, &fieldErr) 134 require.Equal(t, "CashLetterItemsCount", fieldErr.FieldName) 135 } 136 137 // TestFieldInclusionCashLetterTotalAmount validates FieldInclusion 138 func TestFieldInclusionCashLetterTotalAmount(t *testing.T) { 139 clc := mockCashLetterControl() 140 clc.CashLetterTotalAmount = 0 141 err := clc.Validate() 142 var fieldErr *FieldError 143 require.ErrorAs(t, err, &fieldErr) 144 require.Equal(t, "CashLetterTotalAmount", fieldErr.FieldName) 145 } 146 147 // TestFieldInclusionSettlementDate validates FieldInclusion 148 func TestFieldInclusionRecordTypeSettlementDate(t *testing.T) { 149 clc := mockCashLetterControl() 150 // if present (non-zero), SettlementDate.Year() must be between 1993 and 9999 151 clc.SettlementDate = time.Date(40010, time.November, 9, 0, 0, 0, 0, time.UTC) 152 err := clc.Validate() 153 var fieldErr *FieldError 154 require.ErrorAs(t, err, &fieldErr) 155 require.Equal(t, "SettlementDate", fieldErr.FieldName) 156 } 157 158 // TestCashLetterControlRuneCountInString validates RuneCountInString 159 func TestCashLetterControlRuneCountInString(t *testing.T) { 160 clc := NewCashLetterControl() 161 var line = "90" 162 clc.Parse(line) 163 164 require.Equal(t, 0, clc.CashLetterBundleCount) 165 } 166 167 func TestCashLetterControl_isReturnCollectionType(t *testing.T) { 168 tests := []struct { 169 collectionType string 170 expected bool 171 }{ 172 {"03", true}, 173 {"04", true}, 174 {"05", true}, 175 {"06", true}, 176 {"07", false}, 177 {"01", false}, 178 {"", false}, 179 } 180 181 for _, tt := range tests { 182 t.Run(tt.collectionType, func(t *testing.T) { 183 require.Equal(t, tt.expected, isReturnCollectionType(tt.collectionType)) 184 }) 185 } 186 }