Skip to content

Commit cb0a1e6

Browse files
authored
Fix compliance functests (#262)
Adjust sleeps so that tests account for time to confirmation. Ensure that compliance policies are deleted on test exit. Create compliance policies for each test. Extract specific compliance_policy status from compliant_at call (i.e. ignore other compliance policies that may exist and incorrectly cause test failure) AB#9350
1 parent d9217a7 commit cb0a1e6

1 file changed

Lines changed: 118 additions & 37 deletions

File tree

functests/execcompliance_policies.py

Lines changed: 118 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,14 @@ def setUp(self):
100100
client_secret_filename=getenv("DATATRAILS_APPREG_SECRET_FILENAME"),
101101
)
102102
self.arch = Archivist(getenv("DATATRAILS_URL"), auth)
103+
self.identities = []
103104

104105
def tearDown(self):
106+
if self.identities:
107+
for identity in self.identities:
108+
LOGGER.debug("Delete %s", identity)
109+
self.arch.compliance_policies.delete(identity)
110+
105111
self.arch.close()
106112

107113

@@ -113,15 +119,13 @@ def test_compliancepolicies_create_since(self):
113119
compliance_policy = self.arch.compliance_policies.create(
114120
SINCE_POLICY,
115121
)
122+
self.identities.append(compliance_policy["identity"])
116123
self.assertEqual(
117124
compliance_policy["display_name"],
118125
SINCE_POLICY.display_name,
119126
msg="Incorrect display name",
120127
)
121128
LOGGER.debug("SINCE_POLICY: %s", json_dumps(compliance_policy, indent=4))
122-
self.arch.compliance_policies.delete(
123-
compliance_policy["identity"],
124-
)
125129

