From 6c7018dd33ac004ca5ef27b0eb2730748db67d4c Mon Sep 17 00:00:00 2001 From: Son NK <> Date: Sun, 15 Nov 2020 18:42:29 +0100 Subject: [PATCH] Take into account pinned alias in get_alias_infos_with_pagination_v3 --- app/api/serializer.py | 3 +++ tests/api/test_serializer.py | 41 +++++++++++++++++++++++++++++++++--- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/app/api/serializer.py b/app/api/serializer.py index 26305f58..18320677 100644 --- a/app/api/serializer.py +++ b/app/api/serializer.py @@ -272,6 +272,7 @@ def get_alias_infos_with_pagination_v3( or_( EmailLog.created_at == sub.c.max_created_at, sub.c.max_created_at == None, # no email log yet for this alias + Alias.pinned == True, ) ) ) @@ -292,6 +293,8 @@ def get_alias_infos_with_pagination_v3( elif alias_filter == "disabled": q = q.filter(Alias.enabled == False) + q = q.order_by(Alias.pinned.desc()) + if sort == "old2new": q = q.order_by(Alias.created_at) elif sort == "new2old": diff --git a/tests/api/test_serializer.py b/tests/api/test_serializer.py index 4a8167ba..226b9948 100644 --- a/tests/api/test_serializer.py +++ b/tests/api/test_serializer.py @@ -1,9 +1,7 @@ -from flask import url_for - from app.api.serializer import get_alias_infos_with_pagination_v3 from app.config import PAGE_LIMIT from app.extensions import db -from app.models import User, ApiKey, Alias, Contact, EmailLog, Mailbox +from app.models import User, Alias, Mailbox def test_get_alias_infos_with_pagination_v3(flask_client): @@ -140,3 +138,40 @@ def test_get_alias_infos_with_pagination_v3_no_duplicate(flask_client): alias_infos = get_alias_infos_with_pagination_v3(user) assert len(alias_infos) == 1 + + +def test_get_alias_infos_pinned_alias(flask_client): + """Different scenarios with pinned alias""" + user = User.create( + email="a@b.c", + password="password", + name="Test User", + activated=True, + commit=True, + ) + + # to have 3 pages: 2*PAGE_LIMIT + the alias automatically created for a new account + for i in range(2 * PAGE_LIMIT): + Alias.create_new_random(user) + + first_alias = Alias.query.order_by(Alias.id).first() + + # should return PAGE_LIMIT alias + alias_infos = get_alias_infos_with_pagination_v3(user) + assert len(alias_infos) == PAGE_LIMIT + # make sure first_alias is not returned as the default order is alias creation date + assert first_alias not in [ai.alias for ai in alias_infos] + + # pin the first alias + first_alias.pinned = True + db.session.commit() + + alias_infos = get_alias_infos_with_pagination_v3(user) + # now first_alias is the first result + assert first_alias == alias_infos[0].alias + # and the page size is still the same + assert len(alias_infos) == PAGE_LIMIT + + # pinned alias isn't included in the search + alias_infos = get_alias_infos_with_pagination_v3(user, query="no match") + assert len(alias_infos) == 0