Skip to content

Commit

Permalink
Enhance validation on send application mutation
Browse files Browse the repository at this point in the history
  • Loading branch information
matti-lamppu committed Dec 18, 2024
1 parent 647d848 commit dd44f1c
Show file tree
Hide file tree
Showing 7 changed files with 1,104 additions and 69 deletions.
2 changes: 1 addition & 1 deletion tests/factories/address.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class Meta:
post_code = FakerFI("postcode")

city = "Helsinki"
city_fi = city
city_fi = LazyAttribute(lambda i: i.city)
city_en = "Helsinki"
city_sv = "Helsingfors"

Expand Down
76 changes: 75 additions & 1 deletion tests/factories/application.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

from tilavarauspalvelu.enums import ApplicantTypeChoice, ApplicationStatusChoice, Priority, Weekday
from tilavarauspalvelu.models import Application
from utils.date_utils import local_datetime
from utils.date_utils import local_datetime, local_time

from ._base import FakerFI, ForeignKeyFactory, GenericDjangoModelFactory, ModelFactoryBuilder, ReverseForeignKeyFactory

Expand Down Expand Up @@ -102,6 +102,80 @@ def create_in_status_expired(cls, **kwargs: Any) -> Application:
def create_in_status_cancelled(cls, **kwargs: Any) -> Application:
return ApplicationBuilder().cancelled().create(**kwargs)

@classmethod
def create_application_ready_for_sending(cls, **kwargs: Any) -> Application:
"""
Create an application that is ready to be sent (for individual applicant by default):
- is in an open application round
- is a draft
- has one application section
- section has a name
- section has a non-zero number of participants
- section has an age group
- section has a purpose
- section has applied for 1 reservation per week
- section has applied for minimum reservation duration of 1 hour
- section has one suitable timeslot, that is at least as long as the minimum reservation duration
- section has at lest one reservation unit option
- application is for an individual
- application has a contact person
- application has a billing address
"""
from .application_round import ApplicationRoundFactory

round_kwargs = cls.pop_sub_kwargs("application_round", kwargs)
application_round = ApplicationRoundFactory.create_in_status_open(**round_kwargs)

defaults: dict[str, Any] = {
"application_round": application_round,
"applicant_type": ApplicantTypeChoice.INDIVIDUAL,
"cancelled_date": None,
"sent_date": None,
**kwargs,
}

if not any(arg.startswith("organisation") for arg in kwargs):
defaults.setdefault("organisation", None)

if not any(arg.startswith("home_city") for arg in kwargs):
defaults.setdefault("home_city", None)

if "contact_person" not in defaults:
defaults.setdefault("contact_person__first_name", "Test")
defaults.setdefault("contact_person__last_name", "User")
defaults.setdefault("contact_person__email", "test@example.com")
defaults.setdefault("contact_person__phone_number", "1234567890")

if "billing_address" not in defaults:
defaults.setdefault("billing_address__street_address", "Street")
defaults.setdefault("billing_address__post_code", "12345")
defaults.setdefault("billing_address__city", "City")

if "application_sections" not in kwargs:
defaults.setdefault("application_sections__name", "Test application section")
defaults.setdefault("application_sections__num_persons", 1)
defaults.setdefault("application_sections__applied_reservations_per_week", 1)
defaults.setdefault("application_sections__reservation_min_duration", datetime.timedelta(hours=1))
defaults.setdefault("application_sections__reservation_max_duration", datetime.timedelta(hours=2))

if "application_sections__purpose" not in kwargs:
defaults.setdefault("application_sections__purpose__name", "Test purpose")

if "application_sections__age_group" not in kwargs:
defaults.setdefault("application_sections__age_group__minimum", 1)
defaults.setdefault("application_sections__age_group__maximum", 10)

if "application_sections__reservation_unit_options" not in kwargs:
defaults.setdefault("application_sections__reservation_unit_options__preferred_order", 1)

if "application_sections__suitable_time_ranges" not in kwargs:
defaults.setdefault("application_sections__suitable_time_ranges__priority", Priority.PRIMARY)
defaults.setdefault("application_sections__suitable_time_ranges__day_of_the_week", Weekday.MONDAY)
defaults.setdefault("application_sections__suitable_time_ranges__begin_time", local_time(10, 0))
defaults.setdefault("application_sections__suitable_time_ranges__end_time", local_time(11, 0))

return cls.create(**defaults)

@classmethod
def create_application_ready_for_allocation(
cls,
Expand Down
53 changes: 53 additions & 0 deletions tests/factories/organisation.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from __future__ import annotations

from typing import Any

from factory import LazyAttribute, fuzzy

from tilavarauspalvelu.enums import OrganizationTypeChoice
Expand Down Expand Up @@ -38,3 +40,54 @@ class Meta:
address = ForeignKeyFactory("tests.factories.AddressFactory", required=True)

applications = ReverseForeignKeyFactory("tests.factories.ApplicationFactory")

@classmethod
def create_for_community_applicant(cls, **kwargs: Any) -> Organisation:
defaults = {
"name": "Test Community",
"organisation_type": OrganizationTypeChoice.RELIGIOUS_COMMUNITY,
"core_business": "Testing business",
"identifier": None,
**kwargs,
}

if "address" not in defaults:
defaults.setdefault("address__street_address", "Org address")
defaults.setdefault("address__post_code", "54321")
defaults.setdefault("address__city", "City")

return cls.create(**defaults)

@classmethod
def create_for_association_applicant(cls, **kwargs: Any) -> Organisation:
defaults = {
"name": "Test Association",
"organisation_type": OrganizationTypeChoice.PUBLIC_ASSOCIATION,
"core_business": "Testing business",
"identifier": None,
**kwargs,
}

if "address" not in defaults:
defaults.setdefault("address__street_address", "Org address")
defaults.setdefault("address__post_code", "54321")
defaults.setdefault("address__city", "City")

return cls.create(**defaults)

@classmethod
def create_for_company_applicant(cls, **kwargs: Any) -> Organisation:
defaults = {
"name": "Test Company",
"organisation_type": OrganizationTypeChoice.COMPANY,
"core_business": "Testing business",
"identifier": "123456-0",
**kwargs,
}

if "address" not in defaults:
defaults.setdefault("address__street_address", "Org address")
defaults.setdefault("address__post_code", "54321")
defaults.setdefault("address__city", "City")

return cls.create(**defaults)
Loading

0 comments on commit dd44f1c

Please sign in to comment.