From 746d4b057da464e87d5b2ddf30c659faceac6fca Mon Sep 17 00:00:00 2001
From: Johannes Ernst <git@j12t.org>
Date: Fri, 18 Oct 2024 16:59:09 -0700
Subject: [PATCH 1/7] Simplify TestRun id

---
 src/feditest/testrun.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/feditest/testrun.py b/src/feditest/testrun.py
index 2730c82..5d83307 100644
--- a/src/feditest/testrun.py
+++ b/src/feditest/testrun.py
@@ -407,7 +407,7 @@ class TestRun(HasStartEndResults):
     def __init__(self, plan: TestPlan, record_who: bool = False):
         super().__init__()
         self.plan = plan
-        self.id : str = 'feditest-run-' + datetime.now(timezone.utc).strftime("%Y-%m-%dT%H-%M-%S.%fZ")
+        self.id : str = 'feditest-run-' + datetime.now(timezone.utc).strftime("%Y%m%d-%H%M%S")
         self.platform : str = platform.platform()
         self.run_sessions : list[TestRunSession] = []
         self.username : str | None = None

From 04bf5f4833f81940629caa1b9cde547cb4a65161 Mon Sep 17 00:00:00 2001
From: Johannes Ernst <git@j12t.org>
Date: Fri, 18 Oct 2024 16:59:29 -0700
Subject: [PATCH 2/7] Generated TestPlanSession ignores --name argument

---
 src/feditest/cli/utils.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/feditest/cli/utils.py b/src/feditest/cli/utils.py
index b25360f..a0093c4 100644
--- a/src/feditest/cli/utils.py
+++ b/src/feditest/cli/utils.py
@@ -110,7 +110,7 @@ def create_session_template_from_tests(args: Namespace) -> TestPlanSession:
     for constellation_role_name in constellation_role_names:
         constellation_roles[constellation_role_name] = None
 
-    session = TestPlanSession(TestPlanConstellation(constellation_roles), test_plan_specs)
+    session = TestPlanSession(TestPlanConstellation(constellation_roles), test_plan_specs, args.name)
     return session
 
 

From e29ff2a8f754d368152fa86b21abe7f53a07dffe Mon Sep 17 00:00:00 2001
From: Johannes Ernst <git@j12t.org>
Date: Fri, 18 Oct 2024 17:01:01 -0700
Subject: [PATCH 3/7] CSS and other small HTML report improvements Add duration
 to test steps in report

---
 .../templates/default/partials/test_matrix/title.jinja2  | 2 +-
 .../default/partials/test_session/results.jinja2         | 9 ++++-----
 .../default/partials/test_session/testresult.jinja2      | 6 ++++--
 .../templates/default/partials/test_session/title.jinja2 | 4 ++--
 src/feditest/templates/default/static/feditest.css       | 9 ++-------
 5 files changed, 13 insertions(+), 17 deletions(-)

diff --git a/src/feditest/templates/default/partials/test_matrix/title.jinja2 b/src/feditest/templates/default/partials/test_matrix/title.jinja2
index f7a3be0..2386cb7 100644
--- a/src/feditest/templates/default/partials/test_matrix/title.jinja2
+++ b/src/feditest/templates/default/partials/test_matrix/title.jinja2
@@ -1,4 +1,4 @@
 <header class="feditest title">
-  <h1><span class="prefix"><a href="https://feditest.org/">Feditest</a> Report:</span> {{ run.plan.name }}</h1>
+  <h1><span class="prefix"><a href="https://feditest.org/">Feditest</a> Summary Report:</span> {{ run.plan.name }}</h1>
   <p class="id">{{ run.id }}</p>
 </header>
diff --git a/src/feditest/templates/default/partials/test_session/results.jinja2 b/src/feditest/templates/default/partials/test_session/results.jinja2
index 8f022e6..1e365be 100644
--- a/src/feditest/templates/default/partials/test_session/results.jinja2
+++ b/src/feditest/templates/default/partials/test_session/results.jinja2
@@ -7,7 +7,7 @@
 {%          if role_name in run_session.constellation.nodes %}
 {%-             set session_node = run_session.constellation.nodes[role_name] %}
         <div class="role">
-            <div class="name">{{ role_name }}</div>
+            <h3 class="name">{{ role_name }}</h3>
             <div class="driver">{{ local_name_with_tooltip(node.nodedriver) }}</div>
             <div class="app">{{ session_node.appdata['app'] }}</div>
             <div class="appversion">{{ session_node.appdata['app_version'] or '?'}}</div>
@@ -45,8 +45,8 @@
 {%-         if test_meta.description %}
             <div class="description">{{ test_meta.description}}</div>
 {%-         endif %}
