@@ -571,3 +571,77 @@ def test_handle_rpl_namreply_with_malformed_uhnames(mockbot, caplog):
571571
572572 assert len (caplog .messages ) == 1
573573 assert 'RPL_NAMREPLY item without a hostmask' in caplog .messages [0 ]
574+
575+
576+ def test_handle_who_reply (mockbot ):
577+ """Make sure Sopel correctly updates user info from WHO replies"""
578+ # verify we start with no users/channels
579+ assert len (mockbot .users ) == 0
580+ assert 'Internets' not in mockbot .users
581+ assert len (mockbot .channels ) == 0
582+ assert '#channel' not in mockbot .channels
583+
584+ # add one user, who is Here
585+ mockbot .on_message (
586+ ':some.irc.network 352 Sopel #channel '
587+ 'internets services.irc.network * Internets Hr* '
588+ ':0 Network Services Bot' )
589+ mockbot .on_message (
590+ ':some.irc.network 315 Sopel #channel '
591+ ':End of /WHO list.' )
592+
593+ assert len (mockbot .users ) == 1
594+ assert 'Internets' in mockbot .users
595+ assert mockbot .users ['Internets' ].nick == 'Internets'
596+ assert mockbot .users ['Internets' ].user == 'internets'
597+ assert mockbot .users ['Internets' ].host == 'services.irc.network'
598+ assert mockbot .users ['Internets' ].realname == 'Network Services Bot'
599+ assert mockbot .users ['Internets' ].away is False
600+ assert mockbot .users ['Internets' ].is_bot is None
601+
602+ assert '#channel' in mockbot .channels
603+ assert mockbot .channels ['#channel' ]
604+ assert len (mockbot .channels ['#channel' ].users ) == 1
605+ assert 'Internets' in mockbot .channels ['#channel' ].users
606+ assert (
607+ mockbot .users ['Internets' ] is mockbot .channels ['#channel' ].users ['Internets' ]
608+ )
609+
610+ # on next WHO, user has been marked as Gone
611+ mockbot .on_message (
612+ ':some.irc.network 352 Sopel #channel '
613+ 'internets services.irc.network * Internets Gr* '
614+ ':0 Network Services Bot' )
615+ mockbot .on_message (
616+ ':some.irc.network 315 Sopel #channel '
617+ ':End of /WHO list.' )
618+
619+ assert mockbot .users ['Internets' ].away is True
620+ assert mockbot .users ['Internets' ].is_bot is None
621+
622+
623+ def test_handle_who_reply_botmode (mockbot ):
624+ """Make sure Sopel correctly tracks users' bot status from WHO replies"""
625+ mockbot .on_message (
626+ ':irc.example.com 005 Sopel '
627+ 'BOT=B '
628+ ':are supported by this server' )
629+
630+ # non-bot user
631+ mockbot .on_message (
632+ ':some.irc.network 352 Sopel #channel '
633+ 'human somewhere.in.the.world * E_R_Bradshaw H* '
634+ ':0 E. R. Bradshaw' )
635+
636+ assert mockbot .users ['E_R_Bradshaw' ].is_bot is False
637+
638+ # bot user
639+ mockbot .on_message (
640+ ':some.irc.network 352 Sopel #channel '
641+ 'internets services.irc.network * Internets HBr* '
642+ ':0 Network Services Bot' )
643+ mockbot .on_message (
644+ ':some.irc.network 315 Sopel #channel '
645+ ':End of /WHO list.' )
646+
647+ assert mockbot .users ['Internets' ].is_bot is True
0 commit comments