File indexing completed on 2024-04-28 17:00:02
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()