diff --git a/app/routers/packets.py b/app/routers/packets.py index 8142e679..00316ee5 100644 --- a/app/routers/packets.py +++ b/app/routers/packets.py @@ -3,7 +3,7 @@ from hashlib import sha256 from sqlite3 import OperationalError import aiosqlite -from fastapi import APIRouter, BackgroundTasks +from fastapi import APIRouter, BackgroundTasks, HTTPException, Response, status from pydantic import BaseModel, Field from app.database import db @@ -40,6 +40,10 @@ class DecryptResult(BaseModel): message: str +def _bad_request(detail: str) -> HTTPException: + return HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=detail) + + async def _run_historical_channel_decryption( channel_key_bytes: bytes, channel_key_hex: str, display_name: str | None = None ) -> None: @@ -100,7 +104,7 @@ async def get_undecrypted_count() -> dict: @router.post("/decrypt/historical", response_model=DecryptResult) async def decrypt_historical_packets( - request: DecryptRequest, background_tasks: BackgroundTasks + request: DecryptRequest, background_tasks: BackgroundTasks, response: Response ) -> DecryptResult: """ Attempt to decrypt historical packets with the provided key. @@ -112,27 +116,15 @@ async def decrypt_historical_packets( try: channel_key_bytes = bytes.fromhex(request.channel_key) if len(channel_key_bytes) != 16: - return DecryptResult( - started=False, - total_packets=0, - message="Channel key must be 16 bytes (32 hex chars)", - ) + raise _bad_request("Channel key must be 16 bytes (32 hex chars)") channel_key_hex = request.channel_key.upper() except ValueError: - return DecryptResult( - started=False, - total_packets=0, - message="Invalid hex string for channel key", - ) + raise _bad_request("Invalid hex string for channel key") from None elif request.channel_name: channel_key_bytes = sha256(request.channel_name.encode("utf-8")).digest()[:16] channel_key_hex = channel_key_bytes.hex().upper() else: - return DecryptResult( - started=False, - total_packets=0, - message="Must provide channel_key or channel_name", - ) + raise _bad_request("Must provide channel_key or channel_name") # Get count and lookup channel name for display count = await RawPacketRepository.get_undecrypted_count() @@ -148,6 +140,7 @@ async def decrypt_historical_packets( background_tasks.add_task( _run_historical_channel_decryption, channel_key_bytes, channel_key_hex, display_name ) + response.status_code = status.HTTP_202_ACCEPTED return DecryptResult( started=True, @@ -158,48 +151,24 @@ async def decrypt_historical_packets( elif request.key_type == "contact": # DM decryption if not request.private_key: - return DecryptResult( - started=False, - total_packets=0, - message="Must provide private_key for contact decryption", - ) + raise _bad_request("Must provide private_key for contact decryption") if not request.contact_public_key: - return DecryptResult( - started=False, - total_packets=0, - message="Must provide contact_public_key for contact decryption", - ) + raise _bad_request("Must provide contact_public_key for contact decryption") try: private_key_bytes = bytes.fromhex(request.private_key) if len(private_key_bytes) != 64: - return DecryptResult( - started=False, - total_packets=0, - message="Private key must be 64 bytes (128 hex chars)", - ) + raise _bad_request("Private key must be 64 bytes (128 hex chars)") except ValueError: - return DecryptResult( - started=False, - total_packets=0, - message="Invalid hex string for private key", - ) + raise _bad_request("Invalid hex string for private key") from None try: contact_public_key_bytes = bytes.fromhex(request.contact_public_key) if len(contact_public_key_bytes) != 32: - return DecryptResult( - started=False, - total_packets=0, - message="Contact public key must be 32 bytes (64 hex chars)", - ) + raise _bad_request("Contact public key must be 32 bytes (64 hex chars)") contact_public_key_hex = request.contact_public_key.lower() except ValueError: - return DecryptResult( - started=False, - total_packets=0, - message="Invalid hex string for contact public key", - ) + raise _bad_request("Invalid hex string for contact public key") from None packets = await RawPacketRepository.get_undecrypted_text_messages() count = len(packets) @@ -223,6 +192,7 @@ async def decrypt_historical_packets( contact_public_key_hex, display_name, ) + response.status_code = status.HTTP_202_ACCEPTED return DecryptResult( started=True, @@ -230,11 +200,7 @@ async def decrypt_historical_packets( message=f"Started DM decryption of {count} TEXT_MESSAGE packets in background", ) - return DecryptResult( - started=False, - total_packets=0, - message="key_type must be 'channel' or 'contact'", - ) + raise _bad_request("key_type must be 'channel' or 'contact'") class MaintenanceRequest(BaseModel): diff --git a/frontend/AGENTS.md b/frontend/AGENTS.md index f4fac06c..02bf7899 100644 --- a/frontend/AGENTS.md +++ b/frontend/AGENTS.md @@ -415,6 +415,10 @@ PYTHONPATH=. uv run pytest tests/ -v ## Errata & Known Non-Issues +### Contacts rollup uses mention styling for unread DMs + +This is intentional. In the sidebar section headers, unread direct messages are treated as mention-equivalent, so the Contacts rollup uses the highlighted mention-style badge for any unread DM. Row-level mention detection remains separate; this note is only about the section summary styling. + ### RawPacketList always scrolls to bottom `RawPacketList` unconditionally scrolls to the latest packet on every update. This is intentional — the packet feed is a live status display, not an interactive log meant for lingering or long-term analysis. Users watching it want to see the newest packet, not hold a scroll position. diff --git a/frontend/prebuilt/assets/BotCodeEditor-CBFX17Kn.js b/frontend/prebuilt/assets/BotCodeEditor-DUWnXYXA.js similarity index 99% rename from frontend/prebuilt/assets/BotCodeEditor-CBFX17Kn.js rename to frontend/prebuilt/assets/BotCodeEditor-DUWnXYXA.js index 344d57af..5ff3baec 100644 Binary files a/frontend/prebuilt/assets/BotCodeEditor-CBFX17Kn.js and b/frontend/prebuilt/assets/BotCodeEditor-DUWnXYXA.js differ diff --git a/frontend/prebuilt/assets/BotCodeEditor-CBFX17Kn.js.map b/frontend/prebuilt/assets/BotCodeEditor-DUWnXYXA.js.map similarity index 99% rename from frontend/prebuilt/assets/BotCodeEditor-CBFX17Kn.js.map rename to frontend/prebuilt/assets/BotCodeEditor-DUWnXYXA.js.map index 4810b403..16dde522 100644 Binary files a/frontend/prebuilt/assets/BotCodeEditor-CBFX17Kn.js.map and b/frontend/prebuilt/assets/BotCodeEditor-DUWnXYXA.js.map differ diff --git a/frontend/prebuilt/assets/CrackerPanel-RTfofPO9.js b/frontend/prebuilt/assets/CrackerPanel-CqHBN9pz.js similarity index 99% rename from frontend/prebuilt/assets/CrackerPanel-RTfofPO9.js rename to frontend/prebuilt/assets/CrackerPanel-CqHBN9pz.js index 24374ab6..99ec8083 100644 Binary files a/frontend/prebuilt/assets/CrackerPanel-RTfofPO9.js and b/frontend/prebuilt/assets/CrackerPanel-CqHBN9pz.js differ diff --git a/frontend/prebuilt/assets/CrackerPanel-RTfofPO9.js.map b/frontend/prebuilt/assets/CrackerPanel-CqHBN9pz.js.map similarity index 99% rename from frontend/prebuilt/assets/CrackerPanel-RTfofPO9.js.map rename to frontend/prebuilt/assets/CrackerPanel-CqHBN9pz.js.map index 5021e95c..6381038d 100644 Binary files a/frontend/prebuilt/assets/CrackerPanel-RTfofPO9.js.map and b/frontend/prebuilt/assets/CrackerPanel-CqHBN9pz.js.map differ diff --git a/frontend/prebuilt/assets/MapView-DG71Do9A.js b/frontend/prebuilt/assets/MapView-CgY0ZIub.js similarity index 92% rename from frontend/prebuilt/assets/MapView-DG71Do9A.js rename to frontend/prebuilt/assets/MapView-CgY0ZIub.js index 7050c294..c49cd9ae 100644 Binary files a/frontend/prebuilt/assets/MapView-DG71Do9A.js and b/frontend/prebuilt/assets/MapView-CgY0ZIub.js differ diff --git a/frontend/prebuilt/assets/MapView-DG71Do9A.js.map b/frontend/prebuilt/assets/MapView-CgY0ZIub.js.map similarity index 99% rename from frontend/prebuilt/assets/MapView-DG71Do9A.js.map rename to frontend/prebuilt/assets/MapView-CgY0ZIub.js.map index 36364688..662552a5 100644 Binary files a/frontend/prebuilt/assets/MapView-DG71Do9A.js.map and b/frontend/prebuilt/assets/MapView-CgY0ZIub.js.map differ diff --git a/frontend/prebuilt/assets/NeighborsMiniMap-D6bvxuvI.js b/frontend/prebuilt/assets/NeighborsMiniMap-nhWnbDjS.js similarity index 85% rename from frontend/prebuilt/assets/NeighborsMiniMap-D6bvxuvI.js rename to frontend/prebuilt/assets/NeighborsMiniMap-nhWnbDjS.js index 65aca506..89497c85 100644 Binary files a/frontend/prebuilt/assets/NeighborsMiniMap-D6bvxuvI.js and b/frontend/prebuilt/assets/NeighborsMiniMap-nhWnbDjS.js differ diff --git a/frontend/prebuilt/assets/NeighborsMiniMap-D6bvxuvI.js.map b/frontend/prebuilt/assets/NeighborsMiniMap-nhWnbDjS.js.map similarity index 97% rename from frontend/prebuilt/assets/NeighborsMiniMap-D6bvxuvI.js.map rename to frontend/prebuilt/assets/NeighborsMiniMap-nhWnbDjS.js.map index 8b1d046e..c00ecd11 100644 Binary files a/frontend/prebuilt/assets/NeighborsMiniMap-D6bvxuvI.js.map and b/frontend/prebuilt/assets/NeighborsMiniMap-nhWnbDjS.js.map differ diff --git a/frontend/prebuilt/assets/PathRouteMap-DiGw6Qka.js b/frontend/prebuilt/assets/PathRouteMap-BgANOQRu.js similarity index 95% rename from frontend/prebuilt/assets/PathRouteMap-DiGw6Qka.js rename to frontend/prebuilt/assets/PathRouteMap-BgANOQRu.js index cb9632d8..143fc342 100644 Binary files a/frontend/prebuilt/assets/PathRouteMap-DiGw6Qka.js and b/frontend/prebuilt/assets/PathRouteMap-BgANOQRu.js differ diff --git a/frontend/prebuilt/assets/PathRouteMap-DiGw6Qka.js.map b/frontend/prebuilt/assets/PathRouteMap-BgANOQRu.js.map similarity index 99% rename from frontend/prebuilt/assets/PathRouteMap-DiGw6Qka.js.map rename to frontend/prebuilt/assets/PathRouteMap-BgANOQRu.js.map index 1a0c65e0..df9a9478 100644 Binary files a/frontend/prebuilt/assets/PathRouteMap-DiGw6Qka.js.map and b/frontend/prebuilt/assets/PathRouteMap-BgANOQRu.js.map differ diff --git a/frontend/prebuilt/assets/Popup-JtfOLvZE.js b/frontend/prebuilt/assets/Popup-65Kx45OI.js similarity index 81% rename from frontend/prebuilt/assets/Popup-JtfOLvZE.js rename to frontend/prebuilt/assets/Popup-65Kx45OI.js index 460ebc75..4c3c696b 100644 Binary files a/frontend/prebuilt/assets/Popup-JtfOLvZE.js and b/frontend/prebuilt/assets/Popup-65Kx45OI.js differ diff --git a/frontend/prebuilt/assets/Popup-JtfOLvZE.js.map b/frontend/prebuilt/assets/Popup-65Kx45OI.js.map similarity index 97% rename from frontend/prebuilt/assets/Popup-JtfOLvZE.js.map rename to frontend/prebuilt/assets/Popup-65Kx45OI.js.map index 10a1dd64..89e0d0df 100644 Binary files a/frontend/prebuilt/assets/Popup-JtfOLvZE.js.map and b/frontend/prebuilt/assets/Popup-65Kx45OI.js.map differ diff --git a/frontend/prebuilt/assets/RepeaterDashboard-bua8zxo_.js b/frontend/prebuilt/assets/RepeaterDashboard-B86OTQtd.js similarity index 98% rename from frontend/prebuilt/assets/RepeaterDashboard-bua8zxo_.js rename to frontend/prebuilt/assets/RepeaterDashboard-B86OTQtd.js index ff80783b..3e59a4cc 100644 Binary files a/frontend/prebuilt/assets/RepeaterDashboard-bua8zxo_.js and b/frontend/prebuilt/assets/RepeaterDashboard-B86OTQtd.js differ diff --git a/frontend/prebuilt/assets/RepeaterDashboard-bua8zxo_.js.map b/frontend/prebuilt/assets/RepeaterDashboard-B86OTQtd.js.map similarity index 99% rename from frontend/prebuilt/assets/RepeaterDashboard-bua8zxo_.js.map rename to frontend/prebuilt/assets/RepeaterDashboard-B86OTQtd.js.map index 3a16d650..15b861a0 100644 Binary files a/frontend/prebuilt/assets/RepeaterDashboard-bua8zxo_.js.map and b/frontend/prebuilt/assets/RepeaterDashboard-B86OTQtd.js.map differ diff --git a/frontend/prebuilt/assets/SearchView-Cs7v3m6K.js b/frontend/prebuilt/assets/SearchView-BFMnGDyJ.js similarity index 97% rename from frontend/prebuilt/assets/SearchView-Cs7v3m6K.js rename to frontend/prebuilt/assets/SearchView-BFMnGDyJ.js index 03fb6788..e083e5ec 100644 Binary files a/frontend/prebuilt/assets/SearchView-Cs7v3m6K.js and b/frontend/prebuilt/assets/SearchView-BFMnGDyJ.js differ diff --git a/frontend/prebuilt/assets/SearchView-Cs7v3m6K.js.map b/frontend/prebuilt/assets/SearchView-BFMnGDyJ.js.map similarity index 99% rename from frontend/prebuilt/assets/SearchView-Cs7v3m6K.js.map rename to frontend/prebuilt/assets/SearchView-BFMnGDyJ.js.map index 43a11016..a8831582 100644 Binary files a/frontend/prebuilt/assets/SearchView-Cs7v3m6K.js.map and b/frontend/prebuilt/assets/SearchView-BFMnGDyJ.js.map differ diff --git a/frontend/prebuilt/assets/SettingsModal-C-alEUMR.js b/frontend/prebuilt/assets/SettingsModal-CmnPdiWo.js similarity index 99% rename from frontend/prebuilt/assets/SettingsModal-C-alEUMR.js rename to frontend/prebuilt/assets/SettingsModal-CmnPdiWo.js index c5ca5478..10553f24 100644 Binary files a/frontend/prebuilt/assets/SettingsModal-C-alEUMR.js and b/frontend/prebuilt/assets/SettingsModal-CmnPdiWo.js differ diff --git a/frontend/prebuilt/assets/SettingsModal-C-alEUMR.js.map b/frontend/prebuilt/assets/SettingsModal-CmnPdiWo.js.map similarity index 99% rename from frontend/prebuilt/assets/SettingsModal-C-alEUMR.js.map rename to frontend/prebuilt/assets/SettingsModal-CmnPdiWo.js.map index 77548428..3979c5f4 100644 Binary files a/frontend/prebuilt/assets/SettingsModal-C-alEUMR.js.map and b/frontend/prebuilt/assets/SettingsModal-CmnPdiWo.js.map differ diff --git a/frontend/prebuilt/assets/VisualizerView-BBRdi0S-.js b/frontend/prebuilt/assets/VisualizerView-BX96-zH4.js similarity index 99% rename from frontend/prebuilt/assets/VisualizerView-BBRdi0S-.js rename to frontend/prebuilt/assets/VisualizerView-BX96-zH4.js index e187a6a1..fb827d23 100644 Binary files a/frontend/prebuilt/assets/VisualizerView-BBRdi0S-.js and b/frontend/prebuilt/assets/VisualizerView-BX96-zH4.js differ diff --git a/frontend/prebuilt/assets/VisualizerView-BBRdi0S-.js.map b/frontend/prebuilt/assets/VisualizerView-BX96-zH4.js.map similarity index 99% rename from frontend/prebuilt/assets/VisualizerView-BBRdi0S-.js.map rename to frontend/prebuilt/assets/VisualizerView-BX96-zH4.js.map index a0697740..41609cb1 100644 Binary files a/frontend/prebuilt/assets/VisualizerView-BBRdi0S-.js.map and b/frontend/prebuilt/assets/VisualizerView-BX96-zH4.js.map differ diff --git a/frontend/prebuilt/assets/hooks-BHXvHkvm.js b/frontend/prebuilt/assets/hooks-BHXvHkvm.js new file mode 100644 index 00000000..ae98588f Binary files /dev/null and b/frontend/prebuilt/assets/hooks-BHXvHkvm.js differ diff --git a/frontend/prebuilt/assets/hooks-NBTgSuxX.js.map b/frontend/prebuilt/assets/hooks-BHXvHkvm.js.map similarity index 90% rename from frontend/prebuilt/assets/hooks-NBTgSuxX.js.map rename to frontend/prebuilt/assets/hooks-BHXvHkvm.js.map index edc92738..cfe07d5d 100644 Binary files a/frontend/prebuilt/assets/hooks-NBTgSuxX.js.map and b/frontend/prebuilt/assets/hooks-BHXvHkvm.js.map differ diff --git a/frontend/prebuilt/assets/hooks-NBTgSuxX.js b/frontend/prebuilt/assets/hooks-NBTgSuxX.js deleted file mode 100644 index 6720f03b..00000000 Binary files a/frontend/prebuilt/assets/hooks-NBTgSuxX.js and /dev/null differ diff --git a/frontend/prebuilt/assets/index-BJ3L5G2s.js b/frontend/prebuilt/assets/index-D8to1fXL.js similarity index 90% rename from frontend/prebuilt/assets/index-BJ3L5G2s.js rename to frontend/prebuilt/assets/index-D8to1fXL.js index d9be552f..f92fcd8c 100644 Binary files a/frontend/prebuilt/assets/index-BJ3L5G2s.js and b/frontend/prebuilt/assets/index-D8to1fXL.js differ diff --git a/frontend/prebuilt/assets/index-BJ3L5G2s.js.map b/frontend/prebuilt/assets/index-D8to1fXL.js.map similarity index 95% rename from frontend/prebuilt/assets/index-BJ3L5G2s.js.map rename to frontend/prebuilt/assets/index-D8to1fXL.js.map index cc0130d2..41dc715c 100644 Binary files a/frontend/prebuilt/assets/index-BJ3L5G2s.js.map and b/frontend/prebuilt/assets/index-D8to1fXL.js.map differ diff --git a/frontend/prebuilt/assets/leaflet-TNk2YzRY.js b/frontend/prebuilt/assets/leaflet-CQVZ2keI.js similarity index 99% rename from frontend/prebuilt/assets/leaflet-TNk2YzRY.js rename to frontend/prebuilt/assets/leaflet-CQVZ2keI.js index 56bd547b..6017e0d9 100644 Binary files a/frontend/prebuilt/assets/leaflet-TNk2YzRY.js and b/frontend/prebuilt/assets/leaflet-CQVZ2keI.js differ diff --git a/frontend/prebuilt/assets/leaflet-TNk2YzRY.js.map b/frontend/prebuilt/assets/leaflet-CQVZ2keI.js.map similarity index 99% rename from frontend/prebuilt/assets/leaflet-TNk2YzRY.js.map rename to frontend/prebuilt/assets/leaflet-CQVZ2keI.js.map index 10f8bed4..e25fb696 100644 Binary files a/frontend/prebuilt/assets/leaflet-TNk2YzRY.js.map and b/frontend/prebuilt/assets/leaflet-CQVZ2keI.js.map differ diff --git a/frontend/prebuilt/assets/separator-ChUIbJIJ.js b/frontend/prebuilt/assets/separator-CqKVy-fj.js similarity index 89% rename from frontend/prebuilt/assets/separator-ChUIbJIJ.js rename to frontend/prebuilt/assets/separator-CqKVy-fj.js index 6229c01a..311aeda0 100644 Binary files a/frontend/prebuilt/assets/separator-ChUIbJIJ.js and b/frontend/prebuilt/assets/separator-CqKVy-fj.js differ diff --git a/frontend/prebuilt/assets/separator-ChUIbJIJ.js.map b/frontend/prebuilt/assets/separator-CqKVy-fj.js.map similarity index 98% rename from frontend/prebuilt/assets/separator-ChUIbJIJ.js.map rename to frontend/prebuilt/assets/separator-CqKVy-fj.js.map index d6c89661..0774ff3b 100644 Binary files a/frontend/prebuilt/assets/separator-ChUIbJIJ.js.map and b/frontend/prebuilt/assets/separator-CqKVy-fj.js.map differ diff --git a/frontend/prebuilt/index.html b/frontend/prebuilt/index.html index 3ba8dfae..9526f158 100644 Binary files a/frontend/prebuilt/index.html and b/frontend/prebuilt/index.html differ diff --git a/frontend/src/components/ChatHeader.tsx b/frontend/src/components/ChatHeader.tsx index 8cf857e7..0e767483 100644 --- a/frontend/src/components/ChatHeader.tsx +++ b/frontend/src/components/ChatHeader.tsx @@ -304,7 +304,7 @@ export function ChatHeader({ title={ activeContactIsPrefixOnly ? 'Direct Trace unavailable until the full contact key is known' - : 'Direct Trace. Send a zero-hop packet to thie contact and display out and back SNR' + : 'Direct Trace. Send a zero-hop packet to this contact and display out and back SNR' } aria-label="Direct Trace" disabled={activeContactIsPrefixOnly} diff --git a/frontend/src/components/NewMessageModal.tsx b/frontend/src/components/NewMessageModal.tsx index 9b3ba3bf..6fc8d499 100644 --- a/frontend/src/components/NewMessageModal.tsx +++ b/frontend/src/components/NewMessageModal.tsx @@ -15,6 +15,7 @@ import { Input } from './ui/input'; import { Label } from './ui/label'; import { Checkbox } from './ui/checkbox'; import { Button } from './ui/button'; +import { toast } from './ui/sonner'; type Tab = 'existing' | 'new-contact' | 'new-room' | 'hashtag'; @@ -90,6 +91,9 @@ export function NewMessageModal({ resetForm(); onClose(); } catch (err) { + toast.error('Failed to create conversation', { + description: err instanceof Error ? err.message : undefined, + }); setError(err instanceof Error ? err.message : 'Failed to create'); } finally { setLoading(false); @@ -123,6 +127,9 @@ export function NewMessageModal({ setName(''); hashtagInputRef.current?.focus(); } catch (err) { + toast.error('Failed to create conversation', { + description: err instanceof Error ? err.message : undefined, + }); setError(err instanceof Error ? err.message : 'Failed to create'); } finally { setLoading(false); diff --git a/frontend/src/test/newMessageModal.test.tsx b/frontend/src/test/newMessageModal.test.tsx index 02ac8d3c..99847103 100644 --- a/frontend/src/test/newMessageModal.test.tsx +++ b/frontend/src/test/newMessageModal.test.tsx @@ -11,6 +11,7 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { NewMessageModal } from '../components/NewMessageModal'; import type { Contact } from '../types'; +import { toast } from '../components/ui/sonner'; // Mock sonner (toast) vi.mock('../components/ui/sonner', () => ({ @@ -35,6 +36,11 @@ const mockContact: Contact = { first_seen: null, }; +const mockToast = toast as unknown as { + success: ReturnType; + error: ReturnType; +}; + describe('NewMessageModal form reset', () => { const onClose = vi.fn(); const onSelectConversation = vi.fn(); @@ -137,6 +143,24 @@ describe('NewMessageModal form reset', () => { }); expect(onClose).toHaveBeenCalled(); }); + + it('toasts when creation fails', async () => { + const user = userEvent.setup(); + onCreateChannel.mockRejectedValueOnce(new Error('Bad key')); + renderModal(); + await switchToTab(user, 'Room'); + + await user.type(screen.getByPlaceholderText('Room name'), 'MyRoom'); + await user.type(screen.getByPlaceholderText('Pre-shared key (hex)'), 'cc'.repeat(16)); + await user.click(screen.getByRole('button', { name: 'Create' })); + + await waitFor(() => { + expect(mockToast.error).toHaveBeenCalledWith('Failed to create conversation', { + description: 'Bad key', + }); + }); + expect(screen.getByText('Bad key')).toBeTruthy(); + }); }); describe('tab switching resets form', () => { diff --git a/tests/test_packets_router.py b/tests/test_packets_router.py index 536a93fc..edd89823 100644 --- a/tests/test_packets_router.py +++ b/tests/test_packets_router.py @@ -72,7 +72,7 @@ class TestDecryptHistoricalPackets: }, ) - assert response.status_code == 200 + assert response.status_code == 202 data = response.json() assert data["started"] is True assert data["total_packets"] == 5 @@ -91,7 +91,7 @@ class TestDecryptHistoricalPackets: }, ) - assert response.status_code == 200 + assert response.status_code == 202 data = response.json() assert data["started"] is True assert data["total_packets"] == 3 @@ -107,10 +107,9 @@ class TestDecryptHistoricalPackets: }, ) - assert response.status_code == 200 + assert response.status_code == 400 data = response.json() - assert data["started"] is False - assert "invalid" in data["message"].lower() + assert "invalid" in data["detail"].lower() @pytest.mark.asyncio async def test_channel_decrypt_wrong_key_length(self, test_db, client): @@ -123,10 +122,9 @@ class TestDecryptHistoricalPackets: }, ) - assert response.status_code == 200 + assert response.status_code == 400 data = response.json() - assert data["started"] is False - assert "16 bytes" in data["message"] + assert "16 bytes" in data["detail"] @pytest.mark.asyncio async def test_channel_decrypt_no_key_or_name(self, test_db, client): @@ -136,10 +134,9 @@ class TestDecryptHistoricalPackets: json={"key_type": "channel"}, ) - assert response.status_code == 200 + assert response.status_code == 400 data = response.json() - assert data["started"] is False - assert "must provide" in data["message"].lower() + assert "must provide" in data["detail"].lower() @pytest.mark.asyncio async def test_channel_decrypt_no_undecrypted_packets(self, test_db, client): @@ -172,7 +169,7 @@ class TestDecryptHistoricalPackets: }, ) - assert response.status_code == 200 + assert response.status_code == 202 assert response.json()["started"] is True @pytest.mark.asyncio @@ -186,10 +183,9 @@ class TestDecryptHistoricalPackets: }, ) - assert response.status_code == 200 + assert response.status_code == 400 data = response.json() - assert data["started"] is False - assert "private_key" in data["message"].lower() + assert "private_key" in data["detail"].lower() @pytest.mark.asyncio async def test_contact_decrypt_missing_contact_key(self, test_db, client): @@ -202,10 +198,9 @@ class TestDecryptHistoricalPackets: }, ) - assert response.status_code == 200 + assert response.status_code == 400 data = response.json() - assert data["started"] is False - assert "contact_public_key" in data["message"].lower() + assert "contact_public_key" in data["detail"].lower() @pytest.mark.asyncio async def test_contact_decrypt_wrong_private_key_length(self, test_db, client): @@ -219,10 +214,9 @@ class TestDecryptHistoricalPackets: }, ) - assert response.status_code == 200 + assert response.status_code == 400 data = response.json() - assert data["started"] is False - assert "64 bytes" in data["message"] + assert "64 bytes" in data["detail"] @pytest.mark.asyncio async def test_contact_decrypt_wrong_public_key_length(self, test_db, client): @@ -236,10 +230,9 @@ class TestDecryptHistoricalPackets: }, ) - assert response.status_code == 200 + assert response.status_code == 400 data = response.json() - assert data["started"] is False - assert "32 bytes" in data["message"] + assert "32 bytes" in data["detail"] @pytest.mark.asyncio async def test_contact_decrypt_invalid_hex(self, test_db, client): @@ -253,10 +246,9 @@ class TestDecryptHistoricalPackets: }, ) - assert response.status_code == 200 + assert response.status_code == 400 data = response.json() - assert data["started"] is False - assert "invalid" in data["message"].lower() + assert "invalid" in data["detail"].lower() @pytest.mark.asyncio async def test_invalid_key_type(self, test_db, client): @@ -266,10 +258,9 @@ class TestDecryptHistoricalPackets: json={"key_type": "invalid"}, ) - assert response.status_code == 200 + assert response.status_code == 400 data = response.json() - assert data["started"] is False - assert "key_type" in data["message"].lower() + assert "key_type" in data["detail"].lower() class TestRunHistoricalChannelDecryption: