From c8eb4ff375e3130d0e32f12cbcc0290eec053359 Mon Sep 17 00:00:00 2001 From: daveoconnor Date: Mon, 3 Nov 2025 14:46:50 -0800 Subject: [PATCH] Added check to prevent breakages immediately after release (#1879) (#1988) --- ak/tests/test_default_pages.py | 17 +++++++++++ versions/managers.py | 2 +- ...5_version_versions_ve_active_ae486b_idx.py | 20 +++++++++++++ versions/models.py | 5 ++++ versions/tests/fixtures.py | 29 +++++++++++++++++++ versions/tests/test_managers.py | 4 ++- 6 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 versions/migrations/0025_version_versions_ve_active_ae486b_idx.py diff --git a/ak/tests/test_default_pages.py b/ak/tests/test_default_pages.py index 85dc4ebd..c7351142 100644 --- a/ak/tests/test_default_pages.py +++ b/ak/tests/test_default_pages.py @@ -18,6 +18,23 @@ def test_homepage(library, library_version, version, tp): assert "featured_library" in response.context +def test_homepage_not_fully_imported( + library, library_version, version, not_imported_version, tp +): + """Ensure homepage excludes versions that are not fully imported""" + # Verify the version is indeed not fully imported + assert not_imported_version.fully_imported is False + + url = tp.reverse("home") + if not url: + url = "/" + + response = tp.get_check_200(url) + assert "entries" in response.context + assert "latest_version" in response.context + assert response.context["latest_version"] is not not_imported_version + + def test_200_page(db, tp): """Test a 200 OK page""" diff --git a/versions/managers.py b/versions/managers.py index 7ee8a7cf..d1222aa5 100644 --- a/versions/managers.py +++ b/versions/managers.py @@ -12,7 +12,7 @@ from libraries.constants import ( class VersionQuerySet(models.QuerySet): def active(self): """Return active versions""" - return self.filter(active=True) + return self.filter(active=True, fully_imported=True) def most_recent(self): """Return most recent active non-beta version""" diff --git a/versions/migrations/0025_version_versions_ve_active_ae486b_idx.py b/versions/migrations/0025_version_versions_ve_active_ae486b_idx.py new file mode 100644 index 00000000..757834d7 --- /dev/null +++ b/versions/migrations/0025_version_versions_ve_active_ae486b_idx.py @@ -0,0 +1,20 @@ +# Generated by Django 5.2.7 on 2025-10-27 19:08 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("versions", "0024_alter_versionfile_checksum_and_more"), + ] + + operations = [ + migrations.AddIndex( + model_name="version", + index=models.Index( + fields=["active", "fully_imported"], + name="versions_ve_active_ae486b_idx", + ), + ), + ] diff --git a/versions/models.py b/versions/models.py index bd746861..87e45130 100755 --- a/versions/models.py +++ b/versions/models.py @@ -45,6 +45,11 @@ class Version(models.Model): ) objects = VersionManager() + class Meta: + indexes = [ + models.Index(fields=["active", "fully_imported"]), + ] + def __str__(self): return self.name diff --git a/versions/tests/fixtures.py b/versions/tests/fixtures.py index 7a4da3e1..fca57b34 100644 --- a/versions/tests/fixtures.py +++ b/versions/tests/fixtures.py @@ -21,6 +21,7 @@ def beta_version(db): description="Some awesome description of the library", release_date=datetime.date.today(), beta=True, + fully_imported=True, ) # Make version download file @@ -44,6 +45,31 @@ def version(db): name="boost-1.79.0", description="Some awesome description of the library", release_date=yesterday, + fully_imported=True, + ) + + # Make version download file + c = fake_checksum() + baker.make( + "versions.VersionFile", + version=v, + checksum=c, + url="https://example.com/version_1.tar.gz", + ) + + return v + + +@pytest.fixture +def not_imported_version(db): + # Make version that is not fully imported + yesterday = datetime.date.today() - datetime.timedelta(days=1) + v = baker.make( + "versions.Version", + name="boost-1.80.0", + description="A version that is not fully imported", + release_date=yesterday, + fully_imported=False, ) # Make version download file @@ -68,6 +94,7 @@ def inactive_version(db): description="Some old description of the library", release_date=yesterday, active=False, + fully_imported=True, ) # Make version download file @@ -91,6 +118,7 @@ def old_version(db): name="boost-1.70.0", description="Some awesome description of the library", release_date=last_year, + fully_imported=True, ) # Make version download file @@ -116,6 +144,7 @@ def full_version_one(db): description="Some old description of the library for v1.79.0", release_date=yesterday, active=False, + fully_imported=True, ) f1_url = f"{base_url}version1{base_url_suffix}" diff --git a/versions/tests/test_managers.py b/versions/tests/test_managers.py index 3ef29c05..396230f0 100644 --- a/versions/tests/test_managers.py +++ b/versions/tests/test_managers.py @@ -110,7 +110,7 @@ def test_version_dropdown_strict( # Additional setup for most recent non-beta version most_recent_version = Version.objects.create( - name=most_recent_name, beta=False, full_release=True + name=most_recent_name, beta=False, full_release=True, fully_imported=True ) most_recent_version.save() @@ -118,12 +118,14 @@ def test_version_dropdown_strict( version.name = version_name version.beta = beta version.full_release = full_release + version.fully_imported = True version.save() if most_recent_beta_name: beta_version.name = most_recent_beta_name beta_version.beta = True beta_version.full_release = False + beta_version.fully_imported = True beta_version.save() queryset = Version.objects.get_dropdown_versions()