Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions framework/python/src/common/statuses.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@


class TestrunStatus:
"""Statuses for overall testing"""
IDLE = "Idle"
WAITING_FOR_DEVICE = "Waiting for Device"
MONITORING = "Monitoring"
Expand All @@ -27,6 +28,7 @@ class TestrunStatus:


class TestResult:
"""Statuses for test results"""
IN_PROGRESS = "In Progress"
COMPLIANT = "Compliant"
NON_COMPLIANT = "Non-Compliant"
Expand Down
26 changes: 15 additions & 11 deletions framework/python/src/common/testreport.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,12 +248,13 @@ def to_html(self):
module_reports = self._get_module_pages()
pages_num = self._pages_num(json_data)
total_pages = pages_num + len(module_reports) + 1
if len(steps_to_resolve) > 0:
total_pages += 1
if (len(optional_steps_to_resolve) > 0
is_pilot = json_data['device']['test_pack'] == 'Pilot Assessment'
if is_pilot and (len(optional_steps_to_resolve) > 0
and json_data['device']['test_pack'] == 'Pilot Assessment'
):
total_pages += len(optional_steps_to_resolve)
elif len(steps_to_resolve) > 0:
total_pages += len(steps_to_resolve)

return template.render(styles=styles,
logo=logo,
Expand All @@ -275,6 +276,7 @@ def to_html(self):
total_pages=total_pages,
tests_first_page=TESTS_FIRST_PAGE,
tests_per_page=TESTS_PER_PAGE,
is_pilot = is_pilot,
)

def _pages_num(self, json_data):
Expand Down Expand Up @@ -324,7 +326,8 @@ def _get_steps_to_resolve(self, json_data):
if 'recommendations' in test:
tests_with_recommendations.append(test)

return tests_with_recommendations
return self._split_steps_to_resolve_to_pages(
tests_with_recommendations, 4, 4)

def _get_optional_steps_to_resolve(self, json_data):
tests_with_recommendations = []
Expand All @@ -334,20 +337,21 @@ def _get_optional_steps_to_resolve(self, json_data):
if 'optional_recommendations' in test:
tests_with_recommendations.append(test)

return self._split_steps_to_resolve_to_pages(tests_with_recommendations)
return self._split_steps_to_resolve_to_pages(
tests_with_recommendations, 3, 4)

def _split_steps_to_resolve_to_pages(self, steps):
def _split_steps_to_resolve_to_pages(self, steps, start_page=4, page=4):
# Split steps to resolve to pages.
# First page 3 steps, 4 steps on other pages.
if len(steps) < 3:
# First <start_page> steps, <page> steps on other pages.
if len(steps) < start_page:
return [steps]

splitted = [steps[:3]]

index = 3
index = start_page
while index < len(steps):
splitted.append(steps[index:index + 4])
index += 4
splitted.append(steps[index:index + page])
index += page

return splitted

Expand Down
80 changes: 78 additions & 2 deletions resources/report/test_report_styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
font-family: 'Material Symbols Outlined';
font-style: normal;
font-weight: 400;
src: url(https://fonts.gstatic.com/icon/font?kit=kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHOejHdIa31RJq7xr9O779sC3DdMx&skey=b8dc2088854b122f&v=v222) format('woff2');
}

/* Define some common body formatting*/
body {
font-family: 'Google Sans', sans-serif;
Expand Down Expand Up @@ -415,6 +422,10 @@
border-top: 0;
}

.result-line-result-non-compliant-required {
background: #FCE8E6;
}

.result-list-header-label {
position: absolute;
font-size: 12px;
Expand Down Expand Up @@ -467,7 +478,7 @@
margin-top: 8px;
padding: 4px 4px 7px 5px;
border-radius: 2px;
left: 6.85in;
left: 5.4in;
}

.result-test-result-compliant {
Expand All @@ -480,6 +491,71 @@
color: #393939;
}

.material-symbols-outlined {
font-family: 'Material Symbols Outlined';
font-weight: normal;
font-style: normal;
line-height: 1;
letter-spacing: normal;
text-transform: none;
white-space: nowrap;
word-wrap: normal;
direction: ltr;
text-align: center;
font-size: 12px;
display: inline-flex;
width: 14px;
height: 14px;
line-height: 14px;
flex-direction: column;
justify-content: center;
align-items: center;
flex-shrink: 0;
border-radius: 100%;
-webkit-font-feature-settings: 'liga';
-webkit-font-smoothing: antialiased;
vertical-align: bottom;
}

.result-test-required-result {
display: flex;
align-items: center;
overflow: visible;
}

.result-test-required-result-text {
line-height: 14px;
flex: 0 0 120px;
padding-left: 8px;
}

.result-test-required-result-informational{
color: #0D652D;
}

.result-test-required-result-informational .material-symbols-outlined {
background: #0D652D;
color: #ffffff;
}

.result-test-required-result-required {
color: #000000;
}

.result-test-required-result-required .material-symbols-outlined {
background: #000000;
color: #ffffff;
}

.result-test-required-result-required-if-applicable {
color: #174EA6;
}

.result-test-required-result-required-if-applicable .material-symbols-outlined {
background: #174EA6;
color: #ffffff;
}

/* CSS for the footer */
.footer {
position: absolute;
Expand Down Expand Up @@ -639,4 +715,4 @@
width: 8.5in;
height: 11in;
}
}
}
75 changes: 54 additions & 21 deletions resources/report/test_report_template.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

