Skip to content

Commit ff1f8d6

Browse files
committed
Add AllowSpecialCharacters as a validation option
1 parent 25dd4d6 commit ff1f8d6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+575
-143
lines changed

addenda02.go

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ type Addenda02 struct {
6565
validator
6666
// converters is composed for ACH to GoLang Converters
6767
converters
68+
// validateOpts defines optional overrides for record validation
69+
validateOpts *ValidateOpts
6870
}
6971

7072
// NewAddenda02 returns a new Addenda02 with default values for none exported fields
@@ -142,6 +144,12 @@ func (addenda02 *Addenda02) Parse(record string) {
142144
}
143145
}
144146

147+
func (a *Addenda02) SetValidation(opts *ValidateOpts) {
148+
if a != nil {
149+
a.validateOpts = opts
150+
}
151+
}
152+
145153
// String writes the Addenda02 struct to a 94 character string.
146154
func (addenda02 *Addenda02) String() string {
147155
if addenda02 == nil {
@@ -180,17 +188,31 @@ func (addenda02 *Addenda02) Validate() error {
180188
if addenda02.TypeCode != "02" {
181189
return fieldError("TypeCode", ErrAddendaTypeCode, addenda02.TypeCode)
182190
}
183-
if err := addenda02.isAlphanumeric(addenda02.ReferenceInformationOne); err != nil {
184-
return fieldError("ReferenceInformationOne", err, addenda02.ReferenceInformationOne)
185-
}
186-
if err := addenda02.isAlphanumeric(addenda02.ReferenceInformationTwo); err != nil {
187-
return fieldError("ReferenceInformationTwo", err, addenda02.ReferenceInformationTwo)
188-
}
189-
if err := addenda02.isAlphanumeric(addenda02.TerminalIdentificationCode); err != nil {
190-
return fieldError("TerminalIdentificationCode", err, addenda02.TerminalIdentificationCode)
191-
}
192-
if err := addenda02.isAlphanumeric(addenda02.TransactionSerialNumber); err != nil {
193-
return fieldError("TransactionSerialNumber", err, addenda02.TransactionSerialNumber)
191+
if addenda02.validateOpts == nil || !addenda02.validateOpts.AllowSpecialCharacters {
192+
if err := addenda02.isAlphanumeric(addenda02.ReferenceInformationOne); err != nil {
193+
return fieldError("ReferenceInformationOne", err, addenda02.ReferenceInformationOne)
194+
}
195+
if err := addenda02.isAlphanumeric(addenda02.ReferenceInformationTwo); err != nil {
196+
return fieldError("ReferenceInformationTwo", err, addenda02.ReferenceInformationTwo)
197+
}
198+
if err := addenda02.isAlphanumeric(addenda02.TerminalIdentificationCode); err != nil {
199+
return fieldError("TerminalIdentificationCode", err, addenda02.TerminalIdentificationCode)
200+
}
201+
if err := addenda02.isAlphanumeric(addenda02.TransactionSerialNumber); err != nil {
202+
return fieldError("TransactionSerialNumber", err, addenda02.TransactionSerialNumber)
203+
}
204+
if err := addenda02.isAlphanumeric(addenda02.AuthorizationCodeOrExpireDate); err != nil {
205+
return fieldError("AuthorizationCodeOrExpireDate", err, addenda02.AuthorizationCodeOrExpireDate)
206+
}
207+
if err := addenda02.isAlphanumeric(addenda02.TerminalLocation); err != nil {
208+
return fieldError("TerminalLocation", err, addenda02.TerminalLocation)
209+
}
210+
if err := addenda02.isAlphanumeric(addenda02.TerminalCity); err != nil {
211+
return fieldError("TerminalCity", err, addenda02.TerminalCity)
212+
}
213+
if err := addenda02.isAlphanumeric(addenda02.TerminalState); err != nil {
214+
return fieldError("TerminalState", err, addenda02.TerminalState)
215+
}
194216
}
195217

196218
// TransactionDate Addenda02 ACH File format is MMDD. Validate MM is 01-12 and day for the
@@ -204,18 +226,6 @@ func (addenda02 *Addenda02) Validate() error {
204226
return fieldError("TransactionDate", ErrValidDay, mm)
205227
}
206228

207-
if err := addenda02.isAlphanumeric(addenda02.AuthorizationCodeOrExpireDate); err != nil {
208-
return fieldError("AuthorizationCodeOrExpireDate", err, addenda02.AuthorizationCodeOrExpireDate)
209-
}
210-
if err := addenda02.isAlphanumeric(addenda02.TerminalLocation); err != nil {
211-
return fieldError("TerminalLocation", err, addenda02.TerminalLocation)
212-
}
213-
if err := addenda02.isAlphanumeric(addenda02.TerminalCity); err != nil {
214-
return fieldError("TerminalCity", err, addenda02.TerminalCity)
215-
}
216-
if err := addenda02.isAlphanumeric(addenda02.TerminalState); err != nil {
217-
return fieldError("TerminalState", err, addenda02.TerminalState)
218-
}
219229
return nil
220230
}
221231

addenda02_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,21 @@ func testAddenda02ValidTypeCode(t testing.TB) {
5757
}
5858
}
5959

60+
func TestAddenda02SpecialCharacter(t *testing.T) {
61+
record := mockAddenda02()
62+
record.TerminalCity = "Łomża"
63+
err := record.Validate()
64+
if err == nil {
65+
t.Error("Special character should have caused a validation failure")
66+
}
67+
68+
record.SetValidation(&ValidateOpts{AllowSpecialCharacters: true})
69+
err = record.Validate()
70+
if err != nil {
71+
t.Error("Special character should have been allowed with override set.")
72+
}
73+
}
74+
6075
// TestAddenda02ValidTypeCode tests validating Addenda02 TypeCode
6176
func TestAddenda02ValidTypeCode(t *testing.T) {
6277
testAddenda02ValidTypeCode(t)

addenda05.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ type Addenda05 struct {
4747
validator
4848
// converters is composed for ACH to GoLang Converters
4949
converters
50+
// validateOpts defines optional overrides for record validation
51+
validateOpts *ValidateOpts
5052
}
5153

5254
// NewAddenda05 returns a new Addenda05 with default values for none exported fields
@@ -104,6 +106,12 @@ func (addenda05 *Addenda05) Parse(record string) {
104106
}
105107
}
106108

109+
func (a *Addenda05) SetValidation(opts *ValidateOpts) {
110+
if a != nil {
111+
a.validateOpts = opts
112+
}
113+
}
114+
107115
// String writes the Addenda05 struct to a 94 character string.
108116
func (addenda05 *Addenda05) String() string {
109117
if addenda05 == nil {
@@ -136,8 +144,11 @@ func (addenda05 *Addenda05) Validate() error {
136144
if addenda05.TypeCode != "05" {
137145
return fieldError("TypeCode", ErrAddendaTypeCode, addenda05.TypeCode)
138146
}
139-
if err := addenda05.isAlphanumeric(addenda05.PaymentRelatedInformation); err != nil {
140-
return fieldError("PaymentRelatedInformation", err, addenda05.PaymentRelatedInformation)
147+
148+
if addenda05.validateOpts == nil || !addenda05.validateOpts.AllowSpecialCharacters {
149+
if err := addenda05.isAlphanumeric(addenda05.PaymentRelatedInformation); err != nil {
150+
return fieldError("PaymentRelatedInformation", err, addenda05.PaymentRelatedInformation)
151+
}
141152
}
142153

143154
return nil

addenda05_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,21 @@ func TestAddenda05FieldInclusion(t *testing.T) {
124124
}
125125
}
126126

127+
func TestAddenda05SpecialCharacter(t *testing.T) {
128+
record := mockAddenda05()
129+
record.PaymentRelatedInformation = "Łomża"
130+
err := record.Validate()
131+
if err == nil {
132+
t.Error("Special character should have caused a validation failure")
133+
}
134+
135+
record.SetValidation(&ValidateOpts{AllowSpecialCharacters: true})
136+
err = record.Validate()
137+
if err != nil {
138+
t.Error("Special character should have been allowed with override set.")
139+
}
140+
}
141+
127142
func TestAddenda05FieldInclusionSequenceNumber(t *testing.T) {
128143
addenda05 := mockAddenda05()
129144
addenda05.SequenceNumber = 0

addenda10.go

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ type Addenda10 struct {
5858
validator
5959
// converters is composed for ACH to GoLang Converters
6060
converters
61+
// validateOpts defines optional overrides for record validation
62+
validateOpts *ValidateOpts
6163
}
6264

6365
// NewAddenda10 returns a new Addenda10 with default values for none exported fields
@@ -123,6 +125,12 @@ func (addenda10 *Addenda10) Parse(record string) {
123125
}
124126
}
125127

128+
func (a *Addenda10) SetValidation(opts *ValidateOpts) {
129+
if a != nil {
130+
a.validateOpts = opts
131+
}
132+
}
133+
126134
// String writes the Addenda10 struct to a 94 character string.
127135
func (addenda10 *Addenda10) String() string {
128136
if addenda10 == nil {
@@ -165,12 +173,14 @@ func (addenda10 *Addenda10) Validate() error {
165173
if err := addenda10.isTransactionTypeCode(addenda10.TransactionTypeCode); err != nil {
166174
return fieldError("TransactionTypeCode", err, addenda10.TransactionTypeCode)
167175
}
168-
// ToDo: Foreign Payment Amount blank ?
169-
if err := addenda10.isAlphanumeric(addenda10.ForeignTraceNumber); err != nil {
170-
return fieldError("ForeignTraceNumber", err, addenda10.ForeignTraceNumber)
171-
}
172-
if err := addenda10.isAlphanumeric(addenda10.Name); err != nil {
173-
return fieldError("Name", err, addenda10.Name)
176+
if addenda10.validateOpts == nil || !addenda10.validateOpts.AllowSpecialCharacters {
177+
// ToDo: Foreign Payment Amount blank ?
178+
if err := addenda10.isAlphanumeric(addenda10.ForeignTraceNumber); err != nil {
179+
return fieldError("ForeignTraceNumber", err, addenda10.ForeignTraceNumber)
180+
}
181+
if err := addenda10.isAlphanumeric(addenda10.Name); err != nil {
182+
return fieldError("Name", err, addenda10.Name)
183+
}
174184
}
175185
return nil
176186
}

addenda10_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,21 @@ func BenchmarkAddenda10TypeCode10(b *testing.B) {
127127
}
128128
}
129129

130+
func TestAddenda10SpecialCharacter(t *testing.T) {
131+
record := mockAddenda10()
132+
record.Name = "Łomża"
133+
err := record.Validate()
134+
if err == nil {
135+
t.Error("Special character should have caused a validation failure")
136+
}
137+
138+
record.SetValidation(&ValidateOpts{AllowSpecialCharacters: true})
139+
err = record.Validate()
140+
if err != nil {
141+
t.Error("Special character should have been allowed with override set.")
142+
}
143+
}
144+
130145
// testAddenda10TransactionTypeCode validates TransactionTypeCode
131146
func testAddenda10TransactionTypeCode(t testing.TB) {
132147
addenda10 := mockAddenda10()

addenda11.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ type Addenda11 struct {
4949
validator
5050
// converters is composed for ACH to GoLang Converters
5151
converters
52+
// validateOpts defines optional overrides for record validation
53+
validateOpts *ValidateOpts
5254
}
5355

5456
// NewAddenda11 returns a new Addenda11 with default values for none exported fields
@@ -108,6 +110,12 @@ func (addenda11 *Addenda11) Parse(record string) {
108110
}
109111
}
110112

113+
func (a *Addenda11) SetValidation(opts *ValidateOpts) {
114+
if a != nil {
115+
a.validateOpts = opts
116+
}
117+
}
118+
111119
// String writes the Addenda11 struct to a 94 character string.
112120
func (addenda11 *Addenda11) String() string {
113121
if addenda11 == nil {
@@ -144,11 +152,13 @@ func (addenda11 *Addenda11) Validate() error {
144152
if addenda11.TypeCode != "11" {
145153
return fieldError("TypeCode", ErrAddendaTypeCode, addenda11.TypeCode)
146154
}
147-
if err := addenda11.isAlphanumeric(addenda11.OriginatorName); err != nil {
148-
return fieldError("OriginatorName", err, addenda11.OriginatorName)
149-
}
150-
if err := addenda11.isAlphanumeric(addenda11.OriginatorStreetAddress); err != nil {
151-
return fieldError("OriginatorStreetAddress", err, addenda11.OriginatorStreetAddress)
155+
if addenda11.validateOpts == nil || !addenda11.validateOpts.AllowSpecialCharacters {
156+
if err := addenda11.isAlphanumeric(addenda11.OriginatorName); err != nil {
157+
return fieldError("OriginatorName", err, addenda11.OriginatorName)
158+
}
159+
if err := addenda11.isAlphanumeric(addenda11.OriginatorStreetAddress); err != nil {
160+
return fieldError("OriginatorStreetAddress", err, addenda11.OriginatorStreetAddress)
161+
}
152162
}
153163
return nil
154164
}

addenda11_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,21 @@ func TestOriginatorNameAlphaNumeric(t *testing.T) {
134134
testOriginatorNameAlphaNumeric(t)
135135
}
136136

137+
func TestAddenda11SpecialCharacter(t *testing.T) {
138+
record := mockAddenda11()
139+
record.OriginatorName = "Łomża"
140+
err := record.Validate()
141+
if err == nil {
142+
t.Error("Special character should have caused a validation failure")
143+
}
144+
145+
record.SetValidation(&ValidateOpts{AllowSpecialCharacters: true})
146+
err = record.Validate()
147+
if err != nil {
148+
t.Error("Special character should have been allowed with override set.")
149+
}
150+
}
151+
137152
// BenchmarkOriginatorNameAlphaNumeric benchmarks validating OriginatorName is alphanumeric
138153
func BenchmarkOriginatorNameAlphaNumeric(b *testing.B) {
139154
b.ReportAllocs()

addenda12.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ type Addenda12 struct {
5454
validator
5555
// converters is composed for ACH to GoLang Converters
5656
converters
57+
// validateOpts defines optional overrides for record validation
58+
validateOpts *ValidateOpts
5759
}
5860

5961
// NewAddenda12 returns a new Addenda12 with default values for none exported fields
@@ -113,6 +115,12 @@ func (addenda12 *Addenda12) Parse(record string) {
113115
}
114116
}
115117

118+
func (a *Addenda12) SetValidation(opts *ValidateOpts) {
119+
if a != nil {
120+
a.validateOpts = opts
121+
}
122+
}
123+
116124
// String writes the Addenda12 struct to a 94 character string.
117125
func (addenda12 *Addenda12) String() string {
118126
if addenda12 == nil {
@@ -150,11 +158,13 @@ func (addenda12 *Addenda12) Validate() error {
150158
if addenda12.TypeCode != "12" {
151159
return fieldError("TypeCode", ErrAddendaTypeCode, addenda12.TypeCode)
152160
}
153-
if err := addenda12.isAlphanumeric(addenda12.OriginatorCityStateProvince); err != nil {
154-
return fieldError("OriginatorCityStateProvince", err, addenda12.OriginatorCityStateProvince)
155-
}
156-
if err := addenda12.isAlphanumeric(addenda12.OriginatorCountryPostalCode); err != nil {
157-
return fieldError("OriginatorCountryPostalCode", err, addenda12.OriginatorCountryPostalCode)
161+
if addenda12.validateOpts == nil || !addenda12.validateOpts.AllowSpecialCharacters {
162+
if err := addenda12.isAlphanumeric(addenda12.OriginatorCityStateProvince); err != nil {
163+
return fieldError("OriginatorCityStateProvince", err, addenda12.OriginatorCityStateProvince)
164+
}
165+
if err := addenda12.isAlphanumeric(addenda12.OriginatorCountryPostalCode); err != nil {
166+
return fieldError("OriginatorCountryPostalCode", err, addenda12.OriginatorCountryPostalCode)
167+
}
158168
}
159169
return nil
160170
}

addenda12_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,21 @@ func testOriginatorCityStateProvinceAlphaNumeric(t testing.TB) {
129129
}
130130
}
131131

132+
func TestAddenda12SpecialCharacter(t *testing.T) {
133+
record := mockAddenda12()
134+
record.OriginatorCityStateProvince = "Łomża"
135+
err := record.Validate()
136+
if err == nil {
137+
t.Error("Special character should have caused a validation failure")
138+
}
139+
140+
record.SetValidation(&ValidateOpts{AllowSpecialCharacters: true})
141+
err = record.Validate()
142+
if err != nil {
143+
t.Error("Special character should have been allowed with override set.")
144+
}
145+
}
146+
132147
// TestOriginatorCityStateProvinceAlphaNumeric tests validating OriginatorCityStateProvince is alphanumeric
133148
func TestOriginatorCityStateProvinceAlphaNumeric(t *testing.T) {
134149
testOriginatorCityStateProvinceAlphaNumeric(t)

0 commit comments

Comments
 (0)