|
1 | 1 | from datetime import datetime, timezone
|
| 2 | +from unittest import mock |
2 | 3 |
|
3 | 4 | import pytest
|
4 | 5 | from django.conf import settings
|
5 | 6 | from django.test.utils import override_settings
|
6 | 7 |
|
7 | 8 | from sentry.monitors.models import (
|
| 9 | + CronMonitorDataSourceHandler, |
8 | 10 | Monitor,
|
9 | 11 | MonitorEnvironment,
|
10 | 12 | MonitorEnvironmentLimitsExceeded,
|
11 | 13 | MonitorLimitsExceeded,
|
12 | 14 | ScheduleType,
|
13 | 15 | )
|
| 16 | +from sentry.monitors.types import DATA_SOURCE_CRON_MONITOR |
14 | 17 | from sentry.monitors.validators import ConfigValidator
|
15 | 18 | from sentry.testutils.cases import TestCase
|
| 19 | +from sentry.workflow_engine.models import DataSource |
16 | 20 |
|
17 | 21 |
|
18 | 22 | class MonitorTestCase(TestCase):
|
@@ -270,3 +274,93 @@ def test_config_validator(self) -> None:
|
270 | 274 | validated_config["bad_key"] = 100
|
271 | 275 | monitor.config = validated_config
|
272 | 276 | assert monitor.get_validated_config() is None
|
| 277 | + |
| 278 | + |
| 279 | +class CronMonitorDataSourceHandlerTest(TestCase): |
| 280 | + def setUp(self): |
| 281 | + super().setUp() |
| 282 | + self.monitor = self.create_monitor( |
| 283 | + project=self.project, |
| 284 | + name="Test Monitor", |
| 285 | + ) |
| 286 | + |
| 287 | + self.data_source = DataSource.objects.create( |
| 288 | + type=DATA_SOURCE_CRON_MONITOR, |
| 289 | + source_id=str(self.monitor.id), |
| 290 | + organization_id=self.organization.id, |
| 291 | + ) |
| 292 | + |
| 293 | + def test_bulk_get_query_object(self): |
| 294 | + result = CronMonitorDataSourceHandler.bulk_get_query_object([self.data_source]) |
| 295 | + assert result[self.data_source.id] == self.monitor |
| 296 | + |
| 297 | + def test_bulk_get_query_object__multiple_monitors(self): |
| 298 | + monitor2 = self.create_monitor( |
| 299 | + project=self.project, |
| 300 | + name="Test Monitor 2", |
| 301 | + ) |
| 302 | + data_source2 = DataSource.objects.create( |
| 303 | + type=DATA_SOURCE_CRON_MONITOR, |
| 304 | + source_id=str(monitor2.id), |
| 305 | + organization_id=self.organization.id, |
| 306 | + ) |
| 307 | + |
| 308 | + data_sources = [self.data_source, data_source2] |
| 309 | + result = CronMonitorDataSourceHandler.bulk_get_query_object(data_sources) |
| 310 | + |
| 311 | + assert result[self.data_source.id] == self.monitor |
| 312 | + assert result[data_source2.id] == monitor2 |
| 313 | + |
| 314 | + def test_bulk_get_query_object__incorrect_data_source(self): |
| 315 | + ds_with_invalid_monitor_id = DataSource.objects.create( |
| 316 | + type=DATA_SOURCE_CRON_MONITOR, |
| 317 | + source_id="not_an_int", |
| 318 | + organization_id=self.organization.id, |
| 319 | + ) |
| 320 | + |
| 321 | + with mock.patch("sentry.monitors.models.logger.exception") as mock_logger: |
| 322 | + data_sources = [self.data_source, ds_with_invalid_monitor_id] |
| 323 | + result = CronMonitorDataSourceHandler.bulk_get_query_object(data_sources) |
| 324 | + |
| 325 | + assert result[self.data_source.id] == self.monitor |
| 326 | + assert result[ds_with_invalid_monitor_id.id] is None |
| 327 | + |
| 328 | + mock_logger.assert_called_once_with( |
| 329 | + "Invalid DataSource.source_id fetching Monitor", |
| 330 | + extra={ |
| 331 | + "id": ds_with_invalid_monitor_id.id, |
| 332 | + "source_id": ds_with_invalid_monitor_id.source_id, |
| 333 | + }, |
| 334 | + ) |
| 335 | + |
| 336 | + def test_bulk_get_query_object__missing_monitor(self): |
| 337 | + ds_with_deleted_monitor = DataSource.objects.create( |
| 338 | + type=DATA_SOURCE_CRON_MONITOR, |
| 339 | + source_id="99999999", |
| 340 | + organization_id=self.organization.id, |
| 341 | + ) |
| 342 | + |
| 343 | + data_sources = [self.data_source, ds_with_deleted_monitor] |
| 344 | + result = CronMonitorDataSourceHandler.bulk_get_query_object(data_sources) |
| 345 | + |
| 346 | + assert result[self.data_source.id] == self.monitor |
| 347 | + assert result[ds_with_deleted_monitor.id] is None |
| 348 | + |
| 349 | + def test_bulk_get_query_object__empty_list(self): |
| 350 | + result = CronMonitorDataSourceHandler.bulk_get_query_object([]) |
| 351 | + assert result == {} |
| 352 | + |
| 353 | + def test_related_model(self): |
| 354 | + relations = CronMonitorDataSourceHandler.related_model(self.data_source) |
| 355 | + assert len(relations) == 1 |
| 356 | + relation = relations[0] |
| 357 | + |
| 358 | + assert relation.params["model"] == Monitor |
| 359 | + assert relation.params["query"] == {"id": self.data_source.source_id} |
| 360 | + |
| 361 | + def test_get_instance_limit(self): |
| 362 | + assert CronMonitorDataSourceHandler.get_instance_limit(self.organization) is None |
| 363 | + |
| 364 | + def test_get_current_instance_count(self): |
| 365 | + with pytest.raises(NotImplementedError): |
| 366 | + CronMonitorDataSourceHandler.get_current_instance_count(self.organization) |
0 commit comments