"""Real HTTP coverage for scoped cultural and property records.""" import json import unittest from test_app import app import test_households as fixture class HeritageTests(unittest.TestCase): setUp = fixture.HouseholdTests.setUp stop_server = fixture.HouseholdTests.stop_server request = fixture.HouseholdTests.request def create(self, **fields): data = dict(name='家书', kind='culture'); data.update(fields) code, row = self.request('/api/heritage', data=data) self.assertEqual(code, 200, row) return row def allow(self, level): user = app.get_object('users', self.members[self.aid]['id']) user['heritageAccess'] = level app.save_object('users', user) return user def test_genealogy_access_does_not_grant_property_access(self): self.create() member = self.members[self.aid] self.assertEqual(self.request('/api/family', member)[0], 200) self.assertEqual(self.request('/api/heritage', member)[0], 403) self.assertEqual(self.request('/api/heritage', member, dict(name='x', kind='asset'))[0], 403) reader = self.allow('read') self.assertEqual(len(self.request('/api/heritage', reader)[1]['entries']), 1) self.assertFalse(self.request('/api/heritage', reader)[1]['canEdit']) self.assertEqual(self.request('/api/heritage', reader, dict(name='x', kind='asset'))[0], 403) def test_cross_household_reads_edits_and_device_references_are_rejected(self): row = self.create() self.assertEqual(self.request('/api/heritage', self.other)[1]['entries'], []) self.assertIn(self.request('/api/heritage', self.other, row)[0], (403,404)) self.assertEqual(self.request('/api/heritage', data=dict(name='x', kind='culture', deviceId=self.assets[self.bid]['id'], deviceSource='camera'))[0], 404) self.assertEqual(self.request('/api/heritage', self.owner, home=self.bid)[0], 403) def test_revision_archive_and_restore(self): row = self.create() editor = self.allow('edit') code, archived = self.request('/api/heritage', editor, dict(row, archived=True)) self.assertEqual(code, 200);self.assertEqual(archived['revision'], 2) self.assertEqual(self.request('/api/heritage', editor, row)[0], 409) code, restored = self.request('/api/heritage', editor, dict(archived, archived=False)) self.assertEqual(code, 200);self.assertFalse(restored['archived']) self.assertEqual(restored['revision'], 3) def test_validation_and_non_home_scope(self): for values in [dict(sourceUrl='javascript:alert(1)'),dict(sourceUrl='https://user:pass@example.com'), dict(date='2026-02-30'),dict(archived='false'),dict(kind='unsupported')]: data=dict(name='x',kind='culture');data.update(values) self.assertEqual(self.request('/api/heritage',data=data)[0],400) home=app.get_object('households',self.bid) app.HOUSEHOLDS.save(dict(home,kind='office'),self.root) self.assertEqual(self.request('/api/heritage',self.other)[0],403) def test_handover_intent_never_changes_accounts_or_device_ownership(self): users=json.dumps(app.objects('users'),sort_keys=True) devices=json.dumps(app.objects('assets'),sort_keys=True) row=self.create(kind='asset',ownerName='甲',custodianName='乙',successorName='丙',handoverNote='记录意愿') self.assertEqual(row['successorName'],'丙') self.assertEqual(json.dumps(app.objects('users'),sort_keys=True),users) self.assertEqual(json.dumps(app.objects('assets'),sort_keys=True),devices) def test_new_permission_revokes_session_and_editor_needs_device_grant(self): member=app.get_object('users',self.members[self.aid]['id']) app.ACCOUNTS.save(dict(member,heritageAccess='edit'),self.root) self.assertEqual(self.request('/api/heritage',member)[0],401) member=app.get_object('users',member['id']);member['siteIds']=[] app.save_object('users',member) with self.assertRaises(app.Problem): app.HERITAGE.save(dict(name='未授权设备',kind='asset',deviceSource='camera',deviceId=self.assets[self.aid]['id']),member)