Coverage for src/tests/api/v1/trainings/test_presenters.py: 100%

27 statements  

« prev     ^ index     » next       coverage.py v7.11.0, created at 2024-01-01 00:00 +0000

1"""Module for testing presenters for /api/v1/trainings.""" 

2 

3import json 

4 

5from typing import Any 

6 

7import pytest 

8 

9from deepdiff import DeepDiff 

10from kwai_api.v1.trainings.presenters import JsonApiTrainingPresenter 

11from kwai_bc_training.trainings.training import TrainingEntity, TrainingIdentifier 

12from kwai_core.domain.value_objects.identifier import IntIdentifier 

13from kwai_core.domain.value_objects.name import Name 

14from kwai_core.domain.value_objects.owner import Owner 

15from kwai_core.domain.value_objects.period import Period 

16from kwai_core.domain.value_objects.text import DocumentFormat, Locale, LocaleText 

17from kwai_core.domain.value_objects.timestamp import Timestamp 

18from kwai_core.domain.value_objects.unique_id import UniqueId 

19 

20 

21@pytest.fixture 

22def training() -> TrainingEntity: 

23 """A fixture for a training entity.""" 

24 return TrainingEntity( 

25 id=TrainingIdentifier(1), 

26 texts=( 

27 LocaleText( 

28 locale=Locale.NL, 

29 format=DocumentFormat.MARKDOWN, 

30 content="This is a test training", 

31 summary="Test API training", 

32 title="Test API Training", 

33 author=Owner( 

34 id=IntIdentifier(1), 

35 uuid=UniqueId.generate(), 

36 name=Name(first_name="Jigoro", last_name="Kano"), 

37 ), 

38 ), 

39 ), 

40 period=Period.create_from_delta( 

41 Timestamp.create_from_string("2023-01-02 20:00:00"), hours=2 

42 ), 

43 ) 

44 

45 

46@pytest.fixture 

47def expected_training_json(training: TrainingEntity) -> dict[str, Any]: 

48 """A fixture for a JSON:API resource of a training.""" 

49 return { 

50 "data": { 

51 "id": "1", 

52 "type": "trainings", 

53 "meta": { 

54 "created_at": str(training.traceable_time.created_at), 

55 "updated_at": str(training.traceable_time.updated_at), 

56 }, 

57 "attributes": { 

58 "texts": [ 

59 { 

60 "locale": "nl", 

61 "format": "md", 

62 "title": "Test API Training", 

63 "summary": "<p>Test API training</p>", 

64 "content": "<p>This is a test training</p>", 

65 "original_summary": "Test API training", 

66 "original_content": "This is a test training", 

67 } 

68 ], 

69 "event": { 

70 "start_date": "2023-01-02 20:00:00", 

71 "end_date": "2023-01-02 22:00:00", 

72 "location": "", 

73 "cancelled": False, 

74 "active": True, 

75 }, 

76 "remark": "", 

77 }, 

78 "relationships": { 

79 "teams": {"data": []}, 

80 "coaches": {"data": []}, 

81 "schedule": {"data": None}, 

82 }, 

83 }, 

84 "included": [], 

85 } 

86 

87 

88def test_present_training(training, expected_training_json): 

89 """Test a presenter for one training.""" 

90 presenter = JsonApiTrainingPresenter() 

91 presenter.present(training) 

92 document = presenter.get_document() 

93 assert document is not None, "There should be a JSON:API document" 

94 json_resource = json.loads(document.model_dump_json()) 

95 

96 diff = DeepDiff(json_resource, expected_training_json, ignore_order=True) 

97 assert not diff, f"JSON structure is not expected:{diff}"