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

1from datetime import datetime, timedelta 

2from typing import Generic, TypeVar 

3 

4import factory 

5import factory.django 

6 

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 

12 

13T = TypeVar("T") 

14 

15 

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` 

21 

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 """ 

26 

27 @classmethod 

28 def create(cls, **kwargs) -> T: 

29 return super().create(**kwargs) 

30 

31 @classmethod 

32 def build(cls, **kwargs) -> T: 

33 return super().build(**kwargs) 

34 

35 

36class UserFactory(BaseTypingFactory[User]): 

37 class Meta: 

38 model = User 

39 

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") 

44 

45 

46class JournalSectionFactory(BaseTypingFactory[JournalSection]): 

47 class Meta: 

48 model = JournalSection 

49 

50 created_by = factory.SubFactory(UserFactory) 

51 name = factory.Faker("name") 

52 

53 

54class SubmissionFactory(BaseTypingFactory[Submission]): 

55 class Meta: 

56 model = Submission 

57 

58 created_by = factory.SubFactory(UserFactory) 

59 name = factory.Faker("sentence") 

60 abstract = factory.Faker("paragraphs") 

61 author_agreement = True 

62 

63 

64class SubmissionVersionFactory(BaseTypingFactory[SubmissionVersion]): 

65 class Meta: 

66 model = SubmissionVersion 

67 

68 submission = factory.SubFactory(SubmissionFactory) 

69 

70 

71class SubmissionAuthorFactory(BaseTypingFactory[SubmissionAuthor]): 

72 class Meta: 

73 model = SubmissionAuthor 

74 

75 submission = factory.SubFactory(SubmissionFactory) 

76 first_name = factory.Faker("first_name") 

77 last_name = factory.Faker("last_name") 

78 email = factory.Faker("email") 

79 

80 

81class ReviewFactory(BaseTypingFactory[Review]): 

82 class Meta: 

83 model = Review 

84 

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) 

89 

90 

91class EditorialDecisionFactory(BaseTypingFactory[EditorialDecision]): 

92 class Meta: 

93 model = EditorialDecision 

94 

95 created_by = factory.SubFactory(UserFactory) 

96 version = factory.SubFactory(SubmissionVersionFactory) 

97 comment = factory.Faker("paragraphs")