Coverage for product_risk_suite / product / tests.py: 100%

106 statements  

« prev     ^ index     » next       coverage.py v7.14.0, created at 2026-05-13 23:42 +0000

1from django.test import TestCase 

2from collections import OrderedDict 

3 

4from .models import * 

5from risk_assessment.models import * 

6 

7# Create your tests here. 

8class ProductRiskEntryTest(TestCase): 

9 custom_id = "pre-test-001" 

10 risk_title = "PRE test risk" 

11 def setUp(self): 

12 os = Asset.objects.create(name="OS") 

13 Stride.objects.create(id=1, name="S") 

14 usb = Origin.objects.create(name="USB") 

15 lc = LiveCycle.objects.create(name="in use") 

16 risk = Risk(id=0, custom_id=self.custom_id, asset=os, origin=usb, live_cycle=lc, title=self.risk_title, description="more info") 

17 risk.save() 

18 s = Stride.objects.get(id=1) 

19 risk.stride.set([s]) 

20 risk.save() 

21 

22 self.risk_rating_init = RiskRating.objects.create(likelihood_of_occurrence=2, severity_of_impact=5) 

23 self.init_risk = 10 

24 self.risk_rating_miti = RiskRating.objects.create(likelihood_of_occurrence=1, severity_of_impact=5) 

25 self.mit_risk = 5 

26 

27 self.secReq1 = SecurityRequirement.objects.create(norm_short="CRA", norm_long="CRA long", description_short="Part 1.1", description_long="details 1.1", slug="cra-1.1") 

28 self.secReq2 = SecurityRequirement.objects.create(norm_short="CRA", norm_long="CRA long", description_short="Part 1.2", description_long="details 1.2", slug="cra-1.2") 

29 rm = RiskMitigation(id=0, mitigation="We fixed it", rational="We fixed it good") 

30 rm.save() 

31 rm.security_requirements.set([self.secReq1]) 

32 rm.save() 

33 self.rm = rm 

34 

35 self.u = User.objects.create(username="testuser") 

36 self.s1 = Status.objects.create(id=1, status="On going") 

37 self.ev = Evidence.objects.create(id=1, due_date="2026-04-23", responsible=self.u, status=self.s1, evidence="[REQ-001] the evidence req", evidence_link="https://example.com/requirement-001") 

38 

39 def test_product_risk_entry_str(self): 

40 risk = Risk.objects.get(id=0) 

41 acc = ProductRiskEntry.objects.create(id=0, risk=risk, risk_accepted = True, risk_rating_initial=self.risk_rating_init) 

42 mit_evidence = ProductRiskEntry.objects.create(id=1, risk=risk, risk_accepted = False, risk_rating_initial=self.risk_rating_init, risk_mitigation=self.rm, risk_rating_after_mitigation=self.risk_rating_miti) 

43 mit_evidence.evidences.set([self.ev]) 

44 mit_no_evidence = ProductRiskEntry.objects.create(id=2, risk=risk, risk_accepted = False, risk_rating_initial=self.risk_rating_init, risk_mitigation=self.rm, risk_rating_after_mitigation=self.risk_rating_miti) 

45 unmit = ProductRiskEntry.objects.create(id=3, risk=risk, risk_accepted = False, risk_rating_initial=self.risk_rating_init) 

46 

47 self.assertEqual(str(acc), f"Accepted Risk: {self.custom_id} - {self.risk_title}") 

48 self.assertEqual(str(mit_evidence), f"Mitigated Risk: {self.custom_id} - {self.risk_title} Risk: {self.mit_risk}") 

49 self.assertEqual(str(mit_no_evidence), f"Mitigated Risk: {self.custom_id} - {self.risk_title} Risk: {self.mit_risk}") 

50 self.assertEqual(str(unmit), f"*Un*mitigated Risk: {self.custom_id} - {self.risk_title} Open risk: {self.init_risk}") 

51 

52class ProductRiskAnalysisTest(TestCase): 

53 custom_id = "pra-test-002" 

54 risk_title = "PRA test risk" 

55 

56 def setUp(self): 

57 os = Asset.objects.create(name="OS") 

58 Stride.objects.create(id=1, name="S") 

59 usb = Origin.objects.create(name="USB") 

60 lc = LiveCycle.objects.create(name="in use") 

61 risk = Risk(id=0, custom_id=self.custom_id, asset=os, origin=usb, live_cycle=lc, title=self.risk_title, description="more info") 

62 risk.save() 

63 s = Stride.objects.get(id=1) 

64 risk.stride.set([s]) 

65 risk.save() 

66 

67 self.risk_rating_init = RiskRating.objects.create(likelihood_of_occurrence=2, severity_of_impact=5) 

68 self.init_risk = 10 

69 self.risk_rating_miti = RiskRating.objects.create(likelihood_of_occurrence=1, severity_of_impact=5) 

70 self.mit_risk = 5 

71 

