import os,sys,tempfile,json,unittest from pathlib import Path from unittest.mock import patch,MagicMock BASE=Path(__file__).resolve().parents[1] sys.path[:0]=[str(BASE/'bot-utility'),str(BASE)] import mail from tg_channel import TGChannel class MigrationTests(unittest.TestCase): def test_mail_session_requires_tls(self): with patch.dict(os.environ,{'MAIL_COM_URL':'http://remote.example/admin/com'}): with self.assertRaises(RuntimeError): with mail._ComSession():pass def test_mail_client_request_and_close(self): with tempfile.TemporaryDirectory() as d: p=Path(d)/'token';p.write_text('t'*128) with patch.dict(os.environ,{'MAIL_COM_TOKEN_FILE':str(p)}),patch('requests.Session') as factory: factory.return_value.post.return_value.json.return_value={'items':[{'id':42}]} with mail._ComSession() as session: result=mail._list_inbox_messages(session,'a@rrrosmontis.icu',limit=5) self.assertEqual(result,[{'id':42}]) self.assertFalse(factory.return_value.trust_env) self.assertEqual(factory.return_value.post.call_args.kwargs['json']['limit'],5) factory.return_value.close.assert_called_once() def test_body_attachment_metadata_does_not_open_local_eml(self): app=MagicMock() app.post.return_value={'message':{'ID':8,'Subject':'s','From':'a@b.c','Date':'d','Body':'text','HTMLBody':'

body

','image_count':2,'attachment_names':['a.pdf']}} m=mail._find_message_by_id(app,['a@rrrosmontis.icu'],8) self.assertEqual(mail._analyze_message(m),(2,['a.pdf'])) self.assertEqual(mail._extract_body(m),'body') def test_initial_poll_keeps_com_id_and_does_not_push_history(self): with tempfile.TemporaryDirectory() as d,patch.object(mail,'MAIL_DIR',d),patch.object(mail,'_ComSession'),patch.object(mail,'_mail_changes',return_value={'max_id':2386,'items':[]}): (Path(d)/'9000000001.json').write_text(json.dumps({'addresses':['a@rrrosmontis.icu'],'push':{'enabled':True,'last_seen':{}}})) mail._poll_next.clear() with patch.object(mail.notification_queue,'put') as put: mail._poll_once();put.assert_not_called() self.assertEqual(mail._load_user(9000000001)['push']['last_seen']['a@rrrosmontis.icu'],2386) def test_incremental_poll_queues_without_advancing_watermark(self): addr='a@rrrosmontis.icu' with tempfile.TemporaryDirectory() as d,patch.object(mail,'MAIL_DIR',d),patch.object(mail,'_ComSession'),patch.object(mail.identity,'push_targets',return_value=[('tg',1)]): (Path(d)/'9000000001.json').write_text(json.dumps({'addresses':[addr],'push':{'enabled':True,'last_seen':{addr:10}}})) mail._poll_next.clear();mail._inflight.clear() changes={'max_id':99,'items':[{'id':12,'subject':'s','from':'a','from_address':'a@b.c','ts':1},{'id':14,'subject':'s','from':'a','from_address':'a@b.c','ts':1}]} with patch.object(mail,'_mail_changes',return_value=changes),patch.object(mail.notification_queue,'put') as put: mail._poll_once() self.assertEqual([c.args[0]['mid'] for c in put.call_args_list],[12,14]) self.assertEqual(mail._load_user(9000000001)['push']['last_seen'][addr],10) mail._inflight.clear() def test_oss_uris_and_traversal(self): self.assertEqual(TGChannel._translate_oss_path('file:///C:/oss/pixiv/a%20b.jpg'),'/mnt/oss/pixiv/a b.jpg') self.assertEqual(TGChannel._translate_oss_path('file:///mnt/A/pixiv/a.jpg'),'/mnt/oss/pixiv/a.jpg') with self.assertRaises(ValueError):TGChannel._translate_oss_path('file:///mnt/A/../secret') def test_no_windows_admin_secret_or_windows_paths(self): self.assertIsNone(mail.HMAIL_ADMIN_PASSWORD) for name in ['jm','pixiv','setu']: module=__import__(name) # Runtime proxy config is private and intentionally absent in a clone. configured = os.environ.get('BOT_PROXY_CONFIG', str(BASE/'bot-utility'/'proxies.json')) self.assertEqual(Path(module.PROXY_CONFIG_PATH), Path(configured)) self.assertNotIn('C:',module.PROXY_CONFIG_PATH) import pixiv,setu,for_admin_komari_agent self.assertEqual(pixiv.OSS_SAVE_DIR,setu.OSS_SAVE_DIR) self.assertEqual(for_admin_komari_agent.KOMARI_API_BASE,'https://status.rrrosmontis.icu') if __name__=='__main__':unittest.main()