Skip to content

Commit c321738

Browse files
BCDA-9089: Add IOTA file pattern to cclf parser (#1319)
## 🎫 Ticket https://jira.cms.gov/browse/BCDA-6101 ## 🛠 Changes <!-- What was added, updated, or removed in this PR? --> - add IOTA file pattern to cclf file parser - add tests ## ℹ️ Context <!-- Why were these changes made? Add background context suitable for a non-technical audience. --> <!-- If any of the following security implications apply, this PR must not be merged without Stephen Walter's approval. Explain in this section and add @SJWalter11 as a reviewer. - Adds a new software dependency or dependencies. - Modifies or invalidates one or more of our security controls. - Stores or transmits data that was not stored or transmitted before. - Requires additional review of security implications for other reasons. --> ## 🧪 Validation <!-- How were the changes verified? Did you fully test the acceptance criteria in the ticket? Provide reproducible testing instructions and screenshots if applicable. --> Unit tests for a straightforward change --------- Co-authored-by: Parwinder Bhagat <Parwinder.Bhagat@e14s.com>
1 parent c8611c5 commit c321738

File tree

3 files changed

+70
-14
lines changed

3 files changed

+70
-14
lines changed

bcda/cclf/parser.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,11 @@ func getCCLFFileMetadata(cmsID, fileName string) (cclfFileMetadata, error) {
158158
aco = `(?:\.ACO)`
159159
bcd = `(?:BCD\.)`
160160

161-
// CCLF filename convention for SSP with BCD identifier: P.BCD.A****.ZC[0|8][Y|R]**.Dyymmdd.Thhmmsst
161+
// CCLF file name convention for SSP with BCD identifier: P.BCD.A****.ZC[0|8][Y|R]**.Dyymmdd.Thhmmsst
162162
ssp = `A\d{4}`
163-
// CCLF filename convention for NGACO: P.V***.ACO.ZC[0|8][Y|R].Dyymmdd.Thhmmsst
163+
// CCLF file name convention for IOTA with PRT identifier: P.IOTA***.PRT.ZC[0|8](Y|R).Dyymmdd.Thhmmsst
164+
iotaPrt = `IOTA\d{3}(?:\.PRT)`
165+
// CCLF file name convention for NGACO: P.V***.ACO.ZC[0|8][Y|R].Dyymmdd.Thhmmsst
164166
ngaco = `V\d{3}`
165167
// CCLF file name convention for CEC: P.CEC.ZC[0|8][Y|R].Dyymmdd.Thhmmsst
166168
cec = `CEC`
@@ -175,9 +177,17 @@ func getCCLFFileMetadata(cmsID, fileName string) (cclfFileMetadata, error) {
175177
// CCLF file name convention for SBX: P.SBX*****.ACO.ZC(Y|R)**.Dyymmdd.Thhmmsst
176178
sandbox = `SBX[A-Z]{2}\d{3}`
177179

178-
pattern = prefix + `(` + bcd + ssp + `|` + ngaco + aco + `|` + cec +
179-
`|` + ckcc + aco + `|` + kcf + aco + `|` + dc + aco +
180-
`|` + test + aco + `|` + sandbox + aco + `)` + suffix
180+
pattern = prefix + `(` +
181+
bcd + ssp + `|` +
182+
iotaPrt + `|` +
183+
ngaco + aco + `|` +
184+
cec + `|` +
185+
ckcc + aco + `|` +
186+
kcf + aco + `|` +
187+
dc + aco + `|` +
188+
test + aco + `|` +
189+
sandbox + aco +
190+
`)` + suffix
181191
)
182192

183193
filenameRegexp := regexp.MustCompile(pattern)

bcda/cclf/parser_test.go

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ func TestGetCMSID(t *testing.T) {
2727
{"missingBCD", "path/T.A0001.ACO.ZCY18.D18NOV20.T1000009", true, ""},
2828
{"not ZCY or ZCR", "path/T.BCD.A0001.ZC18.D181120.T1000000", true, ""},
2929
{"missing ZCY and ZCR", "path/T.BCD.A0001.ZCA18.D181120.T1000000", true, ""},
30+
{"validIotaPath", "path/T.BCD.IOTA123.ZCY18.D181120.T2000000", false, "IOTA123"},
3031
{"empty", "", true, ""},
3132
}
3233
for _, tt := range tests {
@@ -197,15 +198,16 @@ func TestValidateCSVFileName(t *testing.T) {
197198

198199
func TestGetCCLFMetadata(t *testing.T) {
199200
const (
200-
sspID, cecID, ngacoID, ckccID, kcfID, dcID, testID, sbxID = "A9999", "E9999", "V999", "C9999", "K9999", "D9999", "TEST999", "SBXBD001"
201-
sspProd, sspTest = "P.BCD." + sspID, "T.BCD." + sspID
202-
cecProd, cecTest = "P.CEC", "T.CEC"
203-
ngacoProd, ngacoTest = "P." + ngacoID + ".ACO", "T." + ngacoID + ".ACO"
204-
ckccProd, ckccTest = "P." + ckccID + ".ACO", "T." + ckccID + ".ACO"
205-
kcfProd, kcfTest = "P." + kcfID + ".ACO", "T." + kcfID + ".ACO"
206-
dcProd, dcTest = "P." + dcID + ".ACO", "T." + dcID + ".ACO"
207-
testProd, testTest = "P." + testID + ".ACO", "T." + testID + ".ACO"
208-
sbxProd, sbxTest = "P." + sbxID + ".ACO", "T." + sbxID + ".ACO"
201+
sspID, iotaID, cecID, ngacoID, ckccID, kcfID, dcID, testID, sbxID = "A9999", "IOTA965", "E9999", "V999", "C9999", "K9999", "D9999", "TEST999", "SBXBD001"
202+
sspProd, sspTest = "P.BCD." + sspID, "T.BCD." + sspID
203+
iotaProd, iotaTest = "P." + iotaID + ".PRT", "T." + iotaID + ".PRT"
204+
cecProd, cecTest = "P.CEC", "T.CEC"
205+
ngacoProd, ngacoTest = "P." + ngacoID + ".ACO", "T." + ngacoID + ".ACO"
206+
ckccProd, ckccTest = "P." + ckccID + ".ACO", "T." + ckccID + ".ACO"
207+
kcfProd, kcfTest = "P." + kcfID + ".ACO", "T." + kcfID + ".ACO"
208+
dcProd, dcTest = "P." + dcID + ".ACO", "T." + dcID + ".ACO"
209+
testProd, testTest = "P." + testID + ".ACO", "T." + testID + ".ACO"
210+
sbxProd, sbxTest = "P." + sbxID + ".ACO", "T." + sbxID + ".ACO"
209211
)
210212

211213
start := time.Now()
@@ -228,6 +230,7 @@ func TestGetCCLFMetadata(t *testing.T) {
228230
assert.NoError(t, err)
229231
sspProdFile, sspTestFile, sspRunoutFile := gen(sspProd, validTime), gen(sspTest, validTime),
230232
strings.Replace(gen(sspProd, validTime), "ZC8Y", "ZC8R", 1)
233+
iotaProdFile, iotaTestFile, iotaRunoutFile := gen(iotaProd, validTime), gen(iotaTest, validTime), strings.Replace(gen(iotaProd, validTime), "ZC8Y", "ZC8R", 1)
231234
cecProdFile, cecTestFile := gen(cecProd, validTime), gen(cecTest, validTime)
232235
ngacoProdFile, ngacoTestFile := gen(ngacoProd, validTime), gen(ngacoTest, validTime)
233236
ckccProdFile, ckccTestFile := gen(ckccProd, validTime), gen(ckccTest, validTime)
@@ -285,6 +288,42 @@ func TestGetCCLFMetadata(t *testing.T) {
285288
fileType: models.FileTypeRunout,
286289
},
287290
},
291+
{
292+
"Production IOTA file", iotaID, iotaProdFile, "",
293+
cclfFileMetadata{
294+
env: "production",
295+
name: iotaProdFile,
296+
cclfNum: 8,
297+
acoID: iotaID,
298+
timestamp: validTime,
299+
perfYear: perfYear,
300+
fileType: models.FileTypeDefault,
301+
},
302+
},
303+
{
304+
"Test IOTA file", iotaID, iotaTestFile, "",
305+
cclfFileMetadata{
306+
env: "test",
307+
name: iotaTestFile,
308+
cclfNum: 8,
309+
acoID: iotaID,
310+
timestamp: validTime,
311+
perfYear: perfYear,
312+
fileType: models.FileTypeDefault,
313+
},
314+
},
315+
{
316+
"Runout IOTA file", iotaID, iotaRunoutFile, "",
317+
cclfFileMetadata{
318+
env: "production",
319+
name: iotaRunoutFile,
320+
cclfNum: 8,
321+
acoID: iotaID,
322+
timestamp: validTime,
323+
perfYear: perfYear,
324+
fileType: models.FileTypeRunout,
325+
},
326+
},
288327
{
289328
"Production CEC file", cecID, cecProdFile, "",
290329
cclfFileMetadata{

bcda/service/service_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,13 @@ func TestSupportedACOs(t *testing.T) {
8989
{"GUIDE invalid characters", "GUIDE99999", false},
9090
{"valid GUIDE", "GUIDE-99999", true},
9191

92+
{"Iota too short", "IOTA12", false},
93+
{"Iota too long", "IOTA0123", false},
94+
{"Iota invalid characters 1", "IOTA12Z", false},
95+
{"Iota invalid characters 2", "IOTA1YZ", false},
96+
{"Iota invalid characters 3", "IOTAXYZ", false},
97+
{"valid Iota", "IOTA123", true},
98+
9299
{"SBX too short", "SBXB1", false},
93100
{"SBX too long", "SBXPA0123", false},
94101
{"SBX invalid characters 1", "SBX0A123", false},

0 commit comments

Comments
 (0)