Add --capture disabled mode + capture-mode status in PWA

Server:
- --capture accepts 'disabled'; no backend is created, capture_mode exposed
- /api/status returns capture_mode; capture start/stop return 403 when
  disabled; latest/status/delete_session are None-safe

PWA:
- captureMode state; conn-status shows server version
- new capture-mode line (Settings) explaining gsmtap/direct/disabled
- hide capture + New capture UI when disabled; trace empty-state shows
  'Capture unavailable'
- 7 new EN/RU i18n keys

Version 1.2.0 (server + PWA); tests: 111.
This commit is contained in:
catarrh committed 2026-08-14 23:49:10 +03:00
1 parent b900a8a3e1
commit 24d0decd51
7 files changed
+130 -22

No files matched your search

+53 -1
View File
@@ -140,7 +140,7 @@ class TestImportEndpoint(unittest.TestCase):
class TestVersion(unittest.TestCase):
def test_package_version(self):
from simtrace2_pysniff import __version__
self.assertEqual(__version__, '1.1.0')
self.assertEqual(__version__, '1.2.0')
def test_status_includes_version(self):
import os
@@ -171,5 +171,57 @@ class TestVersion(unittest.TestCase):
self.assertEqual(h._json['version'], __version__)
class TestCaptureDisabled(unittest.TestCase):
def _handler(self, capture_mode):
import os
from simtrace2_pysniff.server.server import RequestHandler
from simtrace2_pysniff.server.database import Database
class Fake(RequestHandler):
def __init__(self, db, capture_mode):
self.db = db
self.capture = None
self.capture_mode = capture_mode
self._status = None
self._json = None
def _send_json(self, data, status=200):
self._status = status
self._json = data
def _send_error(self, status, message):
self._status = status
self._json = {'error': message}
tmp = tempfile.NamedTemporaryFile(suffix='.db', delete=False)
tmp.close()
db = Database(tmp.name)
self.addCleanup(lambda: (db._conn.close(), os.remove(tmp.name)))
return Fake(db, capture_mode)
def test_status_reports_disabled(self):
h = self._handler('disabled')
h._handle_status()
self.assertEqual(h._json['capture_mode'], 'disabled')
self.assertFalse(h._json['capture_active'])
self.assertIsNone(h._json['session_id'])
def test_capture_start_403(self):
h = self._handler('disabled')
h._handle_capture_start()
self.assertEqual(h._status, 403)
self.assertIn('Capture disabled', h._json['error'])
def test_capture_stop_403(self):
h = self._handler('disabled')
h._handle_capture_stop()
self.assertEqual(h._status, 403)
def test_status_reports_gsmtap(self):
h = self._handler('gsmtap')
h._handle_status()
self.assertEqual(h._json['capture_mode'], 'gsmtap')
if __name__ == '__main__':
unittest.main()