备份现场结果补录、图片修复与跳过文章功能

This commit is contained in:
Longtail committed 2026-10-31 17:08:49 +08:00
1 parent 1e6504b4a2
commit d157c179c8
20 files changed
+597 -47

No files matched your search

+57
View File
@@ -144,6 +144,63 @@ class QueueTests(unittest.TestCase):
self.assertEqual(self.store.next(self.owner)['action'], 'idle')
self.assertIsNone(self.store.run['switch'])
def test_skip_preserves_history_and_continues_next_without_counting(self):
job = self.begin()
other = self.root / 'other'
shutil.copytree(self.article, other)
(other / 'a.md').write_text(self.md.read_text().replace('正文内容', '下一篇内容'))
self.store.enqueue(other)
self.transition(job, 'importing')
self.transition(job, 'formatting')
self.transition(job, 'awaiting_user_review')
result = self.store.skip(dict(owner='tab-a', id=job['id'], epoch=self.store.run['epoch']))
self.assertEqual(result['fid'], 125)
self.assertEqual(self.store.run['batch']['count'], 0)
self.assertEqual(self.store.state()['history_count'], 0)
self.assertEqual(next(j for j in self.store.state()['jobs'] if j['id'] == job['id'])['state'], 'skipped')
self.assertIn('已在队列', self.store.enqueue(self.article))
self.assertEqual(self.store.next(self.owner)['action'], 'prepare')
self.assertNotEqual(self.store.run['active'], job['id'])
restarted = Store(self.root / 'queue.sqlite3')
self.assertEqual(next(j for j in restarted.state()['jobs'] if j['id'] == job['id'])['state'], 'skipped')
def test_skip_last_article_finishes_queue(self):
job = self.begin()
self.store.skip(dict(owner='tab-a', id=job['id'], epoch=self.store.run['epoch']))
self.assertEqual(self.store.next(self.owner)['action'], 'idle')
self.assertFalse(self.store.run['running'])
self.assertIsNone(self.store.run['switch'])
def test_skip_rejects_other_tab_stale_request_and_duplicate(self):
job = self.begin()
data = dict(owner='tab-a', id=job['id'], epoch=self.store.run['epoch'])
with self.assertRaisesRegex(ValueError, '另一个'):
self.store.skip({**data, 'owner': 'tab-b'})
self.store.control('stop')
with self.assertRaisesRegex(ValueError, '状态已改变'):
self.store.skip(data)
data['epoch'] = self.store.run['epoch']
self.store.skip(data)
with self.assertRaises(ValueError):
self.store.skip(data)
def test_skip_resumes_unsubmitted_error_but_rejects_submitted_errors(self):
job = self.begin()
self.transition(job, 'needs_attention', error='上传失败')
self.store.skip(dict(owner='tab-a', id=job['id'], epoch=self.store.run['epoch']))
self.assertTrue(self.store.run['running'])
self.assertEqual(self.store.next(self.owner)['action'], 'idle')
def test_submitted_article_cannot_be_skipped(self):
job = self.begin()
self.submit(job)
for state in ('user_submitting', 'submit_unknown', 'needs_attention'):
if state != 'user_submitting':
self.transition(job, state)
with self.assertRaisesRegex(ValueError, '已提交'):
self.store.skip(dict(owner='tab-a', id=job['id'], epoch=self.store.run['epoch']))
self.assertEqual(self.store.run['active'], job['id'])
def test_bad_result_does_not_increment(self):
job = self.begin();self.submit(job)
with self.assertRaises(ValueError):