Skip to content

Commit 739eaf8

Browse files
committed
final tests
1 parent 8a74ee8 commit 739eaf8

File tree

7 files changed

+93
-15
lines changed

7 files changed

+93
-15
lines changed

validity/scripts/runtests/split.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,13 @@ def sync_datasources(
6363
def backup_datasources(self, datasources: QuerySet[VDataSource], logger: Logger) -> None:
6464
def fail_handler(backup_point, error):
6565
logger.failure(f"Cannot back up {md_link(backup_point)}. {error}")
66+
failed_bp.add(backup_point)
6667

67-
backup_points = list(self.backup_queryset.filter(data_source__in=datasources))
68+
failed_bp = set()
69+
backup_points = set(self.backup_queryset.filter(data_source__in=datasources))
6870
self.backup_fn(backup_points, fail_handler=fail_handler)
69-
if backup_points:
70-
bp_names = ", ".join(md_link(bp) for bp in backup_points)
71+
bp_names = ", ".join(md_link(bp) for bp in backup_points - failed_bp)
72+
if bp_names:
7173
logger.info(f"Data Sources have been backed up using the following Backup Points: {bp_names}")
7274

7375
def _work_slices(

validity/tests/conftest.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import validity
1313
import validity.scripts
14+
from validity import dependencies
1415
from validity.models import Poller, Serializer
1516
from validity.utils.orm import CustomFieldBuilder
1617

@@ -97,3 +98,8 @@ def _now(tz):
9798
monkeypatch.setattr(timezone, "now", lambda: tz)
9899

99100
return _now
101+
102+
103+
@pytest.fixture
104+
def launcher_factory(di):
105+
return di[dependencies.launcher_factory]

validity/tests/test_scripts/runtests/test_combine.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
from validity.scripts.data_models import ExecutionResult, Message
99
from validity.scripts.data_models import TestResultRatio as ResultRatio
10-
from validity.scripts.exceptions import AbortScript
1110
from validity.scripts.runtests.combine import CombineWorker
1211
from validity.utils.logger import Logger
1312

@@ -56,8 +55,7 @@ def test_call_abort(worker, full_runtests_params, job_extractor, monkeypatch):
5655
job_extractor.parents[1].job.result.errored = True
5756
monkeypatch.setattr(timezone, "now", lambda: datetime.datetime(2020, 1, 1))
5857
worker.job_extractor_factory = lambda: job_extractor
59-
with pytest.raises(AbortScript):
60-
worker(full_runtests_params)
58+
worker(full_runtests_params)
6159
job = full_runtests_params.get_job()
6260
assert job.status == "errored"
6361
assert job.data == {

validity/tests/test_scripts/runtests/test_split.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,18 @@
66
from django.db.models import Q
77
from django.db.models.signals import post_save
88
from django.utils import timezone
9-
from factories import DataSourceFactory, DeviceFactory, RunTestsJobFactory, SelectorFactory, TenantFactory
9+
from factories import (
10+
BackupPointFactory,
11+
DataSourceFactory,
12+
DeviceFactory,
13+
RunTestsJobFactory,
14+
SelectorFactory,
15+
TenantFactory,
16+
)
1017

18+
from validity.data_backup import BackupBackend
19+
from validity.integrations.errors import IntegrationError
20+
from validity.models import VDataSource
1121
from validity.scripts.data_models import Message, SplitResult
1222
from validity.scripts.runtests.split import SplitWorker
1323
from validity.utils.logger import Logger
@@ -79,6 +89,34 @@ def test_sync_datasources(create_custom_fields, overriding_datasource):
7989
logger.info.assert_called_once()
8090

8191

92+
@pytest.mark.django_db
93+
def test_backup_datasources_success():
94+
backup_fn = Mock()
95+
bp1 = BackupPointFactory(backup_after_sync=True, name="bp1")
96+
worker = SplitWorker(backup_fn=backup_fn)
97+
worker.backup_datasources(VDataSource.objects.all(), Logger())
98+
backup_fn.assert_called_once()
99+
assert backup_fn.call_args[0][0] == {bp1}
100+
101+
102+
@pytest.mark.django_db(transaction=True, reset_sequences=True)
103+
def test_backup_datasources_fail(timezone_now, di):
104+
timezone_now(datetime.datetime(2000, 1, 2, 3, 4, tzinfo=datetime.timezone.utc))
105+
bp = BackupPointFactory(backup_after_sync=True, name="bp1")
106+
worker = SplitWorker()
107+
backend = Mock(side_effect=IntegrationError("ERR123"))
108+
with di.override({BackupBackend: lambda: backend}):
109+
worker.backup_datasources(VDataSource.objects.all(), logger := Logger())
110+
backend.assert_called_once_with(bp)
111+
assert logger.messages == [
112+
Message(
113+
status="failure",
114+
message="Cannot back up [bp1](/plugins/validity/backup-points/1/). ERR123",
115+
time=datetime.datetime(2000, 1, 2, 3, 4, tzinfo=datetime.timezone.utc),
116+
)
117+
]
118+
119+
82120
@pytest.mark.parametrize("device_num", [2])
83121
@pytest.mark.django_db(transaction=True, reset_sequences=True)
84122
def test_call(selectors, devices, runtests_params, monkeypatch):

validity/tests/test_scripts/test_launcher.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from core.models import Job
66
from django.utils import timezone
77
from factories import UserFactory
8+
from rq.queue import Queue
89

910
from validity.models import ComplianceReport
1011
from validity.scripts.data_models import RequestInfo, ScriptParams, Task
@@ -71,3 +72,8 @@ def task_func_2(): ...
7172
launcher(params)
7273
assert launcher.rq_queue.enqueue.call_count == 4
7374
assert launcher.rq_queue.enqueue.call_args.kwargs["depends_on"] == [launcher.rq_queue.enqueue.return_value] * 3
75+
76+
77+
def test_factory_getqueue(launcher_factory):
78+
queue = launcher_factory.get_queue("default")
79+
assert isinstance(queue, Queue)
Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,30 @@
1+
import datetime
2+
import inspect
3+
14
import pytest
25

3-
from validity.utils.logger import Logger
6+
from validity.utils.logger import Logger, Message
47

58

6-
@pytest.fixture
9+
@pytest.fixture(name="err")
710
def error_with_traceback():
8-
# moving this function up/down will cause the test to fail
911
try:
1012
raise ValueError("error")
1113
except ValueError as e:
1214
return e
1315

1416

15-
def test_logger(error_with_traceback):
17+
def test_logger(err):
1618
logger = Logger()
1719
logger.info("info-msg")
1820
logger.failure("failure-msg")
19-
logger.log_exception(error_with_traceback)
21+
logger.log_exception(err)
2022

2123
assert len(logger.messages) == 3
2224
serialized_logs = [m.serialized for m in logger.messages]
2325
for log in serialized_logs:
2426
del log["time"]
27+
line_num = inspect.getsourcelines(error_with_traceback)[1] + 3
2528
assert serialized_logs == [
2629
{"status": "info", "message": "info-msg"},
2730
{"status": "failure", "message": "failure-msg"},
@@ -30,7 +33,32 @@ def test_logger(error_with_traceback):
3033
"message": (
3134
"Unhandled error occured: `<class 'ValueError'>: error`\n```\n "
3235
f'File "{__file__}", '
33-
"""line 10, in error_with_traceback\n raise ValueError("error")\n\n```"""
36+
f"""line {line_num}, in error_with_traceback\n raise ValueError("error")\n\n```"""
3437
),
3538
},
3639
]
40+
41+
42+
def test_as_context():
43+
with Logger() as logger:
44+
logger.info("msg1")
45+
assert logger.messages
46+
assert logger.messages == []
47+
48+
49+
def test_script_id_context(timezone_now):
50+
timezone_now(datetime.datetime(2000, 1, 2, tzinfo=datetime.timezone.utc))
51+
logger = Logger()
52+
with logger.script_id("script1"):
53+
assert logger._script_id == "script1"
54+
logger.info("msg1")
55+
assert logger.messages == [
56+
Message(
57+
status="info",
58+
message="msg1",
59+
time=datetime.datetime(2000, 1, 2, 0, 0, tzinfo=datetime.timezone.utc),
60+
script_id="script1",
61+
)
62+
]
63+
assert logger.messages == []
64+
assert logger._script_id is None

validity/utils/logger.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def __init__(self) -> None:
5050
self.messages = []
5151
self._script_id = None
5252

53-
def __enter__(self) -> None:
53+
def __enter__(self) -> "Logger":
5454
return self
5555

5656
def __exit__(self, ty, exc, val):
@@ -82,5 +82,5 @@ def log_exception(self, exc_value, exc_type=None, exc_traceback=None):
8282
self.failure(f"Unhandled error occured: `{exc_type}: {exc_value}`\n```\n{stacktrace}\n```")
8383

8484
def flush(self):
85-
self.script_id = None
85+
self._script_id = None
8686
self.messages = []

0 commit comments

Comments
 (0)