@@ -83,7 +83,7 @@ async def test_enrich_members_empty_list(self):
8383
8484 @pytest .mark .asyncio
8585 async def test_enrich_members_invalid_object_ids (self ):
86- """Test enrichment with invalid ObjectIds - covers lines 46-47 """
86+ """Test enrichment with invalid ObjectIds - covers lines 47, 52, 108-109 """
8787 members = [
8888 {"userId" : "invalid_id_123" , "role" : "admin" , "joinedAt" : "2023-01-01" },
8989 {"userId" : "also_invalid" , "role" : "member" , "joinedAt" : "2023-01-02" },
@@ -92,12 +92,20 @@ async def test_enrich_members_invalid_object_ids(self):
9292 mock_db = MagicMock ()
9393
9494 with patch .object (self .service , "get_db" , return_value = mock_db ):
95- enriched = await self .service ._enrich_members_with_user_details (members )
95+ # Patch logger to verify warning is called (covers line 47)
96+ with patch ("app.groups.service.logger" ) as mock_logger :
97+ enriched = await self .service ._enrich_members_with_user_details (members )
98+ # Verify logger.warning was called for invalid ObjectIds (line 47)
99+ assert mock_logger .warning .call_count == 2
96100
97- # Should return fallback members since no valid ObjectIds - covers line 52
101+ # Should return fallback members since no valid ObjectIds ( line 52)
98102 assert len (enriched ) == 2
103+ # Verify _create_fallback_member output (lines 108-109)
104+ assert enriched [0 ]["userId" ] == "invalid_id_123"
99105 assert "User" in enriched [0 ]["user" ]["name" ]
100106 assert enriched [0 ]["role" ] == "admin"
107+ assert enriched [
0 ][
"user" ][
"email" ]
== "[email protected] " 108+ assert enriched [0 ]["joinedAt" ] == "2023-01-01"
101109
102110 @pytest .mark .asyncio
103111 async def test_enrich_members_member_without_userId (self ):
@@ -262,3 +270,41 @@ async def test_enrich_members_batch_query_optimization(self):
262270 assert len (enriched ) == 10
263271 for i , member in enumerate (enriched ):
264272 assert member ["user" ]["name" ] == f"User { i } "
273+
274+ def test_create_fallback_member_short_user_id (self ):
275+ """Test _create_fallback_member with short user ID - covers lines 108-109"""
276+ member = {"userId" : "ab" , "role" : "member" , "joinedAt" : "2023-01-01" }
277+
278+ result = self .service ._create_fallback_member (member )
279+
280+ # Verify fallback member structure (lines 108-109)
281+ assert result ["userId" ] == "ab"
282+ assert result ["role" ] == "member"
283+ assert result ["joinedAt" ] == "2023-01-01"
284+ assert result ["user" ]["name" ] == "User ab" # Uses the short ID since len < 4
285+ assert result [
"user" ][
"email" ]
== "[email protected] " 286+ assert result ["user" ]["imageUrl" ] is None
287+
288+ def test_create_fallback_member_long_user_id (self ):
289+ """Test _create_fallback_member with long user ID - covers lines 108-109"""
290+ long_id = "abcdefghijklmnop"
291+ member = {"userId" : long_id , "role" : "admin" , "joinedAt" : "2023-01-01" }
292+
293+ result = self .service ._create_fallback_member (member )
294+
295+ # Verify fallback member structure with last 4 chars
296+ assert result ["userId" ] == long_id
297+ assert result ["role" ] == "admin"
298+ assert result ["user" ]["name" ] == "User mnop" # Uses last 4 chars
299+ assert result [
"user" ][
"email" ]
== "[email protected] " 300+ assert result ["user" ]["imageUrl" ] is None
301+
302+ def test_create_fallback_member_no_user_id (self ):
303+ """Test _create_fallback_member when userId is missing"""
304+ member = {"role" : "member" , "joinedAt" : "2023-01-01" } # No userId
305+
306+ result = self .service ._create_fallback_member (member )
307+
308+ # Should use "unknown" as fallback
309+ assert result ["userId" ] == "unknown"
310+ assert result ["user" ]["name" ] == "User nown" # Last 4 chars of "unknown"
0 commit comments