github.com/moov-io/imagecashletter@v0.10.1/bundleHeader_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  // mockBundleHeader creates a BundleHeader
    16  func mockBundleHeader() *BundleHeader {
    17  	bh := NewBundleHeader()
    18  	bh.CollectionTypeIndicator = "01"
    19  	bh.DestinationRoutingNumber = "231380104"
    20  	bh.ECEInstitutionRoutingNumber = "121042882"
    21  	bh.BundleBusinessDate = time.Now()
    22  	bh.BundleCreationDate = time.Now()
    23  	bh.BundleID = "9999"
    24  	bh.BundleSequenceNumber = "1"
    25  	bh.CycleNumber = "01"
    26  	bh.UserField = ""
    27  	return bh
    28  }
    29  
    30  // testMockBundleHeader creates a BundleHeader
    31  func testMockBundleHeader(t testing.TB) {
    32  	bh := mockBundleHeader()
    33  	require.NoError(t, bh.Validate())
    34  	require.Equal(t, "20", bh.recordType)
    35  	require.Equal(t, "01", bh.CollectionTypeIndicator)
    36  	require.Equal(t, "231380104", bh.DestinationRoutingNumber)
    37  	require.Equal(t, "121042882", bh.ECEInstitutionRoutingNumber)
    38  	require.Equal(t, "9999", bh.BundleID)
    39  	require.Equal(t, "1", bh.BundleSequenceNumber)
    40  	require.Equal(t, "01", bh.CycleNumber)
    41  	require.Equal(t, "", bh.UserField)
    42  }
    43  
    44  // TestMockBundleHeader tests creating a BundleHeader
    45  func TestMockBundleHeader(t *testing.T) {
    46  	testMockBundleHeader(t)
    47  }
    48  
    49  // BenchmarkMockBundleHeader benchmarks creating a BundleHeader
    50  func BenchmarkMockBundleHeader(b *testing.B) {
    51  	b.ReportAllocs()
    52  	for i := 0; i < b.N; i++ {
    53  		testMockBundleHeader(b)
    54  	}
    55  }
    56  
    57  // parseBundleHeader validates parsing a BundleHeader
    58  func parseBundleHeader(t testing.TB) {
    59  	var line = "200123138010412104288220180905201809059999      1   01                          "
    60  	r := NewReader(strings.NewReader(line))
    61  	r.line = line
    62  	clh := mockCashLetterHeader()
    63  	r.addCurrentCashLetter(NewCashLetter(clh))
    64  	bh := mockBundleHeader()
    65  	r.currentCashLetter.AddBundle(NewBundle(bh))
    66  
    67  	require.NoError(t, r.parseBundleHeader())
    68  
    69  	record := r.currentCashLetter.currentBundle.BundleHeader
    70  	require.Equal(t, "20", record.recordType)
    71  	require.Equal(t, "01", record.CollectionTypeIndicatorField())
    72  	require.Equal(t, "231380104", record.DestinationRoutingNumberField())
    73  	require.Equal(t, "121042882", record.ECEInstitutionRoutingNumberField())
    74  	require.Equal(t, "20180905", record.BundleBusinessDateField())
    75  	require.Equal(t, "20180905", record.BundleCreationDateField())
    76  	require.Equal(t, "9999      ", record.BundleIDField())
    77  	require.Equal(t, "1   ", record.BundleSequenceNumberField())
    78  	require.Equal(t, "01", record.CycleNumberField())
    79  	require.Equal(t, "         ", record.ReturnLocationRoutingNumberField())
    80  	require.Equal(t, "     ", record.UserFieldField())
    81  	require.Equal(t, "            ", record.reservedField())
    82  }
    83  
    84  // TestParseBundleHeader tests validating parsing a BundleHeader
    85  func TestParseBundleHeader(t *testing.T) {
    86  	parseBundleHeader(t)
    87  }
    88  
    89  // BenchmarkParseBundleHeader benchmarks validating parsing a BundleHeader
    90  func BenchmarkParseBundleHeader(b *testing.B) {
    91  	b.ReportAllocs()
    92  	for i := 0; i < b.N; i++ {
    93  		parseBundleHeader(b)
    94  	}
    95  }
    96  
    97  // testBHString validates that a known parsed BundleHeader can return to a string of the same value
    98  func testBHString(t testing.TB) {
    99  	var line = "200123138010412104288220180905201809059999      1   01                          "
   100  	r := NewReader(strings.NewReader(line))
   101  	r.line = line
   102  	clh := mockCashLetterHeader()
   103  	r.addCurrentCashLetter(NewCashLetter(clh))
   104  	bh := mockBundleHeader()
   105  	r.currentCashLetter.AddBundle(NewBundle(bh))
   106  	require.NoError(t, r.parseBundleHeader())
   107  	record := r.currentCashLetter.currentBundle.BundleHeader
   108  	require.Equal(t, line, record.String())
   109  }
   110  
   111  // TestBHString tests validating that a known parsed BundleHeader can return to a string of the same value
   112  func TestBHString(t *testing.T) {
   113  	testBHString(t)
   114  }
   115  
   116  // BenchmarkBHString benchmarks validating that a known parsed BundleHeader
   117  // can return to a string of the same value
   118  func BenchmarkBHString(b *testing.B) {
   119  	b.ReportAllocs()
   120  	for i := 0; i < b.N; i++ {
   121  		testBHString(b)
   122  	}
   123  }
   124  
   125  // TestBHRecordType validation
   126  func TestBHRecordType(t *testing.T) {
   127  	bh := mockBundleHeader()
   128  	bh.recordType = "00"
   129  	err := bh.Validate()
   130  	var e *FieldError
   131  	require.ErrorAs(t, err, &e)
   132  	require.Equal(t, "recordType", e.FieldName)
   133  }
   134  
   135  // TestBHCollectionTypeIndicator validation
   136  func TestBHCollectionTypeIndicator(t *testing.T) {
   137  	bh := mockBundleHeader()
   138  	bh.CollectionTypeIndicator = "87"
   139  	err := bh.Validate()
   140  	var e *FieldError
   141  	require.ErrorAs(t, err, &e)
   142  	require.Equal(t, "CollectionTypeIndicator", e.FieldName)
   143  }
   144  
   145  // TestBundleID validation
   146  func TestBundleID(t *testing.T) {
   147  	bh := mockBundleHeader()
   148  	bh.BundleID = "--"
   149  	err := bh.Validate()
   150  	var e *FieldError
   151  	require.ErrorAs(t, err, &e)
   152  	require.Equal(t, "BundleID", e.FieldName)
   153  }
   154  
   155  // TestCycleNumber validation
   156  func TestCycleNumber(t *testing.T) {
   157  	bh := mockBundleHeader()
   158  	bh.CycleNumber = "--"
   159  	err := bh.Validate()
   160  	var e *FieldError
   161  	require.ErrorAs(t, err, &e)
   162  	require.Equal(t, "CycleNumber", e.FieldName)
   163  }
   164  
   165  // TestBHUserField validation
   166  func TestBHUserFieldI(t *testing.T) {
   167  	bh := mockBundleHeader()
   168  	bh.UserField = "®©"
   169  	err := bh.Validate()
   170  	var e *FieldError
   171  	require.ErrorAs(t, err, &e)
   172  	require.Equal(t, "UserField", e.FieldName)
   173  }
   174  
   175  // TestBHFieldInclusionRecordType validates FieldInclusion
   176  func TestBHFieldInclusionRecordType(t *testing.T) {
   177  	bh := mockBundleHeader()
   178  	bh.recordType = ""
   179  	err := bh.Validate()
   180  	var e *FieldError
   181  	require.ErrorAs(t, err, &e)
   182  	require.Equal(t, "recordType", e.FieldName)
   183  }
   184  
   185  // TestBHFieldInclusionCollectionTypeIndicator validates FieldInclusion
   186  func TestBHFieldInclusionCollectionTypeIndicator(t *testing.T) {
   187  	bh := mockBundleHeader()
   188  	bh.CollectionTypeIndicator = ""
   189  	err := bh.Validate()
   190  	var e *FieldError
   191  	require.ErrorAs(t, err, &e)
   192  	require.Equal(t, "CollectionTypeIndicator", e.FieldName)
   193  }
   194  
   195  // TestBHFieldInclusionDestinationRoutingNumber validates FieldInclusion
   196  func TestBHFieldInclusionDestinationRoutingNumber(t *testing.T) {
   197  	bh := mockBundleHeader()
   198  	bh.DestinationRoutingNumber = ""
   199  	err := bh.Validate()
   200  	var e *FieldError
   201  	require.ErrorAs(t, err, &e)
   202  	require.Equal(t, "DestinationRoutingNumber", e.FieldName)
   203  }
   204  
   205  // TestBHFieldInclusionDestinationRoutingNumberZero validates FieldInclusion
   206  func TestBHFieldInclusionDestinationRoutingNumberZero(t *testing.T) {
   207  	bh := mockBundleHeader()
   208  	bh.DestinationRoutingNumber = "000000000"
   209  	err := bh.Validate()
   210  	var e *FieldError
   211  	require.ErrorAs(t, err, &e)
   212  	require.Equal(t, "DestinationRoutingNumber", e.FieldName)
   213  }
   214  
   215  // TestBHFieldInclusionECEInstitutionRoutingNumber validates FieldInclusion
   216  func TestBHFieldInclusionECEInstitutionRoutingNumber(t *testing.T) {
   217  	bh := mockBundleHeader()
   218  	bh.ECEInstitutionRoutingNumber = ""
   219  	err := bh.Validate()
   220  	var e *FieldError
   221  	require.ErrorAs(t, err, &e)
   222  	require.Equal(t, "ECEInstitutionRoutingNumber", e.FieldName)
   223  }
   224  
   225  // TestBHFieldInclusionECEInstitutionRoutingNumberZero validates FieldInclusion
   226  func TestBHFieldInclusionECEInstitutionRoutingNumberZero(t *testing.T) {
   227  	bh := mockBundleHeader()
   228  	bh.ECEInstitutionRoutingNumber = "000000000"
   229  	err := bh.Validate()
   230  	var e *FieldError
   231  	require.ErrorAs(t, err, &e)
   232  	require.Equal(t, "ECEInstitutionRoutingNumber", e.FieldName)
   233  }
   234  
   235  // TestBHFieldInclusionBundleBusinessDate validates FieldInclusion
   236  func TestBHFieldInclusionBundleBusinessDate(t *testing.T) {
   237  	bh := mockBundleHeader()
   238  	bh.BundleBusinessDate = time.Time{}
   239  	err := bh.Validate()
   240  	var e *FieldError
   241  	require.ErrorAs(t, err, &e)
   242  	require.Equal(t, "BundleBusinessDate", e.FieldName)
   243  }
   244  
   245  // TestBHFieldInclusionBundleCreationDate validates FieldInclusion
   246  func TestBHFieldInclusionBundleCreationDate(t *testing.T) {
   247  	bh := mockBundleHeader()
   248  	bh.BundleCreationDate = time.Time{}
   249  	err := bh.Validate()
   250  	var e *FieldError
   251  	require.ErrorAs(t, err, &e)
   252  	require.Equal(t, "BundleCreationDate", e.FieldName)
   253  }
   254  
   255  // TestBHFieldInclusionBundleSequenceNumber validates FieldInclusion
   256  func TestBHFieldInclusionBundleSequenceNumber(t *testing.T) {
   257  	bh := mockBundleHeader()
   258  	bh.BundleSequenceNumber = "    "
   259  	err := bh.Validate()
   260  	var e *FieldError
   261  	require.ErrorAs(t, err, &e)
   262  	require.Equal(t, "BundleSequenceNumber", e.FieldName)
   263  }
   264  
   265  // TestBundleHeaderRuneCountInString validates RuneCountInString
   266  func TestBundleHeaderRuneCountInString(t *testing.T) {
   267  	bh := NewBundleHeader()
   268  	var line = "20"
   269  	bh.Parse(line)
   270  
   271  	require.Equal(t, "", bh.CycleNumber)
   272  }