Coverage for src/tests/fixtures/portal/news.py: 100%

36 statements  

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

1"""Module for defining factory fixtures for news items.""" 

2 

3import pytest 

4 

5from kwai_bc_portal.domain.application import ApplicationEntity 

6from kwai_bc_portal.domain.news_item import ( 

7 NewsItemEntity, 

8 Promotion, 

9) 

10from kwai_bc_portal.news.news_item_db_repository import NewsItemDbRepository 

11from kwai_core.db.database import Database 

12from kwai_core.db.uow import UnitOfWork 

13from kwai_core.domain.value_objects.owner import Owner 

14from kwai_core.domain.value_objects.period import Period 

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

16 

17 

18@pytest.fixture 

19def make_news_item(make_application, make_user): 

20 """A factory fixture for creating a news item.""" 

21 

22 def _make_news_item( 

23 *, 

24 enabled: bool = True, 

25 promotion: Promotion | None = None, 

26 period: Period | None = None, 

27 application: ApplicationEntity | None = None, 

28 texts: tuple[LocaleText, ...] | None = None, 

29 remark: str = "", 

30 owner: Owner | None = None, 

31 ) -> NewsItemEntity: 

32 if owner is None: 

33 user = make_user() 

34 owner = Owner(id=user.id, uuid=user.uuid, name=user.name) 

35 

36 return NewsItemEntity( 

37 enabled=enabled, 

38 promotion=promotion or Promotion(), 

39 period=period or Period(), 

40 application=application or make_application(), 

41 texts=texts 

42 or ( 

43 LocaleText( 

44 locale=Locale.EN, 

45 format=DocumentFormat.MARKDOWN, 

46 title="Test Text", 

47 summary="This is a test.", 

48 content="This is the long text of the test.", 

49 author=owner, 

50 ), 

51 ), 

52 remark=remark, 

53 ) 

54 

55 return _make_news_item 

56 

57 

58@pytest.fixture 

59async def make_news_item_in_db( 

60 database: Database, 

61 make_news_item, 

62 make_user_account_in_db, 

63 make_application_in_db, 

64): 

65 """A factory fixture for a news item in the database.""" 

66 created_entities = [] 

67 

68 async def _make_news_item_in_db( 

69 news_item: NewsItemEntity | None = None, 

70 application: ApplicationEntity | None = None, 

71 owner: Owner | None = None, 

72 ) -> NewsItemEntity: 

73 if owner is None: 

74 account = await make_user_account_in_db() 

75 owner = Owner( 

76 id=account.user.id, uuid=account.user.uuid, name=account.user.name 

77 ) 

78 application = application or await make_application_in_db() 

79 

80 news_item = news_item or make_news_item(application=application, owner=owner) 

81 

82 repo = NewsItemDbRepository(database) 

83 async with UnitOfWork(database): 

84 news_item = await repo.create(news_item) 

85 created_entities.append(news_item) 

86 

87 return news_item 

88 

89 yield _make_news_item_in_db 

90 

91 repo = NewsItemDbRepository(database) 

92 for entity in created_entities: 

93 async with UnitOfWork(database): 

94 await repo.delete(entity)