from pathlib import Path p=Path('C:/kefu/wechat_rpa/test_knowledge_review.py');s=p.read_text(encoding='utf-8') s=s.replace('from archive_store import new_id','from archive_store import ArchiveStore, new_id') s=s.replace('class FullReviewApiTest(TestCase):\n', '''class FullReviewApiTest(TestCase): payload = FullReviewTest.payload start_job = FullReviewTest.start_job process = FullReviewTest.process first = FullReviewTest.first seed = FullReviewTest.seed ''') s+=''' def test_restricted_all_accounts_and_revocation_during_background_execution(self): self.actor = self.db.authenticate('admin', 'ChangedAdmin@2026')['id'] self.store = self.client.app.state.knowledge_store self.archive = ArchiveStore(self.db) accounts = [] for index in range(3): _, account = self.db.create_desktop_session( {'user_id': f'full-review-{index}', 'sn': f'REV{index}', 'nickname': f'测试账号{index}'}, f'review-device-{index}', 'Review QA', '1.0', '') accounts.append(account) self.seed(10 + index, account['tenant_id']) self.db.create_user('limited-reviewer', 'InitialReader123', 'viewer', self.actor, '') reviewer = self.db.authenticate('limited-reviewer', 'InitialReader123')['id'] self.db.change_password(reviewer, 'InitialReader123', 'ChangedReader@2026', '') with self.db.connect() as db: db.executemany("INSERT OR IGNORE INTO role_permissions VALUES ('viewer',?)", [(p,) for p in ('knowledge:read','knowledge:review','im:content:read')]) for account in accounts[:2]: self.db.set_desktop_account_admins(account['id'], [reviewer], self.actor, '') login = self.client.post('/api/v2/auth/login', json={'username': 'limited-reviewer', 'password': 'ChangedReader@2026'}) headers = {'Authorization': 'Bearer ' + login.json()['access_token']} url = '/api/v2/knowledge/review-tasks' self.assertEqual(self.client.post(url + '/preview?account_id=' + str(accounts[2]['id']), headers=headers).status_code, 403) single = self.client.post(url + '/preview?account_id=' + str(accounts[0]['id']), headers=headers) self.assertEqual(single.json()['total'], 10) snapshot = self.client.post(url + '/preview?account_id=-1', headers=headers) self.assertEqual(snapshot.status_code, 200, snapshot.text) job = snapshot.json(); self.assertEqual(job['total'], 21) self.assertEqual(len(job['preview']['accounts']), 2) self.db.set_desktop_account_admins(accounts[1]['id'], [], self.actor, '') response = self.client.post(url + '/' + job['id'] + '/start', headers=headers, json={'confirmed': True}) self.assertEqual(response.status_code, 200, response.text) KnowledgeReviewWorker(self.store).step() final = self.client.get(url + '/' + job['id'], headers=headers).json() self.assertEqual((final['approved'], final['skipped']), (10, 11)) self.assertEqual(self.store.stats(accounts[2]['tenant_id']), {'draft': 12}) self.assertEqual(self.store.stats(accounts[1]['tenant_id']), {'draft': 11}) results = self.client.get(url + '/' + job['id'] + '/results', headers=headers).json() self.assertEqual(results['total'], 0, 'Do not expose titles from revoked accounts') ''' p.write_text(s,encoding='utf-8',newline='\n')