From d65ba2edfbeb9b40b6b063da040a168b0cfb4c09 Mon Sep 17 00:00:00 2001 From: nsdeschenes Date: Wed, 3 Feb 2021 08:07:48 -0400 Subject: [PATCH 1/4] introduce calculate-percentages function --- .../__tests__/calculate-percentages.test.js | 76 +++++++++++++++++++ .../dmarc-report/src/calculate-percentages.js | 19 +++++ 2 files changed, 95 insertions(+) create mode 100644 services/dmarc-report/src/__tests__/calculate-percentages.test.js create mode 100644 services/dmarc-report/src/calculate-percentages.js diff --git a/services/dmarc-report/src/__tests__/calculate-percentages.test.js b/services/dmarc-report/src/__tests__/calculate-percentages.test.js new file mode 100644 index 0000000000..cf24616310 --- /dev/null +++ b/services/dmarc-report/src/__tests__/calculate-percentages.test.js @@ -0,0 +1,76 @@ +const { calculatePercentages } = require('../calculate-percentages') + +describe('given the calculatePercentages', () => { + describe('values are greater then zero', () => { + const categoryTotals = { + pass: 2, + fail: 3, + passDkimOnly: 4, + passSpfOnly: 5, + } + describe('pass is greater then zero', () => { + it('returns percentage', () => { + const percentages = calculatePercentages(categoryTotals) + + expect(percentages.pass).toEqual(14.3) + }) + }) + describe('fail is greater then zero', () => { + it('returns percentage', () => { + const percentages = calculatePercentages(categoryTotals) + + expect(percentages.fail).toEqual(21.4) + }) + }) + describe('passDkimOnly is greater then zero', () => { + it('returns percentage', () => { + const percentages = calculatePercentages(categoryTotals) + + expect(percentages.passDkimOnly).toEqual(28.6) + }) + }) + describe('passSpfOnly is greater then zero', () => { + it('returns percentage', () => { + const percentages = calculatePercentages(categoryTotals) + + expect(percentages.passSpfOnly).toEqual(35.7) + }) + }) + }) + describe('values are less then zero', () => { + const categoryTotals = { + pass: 0, + fail: 0, + passDkimOnly: 0, + passSpfOnly: 0, + } + describe('pass is less then zero', () => { + it('returns 0', () => { + const percentages = calculatePercentages(categoryTotals) + + expect(percentages.pass).toEqual(0) + }) + }) + describe('fail is less then zero', () => { + it('returns 0', () => { + const percentages = calculatePercentages(categoryTotals) + + expect(percentages.fail).toEqual(0) + }) + }) + describe('passDkimOnly is less then zero', () => { + it('returns 0', () => { + const percentages = calculatePercentages(categoryTotals) + + expect(percentages.passDkimOnly).toEqual(0) + }) + }) + describe('passSpfOnly is less then zero', () => { + it('returns 0', () => { + const percentages = calculatePercentages(categoryTotals) + + expect(percentages.passSpfOnly).toEqual(0) + }) + }) + }) +}) diff --git a/services/dmarc-report/src/calculate-percentages.js b/services/dmarc-report/src/calculate-percentages.js new file mode 100644 index 0000000000..16f8b5f3ec --- /dev/null +++ b/services/dmarc-report/src/calculate-percentages.js @@ -0,0 +1,19 @@ +const calculatePercentages = ({ fail, pass, passDkimOnly, passSpfOnly }) => { + const total = [fail, pass, passDkimOnly, passSpfOnly].reduce( + (a, b) => a + b, + 0, + ) + + return { + fail: fail <= 0 ? 0 : Number(((fail / total) * 100).toFixed(1)), + pass: pass <= 0 ? 0 : Number(((pass / total) * 100).toFixed(1)), + passDkimOnly: + passDkimOnly <= 0 ? 0 : Number(((passDkimOnly / total) * 100).toFixed(1)), + passSpfOnly: + passSpfOnly <= 0 ? 0 : Number(((passSpfOnly / total) * 100).toFixed(1)), + } +} + +module.exports = { + calculatePercentages, +} From 8e5f700c66f812e91f1adfe8e3d749c7fb548508 Mon Sep 17 00:00:00 2001 From: nsdeschenes Date: Wed, 3 Feb 2021 08:08:07 -0400 Subject: [PATCH 2/4] calculate percentages on current summaries, and update tests --- .../__tests__/initialize-summaries.test.js | 15 +++++++++++++++ .../__tests__/update-month-summary.test.js | 12 ++++++++++++ .../database/__tests__/update-thirty-days.test.js | 11 +++++++++++ .../src/database/initialize-summaries.js | 5 +++++ .../src/database/update-month-summary.js | 6 ++++++ .../src/database/update-thirty-days.js | 6 ++++++ 6 files changed, 55 insertions(+) diff --git a/services/dmarc-report/src/database/__tests__/initialize-summaries.test.js b/services/dmarc-report/src/database/__tests__/initialize-summaries.test.js index a57bb89dd6..a49ac64085 100644 --- a/services/dmarc-report/src/database/__tests__/initialize-summaries.test.js +++ b/services/dmarc-report/src/database/__tests__/initialize-summaries.test.js @@ -3,6 +3,7 @@ const { ArangoTools, dbNameFromFile } = require('arango-tools') const { makeMigrations } = require('../../../migrations') const { initializeSummaries } = require('../index') const { loadSummaryByDate } = require('../../loaders') +const { calculatePercentages } = require('../../calculate-percentages') const { DB_PASS: rootPass, DB_URL: url } = process.env @@ -68,6 +69,7 @@ describe('given the initializeSummaries function', () => { .mockReturnValue({ _id: 'dmarcSummaries/1' }) const initialSummaryFunc = initializeSummaries( + calculatePercentages, mockedCreateEdge, mockedCreateSummary, loadSummaryByDate(mockedContainer), @@ -82,6 +84,12 @@ describe('given the initializeSummaries function', () => { expect(mockedCreateSummary).toHaveBeenCalledTimes(2) expect(mockedCreateSummary).toHaveBeenNthCalledWith(1, { currentSummary: { + categoryPercentages: { + pass: 0, + fail: 0, + passDkimOnly: 0, + passSpfOnly: 0, + }, categoryTotals: { fail: 0, pass: 0, @@ -98,6 +106,12 @@ describe('given the initializeSummaries function', () => { }) expect(mockedCreateSummary).toHaveBeenNthCalledWith(2, { currentSummary: { + categoryPercentages: { + pass: 0, + fail: 0, + passDkimOnly: 0, + passSpfOnly: 0, + }, categoryTotals: { fail: 0, pass: 0, @@ -120,6 +134,7 @@ describe('given the initializeSummaries function', () => { .mockReturnValue({ _id: 'dmarcSummaries/1' }) const initialSummaryFunc = initializeSummaries( + calculatePercentages, mockedCreateEdge, mockedCreateSummary, loadSummaryByDate(mockedContainer), diff --git a/services/dmarc-report/src/database/__tests__/update-month-summary.test.js b/services/dmarc-report/src/database/__tests__/update-month-summary.test.js index fa6b7fc5fa..ceca754f0f 100644 --- a/services/dmarc-report/src/database/__tests__/update-month-summary.test.js +++ b/services/dmarc-report/src/database/__tests__/update-month-summary.test.js @@ -3,6 +3,7 @@ const { ArangoTools, dbNameFromFile } = require('arango-tools') const { makeMigrations } = require('../../../migrations') const { updateMonthSummary } = require('../index') const { loadSummaryByDate } = require('../../loaders') +const { calculatePercentages } = require('../../calculate-percentages') const { DB_PASS: rootPass, DB_URL: url } = process.env @@ -66,6 +67,7 @@ describe('given the updateMonthSummary function', () => { const mockedRemoveSummary = jest.fn() const updateMonthSummaryFunc = updateMonthSummary( + calculatePercentages, mockedCreateSummary, mockedCreateEdge, loadSummaryByDate(mockedContainer), @@ -97,6 +99,7 @@ describe('given the updateMonthSummary function', () => { const mockedRemoveSummary = jest.fn() const updateMonthSummaryFunc = updateMonthSummary( + calculatePercentages, mockedCreateSummary, mockedCreateEdge, loadSummaryByDate(mockedContainer), @@ -127,6 +130,7 @@ describe('given the updateMonthSummary function', () => { const mockedRemoveSummary = jest.fn() const updateMonthSummaryFunc = updateMonthSummary( + calculatePercentages, mockedCreateSummary, mockedCreateEdge, loadSummaryByDate(mockedContainer), @@ -144,6 +148,12 @@ describe('given the updateMonthSummary function', () => { expect(mockedCreateSummary).toHaveBeenCalledTimes(1) expect(mockedCreateSummary).toHaveBeenNthCalledWith(1, { currentSummary: { + categoryPercentages: { + pass: 0, + fail: 0, + passDkimOnly: 0, + passSpfOnly: 0, + }, categoryTotals: { fail: 0, pass: 0, @@ -170,6 +180,7 @@ describe('given the updateMonthSummary function', () => { const mockedRemoveSummary = jest.fn() const updateMonthSummaryFunc = updateMonthSummary( + calculatePercentages, mockedCreateSummary, mockedCreateEdge, loadSummaryByDate(mockedContainer), @@ -201,6 +212,7 @@ describe('given the updateMonthSummary function', () => { const mockedRemoveSummary = jest.fn() const updateMonthSummaryFunc = updateMonthSummary( + calculatePercentages, mockedCreateSummary, mockedCreateEdge, loadSummaryByDate(mockedContainer), diff --git a/services/dmarc-report/src/database/__tests__/update-thirty-days.test.js b/services/dmarc-report/src/database/__tests__/update-thirty-days.test.js index cb79047af5..059084aee1 100644 --- a/services/dmarc-report/src/database/__tests__/update-thirty-days.test.js +++ b/services/dmarc-report/src/database/__tests__/update-thirty-days.test.js @@ -3,6 +3,7 @@ const { ArangoTools, dbNameFromFile } = require('arango-tools') const { makeMigrations } = require('../../../migrations') const { updateThirtyDays } = require('../index') const { loadSummaryByDate } = require('../../loaders') +const { calculatePercentages } = require('../../calculate-percentages') const { DB_PASS: rootPass, DB_URL: url } = process.env @@ -66,6 +67,7 @@ describe('given the updateThirtyDays function', () => { const mockedRemoveSummary = jest.fn() const updateThirtyDaysFunc = updateThirtyDays( + calculatePercentages, mockedCreateSummary, mockedCreateEdge, loadSummaryByDate(mockedContainer), @@ -95,6 +97,7 @@ describe('given the updateThirtyDays function', () => { const mockedRemoveSummary = jest.fn() const updateThirtyDaysFunc = updateThirtyDays( + calculatePercentages, mockedCreateSummary, mockedCreateEdge, loadSummaryByDate(mockedContainer), @@ -123,6 +126,7 @@ describe('given the updateThirtyDays function', () => { const mockedRemoveSummary = jest.fn() const updateThirtyDaysFunc = updateThirtyDays( + calculatePercentages, mockedCreateSummary, mockedCreateEdge, loadSummaryByDate(mockedContainer), @@ -138,6 +142,12 @@ describe('given the updateThirtyDays function', () => { expect(mockedCreateSummary).toHaveBeenCalledTimes(1) expect(mockedCreateSummary).toHaveBeenNthCalledWith(1, { currentSummary: { + categoryPercentages: { + pass: 0, + fail: 0, + passDkimOnly: 0, + passSpfOnly: 0, + }, categoryTotals: { fail: 0, pass: 0, @@ -164,6 +174,7 @@ describe('given the updateThirtyDays function', () => { const mockedRemoveSummary = jest.fn() const updateThirtyDaysFunc = updateThirtyDays( + calculatePercentages, mockedCreateSummary, mockedCreateEdge, loadSummaryByDate(mockedContainer), diff --git a/services/dmarc-report/src/database/initialize-summaries.js b/services/dmarc-report/src/database/initialize-summaries.js index c133c16926..7e26dc0b5b 100644 --- a/services/dmarc-report/src/database/initialize-summaries.js +++ b/services/dmarc-report/src/database/initialize-summaries.js @@ -1,4 +1,5 @@ const initializeSummaries = ( + calculatePercentages, createSummaryEdge, createSummary, loadSummaryByDate, @@ -17,6 +18,10 @@ const initializeSummaries = ( } const currentSummary = await loadSummaryByDate({ domain, startDate }) + const categoryPercentages = calculatePercentages( + currentSummary.categoryTotals, + ) + currentSummary.categoryPercentages = categoryPercentages const summaryDBInfo = await createSummary({ currentSummary }) diff --git a/services/dmarc-report/src/database/update-month-summary.js b/services/dmarc-report/src/database/update-month-summary.js index 4079c8ecbe..86017e0acd 100644 --- a/services/dmarc-report/src/database/update-month-summary.js +++ b/services/dmarc-report/src/database/update-month-summary.js @@ -1,4 +1,5 @@ const updateMonthSummary = ( + calculatePercentages, createSummary, createSummaryEdge, loadSummaryByDate, @@ -23,6 +24,11 @@ const updateMonthSummary = ( startDate: dateToAdd, }) + const categoryPercentages = calculatePercentages( + currentSummary.categoryTotals, + ) + currentSummary.categoryPercentages = categoryPercentages + const summaryDBInfo = await createSummary({ currentSummary }) await createSummaryEdge({ diff --git a/services/dmarc-report/src/database/update-thirty-days.js b/services/dmarc-report/src/database/update-thirty-days.js index f3e1b29642..cafcfa5402 100644 --- a/services/dmarc-report/src/database/update-thirty-days.js +++ b/services/dmarc-report/src/database/update-thirty-days.js @@ -1,4 +1,5 @@ const updateThirtyDays = ( + calculatePercentages, createSummary, createSummaryEdge, loadSummaryByDate, @@ -19,6 +20,11 @@ const updateThirtyDays = ( startDate: 'thirty_days', }) + const categoryPercentages = calculatePercentages( + currentSummary.categoryTotals, + ) + currentSummary.categoryPercentages = categoryPercentages + const summaryDBInfo = await createSummary({ currentSummary }) await createSummaryEdge({ From 1de465d585a07cc293811788a513f82bc056b776 Mon Sep 17 00:00:00 2001 From: nsdeschenes Date: Wed, 3 Feb 2021 08:08:19 -0400 Subject: [PATCH 3/4] update indexs --- services/dmarc-report/index.js | 4 ++++ services/dmarc-report/src/index.js | 2 ++ 2 files changed, 6 insertions(+) diff --git a/services/dmarc-report/index.js b/services/dmarc-report/index.js index 67a1c2837b..6f501019bf 100644 --- a/services/dmarc-report/index.js +++ b/services/dmarc-report/index.js @@ -20,6 +20,7 @@ const { const { arrayEquals, + calculatePercentages, createSummaries, createSummaryEdge, createSummary, @@ -65,6 +66,7 @@ const { loadDates(moment), loadSummaryCountByDomain(query), initializeSummaries( + calculatePercentages, createSummaryEdge(collections), createSummary(query), loadSummaryByDate(summariesContainer), @@ -73,6 +75,7 @@ const { arrayEquals, loadCurrentDates(query), updateThirtyDays( + calculatePercentages, createSummary(query), createSummaryEdge(collections), loadSummaryByDate(summariesContainer), @@ -80,6 +83,7 @@ const { removeSummary(query), ), updateMonthSummary( + calculatePercentages, createSummary(query), createSummaryEdge(collections), loadSummaryByDate(summariesContainer), diff --git a/services/dmarc-report/src/index.js b/services/dmarc-report/src/index.js index 59b8e86760..6cd2a8ea3b 100644 --- a/services/dmarc-report/src/index.js +++ b/services/dmarc-report/src/index.js @@ -1,9 +1,11 @@ const database = require('./database') const loaders = require('./loaders') const { arrayEquals } = require('./array-equals') +const { calculatePercentages } = require('./calculate-percentages') module.exports = { ...database, ...loaders, arrayEquals, + calculatePercentages, } From cd3b5a41825e8ac73f99a0ed83a49640ecbe44af Mon Sep 17 00:00:00 2001 From: nsdeschenes Date: Thu, 4 Feb 2021 06:32:54 -0400 Subject: [PATCH 4/4] swtich to zero decimals --- .../src/__tests__/calculate-percentages.test.js | 8 ++++---- services/dmarc-report/src/calculate-percentages.js | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/services/dmarc-report/src/__tests__/calculate-percentages.test.js b/services/dmarc-report/src/__tests__/calculate-percentages.test.js index cf24616310..cff6721c73 100644 --- a/services/dmarc-report/src/__tests__/calculate-percentages.test.js +++ b/services/dmarc-report/src/__tests__/calculate-percentages.test.js @@ -12,28 +12,28 @@ describe('given the calculatePercentages', () => { it('returns percentage', () => { const percentages = calculatePercentages(categoryTotals) - expect(percentages.pass).toEqual(14.3) + expect(percentages.pass).toEqual(14) }) }) describe('fail is greater then zero', () => { it('returns percentage', () => { const percentages = calculatePercentages(categoryTotals) - expect(percentages.fail).toEqual(21.4) + expect(percentages.fail).toEqual(21) }) }) describe('passDkimOnly is greater then zero', () => { it('returns percentage', () => { const percentages = calculatePercentages(categoryTotals) - expect(percentages.passDkimOnly).toEqual(28.6) + expect(percentages.passDkimOnly).toEqual(29) }) }) describe('passSpfOnly is greater then zero', () => { it('returns percentage', () => { const percentages = calculatePercentages(categoryTotals) - expect(percentages.passSpfOnly).toEqual(35.7) + expect(percentages.passSpfOnly).toEqual(36) }) }) }) diff --git a/services/dmarc-report/src/calculate-percentages.js b/services/dmarc-report/src/calculate-percentages.js index 16f8b5f3ec..147bf3bc1d 100644 --- a/services/dmarc-report/src/calculate-percentages.js +++ b/services/dmarc-report/src/calculate-percentages.js @@ -5,12 +5,12 @@ const calculatePercentages = ({ fail, pass, passDkimOnly, passSpfOnly }) => { ) return { - fail: fail <= 0 ? 0 : Number(((fail / total) * 100).toFixed(1)), - pass: pass <= 0 ? 0 : Number(((pass / total) * 100).toFixed(1)), + fail: fail <= 0 ? 0 : Number(((fail / total) * 100).toFixed(0)), + pass: pass <= 0 ? 0 : Number(((pass / total) * 100).toFixed(0)), passDkimOnly: - passDkimOnly <= 0 ? 0 : Number(((passDkimOnly / total) * 100).toFixed(1)), + passDkimOnly <= 0 ? 0 : Number(((passDkimOnly / total) * 100).toFixed(0)), passSpfOnly: - passSpfOnly <= 0 ? 0 : Number(((passSpfOnly / total) * 100).toFixed(1)), + passSpfOnly <= 0 ? 0 : Number(((passSpfOnly / total) * 100).toFixed(0)), } }