
    Yf&                         d Z ddlmZmZ ddlmZ ddlmZ ddlm	Z	m
Z
mZ ddlmZ  G d de          Z G d	 d
e          ZdZ G d de          ZdS )z5
Tests for IRC portions of L{twisted.words.service}.
    )checkersportal)proto_helpers)irc)InMemoryWordsRealm
IRCFactoryIRCUser)IRCTestCasec                   N    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd ZdS )IRCUserTestsz'
    Isolated tests for L{IRCUser}
    c                    t          d          | _        t          j                    | _        t          j        | j        | j        g          | _        | j                            dd           t          | j        | j                  | _	        | j	        
                    d          | _        t          j                    | _        | j                            | j                   dS )zm
        Sets up a Realm, Portal, Factory, IRCUser, Transport, and Connection
        for our tests.
        example.comjohnpassN)r   realmr   'InMemoryUsernamePasswordDatabaseDontUsecheckerr   PortaladdUserr   factorybuildProtocolircUserr   StringTransportstringTransportmakeConnectionselfs    U/var/www/html/env/lib/python3.11/site-packages/twisted/words/test/test_irc_service.pysetUpzIRCUserTests.setUp   s    
 (66
GIImDJ??VV,,,!$*dk::|11$77,<>>##D$899999    c                     | j                             ddg           | j                                         | j                             d           |                     | j                                        d           dS )z
        Sending a message to a user after they have sent NICK, but before they
        have authenticated, results in a message from "example.com".
         mynickfooz:example.com foo mynick
N)r   irc_NICKr   clearsendMessageassertEqualBufferValuevaluer   s    r   test_sendMessagezIRCUserTests.test_sendMessage"   s    
 	b8*---""$$$  '''## &&((*G	
 	
 	
 	
 	
r    c                 n   d                                 }| j                            dd                                 g           | j                                         | j                            d                                            |                     | j                                        |           dS )z
        When a UTF8 message is sent with sendMessage and the current IRCUser
        has a UTF8 nick and is set to UTF8 encoding, the message will be
        written to the transport.
        u   :example.com тест ник
r"   u   никu   тестN)encoder   r%   r   r&   r'   r(   r)   )r   expectedResults     r   test_utf8MessageszIRCUserTests.test_utf8Messages.   s     <BBDDb#7#>#>#@#@"ABBB""$$$  !;!B!B!D!DEEE##D$8$>$>$@$@.QQQQQr    c                 r    | j                             ddg           |                     t                     dS )z
        A NICK command sent with a nickname that cannot be decoded with the
        current IRCUser's encoding results in a PRIVMSG from NickServ
        indicating that the nickname could not be decoded.
        r"   s   N)r   r%   assertRaisesUnicodeErrorr   s    r   test_invalidEncodingNickz%IRCUserTests.test_invalidEncodingNick;   s:     	b#6"7888,'''''r    c                     | j         j                                        }| j         j                                         |                    d          }|                                }d |D             S )zC
        Grabs our responses and then clears the transport
        zutf-8c                 6    g | ]}t          j        |          S  )r   parsemsg).0rs     r   
<listcomp>z)IRCUserTests.response.<locals>.<listcomp>L   s     222AQ222r    )r   	transportr)   r&   decode
splitlinesr   responses     r   r>   zIRCUserTests.responseD   sg     <)//11$$&&&??7++&&((222222r    c              #   X   K   t          |          D ]\  }}|d         |k    r||fV  dS )a8  
        Gets messages out of a response

        @param response: The parsed IRC messages of the response, as returned
        by L{IRCUserTests.response}

        @param messageType: The string type of the desired messages.

        @return: An iterator which yields 2-tuples of C{(index, ircMessage)}
           N)	enumerate)r   r>   messageTypenmessages        r   scanResponsezIRCUserTests.scanResponseN   sM       $H-- 	! 	!JAwqz[((j   	! 	!r    c                    | j                             ddg           |                                 }t          |                     |t
          j                            }t          |                     |t
          j                            }|                     |dddddgffg           |                     |ddddd	gffg           d
