File indexing completed on 2024-04-21 05:41:19

0001 #!/usr/bin/env python3
0002 
0003 import os.path
0004 import sys
0005 import unittest
0006 from datetime import datetime, timedelta, timezone
0007 
0008 sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../")
0009 
0010 from lab.utils import Utils
0011 from lab.pipelines import PipelineStatus
0012 from lab.issue import is_valid_time_str
0013 
0014 
0015 class UtilsTest(unittest.TestCase):
0016     def test_gitlab_instance_url(self):
0017         # https
0018         repos = (
0019             "git@invent.kde.org:KDE/kaidan.git",
0020             "ssh://git@invent.kde.org/KDE/kaidan.git" "https://invent.kde.org/KDE/kaidan",
0021             "git://invent.kde.org/KDE/kaidan",
0022         )
0023 
0024         for repo in repos:
0025             url = Utils.gitlab_instance_url(repo)
0026             self.assertEqual(url, "https://invent.kde.org")
0027 
0028         # http
0029         url = Utils.gitlab_instance_url("http://invent.kde.org/KDE/kaidan")
0030         self.assertEqual(url, "http://invent.kde.org")
0031 
0032     def test_normalize_url(self):
0033         scp_url: str = "git@invent.kde.org:KDE/kaidan.git"
0034         url = Utils.normalize_url(scp_url)
0035         self.assertEqual(url, "ssh://git@invent.kde.org/KDE/kaidan.git")
0036 
0037         http_url: str = "https://invent.kde.org/KDE/kaidan.git"
0038         url = Utils.normalize_url(http_url)
0039         self.assertEqual(url, "https://invent.kde.org/KDE/kaidan.git")
0040 
0041     def test_str_id_for_url(self):
0042         url: str = "ssh://git@invent.kde.org/KDE/kaidan.git"
0043 
0044         str_id: str = Utils.str_id_for_url(url)
0045 
0046         self.assertEqual(str_id, "KDE/kaidan")
0047 
0048         # This is not a valid repository name for KDE invent, though
0049         url = "ssh://git@invent.kde.org/KDE/kaidan%.git"
0050         str_id = Utils.str_id_for_url(url)
0051         self.assertEqual(str_id, "KDE/kaidan%")
0052 
0053     def test_ssh_url_from_http(self):
0054         url: str = "http://invent.kde.org/KDE/kaidan"
0055 
0056         ssh_url: str = Utils.ssh_url_from_http(url)
0057 
0058         self.assertEqual(ssh_url, "ssh://git@invent.kde.org/KDE/kaidan")
0059 
0060     def test_id_url_ending_on_slash(self):
0061         url: str = "https://invent.kde.org/network/kaidan/"
0062 
0063         str_id: str = Utils.str_id_for_url(url)
0064 
0065         self.assertEqual(str_id, "network/kaidan")
0066 
0067     def test_pretty_date(self) -> None:
0068         ref_date = datetime(2020, 1, 1)
0069         fmt = "%Y-%m-%dT%H:%M:%S.%fZ"
0070 
0071         iso_date_1 = ref_date + timedelta(seconds=9)
0072         self.assertEqual(Utils.pretty_date(ref_date.strftime(fmt), iso_date_1), "just now")
0073 
0074         iso_date_1 = ref_date + timedelta(seconds=59)
0075         self.assertEqual(Utils.pretty_date(ref_date.strftime(fmt), iso_date_1), "59 seconds ago")
0076 
0077         iso_date_1 = ref_date + timedelta(seconds=5 * 60)
0078         self.assertEqual(Utils.pretty_date(ref_date.strftime(fmt), iso_date_1), "5 minutes ago")
0079 
0080         iso_date_1 = ref_date + timedelta(seconds=60 * 60)
0081         self.assertEqual(Utils.pretty_date(ref_date.strftime(fmt), iso_date_1), "an hour ago")
0082 
0083         iso_date_1 = ref_date + timedelta(seconds=24 * 60 * 60)
0084         self.assertEqual(Utils.pretty_date(ref_date.strftime(fmt), iso_date_1), "Yesterday")
0085 
0086         iso_date_1 = ref_date + timedelta(seconds=14 * 24 * 60 * 60)
0087         self.assertEqual(Utils.pretty_date(ref_date.strftime(fmt), iso_date_1), "2 weeks ago")
0088 
0089     def test_timezone_awareness_of_pretty_date(self) -> None:
0090         ref_date = datetime(2020, 1, 1, tzinfo=timezone.utc)
0091         fmt = "%Y-%m-%dT%H:%M:%S.%fZ"
0092 
0093         iso_date_1 = ref_date + timedelta(seconds=9)
0094         self.assertEqual(Utils.pretty_date(ref_date.replace(tzinfo=None).strftime(fmt), iso_date_1), "just now")
0095 
0096     def test_pretty_time_delta(self) -> None:
0097         delta = timedelta(days=1, hours=12, minutes=10, seconds=20)
0098         tot_sec = int(delta.total_seconds())
0099         self.assertEqual(Utils.pretty_time_delta(tot_sec), "1d 12h 10m 20s")
0100 
0101         delta = timedelta(hours=23, minutes=57, seconds=0)
0102         tot_sec = int(delta.total_seconds())
0103         self.assertEqual(Utils.pretty_time_delta(tot_sec), "23h 57m 0s")
0104 
0105         delta = timedelta(minutes=2, seconds=59)
0106         tot_sec = int(delta.total_seconds())
0107         self.assertEqual(Utils.pretty_time_delta(tot_sec), "2m 59s")
0108 
0109         delta = timedelta(seconds=3)
0110         tot_sec = int(delta.total_seconds())
0111         self.assertEqual(Utils.pretty_time_delta(tot_sec), "3s")
0112 
0113         # Also test sign
0114         delta = timedelta(seconds=3)
0115         tot_sec = - int(delta.total_seconds())
0116         self.assertEqual(Utils.pretty_time_delta(tot_sec), "3s")
0117 
0118 
0119 class PipelineTest(unittest.TestCase):
0120 
0121     def test_enum_with_supported_status(self):
0122         self.assertEqual(PipelineStatus("waiting_for_resource"), PipelineStatus.WAITING)
0123         self.assertEqual(PipelineStatus("pending"), PipelineStatus.PENDING)
0124         self.assertEqual(PipelineStatus("running"), PipelineStatus.RUNNING)
0125         self.assertEqual(PipelineStatus("success"), PipelineStatus.SUCCESS)
0126         self.assertEqual(PipelineStatus("failed"), PipelineStatus.FAILED)
0127         self.assertEqual(PipelineStatus("canceled"), PipelineStatus.CANCELED)
0128         self.assertEqual(PipelineStatus("scheduled"), PipelineStatus.SCHEDULED)
0129 
0130     def test_color_formatting(self):
0131         self.assertEqual(PipelineStatus.SUCCESS.formatted, '\x1b[0;32msuccess\x1b[0m')
0132         self.assertEqual(PipelineStatus.FAILED.formatted, '\x1b[0;31mfailed\x1b[0m')
0133         self.assertEqual(PipelineStatus.RUNNING.formatted, '\x1b[0;34mrunning\x1b[0m')
0134         self.assertEqual(PipelineStatus.CANCELED.formatted, '\x1b[0;95mcanceled\x1b[0m')
0135         self.assertEqual(PipelineStatus.PENDING.formatted, '\x1b[0;34mpending\x1b[0m')
0136         self.assertEqual(PipelineStatus.WAITING.formatted, '\x1b[0;33mwaiting_for_resource\x1b[0m')
0137 
0138         # Make sure that status with no associated color are not changed
0139         self.assertEqual(PipelineStatus.SKIPPED.formatted, "skipped")
0140 
0141     def test_finished(self):
0142         self.assertFalse(PipelineStatus.WAITING.finished)
0143         self.assertFalse(PipelineStatus.PENDING.finished)
0144         self.assertFalse(PipelineStatus.RUNNING.finished)
0145         self.assertFalse(PipelineStatus.SCHEDULED.finished)
0146 
0147         self.assertTrue(PipelineStatus.SUCCESS.finished)
0148         self.assertTrue(PipelineStatus.FAILED.finished)
0149         self.assertTrue(PipelineStatus.CANCELED.finished)
0150         self.assertTrue(PipelineStatus.SKIPPED.finished)
0151 
0152 
0153 class TestTimeTracking(unittest.TestCase):
0154 
0155     def test_regex(self):
0156         self.assertTrue(is_valid_time_str("1mo2w4d10h2m"))
0157         self.assertTrue(is_valid_time_str("2w4d10h2m"))
0158         self.assertTrue(is_valid_time_str("4d10h2m"))
0159         self.assertTrue(is_valid_time_str("10h2m"))
0160         self.assertTrue(is_valid_time_str("2m"))
0161         self.assertTrue(is_valid_time_str("10m"))
0162         self.assertTrue(is_valid_time_str("12h"))
0163         self.assertTrue(is_valid_time_str("5d"))
0164         self.assertTrue(is_valid_time_str("10w"))
0165         self.assertTrue(is_valid_time_str("8m"))
0166 
0167         self.assertFalse(is_valid_time_str("w"))
0168         self.assertFalse(is_valid_time_str("mo"))
0169         self.assertFalse(is_valid_time_str("d"))
0170         self.assertFalse(is_valid_time_str("h"))
0171         self.assertFalse(is_valid_time_str("m"))
0172         self.assertFalse(is_valid_time_str("100"))
0173         self.assertFalse(is_valid_time_str("100p"))
0174         self.assertFalse(is_valid_time_str("100wof"))
0175         self.assertFalse(is_valid_time_str("bar1foo"))
0176 
0177 
0178 if __name__ == "__main__":
0179     unittest.main()