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  }