github.com/moov-io/imagecashletter@v0.10.1/returnDetailAddendumB_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  	"encoding/json"
     9  	"strings"
    10  	"testing"
    11  	"time"
    12  
    13  	"github.com/stretchr/testify/assert"
    14  	"github.com/stretchr/testify/require"
    15  )
    16  
    17  // mockReturnDetailAddendumB creates a ReturnDetailAddendumB
    18  func mockReturnDetailAddendumB() ReturnDetailAddendumB {
    19  	rdAddendumB := NewReturnDetailAddendumB()
    20  	rdAddendumB.PayorBankName = "Payor Bank Name"
    21  	rdAddendumB.AuxiliaryOnUs = "123456789"
    22  	rdAddendumB.PayorBankSequenceNumber = "1              "
    23  	rdAddendumB.PayorBankBusinessDate = time.Now()
    24  	rdAddendumB.PayorAccountName = "Payor Account Name"
    25  	return rdAddendumB
    26  }
    27  
    28  func TestReturnDetailAddendumBParseErr(t *testing.T) {
    29  	var r ReturnDetailAddendumB
    30  	r.Parse("Asdjashfakjfa")
    31  	require.Equal(t, "", r.PayorBankName)
    32  }
    33  
    34  // TestMockReturnDetailAddendumB creates a ReturnDetailAddendumB
    35  func TestMockReturnDetailAddendumB(t *testing.T) {
    36  	rdAddendumB := mockReturnDetailAddendumB()
    37  	require.NoError(t, rdAddendumB.Validate())
    38  	require.Equal(t, "33", rdAddendumB.recordType)
    39  	require.Equal(t, "Payor Bank Name", rdAddendumB.PayorBankName)
    40  	require.Equal(t, "123456789", rdAddendumB.AuxiliaryOnUs)
    41  	require.Equal(t, "1              ", rdAddendumB.PayorBankSequenceNumber)
    42  	require.Equal(t, "Payor Account Name", rdAddendumB.PayorAccountName)
    43  }
    44  
    45  // TestParseReturnDetailAddendumB validates parsing a ReturnDetailAddendumB
    46  func TestParseReturnDetailAddendumB(t *testing.T) {
    47  	var line = "33Payor Bank Name         1234567891              20180905Payor Account Name    "
    48  	r := NewReader(strings.NewReader(line))
    49  	r.line = line
    50  	clh := mockCashLetterHeader()
    51  	r.addCurrentCashLetter(NewCashLetter(clh))
    52  	bh := mockBundleHeader()
    53  	rb := NewBundle(bh)
    54  	r.currentCashLetter.AddBundle(rb)
    55  	r.addCurrentBundle(rb)
    56  	rd := mockReturnDetail()
    57  	r.currentCashLetter.currentBundle.AddReturnDetail(rd)
    58  
    59  	require.NoError(t, r.parseReturnDetailAddendumB())
    60  	record := r.currentCashLetter.currentBundle.GetReturns()[0].ReturnDetailAddendumB[0]
    61  
    62  	require.Equal(t, "33", record.recordType)
    63  	require.Equal(t, "Payor Bank Name   ", record.PayorBankNameField())
    64  	require.Equal(t, "      123456789", record.AuxiliaryOnUsField())
    65  	require.Equal(t, "1              ", record.PayorBankSequenceNumberField())
    66  	require.Equal(t, "Payor Account Name    ", record.PayorAccountNameField())
    67  }
    68  
    69  // testRDAddendumBString validates that a known parsed ReturnDetailAddendumB can return to a string of the same value
    70  func testRDAddendumBString(t testing.TB) {
    71  	var line = "33Payor Bank Name         1234567891              20180905Payor Account Name    "
    72  	r := NewReader(strings.NewReader(line))
    73  	r.line = line
    74  	clh := mockCashLetterHeader()
    75  	r.addCurrentCashLetter(NewCashLetter(clh))
    76  	bh := mockBundleHeader()
    77  	rb := NewBundle(bh)
    78  	r.currentCashLetter.AddBundle(rb)
    79  	r.addCurrentBundle(rb)
    80  	rd := mockReturnDetail()
    81  	r.currentCashLetter.currentBundle.AddReturnDetail(rd)
    82  
    83  	require.NoError(t, r.parseReturnDetailAddendumB())
    84  	record := r.currentCashLetter.currentBundle.GetReturns()[0].ReturnDetailAddendumB[0]
    85  
    86  	require.Equal(t, line, record.String())
    87  }
    88  
    89  // TestParseAddendumBJSONWith3339Date tests parsing ReturnAddendumB with a PayorBankBusinessDate in RFC3339 format
    90  func TestParseAddendumBJSONWith3339Date(t *testing.T) {
    91  	addB := ReturnDetailAddendumB{}
    92  	var testBusinessDateJSON = `{
    93  		"id": "",
    94  		"payorBankName": "",
    95  		"auxiliaryOnUs": "",
    96  		"payorBankSequenceNumber": "3713365076",
    97  		"payorAccountName": "",
    98  		"payorBankBusinessDate": "2021-01-21T00:00:00Z"
    99  }`
   100  	assert.NoError(
   101  		t,
   102  		json.Unmarshal([]byte(testBusinessDateJSON), &addB),
   103  		"Unable to unmarshal ReturnDetailAddendumB",
   104  	)
   105  	assert.Equal(
   106  		t,
   107  		"3713365076",
   108  		addB.PayorBankSequenceNumber,
   109  		"PayorBankSequenceNumber should match JSON",
   110  	)
   111  	parsedTime, timeParseErr := time.Parse(
   112  		time.RFC3339,
   113  		"2021-01-21T00:00:00Z",
   114  	)
   115  	assert.NoError(t, timeParseErr, "Unable to parse test time")
   116  	assert.True(t, addB.PayorBankBusinessDate.Equal(parsedTime), "PayorBankBusinessDate should match JSON")
   117  
   118  	marshalled, marshalErr := json.Marshal(addB)
   119  	assert.NoError(t, marshalErr, "Unable to marshal ReturnDetailAddendumB to JSON")
   120  	assert.Contains(
   121  		t,
   122  		string(marshalled),
   123  		"2021-01-21T00:00:00Z",
   124  		"JSON should contain PayorBankBusinessDate",
   125  	)
   126  }
   127  
   128  // TestParseAddendumBJSONWithX9Date tests parsing ReturnAddendumB with a PayorBankBusinessDate in X9's YYYYMMDD format
   129  func TestParseAddendumBJSONWithX9Date(t *testing.T) {
   130  	addB := ReturnDetailAddendumB{}
   131  	var testBusinessDateJSON = `{
   132  		"id": "",
   133  		"payorBankName": "",
   134  		"auxiliaryOnUs": "",
   135  		"payorBankSequenceNumber": "3713365076",
   136  		"payorAccountName": "",
   137  		"payorBankBusinessDate": "20210121"
   138  }`
   139  	assert.NoError(
   140  		t,
   141  		json.Unmarshal([]byte(testBusinessDateJSON), &addB),
   142  		"Unable to unmarshal ReturnDetailAddendumB",
   143  	)
   144  	assert.Equal(
   145  		t,
   146  		"3713365076",
   147  		addB.PayorBankSequenceNumber,
   148  		"PayorBankSequenceNumber should match JSON",
   149  	)
   150  	parsedTime, timeParseErr := time.Parse(
   151  		time.RFC3339,
   152  		"2021-01-21T00:00:00Z",
   153  	)
   154  	assert.NoError(t, timeParseErr, "Unable to parse test time")
   155  	assert.True(t, addB.PayorBankBusinessDate.Equal(parsedTime), "PayorBankBusinessDate should match JSON")
   156  
   157  	marshalled, marshalErr := json.Marshal(addB)
   158  	assert.NoError(t, marshalErr, "Unable to marshal ReturnDetailAddendumB to JSON")
   159  	assert.Contains(
   160  		t,
   161  		string(marshalled),
   162  		"2021-01-21T00:00:00Z",
   163  		"JSON should contain PayorBankBusinessDate",
   164  	)
   165  }
   166  
   167  // TestParseAddendumBJSONWith3339Date tests parsing ReturnAddendumB with a PayorBankBusinessDate that is empty
   168  func TestParseAddendumBJSONWithEmptyDate(t *testing.T) {
   169  	addB := ReturnDetailAddendumB{}
   170  	var testNoBusinessDateJSON = `{
   171  		"id": "",
   172  		"payorBankName": "",
   173  		"auxiliaryOnUs": "",
   174  		"payorBankSequenceNumber": "3713365088",
   175  		"payorAccountName": "",
   176  		"payorBankBusinessDate": ""
   177  }`
   178  
   179  	assert.NoError(
   180  		t,
   181  		json.Unmarshal([]byte(testNoBusinessDateJSON), &addB),
   182  		"Unable to unmarshal ReturnDetailAddendumB",
   183  	)
   184  	assert.Equal(
   185  		t,
   186  		"3713365088",
   187  		addB.PayorBankSequenceNumber,
   188  		"PayorBankSequenceNumber should match JSON",
   189  	)
   190  	assert.True(
   191  		t,
   192  		addB.PayorBankBusinessDate.IsZero(),
   193  		"PayorBankBusinessDate should be a time.Time zero value",
   194  	)
   195  
   196  	marshalled, marshalErr := json.Marshal(addB)
   197  	assert.NoError(t, marshalErr, "Unable to marshal ReturnDetailAddendumB to JSON")
   198  	assert.NotContains(
   199  		t,
   200  		string(marshalled),
   201  		"0001-01-01",
   202  		"JSON should not contain a time.Time zero value",
   203  	)
   204  }
   205  
   206  // TestRDAddendumBString tests validating that a known parsed ReturnDetailAddendumB can return to a string of the
   207  // same value
   208  func TestRDAddendumBString(t *testing.T) {
   209  	testRDAddendumBString(t)
   210  }
   211  
   212  // BenchmarkRDAddendumBString benchmarks validating that a known parsed ReturnDetailAddendumB
   213  // can return to a string of the same value
   214  func BenchmarkRDAddendumBString(b *testing.B) {
   215  	b.ReportAllocs()
   216  	for i := 0; i < b.N; i++ {
   217  		testRDAddendumBString(b)
   218  	}
   219  }
   220  
   221  // TestRDAddendumBRecordType validation
   222  func TestRDAddendumBRecordType(t *testing.T) {
   223  	rdAddendumB := mockReturnDetailAddendumB()
   224  	rdAddendumB.recordType = "00"
   225  	err := rdAddendumB.Validate()
   226  	var e *FieldError
   227  	require.ErrorAs(t, err, &e)
   228  	require.Equal(t, "recordType", e.FieldName)
   229  }
   230  
   231  // TestRDAddendumBPayorBankName validation
   232  func TestRDAddendumBPayorBankName(t *testing.T) {
   233  	rdAddendumB := mockReturnDetailAddendumB()
   234  	rdAddendumB.PayorBankName = "®©"
   235  	err := rdAddendumB.Validate()
   236  	var e *FieldError
   237  	require.ErrorAs(t, err, &e)
   238  	require.Equal(t, "PayorBankName", e.FieldName)
   239  }
   240  
   241  // TestRDAddendumBPayorAccountName validation
   242  func TestRDAddendumBPayorAccountName(t *testing.T) {
   243  	rdAddendumB := mockReturnDetailAddendumB()
   244  	rdAddendumB.PayorAccountName = "®©"
   245  	err := rdAddendumB.Validate()
   246  	var e *FieldError
   247  	require.ErrorAs(t, err, &e)
   248  	require.Equal(t, "PayorAccountName", e.FieldName)
   249  }
   250  
   251  // Field Inclusion
   252  
   253  // TestRDAddendumBFIRecordType validation
   254  func TestRDAddendumBFIRecordType(t *testing.T) {
   255  	rdAddendumB := mockReturnDetailAddendumB()
   256  	rdAddendumB.recordType = ""
   257  	err := rdAddendumB.Validate()
   258  	var e *FieldError
   259  	require.ErrorAs(t, err, &e)
   260  	require.Equal(t, "recordType", e.FieldName)
   261  }
   262  
   263  // TestRDAddendumBFIPayorBankSequenceNumber validation
   264  func TestRDAddendumBFIPayorBankSequenceNumber(t *testing.T) {
   265  	rdAddendumB := mockReturnDetailAddendumB()
   266  	rdAddendumB.PayorBankSequenceNumber = "               "
   267  	err := rdAddendumB.Validate()
   268  	var e *FieldError
   269  	require.ErrorAs(t, err, &e)
   270  	require.Equal(t, "PayorBankSequenceNumber", e.FieldName)
   271  }
   272  
   273  // TestRDAddendumBFIPayorBankBusinessDate validation
   274  func TestRDAddendumPayorBankBusinessDate(t *testing.T) {
   275  	rdAddendumB := mockReturnDetailAddendumB()
   276  	date := time.Date(1990, time.January, 1, 0, 0, 0, 0, time.UTC)
   277  	rdAddendumB.PayorBankBusinessDate = date
   278  	err := rdAddendumB.Validate()
   279  	var e *FieldError
   280  	require.ErrorAs(t, err, &e)
   281  	require.Equal(t, "PayorBankBusinessDate", e.FieldName)
   282  	require.Contains(t, e.Msg, msgInvalidDate)
   283  }