126130
def test_compliancepolicies_create_richness(self):
127131
"""
@@ -130,15 +134,13 @@ def test_compliancepolicies_create_richness(self):
130134
compliance_policy = self.arch.compliance_policies.create(
131135
RICHNESS_POLICY,
132136
)
137+
self.identities.append(compliance_policy["identity"])
133138
self.assertEqual(
134139
compliance_policy["display_name"],
135140
RICHNESS_POLICY.display_name,
136141
msg="Incorrect display name",
137142
)
138143
LOGGER.debug("RICHNESS_POLICY: %s", json_dumps(compliance_policy, indent=4))
139-
self.arch.compliance_policies.delete(
140-
compliance_policy["identity"],
141-
)
142144

143145
def test_compliancepolicies_create_dynamic_tolerance(self):
144146
"""
@@ -147,6 +149,7 @@ def test_compliancepolicies_create_dynamic_tolerance(self):
147149
compliance_policy = self.arch.compliance_policies.create(
148150
DYNAMIC_TOLERANCE_POLICY,
149151
)
152+
self.identities.append(compliance_policy["identity"])
150153
self.assertEqual(
151154
compliance_policy["display_name"],
152155
DYNAMIC_TOLERANCE_POLICY.display_name,
@@ -155,9 +158,6 @@ def test_compliancepolicies_create_dynamic_tolerance(self):
155158
LOGGER.debug(
156159
"DYNAMIC_TOLERANCE_POLICY: %s", json_dumps(compliance_policy, indent=4)
157160
)
158-
self.arch.compliance_policies.delete(
159-
compliance_policy["identity"],
160-
)
161161

162162
def test_compliancepolicies_create_current_outstanding(self):
163163
"""
@@ -166,6 +166,7 @@ def test_compliancepolicies_create_current_outstanding(self):
166166
compliance_policy = self.arch.compliance_policies.create(
167167
CURRENT_OUTSTANDING_POLICY,
168168
)
169+
self.identities.append(compliance_policy["identity"])
169170
self.assertEqual(
170171
compliance_policy["display_name"],
171172
CURRENT_OUTSTANDING_POLICY.display_name,
@@ -174,9 +175,6 @@ def test_compliancepolicies_create_current_outstanding(self):
174175
LOGGER.debug(
175176
"CURRENT_OUTSTANDING_POLICY: %s", json_dumps(compliance_policy, indent=4)
176177
)
177-
self.arch.compliance_policies.delete(
178-
compliance_policy["identity"],
179-
)
180178

181179
def test_compliancepolicies_create_period_understanding(self):
182180
"""
@@ -185,6 +183,7 @@ def test_compliancepolicies_create_period_understanding(self):
185183
compliance_policy = self.arch.compliance_policies.create(
186184
PERIOD_OUTSTANDING_POLICY,
187185
)
186+
self.identities.append(compliance_policy["identity"])
188187
self.assertEqual(
189188
compliance_policy["display_name"],
190189
PERIOD_OUTSTANDING_POLICY.display_name,
@@ -193,14 +192,28 @@ def test_compliancepolicies_create_period_understanding(self):
193192
LOGGER.debug(
194193
"PERIOD_OUTSTANDING_POLICY: %s", json_dumps(compliance_policy, indent=4)
195194
)
196-
self.arch.compliance_policies.delete(
197-
compliance_policy["identity"],
198-
)
199195

200196
def test_compliance_policies_list(self):
201197
"""
202198
Test compliance_policy list
203199
"""
200+
compliance_policy = self.arch.compliance_policies.create(
201+
SINCE_POLICY,
202+
)
203+
self.identities.append(compliance_policy["identity"])
204+
compliance_policy = self.arch.compliance_policies.create(
205+
PERIOD_OUTSTANDING_POLICY,
206+
)
207+
self.identities.append(compliance_policy["identity"])
208+
compliance_policy = self.arch.compliance_policies.create(
209+
CURRENT_OUTSTANDING_POLICY,
210+
)
211+
self.identities.append(compliance_policy["identity"])
212+
compliance_policy = self.arch.compliance_policies.create(
213+
DYNAMIC_TOLERANCE_POLICY,
214+
)
215+
self.identities.append(compliance_policy["identity"])
216+
204217
compliance_policies = list(self.arch.compliance_policies.list())
205218
for i, compliance_policy in enumerate(compliance_policies):
206219
LOGGER.debug("%d: %s", i, json_dumps(compliance_policy, indent=4))
@@ -209,14 +222,28 @@ def test_compliance_policies_list(self):
209222
0,
210223
msg="Incorrect display name",
211224
)
212-
self.arch.compliance_policies.delete(
213-
compliance_policy["identity"],
214-
)
215225

216226
def test_compliance_policies_count(self):
217227
"""
218228
Test compliance_policy count
219229
"""
230+
compliance_policy = self.arch.compliance_policies.create(
231+
SINCE_POLICY,
232+
)
233+
self.identities.append(compliance_policy["identity"])
234+
compliance_policy = self.arch.compliance_policies.create(
235+
PERIOD_OUTSTANDING_POLICY,
236+
)
237+
self.identities.append(compliance_policy["identity"])
238+
compliance_policy = self.arch.compliance_policies.create(
239+
CURRENT_OUTSTANDING_POLICY,
240+
)
241+
self.identities.append(compliance_policy["identity"])
242+
compliance_policy = self.arch.compliance_policies.create(
243+
DYNAMIC_TOLERANCE_POLICY,
244+
)
245+
self.identities.append(compliance_policy["identity"])
246+
220247
count = self.arch.compliance_policies.count(
221248
props={"compliance_type": CompliancePolicyType.COMPLIANCE_SINCE.name}
222249
)
@@ -271,10 +298,11 @@ def test_compliancepolicies_since(self):
271298
["attributes.arc_display_type=Traffic Light"],
272299
],
273300
event_display_type=f"Maintenance Performed {tag}",
274-
time_period_seconds=10, # very short so we can test
301+
time_period_seconds=20,
275302
)
276303
)
277304
LOGGER.debug("SINCE_POLICY: %s", json_dumps(compliance_policy, indent=4))
305+
self.identities.append(compliance_policy["identity"])
278306

279307
traffic_light = self.arch.assets.create(
280308
attrs=TRAFFIC_LIGHT,
@@ -301,24 +329,53 @@ def test_compliancepolicies_since(self):
301329
traffic_light["identity"],
302330
)
303331
LOGGER.debug("COMPLIANCE (true): %s", json_dumps(compliance, indent=4))
332+
333+
policy_statements = [
334+
c
335+
for c in compliance["compliance"]
336+
if c["compliance_policy_identity"] == compliance_policy["identity"]
337+
]
338+
LOGGER.debug("COMPLIANCE (false): %s", json_dumps(policy_statements, indent=4))
339+
340+
self.assertEqual(
341+
len(policy_statements),
342+
1,
343+
msg="Only one policy statement is expected",
344+
)
345+
304346
self.assertTrue(
305-
compliance["compliant"],
306-
msg="Assets should be compliant",
347+
policy_statements[0]["compliant"],
348+
msg="Asset should be compliant",
307349
)
308350

