Coverage for src/mesh/models/factories.py: 100%
60 statements
« prev ^ index » next coverage.py v7.9.0, created at 2026-02-04 09:42 +0000
« prev ^ index » next coverage.py v7.9.0, created at 2026-02-04 09:42 +0000
1from datetime import datetime, timedelta
2from typing import Generic, TypeVar
4import factory
5import factory.django
7from .editorial_models import EditorialDecision
8from .journal_models import JournalSection
9from .review_models import Review
10from .submission_models import Submission, SubmissionAuthor, SubmissionVersion
11from .user_models import User
13T = TypeVar("T")
16class BaseTypingFactory(Generic[T], factory.django.DjangoModelFactory):
17 """
18 Factory boy does not provide correct type hints of created objects.
19 For ex: the type of `sub = SubmissionFactory()` is `SubmissionFactory` when we want
20 `Submission`
22 This base class enables correct type hints when instantiating new objects
23 using the `create()` method.
24 Ex: `sub = SubmissionFactory.create()` will have the correct type: `Submission`.
25 """
27 @classmethod
28 def create(cls, **kwargs) -> T:
29 return super().create(**kwargs)
31 @classmethod
32 def build(cls, **kwargs) -> T:
33 return super().build(**kwargs)
36class UserFactory(BaseTypingFactory[User]):
37 class Meta:
38 model = User
40 first_name = factory.Faker("first_name")
41 last_name = factory.Faker("last_name")
42 email = factory.Faker("email")
43 password = factory.django.Password("my_password")
46class JournalSectionFactory(BaseTypingFactory[JournalSection]):
47 class Meta:
48 model = JournalSection
50 created_by = factory.SubFactory(UserFactory)
51 name = factory.Faker("name")
54class SubmissionFactory(BaseTypingFactory[Submission]):
55 class Meta:
56 model = Submission
58 created_by = factory.SubFactory(UserFactory)
59 name = factory.Faker("sentence")
60 abstract = factory.Faker("paragraphs")
61 author_agreement = True
64class SubmissionVersionFactory(BaseTypingFactory[SubmissionVersion]):
65 class Meta:
66 model = SubmissionVersion
68 submission = factory.SubFactory(SubmissionFactory)
71class SubmissionAuthorFactory(BaseTypingFactory[SubmissionAuthor]):
72 class Meta:
73 model = SubmissionAuthor
75 submission = factory.SubFactory(SubmissionFactory)
76 first_name = factory.Faker("first_name")
77 last_name = factory.Faker("last_name")
78 email = factory.Faker("email")
81class ReviewFactory(BaseTypingFactory[Review]):
82 class Meta:
83 model = Review
85 reviewer = factory.SubFactory(UserFactory)
86 version = factory.SubFactory(SubmissionVersionFactory)
87 date_response_due = datetime.utcnow().date() + timedelta(days=3)
88 date_review_due = datetime.utcnow().date() + timedelta(days=3)
91class EditorialDecisionFactory(BaseTypingFactory[EditorialDecision]):
92 class Meta:
93 model = EditorialDecision
95 created_by = factory.SubFactory(UserFactory)
96 version = factory.SubFactory(SubmissionVersionFactory)
97 comment = factory.Faker("paragraphs")