diff --git a/slapr/slack.py b/slapr/slack.py index cf8684b..f651dbe 100644 --- a/slapr/slack.py +++ b/slapr/slack.py @@ -9,7 +9,7 @@ import slack_sdk from slack_sdk.errors import SlackApiError -PR_URL_PATTERN = r"<(?P.*)>" +PR_URL_PATTERN = r"<(?Phttps?://[^>|]+)(?:\|[^>]*)?>" class Message(NamedTuple): @@ -111,20 +111,14 @@ def find_timestamp_of_review_requested_message(self, pr_url: str, channel_id: st messages = self._backend.get_latest_messages(channel_id=channel_id) for message in messages: - match = re.search(PR_URL_PATTERN, message.text) - - if match is None: - continue - - # Examples: - # https://github.com/owner/repo/pull/6/files - # https://github.com/owner/repo/pull/6/s - url = match.group("url") - - if not url.startswith(pr_url): - continue - - return message.timestamp + for match in re.finditer(PR_URL_PATTERN, message.text): + # Examples: + # https://github.com/owner/repo/pull/6/files + # https://github.com/owner/repo/pull/6/s + url = match.group("url") + + if url.startswith(pr_url): + return message.timestamp return None diff --git a/tests/test_slapr.py b/tests/test_slapr.py index 2fba76a..10d3c4f 100644 --- a/tests/test_slapr.py +++ b/tests/test_slapr.py @@ -182,6 +182,21 @@ def _user(login: str) -> MockUser: ["test_review_started", "test_approved"], id="approval", ), + pytest.param( + [ + Message( + text=( + " CR Please - " + "" + ), + timestamp="yyyy-mm-dd", + ) + ], + [Review(state="approved", user=_user("alice"))], + [], + ["test_review_started", "test_approved"], + id="approval-with-user-group-mention-before-link", + ), pytest.param( [Message(text="Need :eyes: ", timestamp="yyyy-mm-dd")], [Review(state="changes_requested", user=_user("alice"))],