Compare commits

...

5 Commits

Author SHA1 Message Date
61c81e05b6 Set up hypothesis profiles in dev/ci environments
All checks were successful
Ruff / ruff (push) Successful in 25s
Test / test (push) Successful in 5m20s
2024-02-19 16:22:39 -05:00
8d0730bf70 paperwork: Improve performance of random_certifications testing strategy
Some checks failed
Ruff / ruff (push) Successful in 22s
Test / test (push) Failing after 3m56s
2024-02-17 15:56:32 -05:00
6cf520fdf9 Add pdm lock check to pre-commit checks 2024-02-17 15:44:12 -05:00
aec64ea5f3 gitea-actions: Use pdm sync instead of install
Some checks failed
Ruff / ruff (push) Successful in 22s
Test / test (push) Failing after 3m50s
2024-02-17 13:58:07 -05:00
4a0ccdb8bc gitea-actions: Use empty string for github token 2024-02-17 13:58:04 -05:00
6 changed files with 64 additions and 23 deletions

View File

@ -24,11 +24,12 @@ jobs:
with: with:
cache: true cache: true
python-version: ~3.11 python-version: ~3.11
token: ""
- name: Install apt dependencies - name: Install apt dependencies
run: >- run: >-
sudo apt-get update && sudo apt-get update &&
sudo apt-get -y install build-essential python3-dev libldap2-dev libsasl2-dev mariadb-client sudo apt-get -y install build-essential python3-dev libldap2-dev libsasl2-dev mariadb-client
- name: Install python dependencies - name: Install python dependencies
run: pdm install run: pdm sync -d
- name: Run tests - name: Run tests
run: pdm run ./manage.py test --parallel auto run: pdm run -v ./manage.py test --parallel auto

View File

@ -19,6 +19,11 @@ repos:
- id: ruff - id: ruff
- id: ruff-format - id: ruff-format
- repo: https://github.com/pdm-project/pdm
rev: 2.12.3
hooks:
- id: pdm-lock-check
# TODO: waiting on django-recurrence 1.12 to be released on PyPi # TODO: waiting on django-recurrence 1.12 to be released on PyPi
# - repo: local # - repo: local
# hooks: # hooks:

View File

@ -1,4 +1,7 @@
from hypothesis import settings
from .base import * # noqa: F403 from .base import * # noqa: F403
from .hypothesis import configure_hypothesis_profiles
# Quick-start development settings - unsuitable for production # Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/ # See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/
@ -31,3 +34,5 @@ DATABASES = {
}, },
}, },
} }
configure_hypothesis_profiles()
settings.load_profile("ci")

View File

@ -1,4 +1,9 @@
import os
from hypothesis import settings
from .base import * # noqa: F403 from .base import * # noqa: F403
from .hypothesis import configure_hypothesis_profiles
# Quick-start development settings - unsuitable for production # Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/ # See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/
@ -13,3 +18,6 @@ INSTALLED_APPS.append("debug_toolbar") # noqa: F405
INSTALLED_APPS.append("django_extensions") # noqa: F405 INSTALLED_APPS.append("django_extensions") # noqa: F405
MIDDLEWARE.insert(0, "debug_toolbar.middleware.DebugToolbarMiddleware") # noqa: F405 MIDDLEWARE.insert(0, "debug_toolbar.middleware.DebugToolbarMiddleware") # noqa: F405
configure_hypothesis_profiles()
settings.load_profile(os.getenv("HYPOTHESIS_PROFILE", "dev"))

View File

@ -0,0 +1,7 @@
from hypothesis import HealthCheck, Verbosity, settings
def configure_hypothesis_profiles():
settings.register_profile("ci", suppress_health_check=(HealthCheck.too_slow,))
settings.register_profile("dev", max_examples=20)
settings.register_profile("debug", max_examples=10, verbosity=Verbosity.verbose)

View File

@ -1,3 +1,5 @@
from itertools import chain
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib.auth.models import Permission from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
@ -78,29 +80,42 @@ class InstructorOrVendorReportTestCase(PermissionRequiredViewTestCaseMixin, Test
@st.composite @st.composite
def random_certifications(draw): def random_certifications(
departments = draw(st.lists(from_model(Department), min_size=1)) draw,
definitions = draw( ) -> list[Certification]:
st.lists( def certifications(version: CertificationVersion):
from_model( return st.lists(
CertificationDefinition, department=st.sampled_from(departments)
),
min_size=1,
)
)
certification_versions = draw(
st.lists(
from_model(CertificationVersion, definition=st.sampled_from(definitions)),
min_size=1,
)
)
return draw(
st.lists(
from_model( from_model(
Certification, Certification,
number=st.none(), number=st.none(),
certification_version=st.sampled_from(certification_versions), certification_version=st.just(version),
),
max_size=10,
)
def versions_with_certifications(definition: CertificationDefinition):
return st.lists(
from_model(CertificationVersion, definition=st.just(definition)).flatmap(
certifications
),
max_size=2,
)
def definitions_with_versions(department: Department):
return st.lists(
from_model(CertificationDefinition, department=st.just(department)).flatmap(
versions_with_certifications
),
max_size=2,
)
return draw(
st.lists(
from_model(Department).flatmap(definitions_with_versions),
max_size=2,
).map(
lambda x: list(
chain.from_iterable(chain.from_iterable(chain.from_iterable(x)))
) )
) )
) )
@ -111,7 +126,7 @@ class CertifiersReportTestCase(PermissionRequiredViewTestCaseMixin, TestCase):
path = "/paperwork/certifiers" path = "/paperwork/certifiers"
@given(certifications=random_certifications()) @given(certifications=random_certifications())
def test_certifers_report(self, certifications: list[Certification]) -> None: def test_certifiers_report(self, certifications: list[Certification]) -> None:
self.client.force_login(self.user_with_permission) self.client.force_login(self.user_with_permission)
response = self.client.get(self.path) response = self.client.get(self.path)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)