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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 17 additions & 2 deletions fossology/report.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,23 @@ def generate_report(
response = self.session.get(f"{self.api}/report", headers=headers)

if response.status_code == 201:
report_id = re.search("[0-9]*$", response.json()["message"])
return report_id[0] # type: ignore
message = None
try:
message = response.json()["message"]
match = re.search(r"[0-9]+$", message)
except (ValueError, KeyError, TypeError) as exc:
Comment thread
deveaud-m marked this conversation as resolved.
description = (
f"Report generation for upload {upload.uploadname} succeeded "
f"but response could not be parsed: {exc}"
)
raise FossologyApiError(description, response) from exc
if match is None:
description = (
f"Report generation for upload {upload.uploadname} succeeded "
f"but report ID could not be parsed from response message: {message!r}"
)
raise FossologyApiError(description, response)
return int(match[0])

elif response.status_code == 403:
description = f"Report generation for upload {upload.id} not authorized"
Expand Down
82 changes: 82 additions & 0 deletions tests/test_report.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,88 @@ def test_generate_report(foss: Fossology, upload: Upload):
Path(report_path / report_name).unlink()


@responses.activate
def test_generate_report_unparseable_message(
foss_server: str, foss: Fossology, upload: Upload
):
responses.add(
responses.GET,
f"{foss_server}/api/v1/report",
status=201,
json={"code": 201, "message": "Report has been queued."},
)
with pytest.raises(FossologyApiError) as excinfo:
foss.generate_report(upload)
assert "report ID could not be parsed" in str(excinfo.value)


@responses.activate
def test_generate_report_malformed_response_body(
foss_server: str, foss: Fossology, upload: Upload
):
responses.add(
responses.GET,
f"{foss_server}/api/v1/report",
status=201,
body="<html>Internal Server Error</html>",
content_type="text/html",
)
with pytest.raises(FossologyApiError) as excinfo:
foss.generate_report(upload)
assert "response could not be parsed" in str(excinfo.value)


@responses.activate
def test_generate_report_missing_message_key(
foss_server: str, foss: Fossology, upload: Upload
):
responses.add(
responses.GET,
f"{foss_server}/api/v1/report",
status=201,
json={"code": 201, "type": "INFO"},
)
with pytest.raises(FossologyApiError) as excinfo:
foss.generate_report(upload)
assert "response could not be parsed" in str(excinfo.value)


@responses.activate
def test_generate_report_non_string_message(
foss_server: str, foss: Fossology, upload: Upload
):
responses.add(
responses.GET,
f"{foss_server}/api/v1/report",
status=201,
json={"code": 201, "message": 42},
)
with pytest.raises(FossologyApiError) as excinfo:
foss.generate_report(upload)
assert "response could not be parsed" in str(excinfo.value)


@responses.activate
def test_generate_report_returns_int(
foss_server: str, foss: Fossology, upload: Upload
):
responses.add(
responses.GET,
f"{foss_server}/api/v1/report",
status=201,
json={
"code": 201,
"message": (
"Report will be generated in the back ground, "
"report id is 42"
),
},
)
report_id = foss.generate_report(upload)
assert report_id == 42
assert isinstance(report_id, int)


@responses.activate
def test_report_error(foss_server: str, foss: Fossology, upload: Upload):
responses.add(
Expand Down