S )z
        Receiving NICK without authenticating sends the MOTD Start and MOTD End
        messages, which is required by certain popular IRC clients (such as
        Pidgin) before a connection is considered to be fully established.
        r"   r#   r   r   375#- example.com Message of the Day - r@   376End of /MOTD command.N)	r   r%   r>   listrE   r   RPL_MOTDSTARTRPL_ENDOFMOTDassertEqual)r   r>   startends       r   test_sendNickSendsGreetingz'IRCUserTests.test_sendNickSendsGreeting]   s     	b8*---==??T&&x1BCCDD4$$Xs/@AABB %!#HI		
 	
 	
 	1}eh8O-PQRS	
 	
 	
 	
 	
r    c                     | j                             ddg           | j                             ddg           | j                             ddg           d                    | j        j        d                   }d                    | j        j        d                   }|                     |                                 d	d
ddgfd	dddgfd	dddgfd	dd|gfd	dd|gfd	ddd	| j        j        d         ddgfg           dS )zz
        Receiving USER, PASS, NICK will log in the user, and transmit the
        appropriate response messages.
        r"   zjohn doer   r   z,Your host is example.com, running version {}serviceVersionzThis server was created on {}creationDater   rG   rH   rI   rJ   001zconnected to Twisted IRC002003004wrC   N)	r   irc_USERirc_PASSr%   formatr   _serverInforN   r>   )r   versioncreations      r   test_fullLoginzIRCUserTests.test_fullLoginx   sE   
 	b:,///b6(+++b6(+++@GGL$%56
 
 399L$^4
 
 	MMOO0U'VW0G'HI0J'KL'89'9:!%01AB
	
 	
 	
 	
 	
r    c                    | j                             ddg           |                                 }| j         j                                         |                     |d         d         t          j                   | j                             ddg           |                                 }| j         j                                         |                     |d         d         t          j	                   | j         
                    dddg           |                                 }| j         j                                         |                     |d         d         t          j                   | j         
                    dddg           |                                 }| j         j                                         |                     |d         d         t          j                   d	S )
z
        irc_PART
        testuserr#   r   r@   somechannels   somechannels   boogaboogaN)r   r%   r>   r:   r&   rN   r   rL   irc_JOINERR_NOSUCHCHANNELirc_PARTERR_NOTONCHANNELr=   s     r   	test_PARTzIRCUserTests.test_PART   s    	j8*555==??$$&&&!Q):;;;j=/:::==??$$&&&!Q)>???j>8*DEEE==??$$&&&!Q)=>>>j='*BCCC==??$$&&&!Q)=>>>>>r    c                 j   | j                             ddg           | j                             ddg           | j         j                                         | j                             ddg           |                                 }|                     |d         d         t          j	                   dS )z
        irc_NAMES
        r"   rb   rc   r   r@   N)
