Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

On alias transfer send the proper events #2249

Merged
merged 1 commit into from
Oct 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions app/alias_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
AliasDeleted,
AliasStatusChanged,
EventContent,
AliasCreated,
)
from app.log import LOG
from app.models import (
Expand Down Expand Up @@ -501,6 +502,28 @@ def transfer_alias(alias, new_user, new_mailboxes: [Mailbox]):
alias.disable_pgp = False
alias.pinned = False

EventDispatcher.send_event(
old_user,
EventContent(
alias_deleted=AliasDeleted(
id=alias.id,
email=alias.email,
)
),
)
EventDispatcher.send_event(
new_user,
EventContent(
alias_created=AliasCreated(
id=alias.id,
email=alias.email,
note=alias.note,
enabled=alias.enabled,
created_at=int(alias.created_at.timestamp),
)
),
)

Session.commit()


Expand Down
62 changes: 48 additions & 14 deletions tests/dashboard/test_alias_transfer.py
Original file line number Diff line number Diff line change
@@ -1,38 +1,72 @@
import app.alias_utils
from app import config
from app.db import Session
from app.events.event_dispatcher import GlobalDispatcher
from app.models import (
Alias,
Mailbox,
User,
AliasMailbox,
)
from tests.events.event_test_utils import (
OnMemoryDispatcher,
_get_event_from_string,
_create_linked_user,
)
from tests.utils import login

on_memory_dispatcher = OnMemoryDispatcher()


def setup_module():
GlobalDispatcher.set_dispatcher(on_memory_dispatcher)
config.EVENT_WEBHOOK = "http://test"


def teardown_module():
GlobalDispatcher.set_dispatcher(None)
config.EVENT_WEBHOOK = None


def test_alias_transfer(flask_client):
user = login(flask_client)
mb = Mailbox.create(user_id=user.id, email="[email protected]", commit=True)
(source_user, source_user_pu) = _create_linked_user()
source_user = login(flask_client, source_user)
mb = Mailbox.create(user_id=source_user.id, email="[email protected]", commit=True)

alias = Alias.create_new_random(user)
alias = Alias.create_new_random(source_user)
Session.commit()

AliasMailbox.create(alias_id=alias.id, mailbox_id=mb.id, commit=True)

new_user = User.create(
email="[email protected]",
password="password",
activated=True,
commit=True,
)
(target_user, target_user_pu) = _create_linked_user()

Mailbox.create(
user_id=new_user.id, email="[email protected]", verified=True, commit=True
user_id=target_user.id, email="[email protected]", verified=True, commit=True
)

app.alias_utils.transfer_alias(alias, new_user, new_user.mailboxes())
on_memory_dispatcher.clear()
app.alias_utils.transfer_alias(alias, target_user, target_user.mailboxes())

# refresh from db
alias = Alias.get(alias.id)
assert alias.user == new_user
assert set(alias.mailboxes) == set(new_user.mailboxes())
assert alias.user == target_user
assert set(alias.mailboxes) == set(target_user.mailboxes())
assert len(alias.mailboxes) == 2

# Check events
assert len(on_memory_dispatcher.memory) == 2
# 1st delete event
event_data = on_memory_dispatcher.memory[0]
event_content = _get_event_from_string(event_data, source_user, source_user_pu)
assert event_content.alias_deleted is not None
alias_deleted = event_content.alias_deleted
assert alias_deleted.id == alias.id
assert alias_deleted.email == alias.email
# 2nd create event
event_data = on_memory_dispatcher.memory[1]
event_content = _get_event_from_string(event_data, target_user, target_user_pu)
assert event_content.alias_created is not None
alias_created = event_content.alias_created
assert alias.id == alias_created.id
assert alias.email == alias_created.email
assert alias.note or "" == alias_created.note
assert alias.enabled == alias_created.enabled
12 changes: 12 additions & 0 deletions tests/events/event_test_utils.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from app.events.event_dispatcher import Dispatcher
from app.events.generated import event_pb2
from app.models import PartnerUser, User
from app.proton.utils import get_proton_partner
from tests.utils import create_new_user, random_token
Expand Down Expand Up @@ -30,3 +31,14 @@ def _create_linked_user() -> Tuple[User, PartnerUser]:
)

return user, partner_user


def _get_event_from_string(
data: str, user: User, pu: PartnerUser
) -> event_pb2.EventContent:
event = event_pb2.Event()
event.ParseFromString(data)
assert user.id == event.user_id
assert pu.external_user_id == event.external_user_id
assert pu.partner_id == event.partner_id
return event.content
15 changes: 2 additions & 13 deletions tests/events/test_sent_events.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
from app import config, alias_utils
from app.db import Session
from app.events.event_dispatcher import GlobalDispatcher
from app.events.generated import event_pb2
from app.models import Alias, User, PartnerUser
from app.models import Alias
from tests.utils import random_token
from .event_test_utils import (
OnMemoryDispatcher,
_create_linked_user,
_get_event_from_string,
)

on_memory_dispatcher = OnMemoryDispatcher()
Expand All @@ -26,17 +26,6 @@ def setup_function(func):
on_memory_dispatcher.clear()


def _get_event_from_string(
data: str, user: User, pu: PartnerUser
) -> event_pb2.EventContent:
event = event_pb2.Event()
event.ParseFromString(data)
assert user.id == event.user_id
assert pu.external_user_id == event.external_user_id
assert pu.partner_id == event.partner_id
return event.content


def test_fire_event_on_alias_creation():
(user, pu) = _create_linked_user()
alias = Alias.create_new_random(user)
Expand Down
Loading