Skip to content

Commit 25f6fb2

Browse files
committed
feat: add check softwareDesignTraining
Related #52
1 parent d90cb8b commit 25f6fb2

File tree

3 files changed

+153
-1
lines changed

3 files changed

+153
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
const knexInit = require('knex')
2+
const { getConfig } = require('../../src/config')
3+
const softwareDesignTraining = require('../../src/checks/complianceChecks/softwareDesignTraining')
4+
const {
5+
resetDatabase, addProject, getAllResults, getAllTasks, getAllAlerts,
6+
addAlert, addTask, addResult, getCheckByCodeName, addSSoftwareDesignTraining, getAllSoftwareDesignTrainings
7+
} = require('../../__utils__')
8+
9+
const { dbSettings } = getConfig('test')
10+
11+
let knex
12+
let project
13+
let check
14+
15+
beforeAll(async () => {
16+
knex = knexInit(dbSettings)
17+
check = await getCheckByCodeName(knex, 'softwareDesignTraining')
18+
})
19+
20+
beforeEach(async () => {
21+
await resetDatabase(knex)
22+
project = await addProject(knex, { name: 'project', category: 'impact' })
23+
})
24+
25+
afterAll(async () => {
26+
await knex.destroy()
27+
})
28+
29+
describe('Integration: softwareDesignTraining', () => {
30+
test('Should add results without alerts or tasks', async () => {
31+
// Add a passed check scenario
32+
await addSSoftwareDesignTraining(knex, { project_id: project.id, description: 'learning accomplished', training_date: new Date().toISOString() })
33+
let trainings = await getAllSoftwareDesignTrainings(knex)
34+
expect(trainings.length).toBe(1)
35+
// Check that the database is empty
36+
let results = await getAllResults(knex)
37+
expect(results.length).toBe(0)
38+
let alerts = await getAllAlerts(knex)
39+
expect(alerts.length).toBe(0)
40+
let tasks = await getAllTasks(knex)
41+
expect(tasks.length).toBe(0)
42+
// Run the check
43+
await expect(softwareDesignTraining(knex)).resolves.toBeUndefined()
44+
// Check that the database has the expected results
45+
trainings = await getAllSoftwareDesignTrainings(knex)
46+
expect(trainings.length).toBe(1)
47+
results = await getAllResults(knex)
48+
expect(results.length).toBe(1)
49+
expect(results[0].status).toBe('passed')
50+
expect(results[0].compliance_check_id).toBe(check.id)
51+
alerts = await getAllAlerts(knex)
52+
expect(alerts.length).toBe(0)
53+
tasks = await getAllTasks(knex)
54+
expect(tasks.length).toBe(0)
55+
})
56+
test('Should delete (previous alerts and tasks) and add results', async () => {
57+
// Add a passed check scenario
58+
await addSSoftwareDesignTraining(knex, { project_id: project.id, description: 'learning accomplished', training_date: new Date().toISOString() })
59+
// Add previous alerts and tasks
60+
await addAlert(knex, { compliance_check_id: check.id, project_id: project.id, title: 'existing', description: 'existing', severity: 'critical' })
61+
await addTask(knex, { compliance_check_id: check.id, project_id: project.id, title: 'existing', description: 'existing', severity: 'critical' })
62+
// Check that the database has the expected results
63+
const trainings = await getAllSoftwareDesignTrainings(knex)
64+
expect(trainings.length).toBe(1)
65+
let results = await getAllResults(knex)
66+
expect(results.length).toBe(0)
67+
let alerts = await getAllAlerts(knex)
68+
expect(alerts.length).toBe(1)
69+
expect(alerts[0].compliance_check_id).toBe(check.id)
70+
let tasks = await getAllTasks(knex)
71+
expect(tasks.length).toBe(1)
72+
expect(tasks[0].compliance_check_id).toBe(check.id)
73+
// Run the check
74+
await expect(softwareDesignTraining(knex)).resolves.toBeUndefined()
75+
// Check that the database has the expected results
76+
results = await getAllResults(knex)
77+
expect(results.length).toBe(1)
78+
expect(results[0].status).toBe('passed')
79+
expect(results[0].compliance_check_id).toBe(check.id)
80+
alerts = await getAllAlerts(knex)
81+
expect(alerts.length).toBe(0)
82+
tasks = await getAllTasks(knex)
83+
expect(tasks.length).toBe(0)
84+
})
85+
test('Should add (alerts and tasks) and update results', async () => {
86+
await addResult(knex, { compliance_check_id: check.id, project_id: project.id, status: 'failed', rationale: 'failed previously', severity: 'critical' })
87+
// Check that the database is empty
88+
let results = await getAllResults(knex)
89+
expect(results.length).toBe(1)
90+
expect(results[0].compliance_check_id).toBe(check.id)
91+
let trainings = await getAllSoftwareDesignTrainings(knex)
92+
expect(trainings.length).toBe(0)
93+
let alerts = await getAllAlerts(knex)
94+
expect(alerts.length).toBe(0)
95+
let tasks = await getAllTasks(knex)
96+
expect(tasks.length).toBe(0)
97+
// Run the check
98+
await expect(softwareDesignTraining(knex)).resolves.toBeUndefined()
99+
// Check that the database has the expected results
100+
results = await getAllResults(knex)
101+
expect(results.length).toBe(1)
102+
expect(results[0].status).toBe('failed')
103+
expect(results[0].rationale).not.toBe('failed previously')
104+
expect(results[0].compliance_check_id).toBe(check.id)
105+
trainings = await getAllSoftwareDesignTrainings(knex)
106+
expect(trainings.length).toBe(0)
107+
alerts = await getAllAlerts(knex)
108+
expect(alerts.length).toBe(1)
109+
expect(alerts[0].compliance_check_id).toBe(check.id)
110+
tasks = await getAllTasks(knex)
111+
expect(tasks.length).toBe(1)
112+
expect(tasks[0].compliance_check_id).toBe(check.id)
113+
})
114+
})

