← Files Platform Engineering CopilotARCHIVED FILE

tests/test_offline.py

2.32 KB · Nov 11, 2026 · 12:42 UTC

↓ Download file

See the change to this file →

import unittest
from scripts.plan_risk import summarize
from scripts.slo_math import calculate_slo

class OfflineTests(unittest.TestCase):
    def test_empty(self):
        self.assertFalse(summarize({'resource_changes':[]})['requires_manual_risk_review'])
    def test_create(self):
        d=summarize({'resource_changes':[{'change':{'actions':['create']}}]})
        self.assertEqual(d['actions']['create'],1)
    def test_replace_delete_create(self):
        d=summarize({'resource_changes':[{'change':{'actions':['delete','create']}}]})
        self.assertEqual(d['actions']['replace'],1)
        self.assertTrue(d['requires_manual_risk_review'])
    def test_replace_create_delete(self):
        d=summarize({'resource_changes':[{'change':{'actions':['create','delete']}}]})
        self.assertTrue(d['requires_manual_risk_review'])
    def test_delete(self):
        self.assertTrue(summarize({'resource_changes':[{'change':{'actions':['delete']}}]})['requires_manual_risk_review'])
    def test_unknown(self):
        self.assertTrue(summarize({'resource_changes':[{'change':{'actions':['update'],'after_unknown':{'id':True}}}]})['requires_manual_risk_review'])
    def test_doesnt_leak(self):
        d=summarize({'resource_changes':[{'address':'secret','change':{'actions':['update'],'before':{'password':'topsecret'}}}]})
        self.assertNotIn('secret',str(d))
    def test_invalid_changes(self):
        with self.assertRaises(ValueError): summarize({'resource_changes':'wrong'})
    def test_missing_actions(self):
        with self.assertRaises(ValueError): summarize({'resource_changes':[{'change':{}}]})
    def test_slo_pass(self):
        self.assertTrue(calculate_slo(10000,5,.999)['met'])
    def test_slo_fail(self):
        self.assertFalse(calculate_slo(10000,50,.999)['met'])
    def test_slo_budget(self):
        self.assertAlmostEqual(calculate_slo(10000,8,.999)['remaining_bad_events'],2)
    def test_slo_bad_total(self):
        with self.assertRaises(ValueError):calculate_slo(0,0,.99)
    def test_slo_bad_count(self):
        with self.assertRaises(ValueError):calculate_slo(10,11,.99)
    def test_slo_bad_objective(self):
        with self.assertRaises(ValueError):calculate_slo(10,0,1)
    def test_slo_bool_not_valid(self):
        with self.assertRaises(ValueError):calculate_slo(True,0,.99)
if __name__=='__main__':unittest.main()

SHA-256: d4660c98d7a52b2444cecd564b5112565308a9e7179f360971135858da48faed