
    Vh&                         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y)z5
Tests for IRC portions of L{twisted.words.service}.
    )checkersportal)proto_helpers)irc)InMemoryWordsRealm
IRCFactoryIRCUser)IRCTestCasec                   L    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y)IRCUserTestsz'
    Isolated tests for L{IRCUser}
    c                    t        d      | _        t        j                         | _        t        j                  | j                  | j                  g      | _        | j                  j                  dd       t        | j                  | j
                        | _	        | j                  j                  d      | _        t        j                         | _        | j                  j                  | j                         y)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    S/home/dcms/DCMS/lib/python3.12/site-packages/twisted/words/test/test_irc_service.pysetUpzIRCUserTests.setUp   s    
 (6
GGImmDJJ?VV,!$**dkk:||11$7,<<>##D$8$89    c                     | j                   j                  ddg       | j                  j                          | j                   j	                  d       | j                  | j                  j                         d       y)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"   sa    
 	b8*-""$  '##  &&(*G	
r    c                 T   dj                         }| j                  j                  ddj                         g       | j                  j	                          | j                  j                  dj                                | j                  | j                  j                         |       y)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b#7#>#>#@"AB""$  !;!B!B!DE##D$8$8$>$>$@.Qr    c                 h    | j                   j                  ddg       | j                  t               y)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,'r    c                 $   | j                   j                  j                         }| j                   j                  j                          |j	                  d      }|j                         }|D cg c]  }t        j                  |       c}S c c}w )zC
        Grabs our responses and then clears the transport
        zutf-8)r   	transportr)   r&   decode
splitlinesr   parsemsg)r   responsers      r   r8   zIRCUserTests.responseD   sj     <<))//1$$&??7+&&()12AQ222s   .Bc              #   P   K   t        |      D ]  \  }}|d   |k(  s||f  yw)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   r8   messageTypenmessages        r   scanResponsezIRCUserTests.scanResponseN   s6      $H- 	!JAwqz[(j 	!s   &	&c                 j   | j                   j                  ddg       | j                         }t        | j	                  |t
        j                              }t        | j	                  |t
        j                              }| j                  |dddddgffg       | j                  |ddddd	gffg       y
)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%   r8   listr@   r   RPL_MOTDSTARTRPL_ENDOFMOTDassertEqual)r   r8   startends       r   test_sendNickSendsGreetingz'IRCUserTests.test_sendNickSendsGreeting]   s     	b8*-==?T&&x1B1BCD4$$Xs/@/@AB %!#HI		
 	1}eh8O-PQRS	
r    c                    | j                   j                  ddg       | j                   j                  ddg       | j                   j                  ddg       dj	                  | j
                  j                  d         }dj	                  | j
                  j                  d         }| j                  | j                         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       y)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   rB   rC   rD   rE   001zconnected to Twisted IRC002003004wr>   N)	r   irc_USERirc_PASSr%   formatr   _serverInforI   r8   )r   versioncreations      r   test_fullLoginzIRCUserTests.test_fullLoginx   s(   
 	b:,/b6(+b6(+@GGLL$$%56
 399LL$$^4
 	MMO0U'VW0G'HI0J'KL'89'9:!%001AB
	
r    c                    | j                   j                  ddg       | j                         }| j                   j                  j	                          | j                  |d   d   t        j                         | j                   j                  ddg       | j                         }| j                   j                  j	                          | j                  |d   d   t        j                         | j                   j                  dddg       | j                         }| j                   j                  j	                          | j                  |d   d   t        j                         | j                   j                  dddg       | j                         }| j                   j                  j	                          | j                  |d   d   t        j                         y	)
z
        irc_PART
        testuserr#   r   r;   somechannels   somechannels   boogaboogaN)r   r%   r8   r4   r&   rI   r   rG   irc_JOINERR_NOSUCHCHANNELirc_PARTERR_NOTONCHANNELr   r8   s     r   	test_PARTzIRCUserTests.test_PART   s^    	j8*5==?$$&!Q):):;j=/:==?$$&!Q)>)>?j>8*DE==?$$&!Q)=)=>j='*BC==?$$&!Q)=)=>r    c                 f   | j                   j                  ddg       | j                   j                  ddg       | j                   j                  j	                          | j                   j                  ddg       | j                         }| j                  |d   d   t        j                         y)z
        irc_NAMES
        r"   r]   r^   r   r;   N)
r   r%   r`   r4   r&   	irc_NAMESr8   rI   r   RPL_ENDOFNAMESrd   s     r   
test_NAMESzIRCUserTests.test_NAMES   s     	b:,/b=/2$$&rM?3==?!Q););<r    N)__name__
__module____qualname____doc__r   r*   r.   r2   r8   r@   rL   r[   re   ri    r    r   r   r      s;    :

R(3!
6%
N?*	=r    r   c                       e Zd Zd Zd Zy)MocksyIRCUserc                 2    t        d      | _        g | _        y )Nr   )r   r   mockedCodesr   s    r   __init__zMocksyIRCUser.__init__   s    '6
r    c                 :    | j                   j                  |       y N)rr   append)r   code___s       r   r'   zMocksyIRCUser.sendMessage   s    %r    N)rj   rk   rl   rs   r'   rn   r    r   rp   rp      s    &r    rp      c                   R    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y)IRCUserBadEncodingTestszw
    Verifies that L{IRCUser} sends the correct error messages back to clients
    when given indecipherable bytes
    c                 "    t               | _        y ru   )rp   r   r   s    r   r   zIRCUserBadEncodingTests.setUp   s    $r    c                      t        | j                  d|z        dt        g       | j                  | j                  j                  |g       y)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   BADTEXTrI   rr   )r   irc_xerrors      r   assertChokesOnBadBytesz.IRCUserBadEncodingTests.assertChokesOnBadBytes   s>     	0h./wi@11E7;r    c                 D    | j                  dt        j                         y)zk
        Tests that irc_JOIN sends ERR_NOSUCHCHANNEL if the channel name can't
        be decoded.
        JOINNr   r   ra   r   s    r   	test_JOINz!IRCUserBadEncodingTests.test_JOIN       
 	##FC,A,ABr    c                 D    | j                  dt        j                         y)zl
        Tests that irc_NAMES sends ERR_NOSUCHCHANNEL if the channel name can't
        be decoded.
        NAMESNr   r   s    r   ri   z"IRCUserBadEncodingTests.test_NAMES       
 	##GS-B-BCr    c                 D    | j                  dt        j                         y)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                 D    | j                  dt        j                         y)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                 D    | j                  dt        j                         y)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                 D    | j                  dt        j                         y)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/ABr    c                 D    | j                  dt        j                         y)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                 D    | j                  dt        j                         y)zi
        Tests that irc_PART sends ERR_NOTONCHANNEL if the target name can't
        be decoded.
        PARTN)r   r   rc   r   s    r   re   z!IRCUserBadEncodingTests.test_PART  s    
 	##FC,@,@Ar    c                 D    | j                  dt        j                         y)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)rj   rk   rl   rm   r   r   r   ri   r   r   r   r   r   re   r   rn   r    r   r|   r|      sF    '< CDDC@CAB=r    r|   N)rm   twisted.credr   r   twisted.testr   twisted.words.protocolsr   twisted.words.servicer   r   r	   twisted.words.test.test_ircr
   r   rp   r   r|   rn   r    r   <module>r      sN    * & ' I I 3n=; n=b&G & ^=k ^=r    