mirror of
https://github.com/chatmail/relay.git
synced 2026-08-25 09:33:13 +00:00
test: integrate lua testing into regular pytest run for push notifications
turns out Python has the nice https://pypi.org/project/lupa/ that allows us to quite easily test dovecot LUA parts without figuring out errors on deploy.
This commit is contained in:
@@ -19,6 +19,7 @@ dependencies = [
|
|||||||
"pytest-xdist",
|
"pytest-xdist",
|
||||||
"execnet",
|
"execnet",
|
||||||
"imap_tools",
|
"imap_tools",
|
||||||
|
"lupa",
|
||||||
"deltachat-rpc-client",
|
"deltachat-rpc-client",
|
||||||
"deltachat-rpc-server",
|
"deltachat-rpc-server",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
"""Run the lua scripts we ship under lupa, which bundles Lua 5.4 like dovecot."""
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
from lupa import lua54
|
||||||
|
|
||||||
|
from cmdeploy.basedeploy import get_resource
|
||||||
|
|
||||||
|
|
||||||
|
class Lua:
|
||||||
|
"""A Lua runtime to load shipped scripts and mocks into."""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.rt = lua54.LuaRuntime(unpack_returned_tuples=True)
|
||||||
|
self.g = self.rt.globals()
|
||||||
|
|
||||||
|
def load(self, path):
|
||||||
|
self.rt.execute(get_resource(path).read_text())
|
||||||
|
|
||||||
|
def table(self, **kwargs):
|
||||||
|
return self.rt.table(**kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def lua():
|
||||||
|
return Lua()
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
"""Test the push_notification.lua we ship, against a mocked dovecot mail API."""
|
||||||
|
|
||||||
|
import textwrap
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
USER1 = "user12345@chat.example.org"
|
||||||
|
USER2 = "user67890@chat.example.org"
|
||||||
|
|
||||||
|
DOVECOT_MOCKS = textwrap.dedent("""
|
||||||
|
function make_user(username)
|
||||||
|
local function mailbox(_, name)
|
||||||
|
record("mailbox " .. name)
|
||||||
|
return {
|
||||||
|
sync = function() record("sync") end,
|
||||||
|
metadata_set = function(_, k, v)
|
||||||
|
record("metadata_set " .. k .. "=" .. v)
|
||||||
|
end,
|
||||||
|
free = function() record("free") end,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
return {username = username, mailbox = mailbox}
|
||||||
|
end
|
||||||
|
""")
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def script(lua):
|
||||||
|
lua.rt.execute(DOVECOT_MOCKS)
|
||||||
|
lua.load("dovecot/push_notification.lua")
|
||||||
|
return lua
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def deliver(script):
|
||||||
|
def deliver(recipient, sender):
|
||||||
|
calls = []
|
||||||
|
script.g.record = calls.append
|
||||||
|
user = script.g.make_user(recipient)
|
||||||
|
ctx = script.g.dovecot_lua_notify_begin_txn(user)
|
||||||
|
event = script.table(mailbox="INBOX", from_address=sender)
|
||||||
|
script.g.dovecot_lua_notify_event_message_new(ctx, event)
|
||||||
|
script.g.dovecot_lua_notify_end_txn(ctx, True)
|
||||||
|
return calls
|
||||||
|
|
||||||
|
return deliver
|
||||||
|
|
||||||
|
|
||||||
|
def test_entry_points_have_the_names_dovecot_calls(script):
|
||||||
|
assert script.g.dovecot_lua_notify_begin_txn is not None
|
||||||
|
assert script.g.dovecot_lua_notify_event_message_new is not None
|
||||||
|
assert script.g.dovecot_lua_notify_end_txn is not None
|
||||||
|
|
||||||
|
|
||||||
|
def test_begin_txn_returns_the_user_as_event_context(script):
|
||||||
|
user = script.g.make_user(USER1)
|
||||||
|
ctx = script.g.dovecot_lua_notify_begin_txn(user)
|
||||||
|
ctx.marker = "seen"
|
||||||
|
assert user.marker == "seen"
|
||||||
|
|
||||||
|
|
||||||
|
def test_incoming_message_notifies_metadata_server(deliver):
|
||||||
|
assert deliver(USER1, sender=USER2) == [
|
||||||
|
"mailbox INBOX",
|
||||||
|
"sync",
|
||||||
|
"metadata_set /private/messagenew=",
|
||||||
|
"free",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def test_own_message_does_not_wake_the_sending_device(deliver):
|
||||||
|
assert deliver(USER1, sender=USER1) == [
|
||||||
|
"mailbox INBOX",
|
||||||
|
"sync",
|
||||||
|
"free",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def test_message_without_from_address_is_notified(deliver):
|
||||||
|
assert deliver(USER1, sender=None) == [
|
||||||
|
"mailbox INBOX",
|
||||||
|
"sync",
|
||||||
|
"metadata_set /private/messagenew=",
|
||||||
|
"free",
|
||||||
|
]
|
||||||
Reference in New Issue
Block a user