r   r%   re   r:   r&   	irc_NAMESr>   rN   r   RPL_ENDOFNAMESr=   s     r   
test_NAMESzIRCUserTests.test_NAMES   s     	b:,///b=/222$$&&&rM?333==??!Q);<<<<<r    N)__name__
__module____qualname____doc__r   r*   r.   r2   r>   rE   rQ   r`   ri   rm   r5   r    r   r   r      s         : : :

 

 

R R R( ( (3 3 3! ! !
 
 
6%
 %
 %
N? ? ?*	= 	= 	= 	= 	=r    r   c                       e Zd Zd Zd ZdS )MocksyIRCUserc                 <    t          d          | _        g | _        d S )Nr   )r   r   mockedCodesr   s    r   __init__zMocksyIRCUser.__init__   s    '66
r    c                 :    | j                             |           d S N)ru   append)r   code___s       r   r'   zMocksyIRCUser.sendMessage   s    %%%%%r    N)rn   ro   rp   rv   r'   r5   r    r   rs   rs      s2          & & & & &r    rs      c                   T    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd ZdS )IRCUserBadEncodingTestszw
    Verifies that L{IRCUser} sends the correct error messages back to clients
    when given indecipherable bytes
    c                 ,    t                      | _        d S rx   )rs   r   r   s    r   r   zIRCUserBadEncodingTests.setUp   s    $r    c                      t          | j        d|z            dt          g           |                     | j        j        |g           dS )ak  
        Asserts that IRCUser sends the relevant error code when a given irc_x
        dispatch method is given undecodable bytes.

        @param irc_x: the name of the irc_FOO method to test.
        For example, irc_x = 'PRIVMSG' will check irc_PRIVMSG

        @param error: the error code irc_x should send. For example,
        irc.ERR_NOTONCHANNEL
        zirc_%sN)getattrr   BADTEXTrN   ru   )r   irc_xerrors      r   assertChokesOnBadBytesz.IRCUserBadEncodingTests.assertChokesOnBadBytes   sL     	0h.//wi@@@1E7;;;;;r    c                 F    |                      dt          j                   dS )zk
        Tests that irc_JOIN sends ERR_NOSUCHCHANNEL if the channel name can't
        be decoded.
        JOINNr   r   rf   r   s    r   	test_JOINz!IRCUserBadEncodingTests.test_JOIN   #    
 	##FC,ABBBBBr    c                 F    |                      dt          j                   dS )zl
        Tests that irc_NAMES sends ERR_NOSUCHCHANNEL if the channel name can't
        be decoded.
        NAMESNr   r   s    r   rm   z"IRCUserBadEncodingTests.test_NAMES   #    
 	##GS-BCCCCCr    c                 F    |                      dt          j                   dS )zl
        Tests that irc_TOPIC sends ERR_NOSUCHCHANNEL if the channel name can't
        be decoded.
        TOPICNr   r   s    r   
test_TOPICz"IRCUserBadEncodingTests.test_TOPIC   r   r    c                 F    |                      dt          j                   dS )zk
        Tests that irc_LIST sends ERR_NOSUCHCHANNEL if the channel name can't
        be decoded.
        LISTNr   r   s    r   	test_LISTz!IRCUserBadEncodingTests.test_LIST   r   r    c                 F    |                      dt          j                   dS )zg
        Tests that irc_MODE sends ERR_NOSUCHNICK if the target name can't
        be decoded.
        MODENr   r   ERR_NOSUCHNICKr   s    r   	test_MODEz!IRCUserBadEncodingTests.test_MODE  s#    
 	##FC,>?????r    c                 F    |                      dt          j                   dS )zj
        Tests that irc_PRIVMSG sends ERR_NOSUCHNICK if the target name can't
        be decoded.
        PRIVMSGNr   r   s    r   test_PRIVMSGz$IRCUserBadEncodingTests.test_PRIVMSG  s#    
 	##Is/ABBBBBr    c                 F    |                      dt          j                   dS )zh
        Tests that irc_WHOIS sends ERR_NOSUCHNICK if the target name can't
        be decoded.
        WHOISNr   r   s    r   
test_WHOISz"IRCUserBadEncodingTests.test_WHOIS  s#    
 	##GS-?@@@@@r    c                 F    |                      dt          j                   dS )zi
        Tests that irc_PART sends ERR_NOTONCHANNEL if the target name can't
        be decoded.
        PARTN)r   r   rh   r   s    r   ri   z!IRCUserBadEncodingTests.test_PART  s#    
 	##FC,@AAAAAr    c                 F    |                      dt          j                   dS )zo
        Tests that irc_WHO immediately ends the WHO list if the target name
        can't be decoded.
        WHON)r   r   RPL_ENDOFWHOr   s    r   test_WHOz IRCUserBadEncodingTests.test_WHO%  s#    
 	##E3+;<<<<<r    N)rn   ro   rp   rq   r   r   r   rm   r   r   r   r   r   ri   r   r5   r    r   r   r      s         ' ' '< < < C C CD D DD D DC C C@ @ @C C CA A AB B B= = = = =r    r   N)rq   twisted.credr   r   twisted.testr   twisted.words.protocolsr   twisted.words.servicer   r   r	   twisted.words.test.test_ircr
   r   rs   r   r   r5   r    r   <module>r      s    * ) ) ) ) ) ) ) & & & & & & ' ' ' ' ' ' I I I I I I I I I I 3 3 3 3 3 3n= n= n= n= n=; n= n= n=b& & & & &G & & & ^= ^= ^= ^= ^=k ^= ^= ^= ^= ^=r    