Skip to content
This repository was archived by the owner on Jun 13, 2025. It is now read-only.

Commit 5ee4fc7

Browse files
feat: handle file not found from CLI (#1075)
1 parent 714ba37 commit 5ee4fc7

File tree

2 files changed

+91
-12
lines changed

2 files changed

+91
-12
lines changed

upload/tests/views/test_test_results.py

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77
from shared.django_apps.codecov_auth.tests.factories import (
88
OrganizationLevelTokenFactory,
99
)
10+
from shared.django_apps.core.models import Commit
1011
from shared.django_apps.core.tests.factories import (
1112
CommitFactory,
1213
OwnerFactory,
1314
RepositoryFactory,
1415
)
1516

16-
from core.models import Commit
1717
from services.redis_configuration import get_redis_connection
1818
from services.task import TaskService
1919

@@ -377,3 +377,73 @@ def test_update_repo_fields_when_upload_is_triggered(
377377
assert repository.active is True
378378
assert repository.activated is True
379379
assert repository.test_analytics_enabled is True
380+
381+
382+
def test_upload_test_results_file_not_found(db, client, mocker, mock_redis):
383+
upload = mocker.patch.object(TaskService, "upload")
384+
create_presigned_put = mocker.patch(
385+
"shared.api_archive.archive.StorageService.create_presigned_put",
386+
return_value="test-presigned-put",
387+
)
388+
389+
owner = OwnerFactory(service="github", username="codecov")
390+
repository = RepositoryFactory.create(author=owner)
391+
commit_sha = "6fd5b89357fc8cdf34d6197549ac7c6d7e5977ef"
392+
393+
client = APIClient()
394+
client.credentials(HTTP_AUTHORIZATION=f"token {repository.upload_token}")
395+
396+
res = client.post(
397+
reverse("upload-test-results"),
398+
{
399+
"commit": commit_sha,
400+
"slug": f"{repository.author.username}::::{repository.name}",
401+
"build": "test-build",
402+
"buildURL": "test-build-url",
403+
"job": "test-job",
404+
"service": "github-actions",
405+
"branch": "aaaaaa",
406+
"file_not_found": True,
407+
},
408+
format="json",
409+
headers={"User-Agent": "codecov-cli/0.4.7"},
410+
)
411+
assert res.status_code == 201
412+
413+
assert res.data is None
414+
415+
create_presigned_put.assert_not_called()
416+
417+
commit = Commit.objects.get(commitid=commit_sha)
418+
assert commit
419+
assert commit.branch is not None
420+
421+
redis = get_redis_connection()
422+
args = json.loads(
423+
redis.rpop(f"uploads/{repository.repoid}/{commit_sha}/test_results")
424+
)
425+
assert args == {
426+
"reportid": mocker.ANY,
427+
"build": "test-build",
428+
"build_url": "test-build-url",
429+
"job": "test-job",
430+
"service": "github-actions",
431+
"url": None,
432+
"commit": commit_sha,
433+
"report_code": None,
434+
"flags": None,
435+
}
436+
437+
# sets latest upload timestamp
438+
ts = redis.get(f"latest_upload/{repository.repoid}/{commit_sha}/test_results")
439+
assert ts
440+
441+
# triggers upload task
442+
upload.assert_called_with(
443+
commitid=commit_sha,
444+
repoid=repository.repoid,
445+
report_code=None,
446+
report_type="test_results",
447+
arguments=args,
448+
countdown=4,
449+
)

upload/views/test_results.py

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class UploadSerializer(serializers.Serializer):
5151
pr = serializers.CharField(required=False)
5252
branch = serializers.CharField(required=False, allow_null=True)
5353
storage_path = serializers.CharField(required=False)
54+
file_not_found = serializers.BooleanField(required=False)
5455

5556

5657
class TestResultsView(
@@ -136,18 +137,23 @@ def post(self, request):
136137

137138
upload_external_id = str(uuid.uuid4())
138139

139-
archive_service = ArchiveService(repo)
140+
url = None
141+
file_not_found = data.get("file_not_found", False)
142+
if file_not_found:
143+
storage_path = None
144+
else:
145+
archive_service = ArchiveService(repo)
140146

141-
storage_path = data.get("storage_path", None)
142-
if storage_path is None or not self.is_shelter_request():
143-
storage_path = MinioEndpoints.test_results.get_path(
144-
date=timezone.now().strftime("%Y-%m-%d"),
145-
repo_hash=archive_service.get_archive_hash(repo),
146-
commit_sha=data["commit"],
147-
uploadid=upload_external_id,
148-
)
147+
storage_path = data.get("storage_path", None)
148+
if storage_path is None or not self.is_shelter_request():
149+
storage_path = MinioEndpoints.test_results.get_path(
150+
date=timezone.now().strftime("%Y-%m-%d"),
151+
repo_hash=archive_service.get_archive_hash(repo),
152+
commit_sha=data["commit"],
153+
uploadid=upload_external_id,
154+
)
149155

150-
url = archive_service.create_presigned_put(storage_path)
156+
url = archive_service.create_presigned_put(storage_path)
151157

152158
task_arguments = {
153159
# these are used in the upload task when saving an upload record
@@ -181,4 +187,7 @@ def post(self, request):
181187
report_type=CommitReport.ReportType.TEST_RESULTS,
182188
)
183189

184-
return Response({"raw_upload_location": url}, status=201)
190+
if url is None:
191+
return Response(status=201)
192+
else:
193+
return Response({"raw_upload_location": url}, status=201)

0 commit comments

Comments
 (0)