309-
LOGGER.debug("Sleep 10 seconds ...")
310-
sleep(10)
351+
LOGGER.debug(
352+
"Sleep 15 seconds so that subsequent falls outside compliance_policy limits ..."
353+
)
354+
sleep(15)
311355
compliance = self.arch.compliance.compliant_at(
312356
traffic_light["identity"],
313357
)
314358
LOGGER.debug("COMPLIANCE (false): %s", json_dumps(compliance, indent=4))
315-
self.assertFalse(
316-
compliance["compliant"],
317-
msg="Assets should not be compliant",
359+
360+
policy_statements = [
361+
c
362+
for c in compliance["compliance"]
363+
if c["compliance_policy_identity"] == compliance_policy["identity"]
364+
]
365+
LOGGER.debug("COMPLIANCE (false): %s", json_dumps(policy_statements, indent=4))
366+
367+
self.assertEqual(
368+
len(policy_statements),
369+
1,
370+
msg="Only one policy statement is expected",
318371
)
319372

320-
compliance_policy = self.arch.compliance_policies.delete(
321-
compliance_policy["identity"],
373+
self.assertFalse(
374+
policy_statements[0]["compliant"],
375+
msg=(
376+
"Asset should not be compliant as it was maintained"
377+
"after the compliance policy expired"
378+
),
322379
)
323380

324381
def test_compliancepolicies_current_outstanding(self):
@@ -337,6 +394,7 @@ def test_compliancepolicies_current_outstanding(self):
337394
closing_event_display_type=f"Maintenance Performed {tag}",
338395
),
339396
)
397+
self.identities.append(compliance_policy["identity"])
340398
LOGGER.debug(
341399
"CURRENT_OUTSTANDING_POLICY: %s", json_dumps(compliance_policy, indent=4)
342400
)
@@ -367,10 +425,24 @@ def test_compliancepolicies_current_outstanding(self):
367425
compliance = self.arch.compliance.compliant_at(
368426
traffic_light["identity"],
369427
)
370-
LOGGER.debug("COMPLIANCE (false): %s", json_dumps(compliance, indent=4))
428+
LOGGER.debug("COMPLIANCE (true): %s", json_dumps(compliance, indent=4))
429+
430+
policy_statements = [
431+
c
432+
for c in compliance["compliance"]
433+
if c["compliance_policy_identity"] == compliance_policy["identity"]
434+
]
435+
LOGGER.debug("COMPLIANCE (false): %s", json_dumps(policy_statements, indent=4))
436+
437+
self.assertEqual(
438+
len(policy_statements),
439+
1,
440+
msg="Only one policy statement is expected",
441+
)
442+
371443
self.assertFalse(
372-
compliance["compliant"],
373-
msg="Assets should not be compliant",
444+
policy_statements[0]["compliant"],
445+
msg="Asset should not be compliant",
374446
)
375447

376448
maintenance_performed = self.arch.events.create(
@@ -394,11 +466,20 @@ def test_compliancepolicies_current_outstanding(self):
394466
traffic_light["identity"],
395467
)
396468
LOGGER.debug("COMPLIANCE (true): %s", json_dumps(compliance, indent=4))
397-
self.assertTrue(
398-
compliance["compliant"],
399-
msg="Assets should be compliant",
400-
)
401469

402-
compliance_policy = self.arch.compliance_policies.delete(
403-
compliance_policy["identity"],
470+
policy_statements = [
471+
c
472+
for c in compliance["compliance"]
473+
if c["compliance_policy_identity"] == compliance_policy["identity"]
474+
]
475+
LOGGER.debug("COMPLIANCE (true): %s", json_dumps(policy_statements, indent=4))
476+
477+
self.assertEqual(
478+
len(policy_statements),
479+
1,
480+
msg="Only one policy statement is expected",
481+
)
482+
self.assertTrue(
483+
policy_statements[0]["compliant"],
484+
msg="Asset should be compliant",
404485
)

0 commit comments

Comments
 (0)