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  }