github.com/moov-io/imagecashletter@v0.10.1/returnDetail_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  // mockReturnDetail creates a ReturnDetail
    16  func mockReturnDetail() *ReturnDetail {
    17  	rd := NewReturnDetail()
    18  	rd.PayorBankRoutingNumber = "03130001"
    19  	rd.PayorBankCheckDigit = "2"
    20  	rd.OnUs = "5558881"
    21  	rd.ItemAmount = 100000
    22  	rd.ReturnReason = "A"
    23  	rd.AddendumCount = 4
    24  	rd.DocumentationTypeIndicator = "G"
    25  	rd.ForwardBundleDate = time.Now()
    26  	rd.EceInstitutionItemSequenceNumber = "1              "
    27  	rd.ExternalProcessingCode = ""
    28  	rd.ReturnNotificationIndicator = "2"
    29  	rd.ArchiveTypeIndicator = "B"
    30  	rd.TimesReturned = 0
    31  	return rd
    32  }
    33  
    34  func TestReturnDetailParse(t *testing.T) {
    35  	var r ReturnDetail
    36  	r.Parse("asshafaksjfas")
    37  	require.Equal(t, "", r.PayorBankRoutingNumber)
    38  }
    39  
    40  // TestMockReturnDetail creates a ReturnDetail
    41  func TestMockReturnDetail(t *testing.T) {
    42  	rd := mockReturnDetail()
    43  	require.NoError(t, rd.Validate())
    44  	require.Equal(t, "31", rd.recordType)
    45  	require.Equal(t, "03130001", rd.PayorBankRoutingNumber)
    46  	require.Equal(t, "2", rd.PayorBankCheckDigit)
    47  	require.Equal(t, "5558881", rd.OnUs)
    48  	require.Equal(t, 100000, rd.ItemAmount)
    49  	require.Equal(t, "A", rd.ReturnReason)
    50  	require.Equal(t, 4, rd.AddendumCount)
    51  	require.Equal(t, "G", rd.DocumentationTypeIndicator)
    52  	require.Equal(t, "1              ", rd.EceInstitutionItemSequenceNumber)
    53  	require.Equal(t, "", rd.ExternalProcessingCode)
    54  	require.Equal(t, "2", rd.ReturnNotificationIndicator)
    55  	require.Equal(t, "B", rd.ArchiveTypeIndicator)
    56  	require.Equal(t, 0, rd.TimesReturned)
    57  }
    58  
    59  // TestParseReturnDetail validates parsing a ReturnDetail
    60  func TestParseReturnDetail(t *testing.T) {
    61  	var line = "31031300012             55588810000100000A04G201809051               2B0        "
    62  	r := NewReader(strings.NewReader(line))
    63  	r.line = line
    64  	clh := mockCashLetterHeader()
    65  	r.addCurrentCashLetter(NewCashLetter(clh))
    66  	bh := mockBundleHeader()
    67  	rb := NewBundle(bh)
    68  	r.currentCashLetter.AddBundle(rb)
    69  	r.addCurrentBundle(rb)
    70  
    71  	require.NoError(t, r.parseReturnDetail())
    72  	record := r.currentCashLetter.currentBundle.GetReturns()[0]
    73  
    74  	require.Equal(t, "31", record.recordType)
    75  	require.Equal(t, "03130001", record.PayorBankRoutingNumberField())
    76  	require.Equal(t, "2", record.PayorBankCheckDigitField())
    77  	require.Equal(t, "             5558881", record.OnUsField())
    78  	require.Equal(t, "0000100000", record.ItemAmountField())
    79  	require.Equal(t, "A", record.ReturnReasonField())
    80  	require.Equal(t, "04", record.AddendumCountField())
    81  	require.Equal(t, "G", record.DocumentationTypeIndicatorField())
    82  	require.Equal(t, "1              ", record.EceInstitutionItemSequenceNumberField())
    83  	require.Equal(t, " ", record.ExternalProcessingCodeField())
    84  	require.Equal(t, "2", record.ReturnNotificationIndicatorField())
    85  	require.Equal(t, "B", record.ArchiveTypeIndicatorField())
    86  	require.Equal(t, "0", record.TimesReturnedField())
    87  
    88  }
    89  
    90  // testReturnDetailString validates that a known parsed ReturnDetail can return to a string of the same value
    91  func testReturnDetailString(t testing.TB) {
    92  	var line = "31031300012             55588810000100000A04G201809051               2B0        "
    93  	r := NewReader(strings.NewReader(line))
    94  	r.line = line
    95  	clh := mockCashLetterHeader()
    96  	r.addCurrentCashLetter(NewCashLetter(clh))
    97  	bh := mockBundleHeader()
    98  	rb := NewBundle(bh)
    99  	r.currentCashLetter.AddBundle(rb)
   100  	r.addCurrentBundle(rb)
   101  
   102  	require.NoError(t, r.parseReturnDetail())
   103  	record := r.currentCashLetter.currentBundle.GetReturns()[0]
   104  
   105  	require.Equal(t, line, record.String())
   106  }
   107  
   108  // TestReturnDetailString tests validating that a known parsed ReturnDetail can return to a string of the
   109  // same value
   110  func TestReturnDetailString(t *testing.T) {
   111  	testReturnDetailString(t)
   112  }
   113  
   114  // BenchmarkReturnDetailString benchmarks validating that a known parsed ReturnDetailAddendumB
   115  // can return to a string of the same value
   116  func BenchmarkReturnDetailString(b *testing.B) {
   117  	b.ReportAllocs()
   118  	for i := 0; i < b.N; i++ {
   119  		testReturnDetailString(b)
   120  	}
   121  }
   122  
   123  // TestRDRecordType validation
   124  func TestRDRecordType(t *testing.T) {
   125  	rd := mockReturnDetail()
   126  	rd.recordType = "00"
   127  	err := rd.Validate()
   128  	var e *FieldError
   129  	require.ErrorAs(t, err, &e)
   130  	require.Equal(t, "recordType", e.FieldName)
   131  }
   132  
   133  // TestRDDocumentationTypeIndicator validation
   134  func TestRDDocumentationTypeIndicator(t *testing.T) {
   135  	rd := mockReturnDetail()
   136  	rd.DocumentationTypeIndicator = "P"
   137  	err := rd.Validate()
   138  	var e *FieldError
   139  	require.ErrorAs(t, err, &e)
   140  	require.Equal(t, "DocumentationTypeIndicator", e.FieldName)
   141  }
   142  
   143  // TestRDDocumentationTypeIndicatorZ validation
   144  func TestRDDocumentationTypeIndicatorZ(t *testing.T) {
   145  	rd := mockReturnDetail()
   146  	rd.DocumentationTypeIndicator = "Z"
   147  	err := rd.Validate()
   148  	var e *FieldError
   149  	require.ErrorAs(t, err, &e)
   150  	require.Equal(t, "DocumentationTypeIndicator", e.FieldName)
   151  }
   152  
   153  // TestRDReturnNotificationIndicator validation
   154  func TestRDReturnNotificationIndicator(t *testing.T) {
   155  	rd := mockReturnDetail()
   156  	rd.ReturnNotificationIndicator = "0"
   157  	err := rd.Validate()
   158  	var e *FieldError
   159  	require.ErrorAs(t, err, &e)
   160  	require.Equal(t, "ReturnNotificationIndicator", e.FieldName)
   161  }
   162  
   163  // TestRDArchiveTypeIndicator validation
   164  func TestRDArchiveTypeIndicator(t *testing.T) {
   165  	rd := mockReturnDetail()
   166  	rd.ArchiveTypeIndicator = "W"
   167  	err := rd.Validate()
   168  	var e *FieldError
   169  	require.ErrorAs(t, err, &e)
   170  	require.Equal(t, "ArchiveTypeIndicator", e.FieldName)
   171  }
   172  
   173  // TestRDTimesReturned validation
   174  func TestRDTimesReturned(t *testing.T) {
   175  	rd := mockReturnDetail()
   176  	rd.TimesReturned = 5
   177  	err := rd.Validate()
   178  	var e *FieldError
   179  	require.ErrorAs(t, err, &e)
   180  	require.Equal(t, "TimesReturned", e.FieldName)
   181  }
   182  
   183  // TestReturnReasonInvalid validation
   184  func TestReturnReasonInvalid(t *testing.T) {
   185  	rd := mockReturnDetail()
   186  	rd.ReturnReason = "88"
   187  	err := rd.Validate()
   188  	var e *FieldError
   189  	require.ErrorAs(t, err, &e)
   190  	require.Equal(t, "ReturnReason", e.FieldName)
   191  }
   192  
   193  // Field Inclusion
   194  
   195  // TestRDFIRecordType validation
   196  func TestRDFIRecordType(t *testing.T) {
   197  	rd := mockReturnDetail()
   198  	rd.recordType = ""
   199  	err := rd.Validate()
   200  	var e *FieldError
   201  	require.ErrorAs(t, err, &e)
   202  	require.Equal(t, "recordType", e.FieldName)
   203  }
   204  
   205  // TestRDFIPayorBankRoutingNumber validation
   206  func TestRDFIPayorBankRoutingNumber(t *testing.T) {
   207  	rd := mockReturnDetail()
   208  	rd.PayorBankRoutingNumber = ""
   209  	err := rd.Validate()
   210  	var e *FieldError
   211  	require.ErrorAs(t, err, &e)
   212  	require.Equal(t, "PayorBankRoutingNumber", e.FieldName)
   213  }
   214  
   215  // TestRDFIPayorBankRoutingNumberZero validation
   216  func TestRDFIPayorBankRoutingNumberZero(t *testing.T) {
   217  	rd := mockReturnDetail()
   218  	rd.PayorBankRoutingNumber = "00000000"
   219  	err := rd.Validate()
   220  	var e *FieldError
   221  	require.ErrorAs(t, err, &e)
   222  	require.Equal(t, "PayorBankRoutingNumber", e.FieldName)
   223  }
   224  
   225  // TestRDFIPayorBankCheckDigit validation
   226  func TestRDFIPayorBankCheckDigit(t *testing.T) {
   227  	rd := mockReturnDetail()
   228  	rd.PayorBankCheckDigit = ""
   229  	err := rd.Validate()
   230  	var e *FieldError
   231  	require.ErrorAs(t, err, &e)
   232  	require.Equal(t, "PayorBankCheckDigit", e.FieldName)
   233  }
   234  
   235  // TestRDFIReturnReason validation
   236  func TestRDFIReturnReason(t *testing.T) {
   237  	rd := mockReturnDetail()
   238  	rd.ReturnReason = ""
   239  	err := rd.Validate()
   240  	var e *FieldError
   241  	require.ErrorAs(t, err, &e)
   242  	require.Equal(t, "ReturnReason", e.FieldName)
   243  }
   244  
   245  // TestRDFIEceInstitutionItemSequenceNumber validation
   246  func TestRDFIEceInstitutionItemSequenceNumber(t *testing.T) {
   247  	rd := mockReturnDetail()
   248  	rd.EceInstitutionItemSequenceNumber = "               "
   249  	err := rd.Validate()
   250  	var e *FieldError
   251  	require.ErrorAs(t, err, &e)
   252  	require.Equal(t, "EceInstitutionItemSequenceNumber", e.FieldName)
   253  }