github.com/moov-io/imagecashletter@v0.10.1/returnDetailAddendumA_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  // mockReturnDetailAddendumA creates a ReturnDetailAddendumA
    16  func mockReturnDetailAddendumA() ReturnDetailAddendumA {
    17  	rdAddendumA := NewReturnDetailAddendumA()
    18  	rdAddendumA.RecordNumber = 1
    19  	rdAddendumA.ReturnLocationRoutingNumber = "121042882"
    20  	rdAddendumA.BOFDEndorsementDate = time.Now()
    21  	rdAddendumA.BOFDItemSequenceNumber = "1              "
    22  	rdAddendumA.BOFDAccountNumber = "938383"
    23  	rdAddendumA.BOFDBranchCode = "01"
    24  	rdAddendumA.PayeeName = "Test Payee"
    25  	rdAddendumA.TruncationIndicator = "Y"
    26  	rdAddendumA.BOFDConversionIndicator = "1"
    27  	rdAddendumA.BOFDCorrectionIndicator = 0
    28  	rdAddendumA.UserField = ""
    29  	return rdAddendumA
    30  }
    31  
    32  // mockReturnDetailAddendumAWithoutBOFDItemSequenceNumber creates a ReturnDetailAddendumA
    33  func mockReturnDetailAddendumAWithoutBOFDItemSequenceNumber() ReturnDetailAddendumA {
    34  	rdAddendumA := NewReturnDetailAddendumA()
    35  	rdAddendumA.RecordNumber = 1
    36  	rdAddendumA.ReturnLocationRoutingNumber = "121042882"
    37  	rdAddendumA.BOFDEndorsementDate = time.Now()
    38  	rdAddendumA.BOFDAccountNumber = "938383"
    39  	rdAddendumA.BOFDBranchCode = "01"
    40  	rdAddendumA.PayeeName = "Test Payee"
    41  	rdAddendumA.TruncationIndicator = "Y"
    42  	rdAddendumA.BOFDConversionIndicator = "1"
    43  	rdAddendumA.BOFDCorrectionIndicator = 0
    44  	rdAddendumA.UserField = ""
    45  	return rdAddendumA
    46  }
    47  
    48  func TestReturnDetailAddendumAParseErr(t *testing.T) {
    49  	var r ReturnDetailAddendumA
    50  	r.Parse("asdlsajhfakjfa")
    51  	require.Equal(t, 0, r.RecordNumber)
    52  }
    53  
    54  // TestMockReturnDetailAddendumA creates a ReturnDetailAddendumA
    55  func TestMockReturnDetailAddendumA(t *testing.T) {
    56  	rdAddendumA := mockReturnDetailAddendumA()
    57  	require.NoError(t, rdAddendumA.Validate())
    58  	require.Equal(t, "32", rdAddendumA.recordType)
    59  	require.Equal(t, 1, rdAddendumA.RecordNumber)
    60  	require.Equal(t, "121042882", rdAddendumA.ReturnLocationRoutingNumber)
    61  	require.Equal(t, "1              ", rdAddendumA.BOFDItemSequenceNumber)
    62  	require.Equal(t, "938383", rdAddendumA.BOFDAccountNumber)
    63  	require.Equal(t, "01", rdAddendumA.BOFDBranchCode)
    64  	require.Equal(t, "Test Payee", rdAddendumA.PayeeName)
    65  	require.Equal(t, "Y", rdAddendumA.TruncationIndicator)
    66  	require.Equal(t, "1", rdAddendumA.BOFDConversionIndicator)
    67  	require.Equal(t, 0, rdAddendumA.BOFDCorrectionIndicator)
    68  	require.Equal(t, "", rdAddendumA.UserField)
    69  }
    70  
    71  // TestMockReturnDetailAddendumA creates a ReturnDetailAddendumA
    72  func TestMockReturnDetailAddendumAWithoutBOFDItemSequenceNumber(t *testing.T) {
    73  	rdAddendumA := mockReturnDetailAddendumAWithoutBOFDItemSequenceNumber()
    74  	require.NoError(t, rdAddendumA.Validate())
    75  	require.Equal(t, "32", rdAddendumA.recordType)
    76  	require.Equal(t, 1, rdAddendumA.RecordNumber)
    77  	require.Equal(t, "121042882", rdAddendumA.ReturnLocationRoutingNumber)
    78  	require.Equal(t, "938383", rdAddendumA.BOFDAccountNumber)
    79  	require.Equal(t, "01", rdAddendumA.BOFDBranchCode)
    80  	require.Equal(t, "Test Payee", rdAddendumA.PayeeName)
    81  	require.Equal(t, "Y", rdAddendumA.TruncationIndicator)
    82  	require.Equal(t, "1", rdAddendumA.BOFDConversionIndicator)
    83  	require.Equal(t, 0, rdAddendumA.BOFDCorrectionIndicator)
    84  	require.Equal(t, "", rdAddendumA.UserField)
    85  }
    86  
    87  // TestParseReturnDetailAddendumAWithoutBOFDItemSequenceNumber validates parsing a ReturnDetailAddendumA
    88  func TestParseReturnDetailAddendumAWithoutBOFDItemSequenceNumber(t *testing.T) {
    89  	var line = "32112104288220180905               938383            01   Test Payee     Y10    "
    90  	r := NewReader(strings.NewReader(line))
    91  	r.line = line
    92  	clh := mockCashLetterHeader()
    93  	r.addCurrentCashLetter(NewCashLetter(clh))
    94  	bh := mockBundleHeader()
    95  	rb := NewBundle(bh)
    96  	r.currentCashLetter.AddBundle(rb)
    97  	r.addCurrentBundle(rb)
    98  	rd := mockReturnDetail()
    99  	r.currentCashLetter.currentBundle.AddReturnDetail(rd)
   100  
   101  	require.NoError(t, r.parseReturnDetailAddendumA())
   102  	record := r.currentCashLetter.currentBundle.GetReturns()[0].ReturnDetailAddendumA[0]
   103  
   104  	require.Equal(t, "32", record.recordType)
   105  	require.Equal(t, "1", record.RecordNumberField())
   106  	require.Equal(t, "121042882", record.ReturnLocationRoutingNumberField())
   107  	require.Equal(t, "20180905", record.BOFDEndorsementDateField())
   108  	require.Equal(t, "               ", record.BOFDItemSequenceNumberField())
   109  	require.Equal(t, "938383            ", record.BOFDAccountNumberField())
   110  	require.Equal(t, "01   ", record.BOFDBranchCodeField())
   111  	require.Equal(t, "Test Payee     ", record.PayeeNameField())
   112  	require.Equal(t, "Y", record.TruncationIndicatorField())
   113  	require.Equal(t, "1", record.BOFDConversionIndicatorField())
   114  	require.Equal(t, "0", record.BOFDCorrectionIndicatorField())
   115  	require.Equal(t, " ", record.UserFieldField())
   116  	require.Equal(t, "   ", record.reservedField())
   117  }
   118  
   119  // TestParseReturnDetailAddendumA validates parsing a ReturnDetailAddendumA
   120  func TestParseReturnDetailAddendumA(t *testing.T) {
   121  	var line = "321121042882201809051              938383            01   Test Payee     Y10    "
   122  	r := NewReader(strings.NewReader(line))
   123  	r.line = line
   124  	clh := mockCashLetterHeader()
   125  	r.addCurrentCashLetter(NewCashLetter(clh))
   126  	bh := mockBundleHeader()
   127  	rb := NewBundle(bh)
   128  	r.currentCashLetter.AddBundle(rb)
   129  	r.addCurrentBundle(rb)
   130  	rd := mockReturnDetail()
   131  	r.currentCashLetter.currentBundle.AddReturnDetail(rd)
   132  
   133  	require.NoError(t, r.parseReturnDetailAddendumA())
   134  	record := r.currentCashLetter.currentBundle.GetReturns()[0].ReturnDetailAddendumA[0]
   135  
   136  	require.Equal(t, "32", record.recordType)
   137  	require.Equal(t, "1", record.RecordNumberField())
   138  	require.Equal(t, "121042882", record.ReturnLocationRoutingNumberField())
   139  	require.Equal(t, "20180905", record.BOFDEndorsementDateField())
   140  	require.Equal(t, "1              ", record.BOFDItemSequenceNumberField())
   141  	require.Equal(t, "938383            ", record.BOFDAccountNumberField())
   142  	require.Equal(t, "01   ", record.BOFDBranchCodeField())
   143  	require.Equal(t, "Test Payee     ", record.PayeeNameField())
   144  	require.Equal(t, "Y", record.TruncationIndicatorField())
   145  	require.Equal(t, "1", record.BOFDConversionIndicatorField())
   146  	require.Equal(t, "0", record.BOFDCorrectionIndicatorField())
   147  	require.Equal(t, " ", record.UserFieldField())
   148  	require.Equal(t, "   ", record.reservedField())
   149  }
   150  
   151  // testRDAddendumAString validates that a known parsed ReturnDetailAddendumA can return to a string of the same value
   152  func testRDAddendumAString(t testing.TB) {
   153  	var line = "321121042882201809051              938383            01   Test Payee     Y10    "
   154  	r := NewReader(strings.NewReader(line))
   155  	r.line = line
   156  	clh := mockCashLetterHeader()
   157  	r.addCurrentCashLetter(NewCashLetter(clh))
   158  	bh := mockBundleHeader()
   159  	rb := NewBundle(bh)
   160  	r.currentCashLetter.AddBundle(rb)
   161  	r.addCurrentBundle(rb)
   162  	rd := mockReturnDetail()
   163  	r.currentCashLetter.currentBundle.AddReturnDetail(rd)
   164  
   165  	require.NoError(t, r.parseReturnDetailAddendumA())
   166  	record := r.currentCashLetter.currentBundle.GetReturns()[0].ReturnDetailAddendumA[0]
   167  
   168  	require.Equal(t, line, record.String())
   169  
   170  }
   171  
   172  // TestRDAddendumAString tests validating that a known parsed ReturnDetailAddendumA can return to a string of the
   173  // same value
   174  func TestRDAddendumAString(t *testing.T) {
   175  	testRDAddendumAString(t)
   176  }
   177  
   178  // BenchmarkRDAddendumAString benchmarks validating that a known parsed ReturnDetailAddendumA
   179  // can return to a string of the same value
   180  func BenchmarkRDAddendumAString(b *testing.B) {
   181  	b.ReportAllocs()
   182  	for i := 0; i < b.N; i++ {
   183  		testRDAddendumAString(b)
   184  	}
   185  }
   186  
   187  // TestRDAddendumARecordType validation
   188  func TestRDAddendumARecordType(t *testing.T) {
   189  	rdAddendumA := mockReturnDetailAddendumA()
   190  	rdAddendumA.recordType = "00"
   191  	err := rdAddendumA.Validate()
   192  	var e *FieldError
   193  	require.ErrorAs(t, err, &e)
   194  	require.Equal(t, "recordType", e.FieldName)
   195  }
   196  
   197  // TestRDAddendumAReturnLocationRoutingNumber validation
   198  func TestRDAddendumAReturnLocationRoutingNumber(t *testing.T) {
   199  	rdAddendumA := mockReturnDetailAddendumA()
   200  	rdAddendumA.ReturnLocationRoutingNumber = "X"
   201  	err := rdAddendumA.Validate()
   202  	var e *FieldError
   203  	require.ErrorAs(t, err, &e)
   204  	require.Equal(t, "ReturnLocationRoutingNumber", e.FieldName)
   205  }
   206  
   207  // TestRDAddendumABOFDAccountNumber validation
   208  func TestRDAddendumABOFDAccountNumber(t *testing.T) {
   209  	rdAddendumA := mockReturnDetailAddendumA()
   210  	rdAddendumA.BOFDAccountNumber = "®©"
   211  	err := rdAddendumA.Validate()
   212  	var e *FieldError
   213  	require.ErrorAs(t, err, &e)
   214  	require.Equal(t, "BOFDAccountNumber", e.FieldName)
   215  }
   216  
   217  // TestRDAddendumABOFDBranchCode validation
   218  func TestRDAddendumABOFDBranchCode(t *testing.T) {
   219  	rdAddendumA := mockReturnDetailAddendumA()
   220  	rdAddendumA.BOFDBranchCode = "®©"
   221  	err := rdAddendumA.Validate()
   222  	var e *FieldError
   223  	require.ErrorAs(t, err, &e)
   224  	require.Equal(t, "BOFDBranchCode", e.FieldName)
   225  }
   226  
   227  // TestRDAddendumAPayeeName validation
   228  func TestRDAddendumAPayeeName(t *testing.T) {
   229  	rdAddendumA := mockReturnDetailAddendumA()
   230  	rdAddendumA.PayeeName = "®©"
   231  	err := rdAddendumA.Validate()
   232  	var e *FieldError
   233  	require.ErrorAs(t, err, &e)
   234  	require.Equal(t, "PayeeName", e.FieldName)
   235  }
   236  
   237  // TestRDAddendumATruncationIndicator validation
   238  func TestRDAddendumATruncationIndicator(t *testing.T) {
   239  	rdAddendumA := mockReturnDetailAddendumA()
   240  	rdAddendumA.TruncationIndicator = "A"
   241  	err := rdAddendumA.Validate()
   242  	var e *FieldError
   243  	require.ErrorAs(t, err, &e)
   244  	require.Equal(t, "TruncationIndicator", e.FieldName)
   245  }
   246  
   247  // TestRDAddendumABOFDConversionIndicator validation
   248  func TestRDAddendumABOFDConversionIndicator(t *testing.T) {
   249  	rdAddendumA := mockReturnDetailAddendumA()
   250  	rdAddendumA.BOFDConversionIndicator = "99"
   251  	err := rdAddendumA.Validate()
   252  	var e *FieldError
   253  	require.ErrorAs(t, err, &e)
   254  	require.Equal(t, "BOFDConversionIndicator", e.FieldName)
   255  }
   256  
   257  // TestRDAddendumABOFDCorrectionIndicator validation
   258  func TestRDAddendumABOFDCorrectionIndicator(t *testing.T) {
   259  	rdAddendumA := mockReturnDetailAddendumA()
   260  	rdAddendumA.BOFDCorrectionIndicator = 10
   261  	err := rdAddendumA.Validate()
   262  	var e *FieldError
   263  	require.ErrorAs(t, err, &e)
   264  	require.Equal(t, "BOFDCorrectionIndicator", e.FieldName)
   265  }
   266  
   267  // TestRDAddendumAUserField validation
   268  func TestRDAddendumAUserField(t *testing.T) {
   269  	rdAddendumA := mockReturnDetailAddendumA()
   270  	rdAddendumA.UserField = "®©"
   271  	err := rdAddendumA.Validate()
   272  	var e *FieldError
   273  	require.ErrorAs(t, err, &e)
   274  	require.Equal(t, "UserField", e.FieldName)
   275  }
   276  
   277  // Field Inclusion
   278  
   279  // TestRDAddendumAFIRecordType validation
   280  func TestRDAddendumAFIRecordType(t *testing.T) {
   281  	rdAddendumA := mockReturnDetailAddendumA()
   282  	rdAddendumA.recordType = ""
   283  	err := rdAddendumA.Validate()
   284  	var e *FieldError
   285  	require.ErrorAs(t, err, &e)
   286  	require.Equal(t, "recordType", e.FieldName)
   287  }
   288  
   289  // TestRDAddendumAFIRecordNumber validation
   290  func TestRDAddendumAFIRecordNumber(t *testing.T) {
   291  	rdAddendumA := mockReturnDetailAddendumA()
   292  	rdAddendumA.RecordNumber = 0
   293  	err := rdAddendumA.Validate()
   294  	var e *FieldError
   295  	require.ErrorAs(t, err, &e)
   296  	require.Equal(t, "RecordNumber", e.FieldName)
   297  }
   298  
   299  // TestRDAddendumAFIReturnLocationRoutingNumber validation
   300  func TestRDAddendumAFIReturnLocationRoutingNumber(t *testing.T) {
   301  	rdAddendumA := mockReturnDetailAddendumA()
   302  	rdAddendumA.ReturnLocationRoutingNumber = ""
   303  	err := rdAddendumA.Validate()
   304  	var e *FieldError
   305  	require.ErrorAs(t, err, &e)
   306  	require.Equal(t, "ReturnLocationRoutingNumber", e.FieldName)
   307  }
   308  
   309  // TestRDAddendumAFIReturnLocationRoutingNumberZero validation
   310  func TestRDAddendumAFIReturnLocationRoutingNumberZero(t *testing.T) {
   311  	rdAddendumA := mockReturnDetailAddendumA()
   312  	rdAddendumA.ReturnLocationRoutingNumber = "000000000"
   313  	err := rdAddendumA.Validate()
   314  	var e *FieldError
   315  	require.ErrorAs(t, err, &e)
   316  	require.Equal(t, "ReturnLocationRoutingNumber", e.FieldName)
   317  }
   318  
   319  // TestRDAddendumAFIBOFDEndorsementDate validation
   320  func TestRDAddendumAFIBOFDEndorsementDate(t *testing.T) {
   321  	rdAddendumA := mockReturnDetailAddendumA()
   322  	rdAddendumA.BOFDEndorsementDate = time.Time{}
   323  	err := rdAddendumA.Validate()
   324  	var e *FieldError
   325  	require.ErrorAs(t, err, &e)
   326  	require.Equal(t, "BOFDEndorsementDate", e.FieldName)
   327  }
   328  
   329  // TestRDAddendumAFITruncationIndicator validation
   330  func TestRDAddendumAFITruncationIndicator(t *testing.T) {
   331  	rdAddendumA := mockReturnDetailAddendumA()
   332  	rdAddendumA.TruncationIndicator = ""
   333  	err := rdAddendumA.Validate()
   334  	var e *FieldError
   335  	require.ErrorAs(t, err, &e)
   336  	require.Equal(t, "TruncationIndicator", e.FieldName)
   337  }