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
« 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."""
3import json
5from typing import Any
7import pytest
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
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 )
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 }
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())
96 diff = DeepDiff(json_resource, expected_training_json, ignore_order=True)
97 assert not diff, f"JSON structure is not expected:{diff}"