1091 lines
168 KiB
HTML
1091 lines
168 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8"/>
|
|
<title id="head-title">e2e_report.html</title>
|
|
<style type="text/css">body {
|
|
font-family: Helvetica, Arial, sans-serif;
|
|
font-size: 12px;
|
|
/* do not increase min-width as some may use split screens */
|
|
min-width: 800px;
|
|
color: #999;
|
|
}
|
|
|
|
h1 {
|
|
font-size: 24px;
|
|
color: black;
|
|
}
|
|
|
|
h2 {
|
|
font-size: 16px;
|
|
color: black;
|
|
}
|
|
|
|
p {
|
|
color: black;
|
|
}
|
|
|
|
a {
|
|
color: #999;
|
|
}
|
|
|
|
table {
|
|
border-collapse: collapse;
|
|
}
|
|
|
|
/******************************
|
|
* SUMMARY INFORMATION
|
|
******************************/
|
|
#environment td {
|
|
padding: 5px;
|
|
border: 1px solid #e6e6e6;
|
|
vertical-align: top;
|
|
}
|
|
#environment tr:nth-child(odd) {
|
|
background-color: #f6f6f6;
|
|
}
|
|
#environment ul {
|
|
margin: 0;
|
|
padding: 0 20px;
|
|
}
|
|
|
|
/******************************
|
|
* TEST RESULT COLORS
|
|
******************************/
|
|
span.passed,
|
|
.passed .col-result {
|
|
color: green;
|
|
}
|
|
|
|
span.skipped,
|
|
span.xfailed,
|
|
span.rerun,
|
|
.skipped .col-result,
|
|
.xfailed .col-result,
|
|
.rerun .col-result {
|
|
color: orange;
|
|
}
|
|
|
|
span.error,
|
|
span.failed,
|
|
span.xpassed,
|
|
.error .col-result,
|
|
.failed .col-result,
|
|
.xpassed .col-result {
|
|
color: red;
|
|
}
|
|
|
|
.col-links__extra {
|
|
margin-right: 3px;
|
|
}
|
|
|
|
/******************************
|
|
* RESULTS TABLE
|
|
*
|
|
* 1. Table Layout
|
|
* 2. Extra
|
|
* 3. Sorting items
|
|
*
|
|
******************************/
|
|
/*------------------
|
|
* 1. Table Layout
|
|
*------------------*/
|
|
#results-table {
|
|
border: 1px solid #e6e6e6;
|
|
color: #999;
|
|
font-size: 12px;
|
|
width: 100%;
|
|
}
|
|
#results-table th,
|
|
#results-table td {
|
|
padding: 5px;
|
|
border: 1px solid #e6e6e6;
|
|
text-align: left;
|
|
}
|
|
#results-table th {
|
|
font-weight: bold;
|
|
}
|
|
|
|
/*------------------
|
|
* 2. Extra
|
|
*------------------*/
|
|
.logwrapper {
|
|
max-height: 230px;
|
|
overflow-y: scroll;
|
|
background-color: #e6e6e6;
|
|
}
|
|
.logwrapper.expanded {
|
|
max-height: none;
|
|
}
|
|
.logwrapper.expanded .logexpander:after {
|
|
content: "collapse [-]";
|
|
}
|
|
.logwrapper .logexpander {
|
|
z-index: 1;
|
|
position: sticky;
|
|
top: 10px;
|
|
width: max-content;
|
|
border: 1px solid;
|
|
border-radius: 3px;
|
|
padding: 5px 7px;
|
|
margin: 10px 0 10px calc(100% - 80px);
|
|
cursor: pointer;
|
|
background-color: #e6e6e6;
|
|
}
|
|
.logwrapper .logexpander:after {
|
|
content: "expand [+]";
|
|
}
|
|
.logwrapper .logexpander:hover {
|
|
color: #000;
|
|
border-color: #000;
|
|
}
|
|
.logwrapper .log {
|
|
min-height: 40px;
|
|
position: relative;
|
|
top: -50px;
|
|
height: calc(100% + 50px);
|
|
border: 1px solid #e6e6e6;
|
|
color: black;
|
|
display: block;
|
|
font-family: "Courier New", Courier, monospace;
|
|
padding: 5px;
|
|
padding-right: 80px;
|
|
white-space: pre-wrap;
|
|
}
|
|
|
|
div.media {
|
|
border: 1px solid #e6e6e6;
|
|
float: right;
|
|
height: 240px;
|
|
margin: 0 5px;
|
|
overflow: hidden;
|
|
width: 320px;
|
|
}
|
|
|
|
.media-container {
|
|
display: grid;
|
|
grid-template-columns: 25px auto 25px;
|
|
align-items: center;
|
|
flex: 1 1;
|
|
overflow: hidden;
|
|
height: 200px;
|
|
}
|
|
|
|
.media-container--fullscreen {
|
|
grid-template-columns: 0px auto 0px;
|
|
}
|
|
|
|
.media-container__nav--right,
|
|
.media-container__nav--left {
|
|
text-align: center;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.media-container__viewport {
|
|
cursor: pointer;
|
|
text-align: center;
|
|
height: inherit;
|
|
}
|
|
.media-container__viewport img,
|
|
.media-container__viewport video {
|
|
object-fit: cover;
|
|
width: 100%;
|
|
max-height: 100%;
|
|
}
|
|
|
|
.media__name,
|
|
.media__counter {
|
|
display: flex;
|
|
flex-direction: row;
|
|
justify-content: space-around;
|
|
flex: 0 0 25px;
|
|
align-items: center;
|
|
}
|
|
|
|
.collapsible td:not(.col-links) {
|
|
cursor: pointer;
|
|
}
|
|
.collapsible td:not(.col-links):hover::after {
|
|
color: #bbb;
|
|
font-style: italic;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.col-result {
|
|
width: 130px;
|
|
}
|
|
.col-result:hover::after {
|
|
content: " (hide details)";
|
|
}
|
|
|
|
.col-result.collapsed:hover::after {
|
|
content: " (show details)";
|
|
}
|
|
|
|
#environment-header h2:hover::after {
|
|
content: " (hide details)";
|
|
color: #bbb;
|
|
font-style: italic;
|
|
cursor: pointer;
|
|
font-size: 12px;
|
|
}
|
|
|
|
#environment-header.collapsed h2:hover::after {
|
|
content: " (show details)";
|
|
color: #bbb;
|
|
font-style: italic;
|
|
cursor: pointer;
|
|
font-size: 12px;
|
|
}
|
|
|
|
/*------------------
|
|
* 3. Sorting items
|
|
*------------------*/
|
|
.sortable {
|
|
cursor: pointer;
|
|
}
|
|
.sortable.desc:after {
|
|
content: " ";
|
|
position: relative;
|
|
left: 5px;
|
|
bottom: -12.5px;
|
|
border: 10px solid #4caf50;
|
|
border-bottom: 0;
|
|
border-left-color: transparent;
|
|
border-right-color: transparent;
|
|
}
|
|
.sortable.asc:after {
|
|
content: " ";
|
|
position: relative;
|
|
left: 5px;
|
|
bottom: 12.5px;
|
|
border: 10px solid #4caf50;
|
|
border-top: 0;
|
|
border-left-color: transparent;
|
|
border-right-color: transparent;
|
|
}
|
|
|
|
.hidden, .summary__reload__button.hidden {
|
|
display: none;
|
|
}
|
|
|
|
.summary__data {
|
|
flex: 0 0 550px;
|
|
}
|
|
.summary__reload {
|
|
flex: 1 1;
|
|
display: flex;
|
|
justify-content: center;
|
|
}
|
|
.summary__reload__button {
|
|
flex: 0 0 300px;
|
|
display: flex;
|
|
color: white;
|
|
font-weight: bold;
|
|
background-color: #4caf50;
|
|
text-align: center;
|
|
justify-content: center;
|
|
align-items: center;
|
|
border-radius: 3px;
|
|
cursor: pointer;
|
|
}
|
|
.summary__reload__button:hover {
|
|
background-color: #46a049;
|
|
}
|
|
.summary__spacer {
|
|
flex: 0 0 550px;
|
|
}
|
|
|
|
.controls {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
}
|
|
|
|
.filters,
|
|
.collapse {
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
.filters button,
|
|
.collapse button {
|
|
color: #999;
|
|
border: none;
|
|
background: none;
|
|
cursor: pointer;
|
|
text-decoration: underline;
|
|
}
|
|
.filters button:hover,
|
|
.collapse button:hover {
|
|
color: #ccc;
|
|
}
|
|
|
|
.filter__label {
|
|
margin-right: 10px;
|
|
}
|
|
|
|
</style>
|
|
|
|
</head>
|
|
<body>
|
|
<h1 id="title">e2e_report.html</h1>
|
|
<p>Report generated on 12-Mar-2026 at 08:33:03 by <a href="https://pypi.python.org/pypi/pytest-html">pytest-html</a>
|
|
v4.1.1</p>
|
|
<div id="environment-header">
|
|
<h2>Environment</h2>
|
|
</div>
|
|
<table id="environment"></table>
|
|
<!-- TEMPLATES -->
|
|
<template id="template_environment_row">
|
|
<tr>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</template>
|
|
<template id="template_results-table__body--empty">
|
|
<tbody class="results-table-row">
|
|
<tr id="not-found-message">
|
|
<td colspan="4">No results found. Check the filters.</th>
|
|
</tr>
|
|
</template>
|
|
<template id="template_results-table__tbody">
|
|
<tbody class="results-table-row">
|
|
<tr class="collapsible">
|
|
</tr>
|
|
<tr class="extras-row">
|
|
<td class="extra" colspan="4">
|
|
<div class="extraHTML"></div>
|
|
<div class="media">
|
|
<div class="media-container">
|
|
<div class="media-container__nav--left"><</div>
|
|
<div class="media-container__viewport">
|
|
<img src="" />
|
|
<video controls>
|
|
<source src="" type="video/mp4">
|
|
</video>
|
|
</div>
|
|
<div class="media-container__nav--right">></div>
|
|
</div>
|
|
<div class="media__name"></div>
|
|
<div class="media__counter"></div>
|
|
</div>
|
|
<div class="logwrapper">
|
|
<div class="logexpander"></div>
|
|
<div class="log"></div>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</template>
|
|
<!-- END TEMPLATES -->
|
|
<div class="summary">
|
|
<div class="summary__data">
|
|
<h2>Summary</h2>
|
|
<div class="additional-summary prefix">
|
|
</div>
|
|
<p class="run-count">97 tests took 00:00:50.</p>
|
|
<p class="filter">(Un)check the boxes to filter the results.</p>
|
|
<div class="summary__reload">
|
|
<div class="summary__reload__button hidden" onclick="location.reload()">
|
|
<div>There are still tests running. <br />Reload this page to get the latest results!</div>
|
|
</div>
|
|
</div>
|
|
<div class="summary__spacer"></div>
|
|
<div class="controls">
|
|
<div class="filters">
|
|
<input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="failed" />
|
|
<span class="failed">24 Failed,</span>
|
|
<input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="passed" />
|
|
<span class="passed">73 Passed,</span>
|
|
<input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="skipped" disabled/>
|
|
<span class="skipped">0 Skipped,</span>
|
|
<input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="xfailed" disabled/>
|
|
<span class="xfailed">0 Expected failures,</span>
|
|
<input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="xpassed" disabled/>
|
|
<span class="xpassed">0 Unexpected passes,</span>
|
|
<input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="error" disabled/>
|
|
<span class="error">0 Errors,</span>
|
|
<input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="rerun" disabled/>
|
|
<span class="rerun">0 Reruns</span>
|
|
</div>
|
|
<div class="collapse">
|
|
<button id="show_all_details">Show all details</button> / <button id="hide_all_details">Hide all details</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="additional-summary summary">
|
|
</div>
|
|
<div class="additional-summary postfix">
|
|
</div>
|
|
</div>
|
|
<table id="results-table">
|
|
<thead id="results-table-head">
|
|
<tr>
|
|
<th class="sortable" data-column-type="result">Result</th>
|
|
<th class="sortable" data-column-type="testId">Test</th>
|
|
<th class="sortable" data-column-type="duration">Duration</th>
|
|
<th>Links</th>
|
|
</tr>
|
|
</thead>
|
|
</table>
|
|
</body>
|
|
<footer>
|
|
<div id="data-container" data-jsonblob="{"environment": {"Python": "3.13.5", "Platform": "macOS-26.3.1-arm64-arm-64bit-Mach-O", "Packages": {"pytest": "7.4.4", "pluggy": "1.5.0"}, "Plugins": {"rerunfailures": "14.0", "allure-pytest": "2.13.5", "base-url": "2.1.0", "timeout": "2.3.1", "playwright": "0.5.2", "xdist": "3.6.1", "asyncio": "0.23.8", "Faker": "30.8.1", "cov": "6.0.0", "anyio": "4.11.0", "html": "4.1.1", "json-report": "1.5.0", "qt": "4.2.0", "metadata": "3.1.1", "mock": "3.14.0", "benchmark": "4.0.0"}, "JAVA_HOME": "/opt/homebrew/Cellar/openjdk@21/21.0.10/libexec/openjdk.jdk/Contents/Home", "Base URL": ""}, "tests": {"tests/test_audit.py::TestLoginLog::test_create_login_log": [{"extras": [], "result": "Passed", "testId": "tests/test_audit.py::TestLoginLog::test_create_login_log", "duration": "779 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_audit.py::TestLoginLog::test_create_login_log</td>", "<td class=\"col-duration\">779 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_audit.py::TestLoginLog::test_get_all_login_logs": [{"extras": [], "result": "Passed", "testId": "tests/test_audit.py::TestLoginLog::test_get_all_login_logs", "duration": "832 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_audit.py::TestLoginLog::test_get_all_login_logs</td>", "<td class=\"col-duration\">832 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_audit.py::TestLoginLog::test_get_login_log_by_id": [{"extras": [], "result": "Passed", "testId": "tests/test_audit.py::TestLoginLog::test_get_login_log_by_id", "duration": "644 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_audit.py::TestLoginLog::test_get_login_log_by_id</td>", "<td class=\"col-duration\">644 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_audit.py::TestExceptionLog::test_create_exception_log": [{"extras": [], "result": "Passed", "testId": "tests/test_audit.py::TestExceptionLog::test_create_exception_log", "duration": "815 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_audit.py::TestExceptionLog::test_create_exception_log</td>", "<td class=\"col-duration\">815 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_audit.py::TestExceptionLog::test_get_all_exception_logs": [{"extras": [], "result": "Passed", "testId": "tests/test_audit.py::TestExceptionLog::test_get_all_exception_logs", "duration": "566 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_audit.py::TestExceptionLog::test_get_all_exception_logs</td>", "<td class=\"col-duration\">566 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_audit.py::TestExceptionLog::test_get_exception_log_by_id": [{"extras": [], "result": "Passed", "testId": "tests/test_audit.py::TestExceptionLog::test_get_exception_log_by_id", "duration": "460 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_audit.py::TestExceptionLog::test_get_exception_log_by_id</td>", "<td class=\"col-duration\">460 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_audit.py::TestExceptionLog::test_get_login_logs_by_page_success": [{"extras": [], "result": "Passed", "testId": "tests/test_audit.py::TestExceptionLog::test_get_login_logs_by_page_success", "duration": "440 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_audit.py::TestExceptionLog::test_get_login_logs_by_page_success</td>", "<td class=\"col-duration\">440 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_audit.py::TestExceptionLog::test_get_login_logs_by_page_with_sort": [{"extras": [], "result": "Passed", "testId": "tests/test_audit.py::TestExceptionLog::test_get_login_logs_by_page_with_sort", "duration": "461 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_audit.py::TestExceptionLog::test_get_login_logs_by_page_with_sort</td>", "<td class=\"col-duration\">461 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_audit.py::TestExceptionLog::test_get_login_logs_by_page_with_search": [{"extras": [], "result": "Passed", "testId": "tests/test_audit.py::TestExceptionLog::test_get_login_logs_by_page_with_search", "duration": "425 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_audit.py::TestExceptionLog::test_get_login_logs_by_page_with_search</td>", "<td class=\"col-duration\">425 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_audit.py::TestExceptionLog::test_get_login_log_count_success": [{"extras": [], "result": "Passed", "testId": "tests/test_audit.py::TestExceptionLog::test_get_login_log_count_success", "duration": "409 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_audit.py::TestExceptionLog::test_get_login_log_count_success</td>", "<td class=\"col-duration\">409 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_auth.py::TestAuth::test_login_success": [{"extras": [], "result": "Passed", "testId": "tests/test_auth.py::TestAuth::test_login_success", "duration": "397 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_auth.py::TestAuth::test_login_success</td>", "<td class=\"col-duration\">397 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:18.802 | INFO | api.base_api:post:28 - POST /api/auth/login - Data: None - JSON: {&#x27;username&#x27;: &#x27;admin&#x27;, &#x27;password&#x27;: &#x27;admin123&#x27;}\n2026-03-12 08:32:19.180 | INFO | api.base_api:post:30 - Response: 200\n"}], "tests/test_auth.py::TestAuth::test_login_invalid_credentials": [{"extras": [], "result": "Passed", "testId": "tests/test_auth.py::TestAuth::test_login_invalid_credentials", "duration": "29 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_auth.py::TestAuth::test_login_invalid_credentials</td>", "<td class=\"col-duration\">29 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:19.205 | INFO | api.base_api:post:28 - POST /api/auth/login - Data: None - JSON: {&#x27;username&#x27;: &#x27;invalid_user&#x27;, &#x27;password&#x27;: &#x27;invalid_password&#x27;}\n2026-03-12 08:32:19.213 | INFO | api.base_api:post:30 - Response: 401\n"}], "tests/test_auth.py::TestAuth::test_login_missing_fields": [{"extras": [], "result": "Passed", "testId": "tests/test_auth.py::TestAuth::test_login_missing_fields", "duration": "42 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_auth.py::TestAuth::test_login_missing_fields</td>", "<td class=\"col-duration\">42 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_auth.py::TestAuth::test_register_success": [{"extras": [], "result": "Passed", "testId": "tests/test_auth.py::TestAuth::test_register_success", "duration": "142 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_auth.py::TestAuth::test_register_success</td>", "<td class=\"col-duration\">142 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_auth.py::TestAuth::test_register_duplicate_username": [{"extras": [], "result": "Passed", "testId": "tests/test_auth.py::TestAuth::test_register_duplicate_username", "duration": "143 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_auth.py::TestAuth::test_register_duplicate_username</td>", "<td class=\"col-duration\">143 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_auth.py::TestAuth::test_logout_success": [{"extras": [], "result": "Passed", "testId": "tests/test_auth.py::TestAuth::test_logout_success", "duration": "20 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_auth.py::TestAuth::test_logout_success</td>", "<td class=\"col-duration\">20 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_config.py::TestSysConfig::test_create_config_success": [{"extras": [], "result": "Passed", "testId": "tests/test_config.py::TestSysConfig::test_create_config_success", "duration": "409 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_config.py::TestSysConfig::test_create_config_success</td>", "<td class=\"col-duration\">409 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_config.py::TestSysConfig::test_get_all_configs": [{"extras": [], "result": "Passed", "testId": "tests/test_config.py::TestSysConfig::test_get_all_configs", "duration": "447 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_config.py::TestSysConfig::test_get_all_configs</td>", "<td class=\"col-duration\">447 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_config.py::TestSysConfig::test_get_config_by_key": [{"extras": [], "result": "Passed", "testId": "tests/test_config.py::TestSysConfig::test_get_config_by_key", "duration": "468 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_config.py::TestSysConfig::test_get_config_by_key</td>", "<td class=\"col-duration\">468 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_config.py::TestSysConfig::test_update_config": [{"extras": [], "result": "Passed", "testId": "tests/test_config.py::TestSysConfig::test_update_config", "duration": "430 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_config.py::TestSysConfig::test_update_config</td>", "<td class=\"col-duration\">430 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_config.py::TestSysConfig::test_delete_config": [{"extras": [], "result": "Passed", "testId": "tests/test_config.py::TestSysConfig::test_delete_config", "duration": "527 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_config.py::TestSysConfig::test_delete_config</td>", "<td class=\"col-duration\">527 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_dict.py::TestDictType::test_create_dict_type_success": [{"extras": [], "result": "Passed", "testId": "tests/test_dict.py::TestDictType::test_create_dict_type_success", "duration": "516 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_dict.py::TestDictType::test_create_dict_type_success</td>", "<td class=\"col-duration\">516 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_dict.py::TestDictType::test_get_all_dict_types": [{"extras": [], "result": "Passed", "testId": "tests/test_dict.py::TestDictType::test_get_all_dict_types", "duration": "455 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_dict.py::TestDictType::test_get_all_dict_types</td>", "<td class=\"col-duration\">455 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_dict.py::TestDictType::test_get_dict_type_by_id": [{"extras": [], "result": "Passed", "testId": "tests/test_dict.py::TestDictType::test_get_dict_type_by_id", "duration": "417 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_dict.py::TestDictType::test_get_dict_type_by_id</td>", "<td class=\"col-duration\">417 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_dict.py::TestDictType::test_update_dict_type": [{"extras": [], "result": "Passed", "testId": "tests/test_dict.py::TestDictType::test_update_dict_type", "duration": "425 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_dict.py::TestDictType::test_update_dict_type</td>", "<td class=\"col-duration\">425 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_dict.py::TestDictType::test_delete_dict_type": [{"extras": [], "result": "Passed", "testId": "tests/test_dict.py::TestDictType::test_delete_dict_type", "duration": "410 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_dict.py::TestDictType::test_delete_dict_type</td>", "<td class=\"col-duration\">410 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_dict.py::TestDictData::test_create_dict_data_success": [{"extras": [], "result": "Passed", "testId": "tests/test_dict.py::TestDictData::test_create_dict_data_success", "duration": "416 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_dict.py::TestDictData::test_create_dict_data_success</td>", "<td class=\"col-duration\">416 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_dict.py::TestDictData::test_get_dict_data_by_type": [{"extras": [], "result": "Passed", "testId": "tests/test_dict.py::TestDictData::test_get_dict_data_by_type", "duration": "535 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_dict.py::TestDictData::test_get_dict_data_by_type</td>", "<td class=\"col-duration\">535 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_dictionary.py::TestDictionary::test_create_dictionary_success": [{"extras": [], "result": "Failed", "testId": "tests/test_dictionary.py::TestDictionary::test_create_dictionary_success", "duration": "585 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_dictionary.py::TestDictionary::test_create_dictionary_success</td>", "<td class=\"col-duration\">585 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_dictionary.py:20: in test_create_dictionary_success\n assert response.status_code == 201\nE assert 404 == 201\nE + where 404 = &lt;Response [404 Not Found]&gt;.status_code\n\n----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:25.472 | INFO | api.base_api:post:28 - POST /api/dictionaries - Data: None - JSON: {&#x27;type&#x27;: &#x27;USER_STATUS&#x27;, &#x27;code&#x27;: &#x27;ACTIVE&#x27;, &#x27;name&#x27;: &#x27;\u6fc0\u6d3b&#x27;, &#x27;value&#x27;: &#x27;1&#x27;, &#x27;remark&#x27;: &#x27;\u7528\u6237\u6fc0\u6d3b\u72b6\u6001&#x27;, &#x27;sort&#x27;: 1}\n2026-03-12 08:32:25.619 | INFO | api.base_api:post:30 - Response: 404\n"}], "tests/test_dictionary.py::TestDictionary::test_create_dictionary_duplicate_type_code": [{"extras": [], "result": "Failed", "testId": "tests/test_dictionary.py::TestDictionary::test_create_dictionary_duplicate_type_code", "duration": "484 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_dictionary.py::TestDictionary::test_create_dictionary_duplicate_type_code</td>", "<td class=\"col-duration\">484 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_dictionary.py:35: in test_create_dictionary_duplicate_type_code\n dict_id = create_response.json()[&quot;id&quot;]\nE KeyError: &#x27;id&#x27;\n\n----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:26.134 | INFO | api.base_api:post:28 - POST /api/dictionaries - Data: None - JSON: {&#x27;type&#x27;: &#x27;USER_STATUS&#x27;, &#x27;code&#x27;: &#x27;ACTIVE&#x27;, &#x27;name&#x27;: &#x27;\u6fc0\u6d3b&#x27;, &#x27;value&#x27;: &#x27;1&#x27;, &#x27;remark&#x27;: &#x27;\u7528\u6237\u6fc0\u6d3b\u72b6\u6001&#x27;, &#x27;sort&#x27;: 1}\n2026-03-12 08:32:26.141 | INFO | api.base_api:post:30 - Response: 404\n"}], "tests/test_dictionary.py::TestDictionary::test_get_dictionary_by_id_success": [{"extras": [], "result": "Failed", "testId": "tests/test_dictionary.py::TestDictionary::test_get_dictionary_by_id_success", "duration": "427 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_dictionary.py::TestDictionary::test_get_dictionary_by_id_success</td>", "<td class=\"col-duration\">427 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_dictionary.py:49: in test_get_dictionary_by_id_success\n dict_id = create_response.json()[&quot;id&quot;]\nE KeyError: &#x27;id&#x27;\n\n----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:26.573 | INFO | api.base_api:post:28 - POST /api/dictionaries - Data: None - JSON: {&#x27;type&#x27;: &#x27;USER_STATUS&#x27;, &#x27;code&#x27;: &#x27;ACTIVE&#x27;, &#x27;name&#x27;: &#x27;\u6fc0\u6d3b&#x27;, &#x27;value&#x27;: &#x27;1&#x27;, &#x27;remark&#x27;: &#x27;\u7528\u6237\u6fc0\u6d3b\u72b6\u6001&#x27;, &#x27;sort&#x27;: 1}\n2026-03-12 08:32:26.579 | INFO | api.base_api:post:30 - Response: 404\n"}], "tests/test_dictionary.py::TestDictionary::test_get_dictionary_by_id_not_found": [{"extras": [], "result": "Passed", "testId": "tests/test_dictionary.py::TestDictionary::test_get_dictionary_by_id_not_found", "duration": "435 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_dictionary.py::TestDictionary::test_get_dictionary_by_id_not_found</td>", "<td class=\"col-duration\">435 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:27.006 | INFO | api.base_api:get:20 - GET /api/dictionaries/999999 - Params: None\n2026-03-12 08:32:27.017 | INFO | api.base_api:get:22 - Response: 404\n"}], "tests/test_dictionary.py::TestDictionary::test_get_dictionaries_by_type_success": [{"extras": [], "result": "Failed", "testId": "tests/test_dictionary.py::TestDictionary::test_get_dictionaries_by_type_success", "duration": "496 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_dictionary.py::TestDictionary::test_get_dictionaries_by_type_success</td>", "<td class=\"col-duration\">496 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_dictionary.py:74: in test_get_dictionaries_by_type_success\n dict_id = create_response.json()[&quot;id&quot;]\nE KeyError: &#x27;id&#x27;\n\n----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:27.462 | INFO | api.base_api:post:28 - POST /api/dictionaries - Data: None - JSON: {&#x27;type&#x27;: &#x27;USER_STATUS&#x27;, &#x27;code&#x27;: &#x27;ACTIVE&#x27;, &#x27;name&#x27;: &#x27;\u6fc0\u6d3b&#x27;, &#x27;value&#x27;: &#x27;1&#x27;, &#x27;remark&#x27;: &#x27;\u7528\u6237\u6fc0\u6d3b\u72b6\u6001&#x27;, &#x27;sort&#x27;: 1}\n2026-03-12 08:32:27.487 | INFO | api.base_api:post:30 - Response: 404\n"}], "tests/test_dictionary.py::TestDictionary::test_get_all_dictionaries_success": [{"extras": [], "result": "Failed", "testId": "tests/test_dictionary.py::TestDictionary::test_get_all_dictionaries_success", "duration": "667 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_dictionary.py::TestDictionary::test_get_all_dictionaries_success</td>", "<td class=\"col-duration\">667 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_dictionary.py:91: in test_get_all_dictionaries_success\n assert response.status_code == 200\nE assert 404 == 200\nE + where 404 = &lt;Response [404 Not Found]&gt;.status_code\n\n----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:28.195 | INFO | api.base_api:get:20 - GET /api/dictionaries - Params: None\n2026-03-12 08:32:28.207 | INFO | api.base_api:get:22 - Response: 404\n"}], "tests/test_dictionary.py::TestDictionary::test_update_dictionary_success": [{"extras": [], "result": "Failed", "testId": "tests/test_dictionary.py::TestDictionary::test_update_dictionary_success", "duration": "548 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_dictionary.py::TestDictionary::test_update_dictionary_success</td>", "<td class=\"col-duration\">548 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_dictionary.py:101: in test_update_dictionary_success\n dict_id = create_response.json()[&quot;id&quot;]\nE KeyError: &#x27;id&#x27;\n\n----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:28.764 | INFO | api.base_api:post:28 - POST /api/dictionaries - Data: None - JSON: {&#x27;type&#x27;: &#x27;USER_STATUS&#x27;, &#x27;code&#x27;: &#x27;ACTIVE&#x27;, &#x27;name&#x27;: &#x27;\u6fc0\u6d3b&#x27;, &#x27;value&#x27;: &#x27;1&#x27;, &#x27;remark&#x27;: &#x27;\u7528\u6237\u6fc0\u6d3b\u72b6\u6001&#x27;, &#x27;sort&#x27;: 1}\n2026-03-12 08:32:28.769 | INFO | api.base_api:post:30 - Response: 404\n"}], "tests/test_dictionary.py::TestDictionary::test_delete_dictionary_success": [{"extras": [], "result": "Failed", "testId": "tests/test_dictionary.py::TestDictionary::test_delete_dictionary_success", "duration": "536 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_dictionary.py::TestDictionary::test_delete_dictionary_success</td>", "<td class=\"col-duration\">536 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_dictionary.py:118: in test_delete_dictionary_success\n dict_id = create_response.json()[&quot;id&quot;]\nE KeyError: &#x27;id&#x27;\n\n----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:29.306 | INFO | api.base_api:post:28 - POST /api/dictionaries - Data: None - JSON: {&#x27;type&#x27;: &#x27;USER_STATUS&#x27;, &#x27;code&#x27;: &#x27;ACTIVE&#x27;, &#x27;name&#x27;: &#x27;\u6fc0\u6d3b&#x27;, &#x27;value&#x27;: &#x27;1&#x27;, &#x27;remark&#x27;: &#x27;\u7528\u6237\u6fc0\u6d3b\u72b6\u6001&#x27;, &#x27;sort&#x27;: 1}\n2026-03-12 08:32:29.313 | INFO | api.base_api:post:30 - Response: 404\n"}], "tests/test_dictionary.py::TestDictionary::test_check_type_and_code_exists_true": [{"extras": [], "result": "Failed", "testId": "tests/test_dictionary.py::TestDictionary::test_check_type_and_code_exists_true", "duration": "585 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_dictionary.py::TestDictionary::test_check_type_and_code_exists_true</td>", "<td class=\"col-duration\">585 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_dictionary.py:130: in test_check_type_and_code_exists_true\n dict_id = create_response.json()[&quot;id&quot;]\nE KeyError: &#x27;id&#x27;\n\n----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:29.903 | INFO | api.base_api:post:28 - POST /api/dictionaries - Data: None - JSON: {&#x27;type&#x27;: &#x27;USER_STATUS&#x27;, &#x27;code&#x27;: &#x27;ACTIVE&#x27;, &#x27;name&#x27;: &#x27;\u6fc0\u6d3b&#x27;, &#x27;value&#x27;: &#x27;1&#x27;, &#x27;remark&#x27;: &#x27;\u7528\u6237\u6fc0\u6d3b\u72b6\u6001&#x27;, &#x27;sort&#x27;: 1}\n2026-03-12 08:32:29.907 | INFO | api.base_api:post:30 - Response: 404\n"}], "tests/test_dictionary.py::TestDictionary::test_check_type_and_code_exists_false": [{"extras": [], "result": "Failed", "testId": "tests/test_dictionary.py::TestDictionary::test_check_type_and_code_exists_false", "duration": "428 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_dictionary.py::TestDictionary::test_check_type_and_code_exists_false</td>", "<td class=\"col-duration\">428 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_dictionary.py:148: in test_check_type_and_code_exists_false\n assert response.status_code == 200\nE assert 404 == 200\nE + where 404 = &lt;Response [404 Not Found]&gt;.status_code\n\n----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:30.333 | INFO | api.base_api:get:20 - GET /api/dictionaries/check/exists - Params: {&#x27;type&#x27;: &#x27;NONEXISTENT_TYPE&#x27;, &#x27;code&#x27;: &#x27;NONEXISTENT_CODE&#x27;}\n2026-03-12 08:32:30.341 | INFO | api.base_api:get:22 - Response: 404\n"}], "tests/test_file.py::TestSysFile::test_upload_file": [{"extras": [], "result": "Failed", "testId": "tests/test_file.py::TestSysFile::test_upload_file", "duration": "603 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_file.py::TestSysFile::test_upload_file</td>", "<td class=\"col-duration\">603 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_file.py:29: in test_upload_file\n assert response.status_code == 201\nE assert 400 == 201\nE + where 400 = &lt;Response [400 Bad Request]&gt;.status_code\n"}], "tests/test_file.py::TestSysFile::test_get_all_files": [{"extras": [], "result": "Passed", "testId": "tests/test_file.py::TestSysFile::test_get_all_files", "duration": "463 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_file.py::TestSysFile::test_get_all_files</td>", "<td class=\"col-duration\">463 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_file.py::TestSysFile::test_get_file_by_id": [{"extras": [], "result": "Failed", "testId": "tests/test_file.py::TestSysFile::test_get_file_by_id", "duration": "458 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_file.py::TestSysFile::test_get_file_by_id</td>", "<td class=\"col-duration\">458 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_file.py:53: in test_get_file_by_id\n file_id = upload_response.json()[&quot;id&quot;]\nE KeyError: &#x27;id&#x27;\n"}], "tests/test_file.py::TestSysFile::test_download_file": [{"extras": [], "result": "Failed", "testId": "tests/test_file.py::TestSysFile::test_download_file", "duration": "467 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_file.py::TestSysFile::test_download_file</td>", "<td class=\"col-duration\">467 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_file.py:72: in test_download_file\n file_name = upload_response.json()[&quot;filePath&quot;].split(&quot;/&quot;)[-1]\nE KeyError: &#x27;filePath&#x27;\n"}], "tests/test_file.py::TestSysFile::test_preview_file": [{"extras": [], "result": "Failed", "testId": "tests/test_file.py::TestSysFile::test_preview_file", "duration": "425 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_file.py::TestSysFile::test_preview_file</td>", "<td class=\"col-duration\">425 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_file.py:90: in test_preview_file\n file_name = upload_response.json()[&quot;filePath&quot;].split(&quot;/&quot;)[-1]\nE KeyError: &#x27;filePath&#x27;\n"}], "tests/test_file.py::TestSysFile::test_delete_file": [{"extras": [], "result": "Failed", "testId": "tests/test_file.py::TestSysFile::test_delete_file", "duration": "404 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_file.py::TestSysFile::test_delete_file</td>", "<td class=\"col-duration\">404 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_file.py:108: in test_delete_file\n file_id = upload_response.json()[&quot;id&quot;]\nE KeyError: &#x27;id&#x27;\n"}], "tests/test_notice.py::TestSysNotice::test_create_notice_success": [{"extras": [], "result": "Passed", "testId": "tests/test_notice.py::TestSysNotice::test_create_notice_success", "duration": "447 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_notice.py::TestSysNotice::test_create_notice_success</td>", "<td class=\"col-duration\">447 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_notice.py::TestSysNotice::test_get_all_notices": [{"extras": [], "result": "Passed", "testId": "tests/test_notice.py::TestSysNotice::test_get_all_notices", "duration": "464 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_notice.py::TestSysNotice::test_get_all_notices</td>", "<td class=\"col-duration\">464 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_notice.py::TestSysNotice::test_get_notice_by_id": [{"extras": [], "result": "Passed", "testId": "tests/test_notice.py::TestSysNotice::test_get_notice_by_id", "duration": "575 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_notice.py::TestSysNotice::test_get_notice_by_id</td>", "<td class=\"col-duration\">575 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_notice.py::TestSysNotice::test_get_notice_by_status": [{"extras": [], "result": "Passed", "testId": "tests/test_notice.py::TestSysNotice::test_get_notice_by_status", "duration": "458 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_notice.py::TestSysNotice::test_get_notice_by_status</td>", "<td class=\"col-duration\">458 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_notice.py::TestSysNotice::test_update_notice": [{"extras": [], "result": "Passed", "testId": "tests/test_notice.py::TestSysNotice::test_update_notice", "duration": "413 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_notice.py::TestSysNotice::test_update_notice</td>", "<td class=\"col-duration\">413 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_notice.py::TestSysNotice::test_delete_notice": [{"extras": [], "result": "Passed", "testId": "tests/test_notice.py::TestSysNotice::test_delete_notice", "duration": "406 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_notice.py::TestSysNotice::test_delete_notice</td>", "<td class=\"col-duration\">406 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_notice.py::TestSysMessage::test_create_message": [{"extras": [], "result": "Failed", "testId": "tests/test_notice.py::TestSysMessage::test_create_message", "duration": "407 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_notice.py::TestSysMessage::test_create_message</td>", "<td class=\"col-duration\">407 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_notice.py:143: in test_create_message\n assert response.status_code == 201\nE assert 404 == 201\nE + where 404 = &lt;Response [404 Not Found]&gt;.status_code\n"}], "tests/test_notice.py::TestSysMessage::test_get_messages_by_user": [{"extras": [], "result": "Failed", "testId": "tests/test_notice.py::TestSysMessage::test_get_messages_by_user", "duration": "399 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_notice.py::TestSysMessage::test_get_messages_by_user</td>", "<td class=\"col-duration\">399 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_notice.py:155: in test_get_messages_by_user\n assert response.status_code == 200\nE assert 404 == 200\nE + where 404 = &lt;Response [404 Not Found]&gt;.status_code\n"}], "tests/test_notice.py::TestSysMessage::test_get_unread_count": [{"extras": [], "result": "Failed", "testId": "tests/test_notice.py::TestSysMessage::test_get_unread_count", "duration": "440 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_notice.py::TestSysMessage::test_get_unread_count</td>", "<td class=\"col-duration\">440 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_notice.py:166: in test_get_unread_count\n assert response.status_code == 200\nE assert 404 == 200\nE + where 404 = &lt;Response [404 Not Found]&gt;.status_code\n"}], "tests/test_notice.py::TestSysMessage::test_mark_message_as_read": [{"extras": [], "result": "Failed", "testId": "tests/test_notice.py::TestSysMessage::test_mark_message_as_read", "duration": "429 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_notice.py::TestSysMessage::test_mark_message_as_read</td>", "<td class=\"col-duration\">429 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_notice.py:180: in test_mark_message_as_read\n message_id = create_response.json()[&quot;id&quot;]\nE KeyError: &#x27;id&#x27;\n"}], "tests/test_oauth2.py::TestOAuth2::test_create_oauth2_client_success": [{"extras": [], "result": "Failed", "testId": "tests/test_oauth2.py::TestOAuth2::test_create_oauth2_client_success", "duration": "437 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_oauth2.py::TestOAuth2::test_create_oauth2_client_success</td>", "<td class=\"col-duration\">437 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_oauth2.py:50: in test_create_oauth2_client_success\n assert response.status_code == 201\nE assert 404 == 201\nE + where 404 = &lt;Response [404 Not Found]&gt;.status_code\n"}], "tests/test_oauth2.py::TestOAuth2::test_get_oauth2_client_by_id_success": [{"extras": [], "result": "Failed", "testId": "tests/test_oauth2.py::TestOAuth2::test_get_oauth2_client_by_id_success", "duration": "412 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_oauth2.py::TestOAuth2::test_get_oauth2_client_by_id_success</td>", "<td class=\"col-duration\">412 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_oauth2.py:63: in test_get_oauth2_client_by_id_success\n client_id = create_response.json()[&quot;id&quot;]\nE KeyError: &#x27;id&#x27;\n"}], "tests/test_oauth2.py::TestOAuth2::test_get_oauth2_client_by_id_not_found": [{"extras": [], "result": "Passed", "testId": "tests/test_oauth2.py::TestOAuth2::test_get_oauth2_client_by_id_not_found", "duration": "408 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_oauth2.py::TestOAuth2::test_get_oauth2_client_by_id_not_found</td>", "<td class=\"col-duration\">408 ms</td>", "<td class=\"col-links\"></td>"], "log": "No log output captured."}], "tests/test_oauth2.py::TestOAuth2::test_get_oauth2_client_by_client_id_success": [{"extras": [], "result": "Failed", "testId": "tests/test_oauth2.py::TestOAuth2::test_get_oauth2_client_by_client_id_success", "duration": "411 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_oauth2.py::TestOAuth2::test_get_oauth2_client_by_client_id_success</td>", "<td class=\"col-duration\">411 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_oauth2.py:85: in test_get_oauth2_client_by_client_id_success\n client_id = create_response.json()[&quot;id&quot;]\nE KeyError: &#x27;id&#x27;\n"}], "tests/test_oauth2.py::TestOAuth2::test_get_all_oauth2_clients_success": [{"extras": [], "result": "Failed", "testId": "tests/test_oauth2.py::TestOAuth2::test_get_all_oauth2_clients_success", "duration": "405 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_oauth2.py::TestOAuth2::test_get_all_oauth2_clients_success</td>", "<td class=\"col-duration\">405 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_oauth2.py:100: in test_get_all_oauth2_clients_success\n assert response.status_code == 200\nE assert 404 == 200\nE + where 404 = &lt;Response [404 Not Found]&gt;.status_code\n"}], "tests/test_oauth2.py::TestOAuth2::test_update_oauth2_client_success": [{"extras": [], "result": "Failed", "testId": "tests/test_oauth2.py::TestOAuth2::test_update_oauth2_client_success", "duration": "425 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_oauth2.py::TestOAuth2::test_update_oauth2_client_success</td>", "<td class=\"col-duration\">425 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_oauth2.py:108: in test_update_oauth2_client_success\n client_id = create_response.json()[&quot;id&quot;]\nE KeyError: &#x27;id&#x27;\n"}], "tests/test_oauth2.py::TestOAuth2::test_delete_oauth2_client_success": [{"extras": [], "result": "Failed", "testId": "tests/test_oauth2.py::TestOAuth2::test_delete_oauth2_client_success", "duration": "453 ms", "resultsTableRow": ["<td class=\"col-result\">Failed</td>", "<td class=\"col-testId\">tests/test_oauth2.py::TestOAuth2::test_delete_oauth2_client_success</td>", "<td class=\"col-duration\">453 ms</td>", "<td class=\"col-links\"></td>"], "log": "tests/test_oauth2.py:123: in test_delete_oauth2_client_success\n client_id = create_response.json()[&quot;id&quot;]\nE KeyError: &#x27;id&#x27;\n"}], "tests/test_role.py::TestRole::test_create_role_success": [{"extras": [], "result": "Passed", "testId": "tests/test_role.py::TestRole::test_create_role_success", "duration": "439 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_role.py::TestRole::test_create_role_success</td>", "<td class=\"col-duration\">439 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:41.066 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;TEST_ROLE_1773275561065&#x27;, &#x27;roleKey&#x27;: &#x27;test_role_1773275561065&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:41.080 | INFO | api.base_api:post:30 - Response: 201\n"}], "tests/test_role.py::TestRole::test_create_role_duplicate_name": [{"extras": [], "result": "Passed", "testId": "tests/test_role.py::TestRole::test_create_role_duplicate_name", "duration": "439 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_role.py::TestRole::test_create_role_duplicate_name</td>", "<td class=\"col-duration\">439 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:41.505 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;TEST_ROLE_1773275561504&#x27;, &#x27;roleKey&#x27;: &#x27;test_role_1773275561504&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:41.513 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:41.513 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;TEST_ROLE_1773275561504&#x27;, &#x27;roleKey&#x27;: &#x27;test_role_1773275561504&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:41.522 | INFO | api.base_api:post:30 - Response: 409\n"}], "tests/test_role.py::TestRole::test_get_role_by_id_success": [{"extras": [], "result": "Passed", "testId": "tests/test_role.py::TestRole::test_get_role_by_id_success", "duration": "448 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_role.py::TestRole::test_get_role_by_id_success</td>", "<td class=\"col-duration\">448 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:41.949 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;TEST_ROLE_1773275561948&#x27;, &#x27;roleKey&#x27;: &#x27;test_role_1773275561948&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:41.959 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:41.959 | INFO | api.base_api:get:20 - GET /api/roles/466 - Params: None\n2026-03-12 08:32:41.970 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_role.py::TestRole::test_get_role_by_id_not_found": [{"extras": [], "result": "Passed", "testId": "tests/test_role.py::TestRole::test_get_role_by_id_not_found", "duration": "415 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_role.py::TestRole::test_get_role_by_id_not_found</td>", "<td class=\"col-duration\">415 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:42.391 | INFO | api.base_api:get:20 - GET /api/roles/999999 - Params: None\n2026-03-12 08:32:42.397 | INFO | api.base_api:get:22 - Response: 404\n"}], "tests/test_role.py::TestRole::test_get_role_by_name_success": [{"extras": [], "result": "Passed", "testId": "tests/test_role.py::TestRole::test_get_role_by_name_success", "duration": "427 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_role.py::TestRole::test_get_role_by_name_success</td>", "<td class=\"col-duration\">427 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:42.804 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;TEST_ROLE_1773275562803&#x27;, &#x27;roleKey&#x27;: &#x27;test_role_1773275562803&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:42.810 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:42.810 | INFO | api.base_api:get:20 - GET /api/roles/name/TEST_ROLE_1773275562803 - Params: None\n2026-03-12 08:32:42.817 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_role.py::TestRole::test_get_all_roles_success": [{"extras": [], "result": "Passed", "testId": "tests/test_role.py::TestRole::test_get_all_roles_success", "duration": "407 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_role.py::TestRole::test_get_all_roles_success</td>", "<td class=\"col-duration\">407 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:43.225 | INFO | api.base_api:get:20 - GET /api/roles - Params: {&#x27;includeDeleted&#x27;: False}\n2026-03-12 08:32:43.233 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_role.py::TestRole::test_update_role_success": [{"extras": [], "result": "Passed", "testId": "tests/test_role.py::TestRole::test_update_role_success", "duration": "466 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_role.py::TestRole::test_update_role_success</td>", "<td class=\"col-duration\">466 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:43.676 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;TEST_ROLE_1773275563675&#x27;, &#x27;roleKey&#x27;: &#x27;test_role_1773275563675&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:43.684 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:43.684 | INFO | api.base_api:put:36 - PUT /api/roles/468 - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;UPDATED_ROLE_1773275563684&#x27;}\n2026-03-12 08:32:43.692 | INFO | api.base_api:put:38 - Response: 200\n"}], "tests/test_role.py::TestRole::test_delete_role_success": [{"extras": [], "result": "Passed", "testId": "tests/test_role.py::TestRole::test_delete_role_success", "duration": "477 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_role.py::TestRole::test_delete_role_success</td>", "<td class=\"col-duration\">477 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:44.150 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;TEST_ROLE_1773275564150&#x27;, &#x27;roleKey&#x27;: &#x27;test_role_1773275564150&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:44.158 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:44.158 | INFO | api.base_api:delete:44 - DELETE /api/roles/469\n2026-03-12 08:32:44.166 | INFO | api.base_api:delete:46 - Response: 200\n2026-03-12 08:32:44.166 | INFO | api.base_api:get:20 - GET /api/roles/469 - Params: None\n2026-03-12 08:32:44.171 | INFO | api.base_api:get:22 - Response: 404\n"}], "tests/test_role.py::TestRole::test_restore_role_success": [{"extras": [], "result": "Passed", "testId": "tests/test_role.py::TestRole::test_restore_role_success", "duration": "475 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_role.py::TestRole::test_restore_role_success</td>", "<td class=\"col-duration\">475 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:44.608 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;TEST_ROLE_1773275564607&#x27;, &#x27;roleKey&#x27;: &#x27;test_role_1773275564607&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:44.615 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:44.615 | INFO | api.base_api:delete:44 - DELETE /api/roles/470\n2026-03-12 08:32:44.632 | INFO | api.base_api:delete:46 - Response: 200\n2026-03-12 08:32:44.632 | INFO | api.base_api:post:28 - POST /api/roles/470/restore - Data: None - JSON: None\n2026-03-12 08:32:44.642 | INFO | api.base_api:post:30 - Response: 200\n2026-03-12 08:32:44.642 | INFO | api.base_api:get:20 - GET /api/roles/470 - Params: None\n2026-03-12 08:32:44.649 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_role.py::TestRole::test_check_name_exists_true": [{"extras": [], "result": "Passed", "testId": "tests/test_role.py::TestRole::test_check_name_exists_true", "duration": "443 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_role.py::TestRole::test_check_name_exists_true</td>", "<td class=\"col-duration\">443 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:45.071 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;TEST_ROLE_1773275565070&#x27;, &#x27;roleKey&#x27;: &#x27;test_role_1773275565070&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:45.080 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:45.080 | INFO | api.base_api:get:20 - GET /api/roles/check-name - Params: {&#x27;name&#x27;: &#x27;TEST_ROLE_1773275565070&#x27;}\n2026-03-12 08:32:45.091 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_role.py::TestRole::test_check_name_exists_false": [{"extras": [], "result": "Passed", "testId": "tests/test_role.py::TestRole::test_check_name_exists_false", "duration": "416 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_role.py::TestRole::test_check_name_exists_false</td>", "<td class=\"col-duration\">416 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:45.511 | INFO | api.base_api:get:20 - GET /api/roles/check-name - Params: {&#x27;name&#x27;: &#x27;NONEXISTENT_ROLE&#x27;}\n2026-03-12 08:32:45.518 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_role.py::TestRole::test_get_roles_by_page_success": [{"extras": [], "result": "Passed", "testId": "tests/test_role.py::TestRole::test_get_roles_by_page_success", "duration": "485 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_role.py::TestRole::test_get_roles_by_page_success</td>", "<td class=\"col-duration\">485 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:45.922 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;testrole_1773275565922_0&#x27;, &#x27;roleKey&#x27;: &#x27;testrole_1773275565922_0&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:45.931 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:45.931 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;testrole_1773275565931_1&#x27;, &#x27;roleKey&#x27;: &#x27;testrole_1773275565931_1&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:45.936 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:45.936 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;testrole_1773275565936_2&#x27;, &#x27;roleKey&#x27;: &#x27;testrole_1773275565936_2&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:45.942 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:45.942 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;testrole_1773275565942_3&#x27;, &#x27;roleKey&#x27;: &#x27;testrole_1773275565942_3&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:45.947 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:45.947 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;testrole_1773275565947_4&#x27;, &#x27;roleKey&#x27;: &#x27;testrole_1773275565947_4&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:45.951 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:45.951 | INFO | api.base_api:get:20 - GET /api/roles/page - Params: {&#x27;page&#x27;: 0, &#x27;size&#x27;: 10, &#x27;sort&#x27;: &#x27;id&#x27;, &#x27;order&#x27;: &#x27;asc&#x27;}\n2026-03-12 08:32:45.973 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_role.py::TestRole::test_get_roles_by_page_with_sort": [{"extras": [], "result": "Passed", "testId": "tests/test_role.py::TestRole::test_get_roles_by_page_with_sort", "duration": "446 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_role.py::TestRole::test_get_roles_by_page_with_sort</td>", "<td class=\"col-duration\">446 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:46.407 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;role_a_1773275566407&#x27;, &#x27;roleKey&#x27;: &#x27;role_a_1773275566407&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:46.430 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:46.430 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;role_b_1773275566430&#x27;, &#x27;roleKey&#x27;: &#x27;role_b_1773275566430&#x27;, &#x27;roleSort&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:46.434 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:46.434 | INFO | api.base_api:get:20 - GET /api/roles/page - Params: {&#x27;page&#x27;: 0, &#x27;size&#x27;: 10, &#x27;sort&#x27;: &#x27;roleName&#x27;, &#x27;order&#x27;: &#x27;asc&#x27;}\n2026-03-12 08:32:46.440 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_role.py::TestRole::test_get_roles_by_page_with_search": [{"extras": [], "result": "Passed", "testId": "tests/test_role.py::TestRole::test_get_roles_by_page_with_search", "duration": "429 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_role.py::TestRole::test_get_roles_by_page_with_search</td>", "<td class=\"col-duration\">429 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:46.847 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;search_test_role_1773275566847&#x27;, &#x27;roleKey&#x27;: &#x27;search_test_role_1773275566847&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:46.854 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:46.854 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;other_role_1773275566854&#x27;, &#x27;roleKey&#x27;: &#x27;other_role_1773275566854&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:46.859 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:46.859 | INFO | api.base_api:get:20 - GET /api/roles/page - Params: {&#x27;page&#x27;: 0, &#x27;size&#x27;: 10, &#x27;sort&#x27;: &#x27;id&#x27;, &#x27;order&#x27;: &#x27;asc&#x27;, &#x27;keyword&#x27;: &#x27;search&#x27;}\n2026-03-12 08:32:46.871 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_role.py::TestRole::test_get_role_count_success": [{"extras": [], "result": "Passed", "testId": "tests/test_role.py::TestRole::test_get_role_count_success", "duration": "447 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_role.py::TestRole::test_get_role_count_success</td>", "<td class=\"col-duration\">447 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:47.308 | INFO | api.base_api:get:20 - GET /api/roles/count - Params: None\n2026-03-12 08:32:47.316 | INFO | api.base_api:get:22 - Response: 200\n2026-03-12 08:32:47.316 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;TEST_ROLE_1773275567307&#x27;, &#x27;roleKey&#x27;: &#x27;test_role_1773275567307&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:47.321 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:47.321 | INFO | api.base_api:get:20 - GET /api/roles/count - Params: None\n2026-03-12 08:32:47.325 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_role.py::TestRole::test_get_roles_by_page_with_different_page_sizes": [{"extras": [], "result": "Passed", "testId": "tests/test_role.py::TestRole::test_get_roles_by_page_with_different_page_sizes", "duration": "562 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_role.py::TestRole::test_get_roles_by_page_with_different_page_sizes</td>", "<td class=\"col-duration\">562 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:47.735 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagesize_test_1773275567735_0&#x27;, &#x27;roleKey&#x27;: &#x27;pagesize_test_1773275567735_0&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:47.740 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:47.740 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagesize_test_1773275567740_1&#x27;, &#x27;roleKey&#x27;: &#x27;pagesize_test_1773275567740_1&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:47.744 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:47.745 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagesize_test_1773275567745_2&#x27;, &#x27;roleKey&#x27;: &#x27;pagesize_test_1773275567745_2&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:47.749 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:47.749 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagesize_test_1773275567749_3&#x27;, &#x27;roleKey&#x27;: &#x27;pagesize_test_1773275567749_3&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:47.753 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:47.753 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagesize_test_1773275567753_4&#x27;, &#x27;roleKey&#x27;: &#x27;pagesize_test_1773275567753_4&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:47.757 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:47.757 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagesize_test_1773275567757_5&#x27;, &#x27;roleKey&#x27;: &#x27;pagesize_test_1773275567757_5&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:47.760 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:47.760 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagesize_test_1773275567760_6&#x27;, &#x27;roleKey&#x27;: &#x27;pagesize_test_1773275567760_6&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:47.764 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:47.764 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagesize_test_1773275567764_7&#x27;, &#x27;roleKey&#x27;: &#x27;pagesize_test_1773275567764_7&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:47.768 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:47.768 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagesize_test_1773275567768_8&#x27;, &#x27;roleKey&#x27;: &#x27;pagesize_test_1773275567768_8&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:47.772 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:47.772 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagesize_test_1773275567772_9&#x27;, &#x27;roleKey&#x27;: &#x27;pagesize_test_1773275567772_9&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:47.777 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:47.777 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagesize_test_1773275567777_10&#x27;, &#x27;roleKey&#x27;: &#x27;pagesize_test_1773275567777_10&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:47.781 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:47.781 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagesize_test_1773275567781_11&#x27;, &#x27;roleKey&#x27;: &#x27;pagesize_test_1773275567781_11&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:47.785 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:47.785 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagesize_test_1773275567785_12&#x27;, &#x27;roleKey&#x27;: &#x27;pagesize_test_1773275567785_12&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:47.789 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:47.789 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagesize_test_1773275567789_13&#x27;, &#x27;roleKey&#x27;: &#x27;pagesize_test_1773275567789_13&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:47.793 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:47.793 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagesize_test_1773275567793_14&#x27;, &#x27;roleKey&#x27;: &#x27;pagesize_test_1773275567793_14&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:47.796 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:47.796 | INFO | api.base_api:get:20 - GET /api/roles/page - Params: {&#x27;page&#x27;: 0, &#x27;size&#x27;: 10, &#x27;sort&#x27;: &#x27;id&#x27;, &#x27;order&#x27;: &#x27;asc&#x27;}\n2026-03-12 08:32:47.803 | INFO | api.base_api:get:22 - Response: 200\n2026-03-12 08:32:47.803 | INFO | api.base_api:get:20 - GET /api/roles/page - Params: {&#x27;page&#x27;: 0, &#x27;size&#x27;: 5, &#x27;sort&#x27;: &#x27;id&#x27;, &#x27;order&#x27;: &#x27;asc&#x27;}\n2026-03-12 08:32:47.810 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_role.py::TestRole::test_get_roles_by_page_with_page_navigation": [{"extras": [], "result": "Passed", "testId": "tests/test_role.py::TestRole::test_get_roles_by_page_with_page_navigation", "duration": "651 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_role.py::TestRole::test_get_roles_by_page_with_page_navigation</td>", "<td class=\"col-duration\">651 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:48.302 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568302_0&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568302_0&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.308 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.308 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568308_1&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568308_1&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.313 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.313 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568313_2&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568313_2&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.316 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.316 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568316_3&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568316_3&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.321 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.321 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568321_4&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568321_4&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.326 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.326 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568326_5&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568326_5&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.329 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.330 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568330_6&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568330_6&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.333 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.333 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568333_7&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568333_7&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.336 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.336 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568336_8&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568336_8&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.339 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.339 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568339_9&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568339_9&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.342 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.342 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568342_10&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568342_10&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.346 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.346 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568346_11&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568346_11&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.350 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.350 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568350_12&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568350_12&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.354 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.354 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568354_13&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568354_13&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.358 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.358 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568358_14&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568358_14&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.363 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.363 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568363_15&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568363_15&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.366 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.367 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568367_16&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568367_16&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.370 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.370 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568370_17&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568370_17&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.374 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.374 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568374_18&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568374_18&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.377 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.377 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568377_19&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568377_19&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.381 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.381 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568381_20&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568381_20&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.384 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.384 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568384_21&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568384_21&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.388 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.388 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568388_22&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568388_22&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.393 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.393 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568393_23&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568393_23&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.397 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.397 | INFO | api.base_api:post:28 - POST /api/roles - Data: None - JSON: {&#x27;roleName&#x27;: &#x27;pagination_test_1773275568397_24&#x27;, &#x27;roleKey&#x27;: &#x27;pagination_test_1773275568397_24&#x27;, &#x27;roleSort&#x27;: 1, &#x27;status&#x27;: 1}\n2026-03-12 08:32:48.402 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:48.402 | INFO | api.base_api:get:20 - GET /api/roles/page - Params: {&#x27;page&#x27;: 0, &#x27;size&#x27;: 10, &#x27;sort&#x27;: &#x27;id&#x27;, &#x27;order&#x27;: &#x27;asc&#x27;}\n2026-03-12 08:32:48.407 | INFO | api.base_api:get:22 - Response: 200\n2026-03-12 08:32:48.407 | INFO | api.base_api:get:20 - GET /api/roles/page - Params: {&#x27;page&#x27;: 1, &#x27;size&#x27;: 10, &#x27;sort&#x27;: &#x27;id&#x27;, &#x27;order&#x27;: &#x27;asc&#x27;}\n2026-03-12 08:32:48.411 | INFO | api.base_api:get:22 - Response: 200\n2026-03-12 08:32:48.411 | INFO | api.base_api:get:20 - GET /api/roles/page - Params: {&#x27;page&#x27;: 2, &#x27;size&#x27;: 10, &#x27;sort&#x27;: &#x27;id&#x27;, &#x27;order&#x27;: &#x27;asc&#x27;}\n2026-03-12 08:32:48.416 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_user.py::TestUser::test_create_user_success": [{"extras": [], "result": "Passed", "testId": "tests/test_user.py::TestUser::test_create_user_success", "duration": "506 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_user.py::TestUser::test_create_user_success</td>", "<td class=\"col-duration\">506 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stdout call -----------------------------\nResponse status: 201\nResponse text: {&quot;id&quot;:722,&quot;createdAt&quot;:&quot;2026-03-12T08:32:49.043536&quot;,&quot;updatedAt&quot;:null,&quot;deletedAt&quot;:null,&quot;username&quot;:&quot;testuser_1773275568947&quot;,&quot;password&quot;:&quot;$2a$10$ourZAqK4XMZKZZK/sE5UN.Z7AS0yD78t/n1kkIJ.tW4PNxAp8/N9.&quot;,&quot;email&quot;:&quot;test_1773275568947@example.com&quot;,&quot;roleId&quot;:2,&quot;status&quot;:1}\n\n----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:48.948 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;testuser_1773275568947&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;test_1773275568947@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:49.048 | INFO | api.base_api:post:30 - Response: 201\n"}], "tests/test_user.py::TestUser::test_create_user_duplicate_username": [{"extras": [], "result": "Passed", "testId": "tests/test_user.py::TestUser::test_create_user_duplicate_username", "duration": "604 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_user.py::TestUser::test_create_user_duplicate_username</td>", "<td class=\"col-duration\">604 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:49.459 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;testuser_1773275569459&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;test_1773275569459@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:49.560 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:49.560 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;testuser_1773275569459&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;test_1773275569459@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:49.660 | INFO | api.base_api:post:30 - Response: 409\n"}], "tests/test_user.py::TestUser::test_get_user_by_id_success": [{"extras": [], "result": "Passed", "testId": "tests/test_user.py::TestUser::test_get_user_by_id_success", "duration": "511 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_user.py::TestUser::test_get_user_by_id_success</td>", "<td class=\"col-duration\">511 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:50.067 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;testuser_1773275570066&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;test_1773275570066@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:50.164 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:50.164 | INFO | api.base_api:get:20 - GET /api/users/725 - Params: None\n2026-03-12 08:32:50.168 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_user.py::TestUser::test_get_user_by_id_not_found": [{"extras": [], "result": "Passed", "testId": "tests/test_user.py::TestUser::test_get_user_by_id_not_found", "duration": "409 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_user.py::TestUser::test_get_user_by_id_not_found</td>", "<td class=\"col-duration\">409 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:50.578 | INFO | api.base_api:get:20 - GET /api/users/999999 - Params: None\n2026-03-12 08:32:50.583 | INFO | api.base_api:get:22 - Response: 404\n"}], "tests/test_user.py::TestUser::test_get_all_users_success": [{"extras": [], "result": "Passed", "testId": "tests/test_user.py::TestUser::test_get_all_users_success", "duration": "421 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_user.py::TestUser::test_get_all_users_success</td>", "<td class=\"col-duration\">421 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:50.984 | INFO | api.base_api:get:20 - GET /api/users - Params: {&#x27;includeDeleted&#x27;: False}\n2026-03-12 08:32:51.003 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_user.py::TestUser::test_update_user_success": [{"extras": [], "result": "Passed", "testId": "tests/test_user.py::TestUser::test_update_user_success", "duration": "521 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_user.py::TestUser::test_update_user_success</td>", "<td class=\"col-duration\">521 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:51.409 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;testuser_1773275571408&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;test_1773275571408@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:51.511 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:51.511 | INFO | api.base_api:put:36 - PUT /api/users/726 - Data: None - JSON: {&#x27;email&#x27;: &#x27;updated@example.com&#x27;}\n2026-03-12 08:32:51.522 | INFO | api.base_api:put:38 - Response: 200\n"}], "tests/test_user.py::TestUser::test_delete_user_success": [{"extras": [], "result": "Passed", "testId": "tests/test_user.py::TestUser::test_delete_user_success", "duration": "509 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_user.py::TestUser::test_delete_user_success</td>", "<td class=\"col-duration\">509 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:51.928 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;testuser_1773275571927&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;test_1773275571927@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:52.033 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:52.033 | INFO | api.base_api:delete:44 - DELETE /api/users/727\n2026-03-12 08:32:52.039 | INFO | api.base_api:delete:46 - Response: 204\n"}], "tests/test_user.py::TestUser::test_logical_delete_user_success": [{"extras": [], "result": "Passed", "testId": "tests/test_user.py::TestUser::test_logical_delete_user_success", "duration": "592 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_user.py::TestUser::test_logical_delete_user_success</td>", "<td class=\"col-duration\">592 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:52.478 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;testuser_1773275572475&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;test_1773275572475@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:52.578 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:52.578 | INFO | api.base_api:delete:44 - DELETE /api/users/728/logical\n2026-03-12 08:32:52.584 | INFO | api.base_api:delete:46 - Response: 204\n2026-03-12 08:32:52.584 | INFO | api.base_api:get:20 - GET /api/users/728 - Params: None\n2026-03-12 08:32:52.588 | INFO | api.base_api:get:22 - Response: 404\n2026-03-12 08:32:52.588 | INFO | api.base_api:get:20 - GET /api/users - Params: {&#x27;includeDeleted&#x27;: True}\n2026-03-12 08:32:52.623 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_user.py::TestUser::test_restore_user_success": [{"extras": [], "result": "Passed", "testId": "tests/test_user.py::TestUser::test_restore_user_success", "duration": "517 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_user.py::TestUser::test_restore_user_success</td>", "<td class=\"col-duration\">517 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:53.035 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;testuser_1773275573034&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;test_1773275573034@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:53.133 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:53.133 | INFO | api.base_api:delete:44 - DELETE /api/users/729/logical\n2026-03-12 08:32:53.138 | INFO | api.base_api:delete:46 - Response: 204\n2026-03-12 08:32:53.138 | INFO | api.base_api:post:28 - POST /api/users/729/restore - Data: None - JSON: None\n2026-03-12 08:32:53.143 | INFO | api.base_api:post:30 - Response: 204\n2026-03-12 08:32:53.143 | INFO | api.base_api:get:20 - GET /api/users/729 - Params: None\n2026-03-12 08:32:53.146 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_user.py::TestUser::test_check_username_exists_true": [{"extras": [], "result": "Passed", "testId": "tests/test_user.py::TestUser::test_check_username_exists_true", "duration": "514 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_user.py::TestUser::test_check_username_exists_true</td>", "<td class=\"col-duration\">514 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:53.552 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;testuser_1773275573551&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;test_1773275573551@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:53.652 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:53.652 | INFO | api.base_api:get:20 - GET /api/users/check/username - Params: {&#x27;username&#x27;: &#x27;testuser_1773275573551&#x27;}\n2026-03-12 08:32:53.660 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_user.py::TestUser::test_check_username_exists_false": [{"extras": [], "result": "Passed", "testId": "tests/test_user.py::TestUser::test_check_username_exists_false", "duration": "398 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_user.py::TestUser::test_check_username_exists_false</td>", "<td class=\"col-duration\">398 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:54.061 | INFO | api.base_api:get:20 - GET /api/users/check/username - Params: {&#x27;username&#x27;: &#x27;nonexistent_user&#x27;}\n2026-03-12 08:32:54.066 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_user.py::TestUser::test_check_email_exists_true": [{"extras": [], "result": "Passed", "testId": "tests/test_user.py::TestUser::test_check_email_exists_true", "duration": "580 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_user.py::TestUser::test_check_email_exists_true</td>", "<td class=\"col-duration\">580 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:54.473 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;testuser_1773275574471&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;test_1773275574471@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:54.637 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:54.637 | INFO | api.base_api:get:20 - GET /api/users/check/email - Params: {&#x27;email&#x27;: &#x27;test_1773275574471@example.com&#x27;}\n2026-03-12 08:32:54.643 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_user.py::TestUser::test_check_email_exists_false": [{"extras": [], "result": "Passed", "testId": "tests/test_user.py::TestUser::test_check_email_exists_false", "duration": "401 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_user.py::TestUser::test_check_email_exists_false</td>", "<td class=\"col-duration\">401 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:55.045 | INFO | api.base_api:get:20 - GET /api/users/check/email - Params: {&#x27;email&#x27;: &#x27;nonexistent@example.com&#x27;}\n2026-03-12 08:32:55.050 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_user.py::TestUser::test_get_users_by_page_success": [{"extras": [], "result": "Passed", "testId": "tests/test_user.py::TestUser::test_get_users_by_page_success", "duration": "924 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_user.py::TestUser::test_get_users_by_page_success</td>", "<td class=\"col-duration\">924 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:55.447 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;testuser_1773275575447_0&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;testuser_1773275575447_0@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:55.545 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:55.546 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;testuser_1773275575447_1&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;testuser_1773275575447_1@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:55.642 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:55.642 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;testuser_1773275575447_2&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;testuser_1773275575447_2@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:55.747 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:55.747 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;testuser_1773275575447_3&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;testuser_1773275575447_3@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:55.843 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:55.843 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;testuser_1773275575447_4&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;testuser_1773275575447_4@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:55.940 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:55.940 | INFO | api.base_api:get:20 - GET /api/users/page - Params: {&#x27;page&#x27;: 0, &#x27;size&#x27;: 10, &#x27;sort&#x27;: &#x27;id&#x27;, &#x27;order&#x27;: &#x27;asc&#x27;}\n2026-03-12 08:32:55.954 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_user.py::TestUser::test_get_users_by_page_with_sort": [{"extras": [], "result": "Passed", "testId": "tests/test_user.py::TestUser::test_get_users_by_page_with_sort", "duration": "606 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_user.py::TestUser::test_get_users_by_page_with_sort</td>", "<td class=\"col-duration\">606 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:56.371 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;user_a_1773275576371&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;user_a_1773275576371@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:56.469 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:56.469 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;user_b_1773275576371&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;user_b_1773275576371@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:56.567 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:56.567 | INFO | api.base_api:get:20 - GET /api/users/page - Params: {&#x27;page&#x27;: 0, &#x27;size&#x27;: 10, &#x27;sort&#x27;: &#x27;username&#x27;, &#x27;order&#x27;: &#x27;asc&#x27;}\n2026-03-12 08:32:56.572 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_user.py::TestUser::test_get_users_by_page_with_search": [{"extras": [], "result": "Passed", "testId": "tests/test_user.py::TestUser::test_get_users_by_page_with_search", "duration": "654 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_user.py::TestUser::test_get_users_by_page_with_search</td>", "<td class=\"col-duration\">654 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:56.983 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;search_test_user_1773275576983&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;search_test_1773275576983@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:57.094 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:57.094 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;other_user_1773275576983&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;other_1773275576983@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:57.213 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:57.213 | INFO | api.base_api:get:20 - GET /api/users/page - Params: {&#x27;page&#x27;: 0, &#x27;size&#x27;: 10, &#x27;sort&#x27;: &#x27;id&#x27;, &#x27;order&#x27;: &#x27;asc&#x27;, &#x27;keyword&#x27;: &#x27;search&#x27;}\n2026-03-12 08:32:57.224 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_user.py::TestUser::test_get_user_count_success": [{"extras": [], "result": "Passed", "testId": "tests/test_user.py::TestUser::test_get_user_count_success", "duration": "671 ms", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_user.py::TestUser::test_get_user_count_success</td>", "<td class=\"col-duration\">671 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:57.704 | INFO | api.base_api:get:20 - GET /api/users/count - Params: None\n2026-03-12 08:32:57.729 | INFO | api.base_api:get:22 - Response: 200\n2026-03-12 08:32:57.729 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;testuser_1773275577701&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;test_1773275577701@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:57.883 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:57.883 | INFO | api.base_api:get:20 - GET /api/users/count - Params: None\n2026-03-12 08:32:57.893 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_user.py::TestUser::test_get_users_by_page_with_different_page_sizes": [{"extras": [], "result": "Passed", "testId": "tests/test_user.py::TestUser::test_get_users_by_page_with_different_page_sizes", "duration": "00:00:02", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_user.py::TestUser::test_get_users_by_page_with_different_page_sizes</td>", "<td class=\"col-duration\">00:00:02</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:32:58.349 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagesize_test_1773275578349_0&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagesize_test_1773275578349_0@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:58.464 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:58.464 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagesize_test_1773275578349_1&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagesize_test_1773275578349_1@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:58.580 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:58.580 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagesize_test_1773275578349_2&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagesize_test_1773275578349_2@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:58.677 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:58.677 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagesize_test_1773275578349_3&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagesize_test_1773275578349_3@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:58.778 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:58.779 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagesize_test_1773275578349_4&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagesize_test_1773275578349_4@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:58.889 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:58.889 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagesize_test_1773275578349_5&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagesize_test_1773275578349_5@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:58.999 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:58.999 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagesize_test_1773275578349_6&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagesize_test_1773275578349_6@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:59.102 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:59.102 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagesize_test_1773275578349_7&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagesize_test_1773275578349_7@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:59.200 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:59.200 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagesize_test_1773275578349_8&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagesize_test_1773275578349_8@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:59.358 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:59.359 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagesize_test_1773275578349_9&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagesize_test_1773275578349_9@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:59.495 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:59.495 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagesize_test_1773275578349_10&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagesize_test_1773275578349_10@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:59.610 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:59.610 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagesize_test_1773275578349_11&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagesize_test_1773275578349_11@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:59.719 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:59.719 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagesize_test_1773275578349_12&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagesize_test_1773275578349_12@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:59.819 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:59.819 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagesize_test_1773275578349_13&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagesize_test_1773275578349_13@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:32:59.915 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:32:59.915 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagesize_test_1773275578349_14&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagesize_test_1773275578349_14@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:00.014 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:00.014 | INFO | api.base_api:get:20 - GET /api/users/page - Params: {&#x27;page&#x27;: 0, &#x27;size&#x27;: 10, &#x27;sort&#x27;: &#x27;id&#x27;, &#x27;order&#x27;: &#x27;asc&#x27;}\n2026-03-12 08:33:00.020 | INFO | api.base_api:get:22 - Response: 200\n2026-03-12 08:33:00.020 | INFO | api.base_api:get:20 - GET /api/users/page - Params: {&#x27;page&#x27;: 0, &#x27;size&#x27;: 5, &#x27;sort&#x27;: &#x27;id&#x27;, &#x27;order&#x27;: &#x27;asc&#x27;}\n2026-03-12 08:33:00.025 | INFO | api.base_api:get:22 - Response: 200\n"}], "tests/test_user.py::TestUser::test_get_users_by_page_with_page_navigation": [{"extras": [], "result": "Passed", "testId": "tests/test_user.py::TestUser::test_get_users_by_page_with_page_navigation", "duration": "00:00:03", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">tests/test_user.py::TestUser::test_get_users_by_page_with_page_navigation</td>", "<td class=\"col-duration\">00:00:03</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stderr call -----------------------------\n2026-03-12 08:33:00.508 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_0&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_0@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:00.610 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:00.610 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_1&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_1@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:00.708 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:00.708 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_2&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_2@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:00.942 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:00.942 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_3&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_3@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:01.044 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:01.044 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_4&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_4@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:01.143 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:01.144 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_5&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_5@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:01.241 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:01.241 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_6&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_6@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:01.337 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:01.337 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_7&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_7@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:01.434 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:01.434 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_8&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_8@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:01.530 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:01.530 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_9&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_9@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:01.625 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:01.626 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_10&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_10@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:01.725 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:01.725 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_11&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_11@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:01.823 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:01.823 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_12&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_12@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:01.925 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:01.925 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_13&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_13@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:02.029 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:02.029 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_14&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_14@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:02.128 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:02.128 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_15&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_15@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:02.228 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:02.228 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_16&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_16@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:02.327 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:02.327 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_17&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_17@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:02.426 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:02.426 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_18&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_18@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:02.527 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:02.527 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_19&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_19@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:02.630 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:02.630 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_20&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_20@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:02.726 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:02.726 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_21&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_21@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:02.824 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:02.824 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_22&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_22@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:02.934 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:02.934 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_23&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_23@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:03.041 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:03.041 | INFO | api.base_api:post:28 - POST /api/users - Data: None - JSON: {&#x27;username&#x27;: &#x27;pagination_test_1773275580507_24&#x27;, &#x27;password&#x27;: &#x27;password123&#x27;, &#x27;email&#x27;: &#x27;pagination_test_1773275580507_24@example.com&#x27;, &#x27;roleId&#x27;: 2, &#x27;status&#x27;: 1}\n2026-03-12 08:33:03.142 | INFO | api.base_api:post:30 - Response: 201\n2026-03-12 08:33:03.142 | INFO | api.base_api:get:20 - GET /api/users/page - Params: {&#x27;page&#x27;: 0, &#x27;size&#x27;: 10, &#x27;sort&#x27;: &#x27;id&#x27;, &#x27;order&#x27;: &#x27;asc&#x27;}\n2026-03-12 08:33:03.148 | INFO | api.base_api:get:22 - Response: 200\n2026-03-12 08:33:03.148 | INFO | api.base_api:get:20 - GET /api/users/page - Params: {&#x27;page&#x27;: 1, &#x27;size&#x27;: 10, &#x27;sort&#x27;: &#x27;id&#x27;, &#x27;order&#x27;: &#x27;asc&#x27;}\n2026-03-12 08:33:03.152 | INFO | api.base_api:get:22 - Response: 200\n2026-03-12 08:33:03.152 | INFO | api.base_api:get:20 - GET /api/users/page - Params: {&#x27;page&#x27;: 2, &#x27;size&#x27;: 10, &#x27;sort&#x27;: &#x27;id&#x27;, &#x27;order&#x27;: &#x27;asc&#x27;}\n2026-03-12 08:33:03.156 | INFO | api.base_api:get:22 - Response: 200\n"}]}, "renderCollapsed": ["passed"], "initialSort": "result", "title": "e2e_report.html"}"></div>
|
|
<script>
|
|
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
|
|
const { getCollapsedCategory, setCollapsedIds } = require('./storage.js')
|
|
|
|
class DataManager {
|
|
setManager(data) {
|
|
const collapsedCategories = [...getCollapsedCategory(data.renderCollapsed)]
|
|
const collapsedIds = []
|
|
const tests = Object.values(data.tests).flat().map((test, index) => {
|
|
const collapsed = collapsedCategories.includes(test.result.toLowerCase())
|
|
const id = `test_${index}`
|
|
if (collapsed) {
|
|
collapsedIds.push(id)
|
|
}
|
|
return {
|
|
...test,
|
|
id,
|
|
collapsed,
|
|
}
|
|
})
|
|
const dataBlob = { ...data, tests }
|
|
this.data = { ...dataBlob }
|
|
this.renderData = { ...dataBlob }
|
|
setCollapsedIds(collapsedIds)
|
|
}
|
|
|
|
get allData() {
|
|
return { ...this.data }
|
|
}
|
|
|
|
resetRender() {
|
|
this.renderData = { ...this.data }
|
|
}
|
|
|
|
setRender(data) {
|
|
this.renderData.tests = [...data]
|
|
}
|
|
|
|
toggleCollapsedItem(id) {
|
|
this.renderData.tests = this.renderData.tests.map((test) =>
|
|
test.id === id ? { ...test, collapsed: !test.collapsed } : test,
|
|
)
|
|
}
|
|
|
|
set allCollapsed(collapsed) {
|
|
this.renderData = { ...this.renderData, tests: [...this.renderData.tests.map((test) => (
|
|
{ ...test, collapsed }
|
|
))] }
|
|
}
|
|
|
|
get testSubset() {
|
|
return [...this.renderData.tests]
|
|
}
|
|
|
|
get environment() {
|
|
return this.renderData.environment
|
|
}
|
|
|
|
get initialSort() {
|
|
return this.data.initialSort
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
manager: new DataManager(),
|
|
}
|
|
|
|
},{"./storage.js":8}],2:[function(require,module,exports){
|
|
const mediaViewer = require('./mediaviewer.js')
|
|
const templateEnvRow = document.getElementById('template_environment_row')
|
|
const templateResult = document.getElementById('template_results-table__tbody')
|
|
|
|
function htmlToElements(html) {
|
|
const temp = document.createElement('template')
|
|
temp.innerHTML = html
|
|
return temp.content.childNodes
|
|
}
|
|
|
|
const find = (selector, elem) => {
|
|
if (!elem) {
|
|
elem = document
|
|
}
|
|
return elem.querySelector(selector)
|
|
}
|
|
|
|
const findAll = (selector, elem) => {
|
|
if (!elem) {
|
|
elem = document
|
|
}
|
|
return [...elem.querySelectorAll(selector)]
|
|
}
|
|
|
|
const dom = {
|
|
getStaticRow: (key, value) => {
|
|
const envRow = templateEnvRow.content.cloneNode(true)
|
|
const isObj = typeof value === 'object' && value !== null
|
|
const values = isObj ? Object.keys(value).map((k) => `${k}: ${value[k]}`) : null
|
|
|
|
const valuesElement = htmlToElements(
|
|
values ? `<ul>${values.map((val) => `<li>${val}</li>`).join('')}<ul>` : `<div>${value}</div>`)[0]
|
|
const td = findAll('td', envRow)
|
|
td[0].textContent = key
|
|
td[1].appendChild(valuesElement)
|
|
|
|
return envRow
|
|
},
|
|
getResultTBody: ({ testId, id, log, extras, resultsTableRow, tableHtml, result, collapsed }) => {
|
|
const resultBody = templateResult.content.cloneNode(true)
|
|
resultBody.querySelector('tbody').classList.add(result.toLowerCase())
|
|
resultBody.querySelector('tbody').id = testId
|
|
resultBody.querySelector('.collapsible').dataset.id = id
|
|
|
|
resultsTableRow.forEach((html) => {
|
|
const t = document.createElement('template')
|
|
t.innerHTML = html
|
|
resultBody.querySelector('.collapsible').appendChild(t.content)
|
|
})
|
|
|
|
if (log) {
|
|
// Wrap lines starting with "E" with span.error to color those lines red
|
|
const wrappedLog = log.replace(/^E.*$/gm, (match) => `<span class="error">${match}</span>`)
|
|
resultBody.querySelector('.log').innerHTML = wrappedLog
|
|
} else {
|
|
resultBody.querySelector('.log').remove()
|
|
}
|
|
|
|
if (collapsed) {
|
|
resultBody.querySelector('.collapsible > td')?.classList.add('collapsed')
|
|
resultBody.querySelector('.extras-row').classList.add('hidden')
|
|
} else {
|
|
resultBody.querySelector('.collapsible > td')?.classList.remove('collapsed')
|
|
}
|
|
|
|
const media = []
|
|
extras?.forEach(({ name, format_type, content }) => {
|
|
if (['image', 'video'].includes(format_type)) {
|
|
media.push({ path: content, name, format_type })
|
|
}
|
|
|
|
if (format_type === 'html') {
|
|
resultBody.querySelector('.extraHTML').insertAdjacentHTML('beforeend', `<div>${content}</div>`)
|
|
}
|
|
})
|
|
mediaViewer.setup(resultBody, media)
|
|
|
|
// Add custom html from the pytest_html_results_table_html hook
|
|
tableHtml?.forEach((item) => {
|
|
resultBody.querySelector('td[class="extra"]').insertAdjacentHTML('beforeend', item)
|
|
})
|
|
|
|
return resultBody
|
|
},
|
|
}
|
|
|
|
module.exports = {
|
|
dom,
|
|
htmlToElements,
|
|
find,
|
|
findAll,
|
|
}
|
|
|
|
},{"./mediaviewer.js":6}],3:[function(require,module,exports){
|
|
const { manager } = require('./datamanager.js')
|
|
const { doSort } = require('./sort.js')
|
|
const storageModule = require('./storage.js')
|
|
|
|
const getFilteredSubSet = (filter) =>
|
|
manager.allData.tests.filter(({ result }) => filter.includes(result.toLowerCase()))
|
|
|
|
const doInitFilter = () => {
|
|
const currentFilter = storageModule.getVisible()
|
|
const filteredSubset = getFilteredSubSet(currentFilter)
|
|
manager.setRender(filteredSubset)
|
|
}
|
|
|
|
const doFilter = (type, show) => {
|
|
if (show) {
|
|
storageModule.showCategory(type)
|
|
} else {
|
|
storageModule.hideCategory(type)
|
|
}
|
|
|
|
const currentFilter = storageModule.getVisible()
|
|
const filteredSubset = getFilteredSubSet(currentFilter)
|
|
manager.setRender(filteredSubset)
|
|
|
|
const sortColumn = storageModule.getSort()
|
|
doSort(sortColumn, true)
|
|
}
|
|
|
|
module.exports = {
|
|
doFilter,
|
|
doInitFilter,
|
|
}
|
|
|
|
},{"./datamanager.js":1,"./sort.js":7,"./storage.js":8}],4:[function(require,module,exports){
|
|
const { redraw, bindEvents, renderStatic } = require('./main.js')
|
|
const { doInitFilter } = require('./filter.js')
|
|
const { doInitSort } = require('./sort.js')
|
|
const { manager } = require('./datamanager.js')
|
|
const data = JSON.parse(document.getElementById('data-container').dataset.jsonblob)
|
|
|
|
function init() {
|
|
manager.setManager(data)
|
|
doInitFilter()
|
|
doInitSort()
|
|
renderStatic()
|
|
redraw()
|
|
bindEvents()
|
|
}
|
|
|
|
init()
|
|
|
|
},{"./datamanager.js":1,"./filter.js":3,"./main.js":5,"./sort.js":7}],5:[function(require,module,exports){
|
|
const { dom, find, findAll } = require('./dom.js')
|
|
const { manager } = require('./datamanager.js')
|
|
const { doSort } = require('./sort.js')
|
|
const { doFilter } = require('./filter.js')
|
|
const {
|
|
getVisible,
|
|
getCollapsedIds,
|
|
setCollapsedIds,
|
|
getSort,
|
|
getSortDirection,
|
|
possibleFilters,
|
|
} = require('./storage.js')
|
|
|
|
const removeChildren = (node) => {
|
|
while (node.firstChild) {
|
|
node.removeChild(node.firstChild)
|
|
}
|
|
}
|
|
|
|
const renderStatic = () => {
|
|
const renderEnvironmentTable = () => {
|
|
const environment = manager.environment
|
|
const rows = Object.keys(environment).map((key) => dom.getStaticRow(key, environment[key]))
|
|
const table = document.getElementById('environment')
|
|
removeChildren(table)
|
|
rows.forEach((row) => table.appendChild(row))
|
|
}
|
|
renderEnvironmentTable()
|
|
}
|
|
|
|
const addItemToggleListener = (elem) => {
|
|
elem.addEventListener('click', ({ target }) => {
|
|
const id = target.parentElement.dataset.id
|
|
manager.toggleCollapsedItem(id)
|
|
|
|
const collapsedIds = getCollapsedIds()
|
|
if (collapsedIds.includes(id)) {
|
|
const updated = collapsedIds.filter((item) => item !== id)
|
|
setCollapsedIds(updated)
|
|
} else {
|
|
collapsedIds.push(id)
|
|
setCollapsedIds(collapsedIds)
|
|
}
|
|
redraw()
|
|
})
|
|
}
|
|
|
|
const renderContent = (tests) => {
|
|
const sortAttr = getSort(manager.initialSort)
|
|
const sortAsc = JSON.parse(getSortDirection())
|
|
const rows = tests.map(dom.getResultTBody)
|
|
const table = document.getElementById('results-table')
|
|
const tableHeader = document.getElementById('results-table-head')
|
|
|
|
const newTable = document.createElement('table')
|
|
newTable.id = 'results-table'
|
|
|
|
// remove all sorting classes and set the relevant
|
|
findAll('.sortable', tableHeader).forEach((elem) => elem.classList.remove('asc', 'desc'))
|
|
tableHeader.querySelector(`.sortable[data-column-type="${sortAttr}"]`)?.classList.add(sortAsc ? 'desc' : 'asc')
|
|
newTable.appendChild(tableHeader)
|
|
|
|
if (!rows.length) {
|
|
const emptyTable = document.getElementById('template_results-table__body--empty').content.cloneNode(true)
|
|
newTable.appendChild(emptyTable)
|
|
} else {
|
|
rows.forEach((row) => {
|
|
if (!!row) {
|
|
findAll('.collapsible td:not(.col-links', row).forEach(addItemToggleListener)
|
|
find('.logexpander', row).addEventListener('click',
|
|
(evt) => evt.target.parentNode.classList.toggle('expanded'),
|
|
)
|
|
newTable.appendChild(row)
|
|
}
|
|
})
|
|
}
|
|
|
|
table.replaceWith(newTable)
|
|
}
|
|
|
|
const renderDerived = () => {
|
|
const currentFilter = getVisible()
|
|
possibleFilters.forEach((result) => {
|
|
const input = document.querySelector(`input[data-test-result="${result}"]`)
|
|
input.checked = currentFilter.includes(result)
|
|
})
|
|
}
|
|
|
|
const bindEvents = () => {
|
|
const filterColumn = (evt) => {
|
|
const { target: element } = evt
|
|
const { testResult } = element.dataset
|
|
|
|
doFilter(testResult, element.checked)
|
|
const collapsedIds = getCollapsedIds()
|
|
const updated = manager.renderData.tests.map((test) => {
|
|
return {
|
|
...test,
|
|
collapsed: collapsedIds.includes(test.id),
|
|
}
|
|
})
|
|
manager.setRender(updated)
|
|
redraw()
|
|
}
|
|
|
|
const header = document.getElementById('environment-header')
|
|
header.addEventListener('click', () => {
|
|
const table = document.getElementById('environment')
|
|
table.classList.toggle('hidden')
|
|
header.classList.toggle('collapsed')
|
|
})
|
|
|
|
findAll('input[name="filter_checkbox"]').forEach((elem) => {
|
|
elem.addEventListener('click', filterColumn)
|
|
})
|
|
|
|
findAll('.sortable').forEach((elem) => {
|
|
elem.addEventListener('click', (evt) => {
|
|
const { target: element } = evt
|
|
const { columnType } = element.dataset
|
|
doSort(columnType)
|
|
redraw()
|
|
})
|
|
})
|
|
|
|
document.getElementById('show_all_details').addEventListener('click', () => {
|
|
manager.allCollapsed = false
|
|
setCollapsedIds([])
|
|
redraw()
|
|
})
|
|
document.getElementById('hide_all_details').addEventListener('click', () => {
|
|
manager.allCollapsed = true
|
|
const allIds = manager.renderData.tests.map((test) => test.id)
|
|
setCollapsedIds(allIds)
|
|
redraw()
|
|
})
|
|
}
|
|
|
|
const redraw = () => {
|
|
const { testSubset } = manager
|
|
|
|
renderContent(testSubset)
|
|
renderDerived()
|
|
}
|
|
|
|
module.exports = {
|
|
redraw,
|
|
bindEvents,
|
|
renderStatic,
|
|
}
|
|
|
|
},{"./datamanager.js":1,"./dom.js":2,"./filter.js":3,"./sort.js":7,"./storage.js":8}],6:[function(require,module,exports){
|
|
class MediaViewer {
|
|
constructor(assets) {
|
|
this.assets = assets
|
|
this.index = 0
|
|
}
|
|
|
|
nextActive() {
|
|
this.index = this.index === this.assets.length - 1 ? 0 : this.index + 1
|
|
return [this.activeFile, this.index]
|
|
}
|
|
|
|
prevActive() {
|
|
this.index = this.index === 0 ? this.assets.length - 1 : this.index -1
|
|
return [this.activeFile, this.index]
|
|
}
|
|
|
|
get currentIndex() {
|
|
return this.index
|
|
}
|
|
|
|
get activeFile() {
|
|
return this.assets[this.index]
|
|
}
|
|
}
|
|
|
|
|
|
const setup = (resultBody, assets) => {
|
|
if (!assets.length) {
|
|
resultBody.querySelector('.media').classList.add('hidden')
|
|
return
|
|
}
|
|
|
|
const mediaViewer = new MediaViewer(assets)
|
|
const container = resultBody.querySelector('.media-container')
|
|
const leftArrow = resultBody.querySelector('.media-container__nav--left')
|
|
const rightArrow = resultBody.querySelector('.media-container__nav--right')
|
|
const mediaName = resultBody.querySelector('.media__name')
|
|
const counter = resultBody.querySelector('.media__counter')
|
|
const imageEl = resultBody.querySelector('img')
|
|
const sourceEl = resultBody.querySelector('source')
|
|
const videoEl = resultBody.querySelector('video')
|
|
|
|
const setImg = (media, index) => {
|
|
if (media?.format_type === 'image') {
|
|
imageEl.src = media.path
|
|
|
|
imageEl.classList.remove('hidden')
|
|
videoEl.classList.add('hidden')
|
|
} else if (media?.format_type === 'video') {
|
|
sourceEl.src = media.path
|
|
|
|
videoEl.classList.remove('hidden')
|
|
imageEl.classList.add('hidden')
|
|
}
|
|
|
|
mediaName.innerText = media?.name
|
|
counter.innerText = `${index + 1} / ${assets.length}`
|
|
}
|
|
setImg(mediaViewer.activeFile, mediaViewer.currentIndex)
|
|
|
|
const moveLeft = () => {
|
|
const [media, index] = mediaViewer.prevActive()
|
|
setImg(media, index)
|
|
}
|
|
const doRight = () => {
|
|
const [media, index] = mediaViewer.nextActive()
|
|
setImg(media, index)
|
|
}
|
|
const openImg = () => {
|
|
window.open(mediaViewer.activeFile.path, '_blank')
|
|
}
|
|
if (assets.length === 1) {
|
|
container.classList.add('media-container--fullscreen')
|
|
} else {
|
|
leftArrow.addEventListener('click', moveLeft)
|
|
rightArrow.addEventListener('click', doRight)
|
|
}
|
|
imageEl.addEventListener('click', openImg)
|
|
}
|
|
|
|
module.exports = {
|
|
setup,
|
|
}
|
|
|
|
},{}],7:[function(require,module,exports){
|
|
const { manager } = require('./datamanager.js')
|
|
const storageModule = require('./storage.js')
|
|
|
|
const genericSort = (list, key, ascending, customOrder) => {
|
|
let sorted
|
|
if (customOrder) {
|
|
sorted = list.sort((a, b) => {
|
|
const aValue = a.result.toLowerCase()
|
|
const bValue = b.result.toLowerCase()
|
|
|
|
const aIndex = customOrder.findIndex((item) => item.toLowerCase() === aValue)
|
|
const bIndex = customOrder.findIndex((item) => item.toLowerCase() === bValue)
|
|
|
|
// Compare the indices to determine the sort order
|
|
return aIndex - bIndex
|
|
})
|
|
} else {
|
|
sorted = list.sort((a, b) => a[key] === b[key] ? 0 : a[key] > b[key] ? 1 : -1)
|
|
}
|
|
|
|
if (ascending) {
|
|
sorted.reverse()
|
|
}
|
|
return sorted
|
|
}
|
|
|
|
const durationSort = (list, ascending) => {
|
|
const parseDuration = (duration) => {
|
|
if (duration.includes(':')) {
|
|
// If it's in the format "HH:mm:ss"
|
|
const [hours, minutes, seconds] = duration.split(':').map(Number)
|
|
return (hours * 3600 + minutes * 60 + seconds) * 1000
|
|
} else {
|
|
// If it's in the format "nnn ms"
|
|
return parseInt(duration)
|
|
}
|
|
}
|
|
const sorted = list.sort((a, b) => parseDuration(a['duration']) - parseDuration(b['duration']))
|
|
if (ascending) {
|
|
sorted.reverse()
|
|
}
|
|
return sorted
|
|
}
|
|
|
|
const doInitSort = () => {
|
|
const type = storageModule.getSort(manager.initialSort)
|
|
const ascending = storageModule.getSortDirection()
|
|
const list = manager.testSubset
|
|
const initialOrder = ['Error', 'Failed', 'Rerun', 'XFailed', 'XPassed', 'Skipped', 'Passed']
|
|
|
|
storageModule.setSort(type)
|
|
storageModule.setSortDirection(ascending)
|
|
|
|
if (type?.toLowerCase() === 'original') {
|
|
manager.setRender(list)
|
|
} else {
|
|
let sortedList
|
|
switch (type) {
|
|
case 'duration':
|
|
sortedList = durationSort(list, ascending)
|
|
break
|
|
case 'result':
|
|
sortedList = genericSort(list, type, ascending, initialOrder)
|
|
break
|
|
default:
|
|
sortedList = genericSort(list, type, ascending)
|
|
break
|
|
}
|
|
manager.setRender(sortedList)
|
|
}
|
|
}
|
|
|
|
const doSort = (type, skipDirection) => {
|
|
const newSortType = storageModule.getSort(manager.initialSort) !== type
|
|
const currentAsc = storageModule.getSortDirection()
|
|
let ascending
|
|
if (skipDirection) {
|
|
ascending = currentAsc
|
|
} else {
|
|
ascending = newSortType ? false : !currentAsc
|
|
}
|
|
storageModule.setSort(type)
|
|
storageModule.setSortDirection(ascending)
|
|
|
|
const list = manager.testSubset
|
|
const sortedList = type === 'duration' ? durationSort(list, ascending) : genericSort(list, type, ascending)
|
|
manager.setRender(sortedList)
|
|
}
|
|
|
|
module.exports = {
|
|
doInitSort,
|
|
doSort,
|
|
}
|
|
|
|
},{"./datamanager.js":1,"./storage.js":8}],8:[function(require,module,exports){
|
|
const possibleFilters = [
|
|
'passed',
|
|
'skipped',
|
|
'failed',
|
|
'error',
|
|
'xfailed',
|
|
'xpassed',
|
|
'rerun',
|
|
]
|
|
|
|
const getVisible = () => {
|
|
const url = new URL(window.location.href)
|
|
const settings = new URLSearchParams(url.search).get('visible')
|
|
const lower = (item) => {
|
|
const lowerItem = item.toLowerCase()
|
|
if (possibleFilters.includes(lowerItem)) {
|
|
return lowerItem
|
|
}
|
|
return null
|
|
}
|
|
return settings === null ?
|
|
possibleFilters :
|
|
[...new Set(settings?.split(',').map(lower).filter((item) => item))]
|
|
}
|
|
|
|
const hideCategory = (categoryToHide) => {
|
|
const url = new URL(window.location.href)
|
|
const visibleParams = new URLSearchParams(url.search).get('visible')
|
|
const currentVisible = visibleParams ? visibleParams.split(',') : [...possibleFilters]
|
|
const settings = [...new Set(currentVisible)].filter((f) => f !== categoryToHide).join(',')
|
|
|
|
url.searchParams.set('visible', settings)
|
|
window.history.pushState({}, null, unescape(url.href))
|
|
}
|
|
|
|
const showCategory = (categoryToShow) => {
|
|
if (typeof window === 'undefined') {
|
|
return
|
|
}
|
|
const url = new URL(window.location.href)
|
|
const currentVisible = new URLSearchParams(url.search).get('visible')?.split(',').filter(Boolean) ||
|
|
[...possibleFilters]
|
|
const settings = [...new Set([categoryToShow, ...currentVisible])]
|
|
const noFilter = possibleFilters.length === settings.length || !settings.length
|
|
|
|
noFilter ? url.searchParams.delete('visible') : url.searchParams.set('visible', settings.join(','))
|
|
window.history.pushState({}, null, unescape(url.href))
|
|
}
|
|
|
|
const getSort = (initialSort) => {
|
|
const url = new URL(window.location.href)
|
|
let sort = new URLSearchParams(url.search).get('sort')
|
|
if (!sort) {
|
|
sort = initialSort || 'result'
|
|
}
|
|
return sort
|
|
}
|
|
|
|
const setSort = (type) => {
|
|
const url = new URL(window.location.href)
|
|
url.searchParams.set('sort', type)
|
|
window.history.pushState({}, null, unescape(url.href))
|
|
}
|
|
|
|
const getCollapsedCategory = (renderCollapsed) => {
|
|
let categories
|
|
if (typeof window !== 'undefined') {
|
|
const url = new URL(window.location.href)
|
|
const collapsedItems = new URLSearchParams(url.search).get('collapsed')
|
|
switch (true) {
|
|
case !renderCollapsed && collapsedItems === null:
|
|
categories = ['passed']
|
|
break
|
|
case collapsedItems?.length === 0 || /^["']{2}$/.test(collapsedItems):
|
|
categories = []
|
|
break
|
|
case /^all$/.test(collapsedItems) || collapsedItems === null && /^all$/.test(renderCollapsed):
|
|
categories = [...possibleFilters]
|
|
break
|
|
default:
|
|
categories = collapsedItems?.split(',').map((item) => item.toLowerCase()) || renderCollapsed
|
|
break
|
|
}
|
|
} else {
|
|
categories = []
|
|
}
|
|
return categories
|
|
}
|
|
|
|
const getSortDirection = () => JSON.parse(sessionStorage.getItem('sortAsc')) || false
|
|
const setSortDirection = (ascending) => sessionStorage.setItem('sortAsc', ascending)
|
|
|
|
const getCollapsedIds = () => JSON.parse(sessionStorage.getItem('collapsedIds')) || []
|
|
const setCollapsedIds = (list) => sessionStorage.setItem('collapsedIds', JSON.stringify(list))
|
|
|
|
module.exports = {
|
|
getVisible,
|
|
hideCategory,
|
|
showCategory,
|
|
getCollapsedIds,
|
|
setCollapsedIds,
|
|
getSort,
|
|
setSort,
|
|
getSortDirection,
|
|
setSortDirection,
|
|
getCollapsedCategory,
|
|
possibleFilters,
|
|
}
|
|
|
|
},{}]},{},[4]);
|
|
</script>
|
|
</footer>
|
|
</html> |