Skip to content

Commit f3ff812

Browse files
authored
Pre-Calculate Category Percentages (canada-ca#1569)
* introduce calculate-percentages function * calculate percentages on current summaries, and update tests * update indexs * swtich to zero decimals
1 parent 84d5062 commit f3ff812

10 files changed

Lines changed: 156 additions & 0 deletions

services/dmarc-report/index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ const {
2020

2121
const {
2222
arrayEquals,
23+
calculatePercentages,
2324
createSummaries,
2425
createSummaryEdge,
2526
createSummary,
@@ -65,6 +66,7 @@ const {
6566
loadDates(moment),
6667
loadSummaryCountByDomain(query),
6768
initializeSummaries(
69+
calculatePercentages,
6870
createSummaryEdge(collections),
6971
createSummary(query),
7072
loadSummaryByDate(summariesContainer),
@@ -73,13 +75,15 @@ const {
7375
arrayEquals,
7476
loadCurrentDates(query),
7577
updateThirtyDays(
78+
calculatePercentages,
7679
createSummary(query),
7780
createSummaryEdge(collections),
7881
loadSummaryByDate(summariesContainer),
7982
removeSummaryEdge(query),
8083
removeSummary(query),
8184
),
8285
updateMonthSummary(
86+
calculatePercentages,
8387
createSummary(query),
8488
createSummaryEdge(collections),
8589
loadSummaryByDate(summariesContainer),
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
const { calculatePercentages } = require('../calculate-percentages')
2+
3+
describe('given the calculatePercentages', () => {
4+
describe('values are greater then zero', () => {
5+
const categoryTotals = {
6+
pass: 2,
7+
fail: 3,
8+
passDkimOnly: 4,
9+
passSpfOnly: 5,
10+
}
11+
describe('pass is greater then zero', () => {
12+
it('returns percentage', () => {
13+
const percentages = calculatePercentages(categoryTotals)
14+
15+
expect(percentages.pass).toEqual(14)
16+
})
17+
})
18+
describe('fail is greater then zero', () => {
19+
it('returns percentage', () => {
20+
const percentages = calculatePercentages(categoryTotals)
21+
22+
expect(percentages.fail).toEqual(21)
23+
})
24+
})
25+
describe('passDkimOnly is greater then zero', () => {
26+
it('returns percentage', () => {
27+
const percentages = calculatePercentages(categoryTotals)
28+
29+
expect(percentages.passDkimOnly).toEqual(29)
30+
})
31+
})
32+
describe('passSpfOnly is greater then zero', () => {
33+
it('returns percentage', () => {
34+
const percentages = calculatePercentages(categoryTotals)
35+
36+
expect(percentages.passSpfOnly).toEqual(36)
37+
})
38+
})
39+
})
40+
describe('values are less then zero', () => {
41+
const categoryTotals = {
42+
pass: 0,
43+
fail: 0,
44+
passDkimOnly: 0,
45+
passSpfOnly: 0,
46+
}
47+
describe('pass is less then zero', () => {
48+
it('returns 0', () => {
49+
const percentages = calculatePercentages(categoryTotals)
50+
51+
expect(percentages.pass).toEqual(0)
52+
})
53+
})
54+
describe('fail is less then zero', () => {
55+
it('returns 0', () => {
56+
const percentages = calculatePercentages(categoryTotals)
57+
58+
expect(percentages.fail).toEqual(0)
59+
})
60+
})
61+
describe('passDkimOnly is less then zero', () => {
62+
it('returns 0', () => {
63+
const percentages = calculatePercentages(categoryTotals)
64+
65+
expect(percentages.passDkimOnly).toEqual(0)
66+
})
67+
})
68+
describe('passSpfOnly is less then zero', () => {
69+
it('returns 0', () => {
70+
const percentages = calculatePercentages(categoryTotals)
71+
72+
expect(percentages.passSpfOnly).toEqual(0)
73+
})
74+
})
75+
})
76+
})
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
const calculatePercentages = ({ fail, pass, passDkimOnly, passSpfOnly }) => {
2+
const total = [fail, pass, passDkimOnly, passSpfOnly].reduce(
3+
(a, b) => a + b,
4+
0,
5+
)
6+
7+
return {
8+
fail: fail <= 0 ? 0 : Number(((fail / total) * 100).toFixed(0)),
9+
pass: pass <= 0 ? 0 : Number(((pass / total) * 100).toFixed(0)),
10+
passDkimOnly:
11+
passDkimOnly <= 0 ? 0 : Number(((passDkimOnly / total) * 100).toFixed(0)),
12+
passSpfOnly:
13+
passSpfOnly <= 0 ? 0 : Number(((passSpfOnly / total) * 100).toFixed(0)),
14+
}
15+
}
16+
17+
module.exports = {
18+
calculatePercentages,
19+
}

services/dmarc-report/src/database/__tests__/initialize-summaries.test.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const { ArangoTools, dbNameFromFile } = require('arango-tools')
33
const { makeMigrations } = require('../../../migrations')
44
const { initializeSummaries } = require('../index')
55
const { loadSummaryByDate } = require('../../loaders')
6+
const { calculatePercentages } = require('../../calculate-percentages')
67

78
const { DB_PASS: rootPass, DB_URL: url } = process.env
89

@@ -68,6 +69,7 @@ describe('given the initializeSummaries function', () => {
6869
.mockReturnValue({ _id: 'dmarcSummaries/1' })
6970

7071
const initialSummaryFunc = initializeSummaries(
72+
calculatePercentages,
7173
mockedCreateEdge,
7274
mockedCreateSummary,
7375
loadSummaryByDate(mockedContainer),
@@ -82,6 +84,12 @@ describe('given the initializeSummaries function', () => {
8284
expect(mockedCreateSummary).toHaveBeenCalledTimes(2)
8385
expect(mockedCreateSummary).toHaveBeenNthCalledWith(1, {
8486
currentSummary: {
87+
categoryPercentages: {
88+
pass: 0,
89+
fail: 0,
90+
passDkimOnly: 0,
91+
passSpfOnly: 0,
92+
},
8593
categoryTotals: {
8694
fail: 0,
8795
pass: 0,
@@ -98,6 +106,12 @@ describe('given the initializeSummaries function', () => {
98106
})
99107
expect(mockedCreateSummary).toHaveBeenNthCalledWith(2, {
100108
currentSummary: {
109+
categoryPercentages: {
110+
pass: 0,
111+
fail: 0,
112+
passDkimOnly: 0,
113+
passSpfOnly: 0,
114+
},
101115
categoryTotals: {
102116
fail: 0,
103117
pass: 0,
@@ -120,6 +134,7 @@ describe('given the initializeSummaries function', () => {
120134
.mockReturnValue({ _id: 'dmarcSummaries/1' })
121135

122136
const initialSummaryFunc = initializeSummaries(
137+
calculatePercentages,
123138
mockedCreateEdge,
124139
mockedCreateSummary,
125140
loadSummaryByDate(mockedContainer),

services/dmarc-report/src/database/__tests__/update-month-summary.test.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const { ArangoTools, dbNameFromFile } = require('arango-tools')
33
const { makeMigrations } = require('../../../migrations')
44
const { updateMonthSummary } = require('../index')
55
const { loadSummaryByDate } = require('../../loaders')
6+
const { calculatePercentages } = require('../../calculate-percentages')
67

78
const { DB_PASS: rootPass, DB_URL: url } = process.env
89

@@ -66,6 +67,7 @@ describe('given the updateMonthSummary function', () => {
6667
const mockedRemoveSummary = jest.fn()
6768

6869
const updateMonthSummaryFunc = updateMonthSummary(
70+
calculatePercentages,
6971
mockedCreateSummary,
7072
mockedCreateEdge,
7173
loadSummaryByDate(mockedContainer),
@@ -97,6 +99,7 @@ describe('given the updateMonthSummary function', () => {
9799
const mockedRemoveSummary = jest.fn()
98100

99101
const updateMonthSummaryFunc = updateMonthSummary(
102+
calculatePercentages,
100103
mockedCreateSummary,
101104
mockedCreateEdge,
102105
loadSummaryByDate(mockedContainer),
@@ -127,6 +130,7 @@ describe('given the updateMonthSummary function', () => {
127130
const mockedRemoveSummary = jest.fn()
128131

129132
const updateMonthSummaryFunc = updateMonthSummary(
133+
calculatePercentages,
130134
mockedCreateSummary,
131135
mockedCreateEdge,
132136
loadSummaryByDate(mockedContainer),
@@ -144,6 +148,12 @@ describe('given the updateMonthSummary function', () => {
144148
expect(mockedCreateSummary).toHaveBeenCalledTimes(1)
145149
expect(mockedCreateSummary).toHaveBeenNthCalledWith(1, {
146150
currentSummary: {
151+
categoryPercentages: {
152+
pass: 0,
153+
fail: 0,
154+
passDkimOnly: 0,
155+
passSpfOnly: 0,
156+
},
147157
categoryTotals: {
148158
fail: 0,
149159
pass: 0,
@@ -170,6 +180,7 @@ describe('given the updateMonthSummary function', () => {
170180
const mockedRemoveSummary = jest.fn()
171181

172182
const updateMonthSummaryFunc = updateMonthSummary(
183+
calculatePercentages,
173184
mockedCreateSummary,
174185
mockedCreateEdge,
175186
loadSummaryByDate(mockedContainer),
@@ -201,6 +212,7 @@ describe('given the updateMonthSummary function', () => {
201212
const mockedRemoveSummary = jest.fn()
202213

203214
const updateMonthSummaryFunc = updateMonthSummary(
215+
calculatePercentages,
204216
mockedCreateSummary,
205217
mockedCreateEdge,
206218
loadSummaryByDate(mockedContainer),

services/dmarc-report/src/database/__tests__/update-thirty-days.test.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const { ArangoTools, dbNameFromFile } = require('arango-tools')
33
const { makeMigrations } = require('../../../migrations')
44
const { updateThirtyDays } = require('../index')
55
const { loadSummaryByDate } = require('../../loaders')
6+
const { calculatePercentages } = require('../../calculate-percentages')
67

78
const { DB_PASS: rootPass, DB_URL: url } = process.env
89

@@ -66,6 +67,7 @@ describe('given the updateThirtyDays function', () => {
6667
const mockedRemoveSummary = jest.fn()
6768

6869
const updateThirtyDaysFunc = updateThirtyDays(
70+
calculatePercentages,
6971
mockedCreateSummary,
7072
mockedCreateEdge,
7173
loadSummaryByDate(mockedContainer),
@@ -95,6 +97,7 @@ describe('given the updateThirtyDays function', () => {
9597
const mockedRemoveSummary = jest.fn()
9698

9799
const updateThirtyDaysFunc = updateThirtyDays(
100+
calculatePercentages,
98101
mockedCreateSummary,
99102
mockedCreateEdge,
100103
loadSummaryByDate(mockedContainer),
@@ -123,6 +126,7 @@ describe('given the updateThirtyDays function', () => {
123126
const mockedRemoveSummary = jest.fn()
124127

125128
const updateThirtyDaysFunc = updateThirtyDays(
129+
calculatePercentages,
126130
mockedCreateSummary,
127131
mockedCreateEdge,
128132
loadSummaryByDate(mockedContainer),
@@ -138,6 +142,12 @@ describe('given the updateThirtyDays function', () => {
138142
expect(mockedCreateSummary).toHaveBeenCalledTimes(1)
139143
expect(mockedCreateSummary).toHaveBeenNthCalledWith(1, {
140144
currentSummary: {
145+
categoryPercentages: {
146+
pass: 0,
147+
fail: 0,
148+
passDkimOnly: 0,
149+
passSpfOnly: 0,
150+
},
141151
categoryTotals: {
142152
fail: 0,
143153
pass: 0,
@@ -164,6 +174,7 @@ describe('given the updateThirtyDays function', () => {
164174
const mockedRemoveSummary = jest.fn()
165175

166176
const updateThirtyDaysFunc = updateThirtyDays(
177+
calculatePercentages,
167178
mockedCreateSummary,
168179
mockedCreateEdge,
169180
loadSummaryByDate(mockedContainer),

services/dmarc-report/src/database/initialize-summaries.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const initializeSummaries = (
2+
calculatePercentages,
23
createSummaryEdge,
34
createSummary,
45
loadSummaryByDate,
@@ -17,6 +18,10 @@ const initializeSummaries = (
1718
}
1819

1920
const currentSummary = await loadSummaryByDate({ domain, startDate })
21+
const categoryPercentages = calculatePercentages(
22+
currentSummary.categoryTotals,
23+
)
24+
currentSummary.categoryPercentages = categoryPercentages
2025

2126
const summaryDBInfo = await createSummary({ currentSummary })
2227

services/dmarc-report/src/database/update-month-summary.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const updateMonthSummary = (
2+
calculatePercentages,
23
createSummary,
34
createSummaryEdge,
45
loadSummaryByDate,
@@ -23,6 +24,11 @@ const updateMonthSummary = (
2324
startDate: dateToAdd,
2425
})
2526

27+
const categoryPercentages = calculatePercentages(
28+
currentSummary.categoryTotals,
29+
)
30+
currentSummary.categoryPercentages = categoryPercentages
31+
2632
const summaryDBInfo = await createSummary({ currentSummary })
2733

2834
await createSummaryEdge({

services/dmarc-report/src/database/update-thirty-days.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const updateThirtyDays = (
2+
calculatePercentages,
23
createSummary,
34
createSummaryEdge,
45
loadSummaryByDate,
@@ -19,6 +20,11 @@ const updateThirtyDays = (
1920
startDate: 'thirty_days',
2021
})
2122

23+
const categoryPercentages = calculatePercentages(
24+
currentSummary.categoryTotals,
25+
)
26+
currentSummary.categoryPercentages = categoryPercentages
27+
2228
const summaryDBInfo = await createSummary({ currentSummary })
2329

2430
await createSummaryEdge({

services/dmarc-report/src/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
const database = require('./database')
22
const loaders = require('./loaders')
33
const { arrayEquals } = require('./array-equals')
4+
const { calculatePercentages } = require('./calculate-percentages')
45

56
module.exports = {
67
...database,
78
...loaders,
89
arrayEquals,
10+
calculatePercentages,
911
}

0 commit comments

Comments
 (0)