72 self.secReq1 = SecurityRequirement.objects.create(norm_short="CRA", norm_long="CRA long", description_short="Part 1.1", description_long="details 1.1", slug="cra-1.1") 

73 self.secReq2 = SecurityRequirement.objects.create(norm_short="CRA", norm_long="CRA long", description_short="Part 1.2", description_long="details 1.2", slug="cra-1.2") 

74 rm = RiskMitigation(id=0, mitigation="We fixed it", rational="We fixed it good") 

75 rm.save() 

76 rm.security_requirements.set([self.secReq1]) 

77 rm.save() 

78 self.rm = rm 

79 

80 self.u = User.objects.create(username="testuser") 

81 self.s1 = Status.objects.create(id=1, status="On going") 

82 self.ev = Evidence.objects.create(id=1, due_date="2026-04-23", responsible=self.u, status=self.s1, evidence="[REQ-001] the evidence req", evidence_link="https://example.com/requirement-001") 

83 

84 acc = ProductRiskEntry.objects.create(id=0, risk=risk, risk_accepted = True, risk_rating_initial=self.risk_rating_init) 

85 mit_evidence = ProductRiskEntry.objects.create(id=1, risk=risk, risk_accepted = False, risk_rating_initial=self.risk_rating_init, risk_mitigation=self.rm, risk_rating_after_mitigation=self.risk_rating_miti) 

86 mit_evidence.evidences.set([self.ev]) 

87 mit_evidence.save() 

88 mit_no_evidence = ProductRiskEntry.objects.create(id=2, risk=risk, risk_accepted = False, risk_rating_initial=self.risk_rating_init, risk_mitigation=self.rm, risk_rating_after_mitigation=self.risk_rating_miti) 

89 unmit = ProductRiskEntry.objects.create(id=3, risk=risk, risk_accepted = False, risk_rating_initial=self.risk_rating_init) 

90 

91 def test_str(self): 

92 pra = ProductRiskAnalysis.objects.create(id=0, name="Our first analysis", slug="our-first-analysis") 

93 pra.risk_entries.set([ProductRiskEntry.objects.get(id=0), ProductRiskEntry.objects.get(id=1), ProductRiskEntry.objects.get(id=2), ProductRiskEntry.objects.get(id=3)]) 

94 pra.save() 

95 

96 self.assertEqual(str(ProductRiskAnalysis.objects.get(id=0)), "Our first analysis") 

97 

98 def test_get_risk_summary(self): 

99 pra = ProductRiskAnalysis.objects.create(id=0, name="Our first analysis", slug="our-first-analysis") 

100 pra.risk_entries.set([ProductRiskEntry.objects.get(id=0), ProductRiskEntry.objects.get(id=1), ProductRiskEntry.objects.get(id=2), ProductRiskEntry.objects.get(id=3)]) 

101 pra.save() 

102 

103 risk_summary = ProductRiskAnalysis.get_risk_summary(pra.risk_entries) 

104 self.assertEqual(risk_summary["risk_severities_before_mitigation"][Risk5x5.LOW.name], 0) 

105 self.assertEqual(risk_summary["risk_severities_before_mitigation"][Risk5x5.MID.name], 4) 

106 self.assertEqual(risk_summary["risk_severities_before_mitigation"][Risk5x5.HIGH.name], 0) 

107 

108 self.assertEqual(risk_summary["risk_severities_after_mitigation"][Risk5x5.LOW.name], 2) 

109 self.assertEqual(risk_summary["risk_severities_after_mitigation"][Risk5x5.MID.name], 2) 

110 self.assertEqual(risk_summary["risk_severities_after_mitigation"][Risk5x5.HIGH.name], 0) 

111 

112 self.assertEqual(risk_summary["risk_severity_colors"][Risk5x5.LOW.name], "#d0e6dc") 

113 self.assertEqual(risk_summary["risk_severity_colors"][Risk5x5.MID.name], "#fff3cc") 

114 self.assertEqual(risk_summary["risk_severity_colors"][Risk5x5.HIGH.name], "#f8d6d9") 

115 

116 self.assertEqual(risk_summary["n_risks"], 4) 

117 self.assertEqual(len(risk_summary["unmitigated_risks"]), 2) 

118 self.assertEqual(risk_summary["unmitigated_risks"][0], "pra-test-002") 

119 self.assertEqual(risk_summary["unmitigated_risks"][1], "pra-test-002") 

120 self.assertEqual(risk_summary["mitigation_stati"], { 

121 "open": 0, 

122 "on_going": 1, 

123 "finished": 0, 

124 "rejected": 0, 

125 }) 

126 

127 self.assertEqual(risk_summary["covered_sec_reqs"], OrderedDict( 

128 {"CRA: Part 1.1": "cra-1.1"}, 

129 )) 

130 

131class ProductTest(TestCase): 

132 def setUp(self): 

133 Product.objects.create(id=0, title="My test project", description="A real cool test project") 

134 

135 def test_str(self): 

136 p = Product.objects.get(id=0) 

137 self.assertEqual(str(p), "My test project")