<body>
{% set page_index = namespace(value=0) %}
{% set step_index = namespace(value=0) %}
{% set opt_step_index = namespace(value=0) %}
{# Test Results #}
{% for page in range(pages_num) %}
Expand Down Expand Up @@ -56,7 +57,7 @@ <h4>Device Configuration</h4>
{% endif %}
<div class="summary-box-label">Test Status</div>
<div class="summary-box-value">Complete</div>
{% if json_data['device']['test_pack'] == 'Pilot Assessment' %}
{% if is_pilot %}
<div class="summary-box-label">Pilot Recommendation</div>
{% else %}
<div class="summary-box-label">Test Result</div>
Expand Down Expand Up @@ -84,27 +85,54 @@ <h4>Device Configuration</h4>
<h4 class="result-list-title">Results List <small>({{ successful_tests }}/{{ total_tests }})</small></h4>
<div class="result-line" style="margin-top: 10px;border-top-left-radius:4px;border-top-right-radius:4px;">
<div class="result-list-header-label" style="left: .1in">Name</div>
<div class="result-list-header-label" style="left: 2.8in">Description</div>
<div class="result-list-header-label" style="left: 6.85in">Result</div>
<div class="result-list-header-label" style="left: 2.1in">Description</div>
<div class="result-list-header-label" style="left: 5.4in">Result</div>
<div class="result-list-header-label" style="left: 7in">Required result</div>
</div>
{% for i in range(results_from, results_to) %}
{% if test_results[i]['result'] == 'Non-Compliant' and test_results[i]['required_result'] == "Required" %}
<div class="result-line result-line-result result-line-result-non-compliant-required">
{% else %}
<div class="result-line result-line-result">
{% endif %}
<div class="result-test-label" style="left: .1in;">{{ test_results[i]['name'] }}</div>
<div class="result-test-label result-test-description" style="left: 2.8in;">{{ test_results[i]['description'] }}</div>
<div class="result-test-label result-test-description" style="left: 2.1in">{{ test_results[i]['description'] }}</div>
<div class="result-test-label result-test-result
{% if test_results[i]['result'] == 'Non-Compliant' %}
<div class="result-test-label result-test-result result-test-result-non-compliant">
result-test-result-non-compliant">
{% elif test_results[i]['result'] == 'Compliant' %}
<div class="result-test-label result-test-result result-test-result-compliant">
result-test-result-compliant">
{% elif test_results[i]['result'] == 'Error' %}
<div class="result-test-label result-test-result result-test-result-error">
result-test-result-error">
{% elif test_results[i]['result'] == 'Feature Not Detected' %}
<div class="result-test-label result-test-result result-test-result-feature-not-detected">
result-test-result-feature-not-detected">
{% elif test_results[i]['result'] == 'Informational' %}
<div class="result-test-label result-test-result result-test-result-informational">
result-test-result-informational">
{% else %}
<div class="result-test-label result-test-result result-test-result-skipped">
result-test-result-skipped">
{% endif %}
{{ test_results[i]['result'] }}</div>
{# Required resul badges #}
{% if test_results[i]['required_result'] == "Required" %}
<div class="result-test-label result-test-required-result result-test-required-result-required" style="left: 7in;">
<span class="material-symbols-outlined">asterisk</span>
<span class="result-test-required-result-text">{{ test_results[i]['required_result'] }}</span>
</div>
{% elif test_results[i]['required_result'] == "Required if Applicable" %}
<div class="result-test-label result-test-required-result result-test-required-result-required-if-applicable" style="left: 7in;">
<span class="material-symbols-outlined">asterisk</span>
<span class="result-test-required-result-text">{{ test_results[i]['required_result'] }}</span>
</div>
{% elif test_results[i]['required_result'] == "Informational" %}
<div class="result-test-label result-test-required-result result-test-required-result-informational" style="left: 7in;">
<span class="material-symbols-outlined">info_i</span>
<span class="result-test-required-result-text">{{ test_results[i]['required_result'] }}</span>
</div>
{% else %}
<div class="result-test-label result-test-required-result" style="left: 7in;">
<span class="result-test-required-result-text">{{ test_results[i]['required_result'] }}</span>
</div>
{% endif %}
</div>
{% endfor %}
</div>
Expand All @@ -116,25 +144,29 @@ <h4 class="result-list-title">Results List <small>({{ successful_tests }}/{{ tot
<div style="break-after:page"></div>
{% endfor %}
{# Steps to resolve Device qualification #}
{% if steps_to_resolve|length > 0 and json_data['device']['test_pack'] == 'Device Qualification' %}
{% set page_index.value = page_index.value+1 %}
{% if steps_to_resolve|length > 0 and not is_pilot %}
{% for step in steps_to_resolve%}
{% set page_index.value = page_index.value + 1 %}
<div class="page">
{{ header_macros.header(False, "Testrun report", json_data, device, logo, icon_qualification, icon_pilot)}}
<h2 class="page-heading">Non-compliant tests and suggested steps to resolve</h2>
{% for step in steps_to_resolve %}
{% if loop.first %}
<h2 class="page-heading">Non-compliant tests and suggested steps to resolve</h2>
{% endif %}
{% for line in step %}
{% set step_index.value = step_index.value + 1 %}
<div class="steps-to-resolve">
<div class="steps-to-resolve-row">
<span class="steps-to-resolve-index">{{ loop.index }}.</span>
<span class="steps-to-resolve-index">{{ step_index.value }}.</span>
<div class="steps-to-resolve-test-name">
<span class="steps-to-resolve subtitle">Name</span><br>{{ step['name'] }}
<span class="steps-to-resolve subtitle">Name</span><br>{{ line['name'] }}
</div>
<div class="steps-to-resolve-description">
<span class="steps-to-resolve subtitle">Description</span><br>{{ step["description"] }}
<span class="steps-to-resolve subtitle">Description</span><br>{{ line["description"] }}
</div>
</div>
<div class="steps-to-resolve-row content">
<span class="steps-to-resolve subtitle">Steps to resolve</span>
{% for recommedtation in step['recommendations'] %}
{% for recommedtation in line['recommendations'] %}
<br><span style="font-size: 14px">{{ loop.index }}. {{ recommedtation }}</span>
{% endfor %}
</div>
Expand All @@ -145,11 +177,12 @@ <h2 class="page-heading">Non-compliant tests and suggested steps to resolve</h2>
<div class="footer-label" style="right: 0px">Page {{ page_index.value }}/{{ total_pages }}</div>
</div>
</div><div style="break-after:page"></div>
{% endfor %}
{% endif %}
{# Pilot steps to resolve#}
{% if json_data['device']['test_pack'] == 'Pilot Assessment' and optional_steps_to_resolve|length > 0 %}
{% for step in optional_steps_to_resolve%}
{% set page_index.value = page_index.value + 1 %}
{% if is_pilot and optional_steps_to_resolve|length > 0 %}
{% for step in optional_steps_to_resolve%}
{% set page_index.value = page_index.value + 1 %}
<div class="page">
{{ header_macros.header(False, "Testrun report", json_data, device, logo, icon_qualification, icon_pilot)}}
{% if loop.first %}
Expand Down
Loading
Loading