mozci/tests/test_notify.py

169 строки
5.7 KiB
Python

# -*- coding: utf-8 -*-
import json
import markdown2
import pytest
from mozci.console.commands.push import ClassifyCommand
from mozci.push import PushStatus, Regressions
from mozci.task import TestTask
EMAIL_EMPTY_TO_BAD = """
# Push 1 evolved from no classification to BAD
Rev: [rev1](https://treeherder.mozilla.org/jobs?repo=unittest&revision=rev1)\n
Author: Bob Bob bbob@mozilla.com\n
Time: 09:45:02
## Real failures
- Group [group1](https://treeherder.mozilla.org/#/jobs?repo=unittest&tochange=rev1&test_paths=group1) - Tasks:
- [random-test-task](https://treeherder.mozilla.org/#/jobs?repo=unittest&revision=rev1&selectedTaskRun=taskIdXXX-0)
- Group [group2](https://treeherder.mozilla.org/#/jobs?repo=unittest&tochange=rev1&test_paths=group2) - No tasks available
"""
EMAIL_UNKNOWN_TO_BAD = """
# Push 1 evolved from UNKNOWN to BAD
Rev: [rev1](https://treeherder.mozilla.org/jobs?repo=unittest&revision=rev1)\n
Author: Bob Bob bbob@mozilla.com\n
Time: 09:45:02
## Real failures
- Group [group1](https://treeherder.mozilla.org/#/jobs?repo=unittest&tochange=rev1&test_paths=group1) - Tasks:
- [random-test-task](https://treeherder.mozilla.org/#/jobs?repo=unittest&revision=rev1&selectedTaskRun=taskIdXXX-0)
- Group [group2](https://treeherder.mozilla.org/#/jobs?repo=unittest&tochange=rev1&test_paths=group2) - No tasks available
"""
EMAIL_BAD_TO_UNKNOWN = """
# Push 1 evolved from BAD to UNKNOWN
Rev: [rev1](https://treeherder.mozilla.org/jobs?repo=unittest&revision=rev1)\n
Author: Bob Bob bbob@mozilla.com\n
Time: 09:45:02
## Real failures
- Group [group1](https://treeherder.mozilla.org/#/jobs?repo=unittest&tochange=rev1&test_paths=group1) - Tasks:
- [random-test-task](https://treeherder.mozilla.org/#/jobs?repo=unittest&revision=rev1&selectedTaskRun=taskIdXXX-0)
- Group [group2](https://treeherder.mozilla.org/#/jobs?repo=unittest&tochange=rev1&test_paths=group2) - No tasks available
"""
EMAIL_BAD_TO_GOOD = """
# Push 1 evolved from BAD to GOOD
Rev: [rev1](https://treeherder.mozilla.org/jobs?repo=unittest&revision=rev1)\n
Author: Bob Bob bbob@mozilla.com\n
Time: 09:45:02
## Real failures
- Group [group1](https://treeherder.mozilla.org/#/jobs?repo=unittest&tochange=rev1&test_paths=group1) - Tasks:
- [random-test-task](https://treeherder.mozilla.org/#/jobs?repo=unittest&revision=rev1&selectedTaskRun=taskIdXXX-0)
- Group [group2](https://treeherder.mozilla.org/#/jobs?repo=unittest&tochange=rev1&test_paths=group2) - No tasks available
"""
EMAIL_GOOD_TO_BAD = """
# Push 1 evolved from GOOD to BAD
Rev: [rev1](https://treeherder.mozilla.org/jobs?repo=unittest&revision=rev1)\n
Author: Bob Bob bbob@mozilla.com\n
Time: 09:45:02
## Real failures
- Group [group1](https://treeherder.mozilla.org/#/jobs?repo=unittest&tochange=rev1&test_paths=group1) - Tasks:
- [random-test-task](https://treeherder.mozilla.org/#/jobs?repo=unittest&revision=rev1&selectedTaskRun=taskIdXXX-0)
- Group [group2](https://treeherder.mozilla.org/#/jobs?repo=unittest&tochange=rev1&test_paths=group2) - No tasks available
"""
@pytest.mark.parametrize(
"previous, current, email_content",
(
(None, PushStatus.GOOD, None),
(None, PushStatus.UNKNOWN, None),
(None, PushStatus.BAD, EMAIL_EMPTY_TO_BAD),
(PushStatus.GOOD, PushStatus.GOOD, None),
(PushStatus.GOOD, PushStatus.UNKNOWN, None),
(PushStatus.GOOD, PushStatus.BAD, EMAIL_GOOD_TO_BAD),
(PushStatus.BAD, PushStatus.GOOD, EMAIL_BAD_TO_GOOD),
(PushStatus.BAD, PushStatus.UNKNOWN, EMAIL_BAD_TO_UNKNOWN),
(PushStatus.BAD, PushStatus.BAD, None),
(PushStatus.UNKNOWN, PushStatus.GOOD, None),
(PushStatus.UNKNOWN, PushStatus.UNKNOWN, None),
(PushStatus.UNKNOWN, PushStatus.BAD, EMAIL_UNKNOWN_TO_BAD),
),
)
def test_classification_evolution(
create_push, responses, previous, current, email_content
):
# Setup dummy regressions with real failures
regressions = Regressions(
real={
"group1": [TestTask(id="taskIdXXX", label="random-test-task")],
"group2": [],
},
intermittent={},
unknown={},
)
# Create a random push
push = create_push()
# Mock Taskcluster email notification service
responses.add(
responses.POST,
"https://community-tc.services.mozilla.com/api/notify/v1/email",
json={},
status=200,
)
# Mock Taskcluster Matrix notification service
responses.add(
responses.POST,
"https://community-tc.services.mozilla.com/api/notify/v1/matrix",
json={},
status=200,
)
# Run the notification code from mozci push classify
cmd = ClassifyCommand()
cmd.name = "classify"
cmd.branch = "unittest"
cmd.send_notifications(
emails=["test@mozilla.com"],
matrix_room="!tEsTmAtRIxRooM:mozilla.org",
push=push,
previous=previous,
current=current,
regressions=regressions,
)
if email_content:
# Check an email and a matrix notification were correctly sent
assert len(responses.calls) == 2
email_call = responses.calls[0]
assert json.loads(email_call.request.body) == {
"address": "test@mozilla.com",
"subject": "Mozci | Push status evolution 1 rev1",
"content": email_content,
}
matrix_call = responses.calls[1]
assert json.loads(matrix_call.request.body) == {
"roomId": "!tEsTmAtRIxRooM:mozilla.org",
"body": email_content,
"formattedBody": markdown2.markdown(email_content),
"format": "org.matrix.custom.html",
"msgtype": "m.text",
}
else:
# Check no email was sent
assert len(responses.calls) == 0