← Files Product & App ArchitectARCHIVED FILE
tests/test_spec_check.py
2.33 KB · Nov 11, 2026 · 12:42 UTC
import unittest
import sys
from pathlib import Path
sys.path.insert(0,str(Path(__file__).resolve().parents[1]/'scripts'))
from spec_check import inspect_spec
class SpecCheckerTests(unittest.TestCase):
def good(self):
return {'requirements':[{'id':'R1','description':'Users can save drafts','acceptance_tests':['T1']}],
'tests':[{'id':'T1'}],
'milestones':[{'id':'M1','depends_on':[]},{'id':'M2','depends_on':['M1']}]}
def codes(self,data):return {f['code'] for f in inspect_spec(data)['findings']}
def test_valid_plan(self):self.assertTrue(inspect_spec(self.good())['ok'])
def test_uncovered_requirement(self):
d=self.good();d['requirements'][0]['acceptance_tests']=[];self.assertIn('UNTESTED_REQUIREMENT',self.codes(d))
def test_missing_description(self):
d=self.good();d['requirements'][0]['description']='';self.assertIn('MISSING_DESCRIPTION',self.codes(d))
def test_unknown_test(self):
d=self.good();d['requirements'][0]['acceptance_tests']=['T999'];self.assertIn('UNKNOWN_TEST',self.codes(d))
def test_duplicate_requirement(self):
d=self.good();d['requirements'].append(dict(d['requirements'][0]));self.assertIn('DUPLICATE_ID',self.codes(d))
def test_duplicate_test(self):
d=self.good();d['tests'].append({'id':'T1'});self.assertIn('DUPLICATE_ID',self.codes(d))
def test_missing_id(self):
d=self.good();d['milestones'].append({'depends_on':[]});self.assertIn('MISSING_ID',self.codes(d))
def test_self_dependency(self):
d=self.good();d['milestones'][0]['depends_on']=['M1'];self.assertIn('SELF_DEPENDENCY',self.codes(d))
def test_unknown_dependency(self):
d=self.good();d['milestones'][0]['depends_on']=['M9'];self.assertIn('UNKNOWN_DEPENDENCY',self.codes(d))
def test_cycle(self):
d=self.good();d['milestones'][0]['depends_on']=['M2'];self.assertIn('DEPENDENCY_CYCLE',self.codes(d))
def test_long_cycle(self):
d=self.good();d['milestones'].append({'id':'M3','depends_on':['M2']});d['milestones'][0]['depends_on']=['M3'];self.assertIn('DEPENDENCY_CYCLE',self.codes(d))
def test_empty_is_not_certified_product(self):
d={'requirements':[],'tests':[],'milestones':[]};self.assertTrue(inspect_spec(d)['ok']);self.assertEqual(inspect_spec(d)['requirement_count'],0)
if __name__=='__main__':unittest.main()
SHA-256: 6021c0eb9e1d36086efa7b44d724c38adeabf5fb6cd49743b72512e5c3dfd611