From 28161f13c92aee87dc2401dc5066b10aa95c3cad Mon Sep 17 00:00:00 2001 From: Miaopeng Yu Date: Sun, 12 Jul 2026 13:55:05 +0800 Subject: [PATCH] Fix Gmail multi-label filtering --- .../mock-gmail/mock_gmail/api/messages.py | 4 ++- .../environments/mock-gmail/tests/test_api.py | 33 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/packages/environments/mock-gmail/mock_gmail/api/messages.py b/packages/environments/mock-gmail/mock_gmail/api/messages.py index b9204a6df..ebdfcefeb 100644 --- a/packages/environments/mock-gmail/mock_gmail/api/messages.py +++ b/packages/environments/mock-gmail/mock_gmail/api/messages.py @@ -253,7 +253,9 @@ def list_messages( elif lid == "SENT": query = query.filter(Message.is_sent == True) else: - query = query.join(MessageLabel).filter(MessageLabel.label_id == lid) + query = query.filter( + Message.labels.any(MessageLabel.label_id == lid) + ) if q: filters = _parse_search_query(q) diff --git a/packages/environments/mock-gmail/tests/test_api.py b/packages/environments/mock-gmail/tests/test_api.py index fe869ae98..4b11c881b 100644 --- a/packages/environments/mock-gmail/tests/test_api.py +++ b/packages/environments/mock-gmail/tests/test_api.py @@ -37,6 +37,39 @@ def test_list_messages(self, client): assert "id" in data["messages"][0] assert "threadId" in data["messages"][0] + def test_list_messages_with_multiple_labels(self, client): + first_label_id = client.post( + "/gmail/v1/users/me/labels", json={"name": "First filter label"} + ).json()["id"] + second_label_id = client.post( + "/gmail/v1/users/me/labels", json={"name": "Second filter label"} + ).json()["id"] + + matching_message = client.post( + "/gmail/v1/users/me/messages", + json={ + "raw": _raw(subject="Matches both labels"), + "labelIds": [first_label_id, second_label_id], + }, + ).json() + client.post( + "/gmail/v1/users/me/messages", + json={ + "raw": _raw(subject="Matches only one label"), + "labelIds": [first_label_id], + }, + ) + + resp = client.get( + "/gmail/v1/users/me/messages", + params=[("labelIds", first_label_id), ("labelIds", second_label_id)], + ) + + assert resp.status_code == 200 + assert [message["id"] for message in resp.json()["messages"]] == [ + matching_message["id"] + ] + def test_get_message(self, client): # First list to get an ID resp = client.get("/gmail/v1/users/me/messages")