Coverage for src/tests/modules/club/test_import_members.py: 100%

45 statements  

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

1"""Module for testing the use case Import Members.""" 

2 

3from pathlib import Path 

4from typing import Self 

5 

6import pytest 

7 

8from kwai_bc_club.import_members import ( 

9 ImportMembers, 

10 ImportMembersCommand, 

11 MemberImportResult, 

12) 

13from kwai_bc_club.repositories.country_db_repository import CountryDbRepository 

14from kwai_bc_club.repositories.file_upload_db_repository import ( 

15 FileUploadDbRepository, 

16) 

17from kwai_bc_club.repositories.file_upload_preview_repository import ( 

18 FileUploadPreviewRepository, 

19) 

20from kwai_bc_club.repositories.file_upload_repository import ( 

21 DuplicateMemberUploadedException, 

22) 

23from kwai_bc_club.repositories.flemish_member_importer import FlemishMemberImporter 

24from kwai_bc_club.repositories.member_db_repository import MemberDbRepository 

25from kwai_core.db.database import Database 

26from kwai_core.domain.presenter import AsyncPresenter, IterableResult 

27from kwai_core.domain.value_objects.owner import Owner 

28 

29 

30class DummyPresenter(AsyncPresenter[IterableResult[MemberImportResult]]): 

31 """A dummy presenter.""" 

32 

33 def __init__(self): 

34 super().__init__() 

35 self._count = 0 

36 

37 @property 

38 def count(self): 

39 """Return the count.""" 

40 return self._count 

41 

42 async def present( 

43 self, use_case_result: IterableResult[MemberImportResult] 

44 ) -> Self: 

45 """Process the result of the use case.""" 

46 self._count += 1 

47 async for _ in use_case_result.iterator: 

48 ... 

49 return self 

50 

51 

52async def test_import_members(database: Database, owner: Owner): 

53 """Test the use case Import Members.""" 

54 filename = ( 

55 Path(__file__).parent / "repositories" / "data" / "flemish_members_test.csv" 

56 ) 

57 

58 importer = FlemishMemberImporter( 

59 str(filename), owner, CountryDbRepository(database) 

60 ) 

61 

62 command = ImportMembersCommand(preview=False) 

63 presenter = DummyPresenter() 

64 await ImportMembers( 

65 importer, 

66 FileUploadDbRepository(database), 

67 MemberDbRepository(database), 

68 presenter, 

69 ).execute(command) 

70 

71 assert presenter.count > 0, "There should be a member uploaded." 

72 

73 

74async def test_import_preview_members(database: Database, owner: Owner): 

75 """Test the use case Import Members with preview.""" 

76 filename = ( 

77 Path(__file__).parent / "repositories" / "data" / "flemish_members_test.csv" 

78 ) 

79 

80 importer = FlemishMemberImporter( 

81 str(filename), owner, CountryDbRepository(database) 

82 ) 

83 

84 command = ImportMembersCommand(preview=True) 

85 presenter = DummyPresenter() 

86 await ImportMembers( 

87 importer, 

88 FileUploadPreviewRepository(), 

89 MemberDbRepository(database), 

90 presenter, 

91 ).execute(command) 

92 

93 assert presenter.count > 0, "There should be a member uploaded." 

94 

95 

96async def test_import_duplicate_members(database: Database, owner: Owner): 

97 """Test the use case Import Members.""" 

98 filename = ( 

99 Path(__file__).parent 

100 / "repositories" 

101 / "data" 

102 / "flemish_members_duplicate_test.csv" 

103 ) 

104 

105 importer = FlemishMemberImporter( 

106 str(filename), owner, CountryDbRepository(database) 

107 ) 

108 

109 command = ImportMembersCommand() 

110 presenter = DummyPresenter() 

111 with pytest.raises(DuplicateMemberUploadedException): 

112 await ImportMembers( 

113 importer, 

114 FileUploadDbRepository(database), 

115 MemberDbRepository(database), 

116 presenter, 

117 ).execute(command)