Merge "[CompareSuitesResults] Added optgroup for select input"
diff --git a/testrail_bot/control/celery_tasks/test_rail_api.py b/testrail_bot/control/celery_tasks/test_rail_api.py
index d77b511..c359dbe 100644
--- a/testrail_bot/control/celery_tasks/test_rail_api.py
+++ b/testrail_bot/control/celery_tasks/test_rail_api.py
@@ -1,6 +1,7 @@
 from testrail_api import TestRailAPI, StatusCodeError
 from requests.exceptions import ReadTimeout
 from django.conf import settings
+from django.utils.html import escape
 from typing import Optional, List, Iterator
 
 from functools import lru_cache
@@ -55,6 +56,11 @@
     return api.runs.get_run(run_id)
 
 
+@lru_cache
+def get_run_name(run_id: int) -> str:
+    return get_run_by_id(run_id)["name"]
+
+
 def get_plan_by_id(plan_id: int) -> dict:
     return api.plans.get_plan(plan_id)
 
@@ -147,3 +153,8 @@
     except StatusCodeError as e:
         print(f"{e=}")
         return False
+
+
+def html_link(type: str, id: int, title: str) -> str:
+    return f"<a href='https://mirantis.testrail.com/index.php?/{type}s/view/" \
+           f"{id}'>{escape(title)}</a>"
diff --git a/testrail_bot/control/celery_tasks/testrail_pipeline.py b/testrail_bot/control/celery_tasks/testrail_pipeline.py
index f1e4bf0..091e086 100644
--- a/testrail_bot/control/celery_tasks/testrail_pipeline.py
+++ b/testrail_bot/control/celery_tasks/testrail_pipeline.py
@@ -233,8 +233,7 @@
         if str(run_id) == str(old_run_id):
             continue
         per = round(100.0 * ratio, 2)
-        run_link = f"<a href=https://mirantis.testrail.com/index.php?/runs/" \
-                   f"view/{old_run_id}>{old_run_id} </a>"
+        run_link = test_rail_api.html_link('run', old_run_id, old_run_id)
         if type(sim_result) is not dict:
             f.write(f"Similarity not found due to similarity: {per}, "
                     f"in run {run_link}\n")
@@ -243,9 +242,9 @@
 
         prod_link = "<a href=https://mirantis.jira.com/browse/{defect}>" \
                     "{defect}</a>".format(defect=sim_result["defects"])
-        test_link = "<a href=https://mirantis.testrail.com/index.php?/tests/" \
-                    "view/{test_id}>{test_id}</a>".format(
-            test_id=sim_result["test_id"])
+        test_link = test_rail_api.html_link('test',
+                                            sim_result["test_id"],
+                                            str(sim_result["test_id"]))
         status_id = int(sim_result['status_id'])
         if status_id in [StatusEnum.retest, StatusEnum.failed,
                          StatusEnum.blocked]:
@@ -304,11 +303,12 @@
     """
     case_id = test["case_id"]
     run_id = test["run_id"]
+    run_name = test_rail_api.get_run_name(run_id)
+    test_link = test_rail_api.html_link('test', test['id'], test["title"])
+    run_link = test_rail_api.html_link('run', run_id, run_name)
 
-    f.write("<br><b>Proceeding test {title}<br>with id <a "
-            "href=https://mirantis.testrail.com/"
-            "index.php?/tests/view/{id}>[{id}]"
-            "</a></b>\n".format(id=test['id'], title=test["title"]))
+    f.write(f"<br><b>Proceeding test {test_link} <br>"
+            f"in {run_link} run</b>\n")
     f.flush()
 
     last_comment = get_last_comment(case_id, run_id, text_filters)
@@ -318,11 +318,9 @@
     if found:
         return
     else:
-        f.write("<b style='color:red;'>Automatic test processing failed. "
+        f.write(f"<b style='color:red;'>Automatic test processing failed. "
                 "Please process test manually "
-                "<a href=https://mirantis.testrail.com/"
-                "index.php?/tests/view/{test_id}>{test_id}"
-                "</a></b>\n\n".format(test_id=test["id"]))
+                f"{test_link}</b>\n\n")
         f.flush()
 
 
@@ -349,12 +347,8 @@
         else:
             test_run = test_rail_api.get_run_by_id(bot_test_run.run_id)
             run_type = "run"
-        f.write("Start processing {run_type} <a "
-                "href=https://mirantis.testrail.com/"
-                "index.php?/{run_type}s/view/{id}>{name}"
-                "</a>\n".format(run_type=run_type,
-                                id=test_run['id'],
-                                name=test_run['name']))
+        link = test_rail_api.html_link(run_type, test_run['id'], test_run['name'])
+        f.write(f"Start processing {run_type} {link}\n")
         f.flush()
 
         project_id = get_project_id(f, bot_test_run, report)