-            <p class="when">Started {{ format_timestamp(run_test.started) }}, ended {{ format_timestamp(run_test.ended) }}</p>
-{%-         with result=run_test.worst_result %}
+            <p class="when">Started {{ format_timestamp(run_test.started) }}, ended {{ format_timestamp(run_test.ended) }} (duration: {{ format_duration(run_test.ended - run_test.started) }})</p>
+            {%-         with result=run_test.worst_result %}
 {%-             include "partials/test_session/testresult.jinja2" %}
 {%-         endwith %}
 {%-         for test_step_index, run_step in enumerate(run_test.run_steps or []) %}
@@ -56,8 +56,7 @@
 {%-             if test_step_meta.description %}
                 <div class="description">{{ test_step_meta.description}}</div>
 {%-             endif %}
-                <p class="when">Started {{ format_timestamp(run_step.started) }}, ended {{ format_timestamp(run_step.ended) }}</p>
-
+                <p class="when">Started {{ format_timestamp(run_test.started) }}, ended {{ format_timestamp(run_test.ended) }} (duration: {{ format_duration(run_test.ended - run_test.started) }})</p>
 {%-             with result=run_step.result, idmod='step' %}
 {%-                 include "partials/test_session/testresult.jinja2" %}
 {%-             endwith %}
diff --git a/src/feditest/templates/default/partials/test_session/testresult.jinja2 b/src/feditest/templates/default/partials/test_session/testresult.jinja2
index 87f2aa0..0272b5e 100644
--- a/src/feditest/templates/default/partials/test_session/testresult.jinja2
+++ b/src/feditest/templates/default/partials/test_session/testresult.jinja2
@@ -2,8 +2,10 @@
 <div class="status {{ result.css_classes() }} moreinfo">
 	<label for="details-{{ result.id() }}{{ idmod }}">{{ result.short_title() }}</label>
     <input id="details-{{ result.id() }}{{ idmod }}" type="checkbox">
-    <pre class="stacktrace">{{ result }}</pre>
+    <pre class="stacktrace">{{ html_escape(result) }}</pre>
 </div>
 {%- else %}
-<div class="status passed">Passed</div>
+<div class="status passed">
+    <div>Passed</div>
+</div>
 {%- endif %}
diff --git a/src/feditest/templates/default/partials/test_session/title.jinja2 b/src/feditest/templates/default/partials/test_session/title.jinja2
index 79c566b..660fa26 100644
--- a/src/feditest/templates/default/partials/test_session/title.jinja2
+++ b/src/feditest/templates/default/partials/test_session/title.jinja2
@@ -1,5 +1,5 @@
 {% set plan_session = run.plan.sessions[run_session.plan_session_index] %}
 <header class="feditest title" style="text-align: center">
-  <h1><span class="prefix"><a href="https://feditest.org/">Feditest</a>:</span> {{ plan_session.name }}</h1>
-  <p class="id">{{ run.id }} [<a href="{{ matrix_file_path }}">Test Matrix</a>] </p>
+  <h1><span class="prefix"><a href="https://feditest.org/">Feditest</a> Sess Report:</span> {{ plan_session.name }}</h1>
+  <p class="id">{{ run.id }} [<a href="{{ matrix_file_path }}">Summary</a>] </p>
 </header>
\ No newline at end of file
diff --git a/src/feditest/templates/default/static/feditest.css b/src/feditest/templates/default/static/feditest.css
index 213e4c4..ec24139 100644
--- a/src/feditest/templates/default/static/feditest.css
+++ b/src/feditest/templates/default/static/feditest.css
@@ -63,7 +63,7 @@ footer {
     font-size: smaller;
 }
 
