chromium/third_party/blink/tools/blinkpy/w3c/buganizer_unittest.py

# Copyright 2024 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import textwrap
import unittest
from unittest import mock

from blinkpy.common.net.web_mock import MockWeb
from blinkpy.w3c.buganizer import (
    BuganizerClient,
    BuganizerError,
    BuganizerIssue,
    Status,
    Priority,
    Severity,
)


class BuganizerIssueTest(unittest.TestCase):

    def test_display(self):
        issue = BuganizerIssue(title='test',
                               description='ABC~‾¥≈¤・・•∙·☼★星🌟星★☼·∙•・・¤≈¥‾~XYZ',
                               component_id='999',
                               issue_id=12345,
                               cc=['[email protected]', '[email protected]'],
                               status=Status.ASSIGNED,
                               priority=Priority.P0,
                               severity=Severity.S0)
        self.assertEqual(
            str(issue),
            textwrap.dedent("""\
                Issue https://crbug.com/12345: test
                  Status: ASSIGNED
                  Component ID: 999
                  CC: [email protected], [email protected]
                  Priority: P0
                  Severity: S0
                  Description:
                    ABC~‾¥≈¤・・•∙·☼★星🌟星★☼·∙•・・¤≈¥‾~XYZ
                  """))

    def test_display_minimal(self):
        issue = BuganizerIssue(title='test',
                               description=textwrap.dedent("""\
                                  line 1
                                    line 2
                                  line 3
                                  """),
                               component_id='999')
        self.assertEqual(
            str(issue),
            textwrap.dedent("""\
                Issue: test
                  Status: NEW
                  Component ID: 999
                  CC: (none)
                  Priority: P3
                  Severity: S4
                  Description:
                    line 1
                      line 2
                    line 3
                """))

    def test_crbug_link(self):
        issue = BuganizerIssue(title='test',
                               description='test',
                               component_id='999',
                               issue_id=12345)
        self.assertEqual(issue.link, 'https://crbug.com/12345')
        issue = BuganizerIssue(title='test',
                               description='test',
                               component_id='999')
        self.assertIsNone(issue.link)

    def test_build_from_payload(self):
        issue = BuganizerIssue.from_payload({
            'issueId': 12345,
            'issueState': {
                'title': 'test title',
                'componentId': 999,
                'status': 'NEW',
                'severity': 'S2',
                'priority': 'P1',
                # `emailAddress` may be blank if the user is not visible to the
                # caller.
                'ccs': [{}, {
                    'emailAddress': '[email protected]',
                }],
            },
            'issueComment': {
                'comment': 'test description',
            },
        })
        self.assertEqual(issue.issue_id, 12345)
        self.assertEqual(issue.title, 'test title')
        self.assertEqual(issue.component_id, '999')
        self.assertIs(issue.status, Status.NEW)
        self.assertIs(issue.severity, Severity.S2)
        self.assertIs(issue.priority, Priority.P1)
        self.assertEqual(issue.cc, ['[email protected]'])
        self.assertEqual(issue.description, 'test description')


class BuganizerClientTest(unittest.TestCase):

    def setUp(self):
        self.service = mock.Mock()
        self.web = MockWeb()
        self.client = BuganizerClient(self.service, self.web)

    def test_resolve_id_already_valid(self):
        self.client.GetIssue(12_345_678)
        fake_get = self.service.issues.return_value.get
        fake_get.assert_called_once_with(issueId=12_345_678)

    def test_resolve_id_already_valid_url(self):
        self.client.GetIssue('crbug.com/12345678')
        fake_get = self.service.issues.return_value.get
        fake_get.assert_called_once_with(issueId=12_345_678)

    def test_resolve_historic(self):
        self.web.urls['https://crbug.com/123'] = (
            b'window.location = "https://issues.chromium.org/12345678";')
        self.client.GetIssue(123)
        fake_get = self.service.issues.return_value.get
        fake_get.assert_called_once_with(issueId=12_345_678)

    def test_resolve_historic_url(self):
        self.web.urls['https://crbug.com/123'] = (
            b'window.location = "https://issues.chromium.org/12345678";')
        self.client.GetIssue('crbug.com/123')
        fake_get = self.service.issues.return_value.get
        fake_get.assert_called_once_with(issueId=12_345_678)

    def test_resolve_non_chromium_project(self):
        self.web.urls['https://skbug.com/123'] = (
            b'window.location = "https://issues.skia.org/12345678";')
        self.client.GetIssue('https://skbug.com/123')
        fake_get = self.service.issues.return_value.get
        fake_get.assert_called_once_with(issueId=12_345_678)

    def test_unsuccessful_resolve(self):
        self.web.urls['https://crbug.com/123'] = b'404 not found'
        with self.assertRaises(BuganizerError):
            self.client.GetIssue(123)
        fake_get = self.service.issues.return_value.get
        fake_get.assert_not_called()