From 7e23dfe53540f1c499b633ff40e7e1ee7c7790fe Mon Sep 17 00:00:00 2001 From: 0xEmma Date: Fri, 19 Dec 2025 02:48:19 -0600 Subject: [PATCH 1/2] Update User-Stats to display a more precise percentage --- src/cmds/core/user.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmds/core/user.py b/src/cmds/core/user.py index e518233..4337212 100644 --- a/src/cmds/core/user.py +++ b/src/cmds/core/user.py @@ -261,7 +261,7 @@ async def user_stats(self, ctx: ApplicationContext) -> Interaction | WebhookMess else: bots_count += 1 - percent_verified = round(verified_members / members * 100) + percent_verified = round(verified_members / members * 100, 2) # Create embed embed = discord.Embed(title="HackTheBox Discord User Stats") From 91ddd1520e0a25e47b49083a8f99c3eabd5848d9 Mon Sep 17 00:00:00 2001 From: Dimosthenis Schizas Date: Fri, 19 Dec 2025 12:58:08 +0200 Subject: [PATCH 2/2] =?UTF-8?q?=E2=9C=85=20Add=20test=20for=20user=5Fstats?= =?UTF-8?q?=20command?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add test coverage for user_stats command verifying decimal percentage display - Fix pre-existing broken assertion in test_ban.py (called_once_with -> assert_called_once_with) --- tests/src/cmds/core/test_user.py | 34 ++++++++++++++++++++++++++++++++ tests/src/helpers/test_ban.py | 2 +- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/tests/src/cmds/core/test_user.py b/tests/src/cmds/core/test_user.py index 01da1aa..bf3fb18 100644 --- a/tests/src/cmds/core/test_user.py +++ b/tests/src/cmds/core/test_user.py @@ -56,6 +56,40 @@ async def test_kick_fail_user_left(self, ctx, guild, bot, session): ctx.respond.assert_called_once_with("User seems to have already left the server.") + @pytest.mark.asyncio + async def test_user_stats(self, ctx, bot): + """Test the user_stats command displays correct statistics.""" + # Create mock members: 3 regular users (2 verified with roles, 1 unverified), 1 bot + verified_member1 = helpers.MockMember(id=1, name="Verified1", bot=False) + verified_member1.roles = [helpers.MockRole(id=0, name="@everyone"), helpers.MockRole(id=1, name="Verified")] + + verified_member2 = helpers.MockMember(id=2, name="Verified2", bot=False) + verified_member2.roles = [helpers.MockRole(id=0, name="@everyone"), helpers.MockRole(id=2, name="Member")] + + unverified_member = helpers.MockMember(id=3, name="Unverified", bot=False) + unverified_member.roles = [helpers.MockRole(id=0, name="@everyone")] + + bot_member = helpers.MockMember(id=4, name="BotUser", bot=True) + + ctx.guild.members = [verified_member1, verified_member2, unverified_member, bot_member] + ctx.user = helpers.MockMember(id=100, name="Admin") + ctx.channel = helpers.MockTextChannel(name="admin-channel") + + cog = user.UserCog(bot) + await cog.user_stats.callback(cog, ctx) + + # Verify respond was called with an embed + ctx.respond.assert_called_once() + call_kwargs = ctx.respond.call_args[1] + embed = call_kwargs["embed"] + + # Verify embed fields: 3 members, 2 verified (66.67%), 1 bot + assert embed.title == "HackTheBox Discord User Stats" + fields = {f.name: f.value for f in embed.fields} + assert fields["Members"] == "3" + assert fields["Bots"] == "1" + assert "66.67%" in fields["Verified Members"] + def test_setup(self, bot): """Test the setup method of the cog.""" # Invoke the command diff --git a/tests/src/helpers/test_ban.py b/tests/src/helpers/test_ban.py index 1771928..1ae616c 100644 --- a/tests/src/helpers/test_ban.py +++ b/tests/src/helpers/test_ban.py @@ -37,7 +37,7 @@ async def test__check_member_user(self, bot, guild, user): bot.get_member_or_user = AsyncMock() bot.get_member_or_user.return_value = user response = await _check_member(bot, guild, user, author) - assert await bot.get_member_or_user.called_once_with(guild, user.id) + bot.get_member_or_user.assert_called_once_with(guild, user.id) assert response is None @pytest.mark.asyncio