Skip to content

Commit 747dc5f

Browse files
committed
Update Patch constraint and add a test for the constraint
Signed-off-by: ziad hany <ziadhany2016@gmail.com>
1 parent 8657a92 commit 747dc5f

File tree

3 files changed

+39
-8
lines changed

3 files changed

+39
-8
lines changed

vulnerabilities/migrations/0104_packagecommitpatch_patch_and_more.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 4.2.25 on 2025-12-11 12:23
1+
# Generated by Django 4.2.25 on 2025-12-11 21:28
22

33
from django.db import migrations, models
44

@@ -102,9 +102,12 @@ class Migration(migrations.Migration):
102102
constraint=models.CheckConstraint(
103103
check=models.Q(
104104
models.Q(
105-
("patch_url__isnull", False), ("patch_text__isnull", False), _connector="OR"
105+
("patch_url__isnull", False), models.Q(("patch_url", ""), _negated=True)
106106
),
107-
models.Q(("patch_url", ""), ("patch_text", ""), _negated=True),
107+
models.Q(
108+
("patch_text__isnull", False), models.Q(("patch_text", ""), _negated=True)
109+
),
110+
_connector="OR",
108111
),
109112
name="patch_url_or_patch_text",
110113
),

vulnerabilities/models.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2782,8 +2782,10 @@ class Meta:
27822782
unique_together = ["patch_checksum", "patch_url"]
27832783
constraints = [
27842784
models.CheckConstraint(
2785-
check=(Q(patch_url__isnull=False) | Q(patch_text__isnull=False))
2786-
& ~(Q(patch_url="") & Q(patch_text="")),
2785+
check=(
2786+
Q(patch_url__isnull=False) & ~Q(patch_url="")
2787+
| Q(patch_text__isnull=False) & ~Q(patch_text="")
2788+
),
27872789
name="patch_url_or_patch_text",
27882790
)
27892791
]

vulnerabilities/tests/test_models.py

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@
1010
import urllib.parse
1111
from datetime import datetime
1212
from unittest import TestCase
13+
from unittest.mock import patch
1314

1415
import pytest
1516
from django.core.exceptions import ValidationError
17+
from django.db.utils import IntegrityError
1618
from django.test import TestCase as DjangoTestCase
1719
from packageurl import PackageURL
1820
from univers import versions
@@ -25,6 +27,7 @@
2527
from vulnerabilities.importer import Reference
2628
from vulnerabilities.models import Alias
2729
from vulnerabilities.models import Package
30+
from vulnerabilities.models import Patch
2831
from vulnerabilities.models import Vulnerability
2932
from vulnerabilities.utils import compute_content_id
3033

@@ -647,9 +650,6 @@ def test_advisory_insert_no_duplicate_content_id(self):
647650
)
648651

649652

650-
from unittest.mock import patch
651-
652-
653653
class TestPipelineRunModel(DjangoTestCase):
654654
def setUp(self):
655655
self.schedule1 = models.PipelineSchedule.objects.create(pipeline_id="test_pipeline")
@@ -694,3 +694,29 @@ def test_pipelineschedule_latest_run_date(self):
694694

695695
def test_pipelineschedule_all_runs(self):
696696
self.assertEqual(self.schedule1.all_runs.count(), 2)
697+
698+
699+
class PatchConstraintTests(TestCase):
700+
@pytest.mark.django_db
701+
def test_constraint_none(self):
702+
with self.assertRaises(IntegrityError) as raised:
703+
Patch.objects.create(patch_url=None, patch_text=None)
704+
self.assertIn("patch_url_or_patch_text", str(raised.exception))
705+
706+
@pytest.mark.django_db
707+
def test_constraint_empty(self):
708+
with self.assertRaises(IntegrityError) as raised:
709+
Patch.objects.create(patch_url="", patch_text="")
710+
self.assertIn("patch_url_or_patch_text", str(raised.exception))
711+
712+
@pytest.mark.django_db
713+
def test_constraint_empty_none(self):
714+
with self.assertRaises(IntegrityError) as raised:
715+
Patch.objects.create(patch_url="", patch_text=None)
716+
self.assertIn("patch_url_or_patch_text", str(raised.exception))
717+
718+
@pytest.mark.django_db
719+
def test_constraint_none_empty(self):
720+
with self.assertRaises(IntegrityError) as raised:
721+
Patch.objects.create(patch_url=None, patch_text="")
722+
self.assertIn("patch_url_or_patch_text", str(raised.exception))

0 commit comments

Comments
 (0)