-div.feditest.title {
+div.title {
     text-align: center;
 }
 div.feditest span.prefix,
@@ -131,11 +131,7 @@ div.feditest.session > h3::before {
     border-color: var(--pico-table-border-color);
 }
 
-.feditest div.role > div.name {
-    font-weight: bold;
-}
-
-.feditest div.role > div.name::before {
+.feditest div.role > h3.name::before {
     content: "Role: ";
 }
 
@@ -422,7 +418,6 @@ nav.matrix {
 
 nav.matrix ul {
     display: block;
-    font-size: 1.4rem;
 }
 
 div.feditest.mobile {

From 35b393e933bc7b1dbec08fd4a241f5cca7671a04 Mon Sep 17 00:00:00 2001
From: Johannes Ernst <git@j12t.org>
Date: Fri, 18 Oct 2024 17:01:28 -0700
Subject: [PATCH 4/7] Make emitted timestamps consistent

---
 src/feditest/testruntranscript.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/feditest/testruntranscript.py b/src/feditest/testruntranscript.py
index 6046c11..2f9fc2f 100644
--- a/src/feditest/testruntranscript.py
+++ b/src/feditest/testruntranscript.py
@@ -560,7 +560,7 @@ def session_file_path(plan_session):
                 r"(\.|::)", r"<wbr>\1", s
             ),
             local_name_with_tooltip=lambda n: f'<span title="{ n }">{ n.split(".")[-1] }</span>',
-            format_timestamp=lambda ts: ts.isoformat() if ts else "",
+            format_timestamp=lambda ts: ts.strftime("%Y:%m:%d-%H:%M:%S.%fZ") if ts else "",
             format_duration=lambda s: str(s), # makes it easier to change in the future
             len=len
         )

From 29c6a7310bbacd54ae884e2037d9f33e9ece0644 Mon Sep 17 00:00:00 2001
From: Johannes Ernst <git@j12t.org>
Date: Fri, 18 Oct 2024 17:03:09 -0700
Subject: [PATCH 5/7] HTML escape payload from error messages. Closes #392

---
 src/feditest/testruntranscript.py | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/feditest/testruntranscript.py b/src/feditest/testruntranscript.py
index 2f9fc2f..0699495 100644
--- a/src/feditest/testruntranscript.py
+++ b/src/feditest/testruntranscript.py
@@ -9,6 +9,7 @@
 import traceback
 from abc import ABC, abstractmethod
 from datetime import datetime
+import html
 from typing import IO, Iterator, Optional
 
 import jinja2
@@ -562,7 +563,8 @@ def session_file_path(plan_session):
             local_name_with_tooltip=lambda n: f'<span title="{ n }">{ n.split(".")[-1] }</span>',
             format_timestamp=lambda ts: ts.strftime("%Y:%m:%d-%H:%M:%S.%fZ") if ts else "",
             format_duration=lambda s: str(s), # makes it easier to change in the future
-            len=len
+            len=len,
+            html_escape=lambda s: html.escape(str(s))
         )
 
         try:

From 0219b0733fdfc605539b67f74b84814173986adc Mon Sep 17 00:00:00 2001
From: Johannes Ernst <git@j12t.org>
Date: Fri, 18 Oct 2024 17:03:30 -0700
Subject: [PATCH 6/7] Fix NullPointerExceptions

---
 src/feditest/nodedrivers/mastodon/__init__.py | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/feditest/nodedrivers/mastodon/__init__.py b/src/feditest/nodedrivers/mastodon/__init__.py
index f049fc8..734452d 100644
--- a/src/feditest/nodedrivers/mastodon/__init__.py
+++ b/src/feditest/nodedrivers/mastodon/__init__.py
@@ -354,7 +354,7 @@ def actor_has_received_object(self,  object_uri: str) -> dict[str, Any]:
         response = find_first_in_array(elements, lambda s: s['uri'] == object_uri)
         if not response:
             #   Home timeline second case: an announce/boost was created by an account we follow -- need to look for the original URI
-            if reblog_response := find_first_in_array(elements, lambda s: 'reblog' in s and s['reblog']['uri'] == object_uri) :
+            if reblog_response := find_first_in_array(elements, lambda s: 'reblog' in s and s['reblog'] and 'uri' in s['reblog'] and s['reblog']['uri'] == object_uri) :
                 response = reblog_response['reblog']
         if not response:
             # Check for it in notifications: mentions arrive here
@@ -458,7 +458,7 @@ def _find_account_dict_by_other_actor_acct_uri(self, other_actor_acct_uri: str)
         raise ValueError(f'Unexpected type: { ret }')
 
 
-    def _find_note_dict_by_uri(self, uri: str) -> dict[str,Any]:
+    def _find_note_dict_by_uri(self, uri: str) -> dict[str,Any] | None:
         """
         Find a the dict for a status, or None.
         """
@@ -470,6 +470,8 @@ def _find_note_dict_by_uri(self, uri: str) -> dict[str,Any]:
         results = self.http_get('/api/v2/search?' + urlencode(args))
 
         ret = find_first_in_array(results.get('statuses'), lambda b: b['uri'] == uri)
+        if ret is None:
+            return None
         if isinstance(ret, dict):
             return cast(dict[str,Any], ret)
         raise ValueError(f'Unexpected type: { ret }')

From da0226694fef31036db2c015b9714aa2756e4402 Mon Sep 17 00:00:00 2001
From: Johannes Ernst <git@j12t.org>
Date: Fri, 18 Oct 2024 17:16:50 -0700
Subject: [PATCH 7/7] Typo

---
 .../templates/default/partials/test_session/title.jinja2        | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/feditest/templates/default/partials/test_session/title.jinja2 b/src/feditest/templates/default/partials/test_session/title.jinja2
index 660fa26..47f233e 100644
--- a/src/feditest/templates/default/partials/test_session/title.jinja2
+++ b/src/feditest/templates/default/partials/test_session/title.jinja2
@@ -1,5 +1,5 @@
 {% set plan_session = run.plan.sessions[run_session.plan_session_index] %}
 <header class="feditest title" style="text-align: center">
-  <h1><span class="prefix"><a href="https://feditest.org/">Feditest</a> Sess Report:</span> {{ plan_session.name }}</h1>
+  <h1><span class="prefix"><a href="https://feditest.org/">Feditest</a> Session Report:</span> {{ plan_session.name }}</h1>
   <p class="id">{{ run.id }} [<a href="{{ matrix_file_path }}">Summary</a>] </p>
 </header>
\ No newline at end of file