Skip to content

Commit 1c911d9

Browse files
emyllerClaudeClaude (Anthropic AI)claude
committed
Improve segment audit log and tests
Co-authored-by: Claude <[email protected]> Co-authored-by: Claude (Anthropic AI) <[email protected]> Co-authored-by: Claude <[email protected]>
1 parent 206e538 commit 1c911d9

File tree

2 files changed

+49
-33
lines changed

2 files changed

+49
-33
lines changed

api/segments/models.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -135,13 +135,8 @@ def __str__(self): # type: ignore[no-untyped-def]
135135
def get_skip_create_audit_log(self) -> bool:
136136
if self.is_system_segment:
137137
return True
138-
try:
139-
if self.version_of_id and self.version_of_id != self.id:
140-
return True
141-
except Segment.DoesNotExist:
142-
return True
143-
144-
return False
138+
is_revision = bool(self.version_of_id and self.version_of_id != self.id)
139+
return is_revision
145140

146141
@hook(AFTER_CREATE, when="version_of", is_now=None)
147142
def set_version_of_to_self_if_none(self): # type: ignore[no-untyped-def]

api/tests/unit/segments/test_unit_segments_models.py

Lines changed: 47 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from collections.abc import Callable
22
from typing import Any
3-
from unittest.mock import PropertyMock
43

54
import pytest
65
from django.core.exceptions import ValidationError
@@ -29,7 +28,15 @@ def test_Condition_str__returns_readable_representation_of_condition(
2928
assert result == "Condition for ALL rule for Segment - segment: foo EQUAL bar"
3029

3130

32-
def test_Condition_get_skip_create_audit_log__returns_true(
31+
@pytest.mark.parametrize(
32+
"delete",
33+
[
34+
lambda rule: rule.delete(),
35+
lambda rule: rule.hard_delete(),
36+
],
37+
)
38+
def test_Condition_get_skip_create_audit_log__rule_deleted__returns_true(
39+
delete: Callable[[SegmentRule], None],
3340
segment_rule: SegmentRule,
3441
) -> None:
3542
# Given
@@ -38,16 +45,45 @@ def test_Condition_get_skip_create_audit_log__returns_true(
3845
property="foo",
3946
operator=EQUAL,
4047
value="bar",
48+
created_with_segment=False,
4149
)
4250

4351
# When
44-
result = condition.get_skip_create_audit_log()
52+
delete(segment_rule)
4553

4654
# Then
47-
assert result is True
55+
assert condition.get_skip_create_audit_log() is True
4856

4957

50-
def test_manager_returns_only_highest_version_of_segments(
58+
@pytest.mark.parametrize(
59+
"delete",
60+
[
61+
lambda segment: segment.delete(),
62+
lambda segment: segment.hard_delete(),
63+
],
64+
)
65+
def test_Condition_get_skip_create_audit_log__segment_deleted__returns_true(
66+
delete: Callable[[Segment], None],
67+
segment: Segment,
68+
segment_rule: SegmentRule,
69+
) -> None:
70+
# Given
71+
condition = Condition.objects.create(
72+
rule=segment_rule,
73+
property="foo",
74+
operator=EQUAL,
75+
value="bar",
76+
created_with_segment=False,
77+
)
78+
79+
# When
80+
delete(segment)
81+
82+
# Then
83+
assert condition.get_skip_create_audit_log() is True
84+
85+
86+
def test_LiveSegmentManager__returns_only_highest_version_of_segments(
5187
segment: Segment,
5288
) -> None:
5389
# Given
@@ -108,24 +144,7 @@ def test_SegmentRule_get_skip_create_audit_log__returns_true(
108144
assert result is True
109145

110146

111-
def test_segment_get_skip_create_audit_log_when_exception(
112-
mocker: MockerFixture,
113-
segment: Segment,
114-
) -> None:
115-
# Given
116-
patched_segment = mocker.patch.object(
117-
Segment, "version_of_id", new_callable=PropertyMock
118-
)
119-
patched_segment.side_effect = Segment.DoesNotExist("Segment missing")
120-
121-
# When
122-
result = segment.get_skip_create_audit_log()
123-
124-
# Then
125-
assert result is True
126-
127-
128-
def test_delete_segment_only_schedules_one_task_for_audit_log_creation(
147+
def test_Segment_delete__multiple_rules_conditions__schedules_audit_log_task_once(
129148
mocker: MockerFixture, segment: Segment
130149
) -> None:
131150
# Given
@@ -143,11 +162,11 @@ def test_delete_segment_only_schedules_one_task_for_audit_log_creation(
143162
)
144163

145164
# When
146-
mocked_tasks = mocker.patch("core.signals.tasks")
165+
task = mocker.patch("core.signals.tasks.create_audit_log_from_historical_record")
147166
segment.delete()
148167

149168
# Then
150-
assert len(mocked_tasks.mock_calls) == 1
169+
assert task.delay.call_count == 1
151170

152171

153172
def test_Segment_clone__can_create_standalone_segment_clone(
@@ -264,7 +283,9 @@ def test_Segment_clone__segment_with_rules__returns_new_segment_with_copied_rule
264283
]
265284

266285

267-
def test_system_segment_get_skip_create_audit_log(system_segment: Segment) -> None:
286+
def test_Segment_get_skip_create_audit_log__system_segment__returns_true(
287+
system_segment: Segment,
288+
) -> None:
268289
# When
269290
result = system_segment.get_skip_create_audit_log()
270291

0 commit comments

Comments
 (0)