Skip to content

Commit 83f4c24

Browse files
add test
1 parent 3370327 commit 83f4c24

File tree

4 files changed

+244
-112
lines changed

4 files changed

+244
-112
lines changed

apps/worker/tasks/manual_trigger.py

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
from database.models import Commit, Pull
99
from database.models.reports import CommitReport, Upload
1010
from services.comparison import get_or_create_comparison
11-
from services.processing.state import ProcessingState
1211
from shared.celery_config import (
1312
compute_comparison_task_name,
1413
manual_upload_completion_trigger_task_name,
@@ -97,26 +96,6 @@ def process_impl_within_lock(
9796
for upload in uploads:
9897
if not upload.state or upload.state_id == UploadState.UPLOADED.db_id:
9998
still_processing += 1
100-
101-
# Also check Redis processing state to prevent race conditions
102-
# where uploads have been marked complete in DB but are still
103-
# being processed/merged by the finisher task
104-
state = ProcessingState(repoid, commitid)
105-
upload_numbers = state.get_upload_numbers()
106-
107-
if upload_numbers.processing > 0 or upload_numbers.processed > 0:
108-
log.info(
109-
"Retrying ManualTriggerTask. Redis shows uploads still being processed.",
110-
extra={
111-
"repoid": repoid,
112-
"commitid": commitid,
113-
"redis_processing": upload_numbers.processing,
114-
"redis_processed": upload_numbers.processed,
115-
"db_still_processing": still_processing,
116-
},
117-
)
118-
still_processing += upload_numbers.processing + upload_numbers.processed
119-
12099
if still_processing == 0:
121100
self.trigger_notifications(repoid, commitid, commit_yaml)
122101
if commit.pullid:

apps/worker/tasks/tests/unit/test_manual_trigger.py

Lines changed: 0 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
from database.tests.factories import CommitFactory, PullFactory
55
from database.tests.factories.core import UploadFactory
6-
from services.processing.state import UploadNumbers
76
from shared.reports.enums import UploadState
87
from tasks.manual_trigger import ManualTriggerTask
98

@@ -18,14 +17,6 @@ def test_manual_upload_completion_trigger(
1817
mock_redis,
1918
celery_app,
2019
):
21-
# Mock ProcessingState to return no pending uploads in Redis
22-
mock_processing_state = mocker.patch("tasks.manual_trigger.ProcessingState")
23-
mock_state_instance = mocker.MagicMock()
24-
mock_state_instance.get_upload_numbers.return_value = UploadNumbers(
25-
processing=0, processed=0
26-
)
27-
mock_processing_state.return_value = mock_state_instance
28-
2920
mocked_app = mocker.patch.object(
3021
ManualTriggerTask,
3122
"app",
@@ -87,14 +78,6 @@ def test_manual_upload_completion_trigger_uploads_still_processing(
8778
mock_redis,
8879
celery_app,
8980
):
90-
# Mock ProcessingState to return no pending uploads in Redis
91-
mock_processing_state = mocker.patch("tasks.manual_trigger.ProcessingState")
92-
mock_state_instance = mocker.MagicMock()
93-
mock_state_instance.get_upload_numbers.return_value = UploadNumbers(
94-
processing=0, processed=0
95-
)
96-
mock_processing_state.return_value = mock_state_instance
97-
9881
mocker.patch.object(
9982
ManualTriggerTask,
10083
"app",
@@ -122,47 +105,3 @@ def test_manual_upload_completion_trigger_uploads_still_processing(
122105
"notifications_called": False,
123106
"message": "Uploads are still in process and the task got retired so many times. Not triggering notifications.",
124107
} == result
125-
126-
def test_manual_upload_completion_trigger_redis_pending(
127-
self,
128-
mocker,
129-
mock_configuration,
130-
dbsession,
131-
mock_storage,
132-
mock_redis,
133-
celery_app,
134-
):
135-
"""Test that task retries when Redis shows pending uploads even if DB shows complete"""
136-
# Mock ProcessingState to return pending uploads in Redis
137-
mock_processing_state = mocker.patch("tasks.manual_trigger.ProcessingState")
138-
mock_state_instance = mocker.MagicMock()
139-
mock_state_instance.get_upload_numbers.return_value = UploadNumbers(
140-
processing=1,
141-
processed=2, # Redis shows 3 uploads still being processed/merged
142-
)
143-
mock_processing_state.return_value = mock_state_instance
144-
145-
mocker.patch.object(
146-
ManualTriggerTask,
147-
"app",
148-
celery_app,
149-
)
150-
commit = CommitFactory.create()
151-
# Upload is complete in DB
152-
upload = UploadFactory.create(
153-
report__commit=commit,
154-
state="complete",
155-
state_id=UploadState.PROCESSED.db_id,
156-
)
157-
dbsession.add(commit)
158-
dbsession.add(upload)
159-
dbsession.flush()
160-
161-
# Should retry because Redis shows pending uploads
162-
with pytest.raises(Retry):
163-
ManualTriggerTask().run_impl(
164-
dbsession,
165-
repoid=commit.repoid,
166-
commitid=commit.commitid,
167-
current_yaml={},
168-
)

apps/worker/tasks/tests/unit/test_upload_finisher_task.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from datetime import UTC, datetime
12
from pathlib import Path
23
from unittest.mock import ANY, call
34

@@ -951,3 +952,49 @@ def test_generic_exception_handling(self, dbsession, mocker, mock_self_app):
951952
"sentry_trace_id": None,
952953
}
953954
)
955+
956+
@pytest.mark.django_db
957+
def test_upload_finisher_updates_repository_timestamp(
958+
self,
959+
mocker,
960+
mock_configuration,
961+
dbsession,
962+
mock_storage,
963+
mock_repo_provider,
964+
mock_redis,
965+
mock_self_app,
966+
):
967+
"""Test that repository.updatestamp is updated when None or old"""
968+
969+
mock_redis.scard.return_value = 0
970+
mocker.patch("tasks.upload_finisher.load_intermediate_reports", return_value=[])
971+
mocker.patch("tasks.upload_finisher.update_uploads")
972+
973+
# Create commit with repository that has no updatestamp
974+
commit = CommitFactory.create(
975+
message="test",
976+
branch="main",
977+
repository__branch="main",
978+
)
979+
# Ensure updatestamp is None
980+
commit.repository.updatestamp = None
981+
dbsession.add(commit)
982+
dbsession.flush()
983+
984+
previous_results = [
985+
{"upload_id": 0, "arguments": {"url": "test_url"}, "successful": True}
986+
]
987+
988+
result = UploadFinisherTask().run_impl(
989+
dbsession,
990+
previous_results,
991+
repoid=commit.repoid,
992+
commitid=commit.commitid,
993+
commit_yaml={},
994+
)
995+
996+
assert result == {"notifications_called": True}
997+
dbsession.refresh(commit.repository)
998+
# Repository timestamp should now be set
999+
assert commit.repository.updatestamp is not None
1000+
assert (datetime.now(tz=UTC) - commit.repository.updatestamp).seconds < 60

0 commit comments

Comments
 (0)