__utils__/index.js

+11-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const resetDatabase = async (knex) => {
2+
await knex.raw('TRUNCATE TABLE software_design_training RESTART IDENTITY CASCADE')
23
await knex.raw('TRUNCATE TABLE compliance_checks_results RESTART IDENTITY CASCADE')
34
await knex.raw('TRUNCATE TABLE compliance_checks_tasks RESTART IDENTITY CASCADE')
45
await knex.raw('TRUNCATE TABLE compliance_checks_alerts RESTART IDENTITY CASCADE')
@@ -50,6 +51,13 @@ const getCheckByCodeName = async (knex, codeName) => {
5051
return check
5152
}
5253

54+
const addSSoftwareDesignTraining = async (knex, data) => {
55+
const [training] = await knex('software_design_training').insert(data).returning('*')
56+
return training
57+
}
58+
59+
const getAllSoftwareDesignTrainings = (knex) => knex('software_design_training').select('*')
60+
5361
module.exports = {
5462
getAllComplianceChecks,
5563
resetDatabase,
@@ -65,5 +73,7 @@ module.exports = {
6573
addAlert,
6674
addTask,
6775
addResult,
68-
getCheckByCodeName
76+
getCheckByCodeName,
77+
addSSoftwareDesignTraining,
78+
getAllSoftwareDesignTrainings
6979
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
const validators = require('../validators')
2+
const { initializeStore } = require('../../store')
3+
const debug = require('debug')('checks:softwareDesignTraining')
4+
5+
module.exports = async (knex) => {
6+
const {
7+
getAllSSoftwareDesignTrainings, getCheckByCodeName,
8+
getAllProjects, addAlert, addTask, upsertComplianceCheckResult,
9+
deleteAlertsByComplianceCheckId, deleteTasksByComplianceCheckId
10+
} = initializeStore(knex)
11+
debug('Collecting relevant data...')
12+
const check = await getCheckByCodeName('softwareDesignTraining')
13+
const trainings = await getAllSSoftwareDesignTrainings()
14+
const projects = await getAllProjects()
15+
16+
debug('Extracting the validation results...')
17+
const analysis = validators.softwareDesignTraining({ trainings, check, projects })
18+
debug('Deleting previous alerts and tasks to avoid orphaned records...')
19+
await deleteAlertsByComplianceCheckId(check.id)
20+
await deleteTasksByComplianceCheckId(check.id)
21+
22+
debug('Upserting the new results...')
23+
await Promise.all(analysis.results.map(result => upsertComplianceCheckResult(result)))
24+
25+
debug('Inserting the new Alerts and Tasks...')
26+
await Promise.all(analysis.alerts.map(alert => addAlert(alert)))
27+
await Promise.all(analysis.tasks.map(task => addTask(task)))
28+
}

0 commit comments

Comments
 (0)