Skip to content

Commit eb095de

Browse files
committed
Fix tests
1 parent 5c40c36 commit eb095de

File tree

5 files changed

+97
-80
lines changed

5 files changed

+97
-80
lines changed

backend/ibutsu_server/encoder.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,7 @@ def default(self, o):
1616
mapped_attr = o.attribute_map[attr]
1717
dikt[mapped_attr] = value
1818
return dikt
19-
return DefaultJSONProvider.default(self, o)
19+
# For basic JSON-serializable types, return as-is
20+
if isinstance(o, (dict, list, str, int, float, bool, type(None))):
21+
return o
22+
return super().default(o)

backend/ibutsu_server/tasks/importers.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import json
22
import re
33
import tarfile
4-
from datetime import datetime
4+
from datetime import datetime, timezone
55
from io import BytesIO
66

77
from celery.utils.log import get_task_logger
@@ -87,24 +87,24 @@ def _get_ts_element(tree):
8787

8888
def _parse_timestamp(ts):
8989
"""To reduce cognitive complexity"""
90-
return parser.parse(ts.get("timestamp")) if ts.get("timestamp") else datetime.utcnow()
90+
return parser.parse(ts.get("timestamp")) if ts.get("timestamp") else datetime.now(timezone.utc)
9191

9292

9393
def _process_result(result_dict, testcase):
9494
"""To reduce cognitive complexity"""
9595
skip_reason = traceback = None
96-
if testcase.find("failure"):
96+
if hasattr(testcase, "failure"):
9797
result_dict["result"] = "failed"
9898
traceback = bytes(str(testcase.failure), "utf8")
99-
elif testcase.find("error"):
99+
elif hasattr(testcase, "error"):
100100
result_dict["result"] = "error"
101101
traceback = bytes(str(testcase.error), "utf8")
102-
elif testcase.find("skipped"):
102+
elif hasattr(testcase, "skipped"):
103103
result_dict["result"] = "skipped"
104104
skip_reason = str(testcase.skipped)
105-
elif testcase.find("xfailure"):
105+
elif hasattr(testcase, "xfailure"):
106106
result_dict["result"] = "xfailed"
107-
elif testcase.find("xpassed"):
107+
elif hasattr(testcase, "xpassed"):
108108
result_dict["result"] = "xpassed"
109109
else:
110110
result_dict["result"] = "passed"
@@ -124,7 +124,7 @@ def _add_artifacts(result, testcase, traceback, session):
124124
content=traceback,
125125
)
126126
)
127-
if testcase.find("system-out"):
127+
if hasattr(testcase, "system-out"):
128128
system_out = bytes(str(testcase["system-out"]), "utf8")
129129
session.add(
130130
Artifact(
@@ -134,7 +134,7 @@ def _add_artifacts(result, testcase, traceback, session):
134134
content=system_out,
135135
)
136136
)
137-
if testcase.find("system-err"):
137+
if hasattr(testcase, "system-err"):
138138
system_err = bytes(str(testcase["system-err"]), "utf8")
139139
session.add(
140140
Artifact(
@@ -191,10 +191,10 @@ def _populate_result_metadata(run_dict, result_dict, metadata):
191191
result_dict["metadata"].update(metadata)
192192
result_dict["env"] = run_dict.get("env")
193193
result_dict["component"] = run_dict.get("component")
194-
if metadata.get("project_id"):
195-
result_dict["project_id"] = metadata["project_id"]
196-
if metadata.get("source"):
197-
result_dict["source"] = metadata["source"]
194+
if metadata.get("project_id"):
195+
result_dict["project_id"] = metadata["project_id"]
196+
if metadata.get("source"):
197+
result_dict["source"] = metadata["source"]
198198

199199

200200
def _get_test_name_path(testcase):
@@ -346,7 +346,7 @@ def run_junit_import(import_): # noqa: PLR0912
346346
content=traceback,
347347
)
348348
)
349-
if testcase.find("system-out"):
349+
if hasattr(testcase, "system-out"):
350350
system_out = bytes(str(testcase["system-out"]), "utf8")
351351
session.add(
352352
Artifact(
@@ -356,7 +356,7 @@ def run_junit_import(import_): # noqa: PLR0912
356356
content=system_out,
357357
)
358358
)
359-
if testcase.find("system-err"):
359+
if hasattr(testcase, "system-err"):
360360
system_err = bytes(str(testcase["system-err"]), "utf8")
361361
session.add(
362362
Artifact(

backend/ibutsu_server/templates/result.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
{{raw_data|safe}}
2+
{% if duration %}
3+
<p>Duration: {{duration|pretty_duration}}</p>
4+
{% endif %}
25
<table>
36
{% for art in artifacts %}
47
<tr><td><a href="/api/artifact/{{art._id}}">{{art.filename}}</a></td></tr>

backend/tests/test_importers.py

Lines changed: 38 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -650,54 +650,52 @@ def test_run_junit_import_basic(self, make_import, flask_app):
650650
</testsuite>
651651
"""
652652

653-
import_record = make_import(filename="test.xml", format="junit", status="pending")
653+
import_record = make_import(filename="test.xml", format="junit", status="pending")
654654

655-
# Create import file
656-
import_file = ImportFile(
657-
id=str(uuid4()), import_id=import_record.id, filename="test.xml", content=junit_xml
658-
)
659-
from ibutsu_server.db.base import session
655+
# Create import file
656+
import_file = ImportFile(id=str(uuid4()), import_id=import_record.id, content=junit_xml)
657+
from ibutsu_server.db.base import session
660658

661-
session.add(import_file)
662-
session.commit()
659+
session.add(import_file)
660+
session.commit()
663661

664-
# Run the import
665-
run_junit_import({"id": str(import_record.id)})
662+
# Run the import
663+
run_junit_import({"id": str(import_record.id)})
666664

667-
# Verify run was created
668-
runs = Run.query.all()
669-
assert len(runs) > 0
670-
run = runs[-1] # Get the latest run
671-
assert run.summary["tests"] == 2
672-
assert run.summary["failures"] == 1
665+
# Verify run was created
666+
runs = Run.query.all()
667+
assert len(runs) > 0
668+
run = runs[-1] # Get the latest run
669+
assert run.summary["tests"] == 2
670+
assert run.summary["failures"] == 1
673671

674-
# Verify results were created
675-
results = Result.query.filter_by(run_id=run.id).order_by(Result.id).all()
676-
assert len(results) == 2
672+
# Verify results were created
673+
results = Result.query.filter_by(run_id=run.id).order_by(Result.id).all()
674+
assert len(results) == 2
677675

678-
# Verify per-test behavior: one passed and one failed result
679-
statuses = {r.result for r in results}
680-
assert statuses == {"passed", "failed"}
676+
# Verify per-test behavior: one passed and one failed result
677+
statuses = {r.result for r in results}
678+
assert statuses == {"passed", "failed"}
681679

682-
# Check that test identifiers/names were correctly mapped from the XML
683-
test_ids = {r.test_id for r in results}
684-
# Test IDs should contain both test case names
685-
assert any("test_pass" in tid for tid in test_ids)
686-
assert any("test_fail" in tid for tid in test_ids)
680+
# Check that test identifiers/names were correctly mapped from the XML
681+
test_ids = {r.test_id for r in results}
682+
# Test IDs should contain both test case names
683+
assert any("test_pass" in tid for tid in test_ids)
684+
assert any("test_fail" in tid for tid in test_ids)
687685

688-
# Verify the failed test has a traceback artifact attached
689-
failed_result = next(r for r in results if r.result == "failed")
690-
failed_artifacts = Artifact.query.filter_by(result_id=failed_result.id).all()
691-
failed_filenames = {a.filename for a in failed_artifacts}
686+
# Verify the failed test has a traceback artifact attached
687+
failed_result = next(r for r in results if r.result == "failed")
688+
failed_artifacts = Artifact.query.filter_by(result_id=failed_result.id).all()
689+
failed_filenames = {a.filename for a in failed_artifacts}
692690

693-
# We expect a traceback artifact for the failed test
694-
assert "traceback.log" in failed_filenames
691+
# We expect a traceback artifact for the failed test
692+
assert "traceback.log" in failed_filenames
695693

696-
# Verify import status updated
697-
from ibutsu_server.db.models import Import
694+
# Verify import status updated
695+
from ibutsu_server.db.models import Import
698696

699-
updated_import = Import.query.get(import_record.id)
700-
assert updated_import.status == "done"
697+
updated_import = Import.query.get(import_record.id)
698+
assert updated_import.status == "done"
701699

702700
def test_run_junit_import_with_properties(self, make_import, make_project, flask_app):
703701
"""Test JUnit import with properties"""
@@ -723,9 +721,7 @@ def test_run_junit_import_with_properties(self, make_import, make_project, flask
723721
data={"project_id": project.id},
724722
)
725723

726-
import_file = ImportFile(
727-
id=str(uuid4()), import_id=import_record.id, filename="test.xml", content=junit_xml
728-
)
724+
import_file = ImportFile(id=str(uuid4()), import_id=import_record.id, content=junit_xml)
729725
from ibutsu_server.db.base import session
730726

731727
session.add(import_file)
@@ -809,7 +805,6 @@ def test_run_archive_import_basic(self, make_import, flask_app):
809805
import_file = ImportFile(
810806
id=str(uuid4()),
811807
import_id=import_record.id,
812-
filename="archive.tar.gz",
813808
content=tar_content,
814809
)
815810
from ibutsu_server.db.base import session
@@ -825,8 +820,8 @@ def test_run_archive_import_basic(self, make_import, flask_app):
825820
run = Run.query.get(run_id)
826821
assert run is not None
827822

828-
# Verify result was created
829-
result = Result.query.get(result_id)
823+
# Verify result was created (archive import creates new IDs for results)
824+
result = Result.query.filter_by(test_id="test.example", run_id=run.id).first()
830825
assert result is not None
831826
assert result.test_id == "test.example"
832827

0 commit comments

Comments
 (0)