feat: implement channel runtime connectors
This commit is contained in:
68
external-connector/tests/test_state.py
Normal file
68
external-connector/tests/test_state.py
Normal file
@ -0,0 +1,68 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from external_connector.state import SidecarStateStore
|
||||
|
||||
|
||||
def test_state_store_saves_and_loads_connector_sessions(tmp_path) -> None:
|
||||
store = SidecarStateStore(tmp_path / "state.json")
|
||||
|
||||
session = store.create_session(
|
||||
kind="weixin",
|
||||
connection_id="conn_1",
|
||||
channel_id="weixin-main",
|
||||
display_name="Weixin Main",
|
||||
options={},
|
||||
)
|
||||
store.update_session(session.session_id, status="connected", account_id="weixin:me", display_name="Me")
|
||||
loaded = store.get_session(session.session_id)
|
||||
|
||||
assert session.session_id.startswith("cs_")
|
||||
assert loaded.status == "connected"
|
||||
assert loaded.account_id == "weixin:me"
|
||||
|
||||
|
||||
def test_state_store_dedupes_send_results(tmp_path) -> None:
|
||||
store = SidecarStateStore(tmp_path / "state.json")
|
||||
|
||||
first = store.begin_send(connection_id="conn_1", request_id="out_1")
|
||||
store.complete_send(first.dedupe_key, provider_message_id="provider-1")
|
||||
duplicate = store.begin_send(connection_id="conn_1", request_id="out_1")
|
||||
|
||||
assert first.should_send is True
|
||||
assert duplicate.should_send is False
|
||||
assert duplicate.status == "completed"
|
||||
assert duplicate.http_status == 200
|
||||
assert duplicate.provider_message_id == "provider-1"
|
||||
|
||||
|
||||
def test_state_store_returns_conflict_for_active_send_processing(tmp_path) -> None:
|
||||
store = SidecarStateStore(tmp_path / "state.json", send_processing_ttl_seconds=60)
|
||||
|
||||
store.begin_send(connection_id="conn_1", request_id="out_1")
|
||||
duplicate = store.begin_send(connection_id="conn_1", request_id="out_1")
|
||||
|
||||
assert duplicate.should_send is False
|
||||
assert duplicate.status == "processing"
|
||||
assert duplicate.http_status == 409
|
||||
assert duplicate.retry_after_seconds == 5
|
||||
|
||||
|
||||
def test_state_store_retries_stale_send_processing(tmp_path) -> None:
|
||||
store = SidecarStateStore(tmp_path / "state.json", send_processing_ttl_seconds=0)
|
||||
|
||||
store.begin_send(connection_id="conn_1", request_id="out_1")
|
||||
retry = store.begin_send(connection_id="conn_1", request_id="out_1")
|
||||
|
||||
assert retry.should_send is True
|
||||
assert retry.status == "processing"
|
||||
|
||||
|
||||
def test_state_store_retries_failed_send_immediately(tmp_path) -> None:
|
||||
store = SidecarStateStore(tmp_path / "state.json", send_processing_ttl_seconds=60)
|
||||
|
||||
first = store.begin_send(connection_id="conn_1", request_id="out_1")
|
||||
store.fail_send(first.dedupe_key, error="provider rejected message")
|
||||
retry = store.begin_send(connection_id="conn_1", request_id="out_1")
|
||||
|
||||
assert retry.should_send is True
|
||||
assert retry.status == "processing"
|
||||
Reference in New Issue
Block a user