3
(hz                 @   s`   d Z dZddd
 ZdZyddlZW n ek
r@   ddlZY nX ddlZG dd	 d	ejZ	dS )a   Python DB API 2.0 driver compliance unit test suite.

    This software is Public Domain and may be used without restrictions.

 "Now we have booze and barflies entering the discussion, plus rumours of
  DBAs on drugs... and I won't tell you what flashes through my mind each
  time I read the subject line with 'Anal Compliance' in it.  All around
  this is turning out to be a thoroughly unwholesome unit test."

    -- Ian Bicking
z$Id$z
$Revision$      z-Stuart Bishop <zen@shangri-la.dropbear.id.au>    Nc               @   s  e Zd ZdZdZf Zi ZdZde Zde Z	de Z
de ZdZd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* ZdZd+d, Zd-d. Z d/d0 Z!d1d2 Z"d3d4 Z#d5d6 Z$d7d8d9d:d;d<gZ%d=d> Z&d?d@ Z'dAdB Z(dCdD Z)dEdF Z*dGdH Z+dIdJ Z,dKdJ Z,dLdM Z-dNdO Z.dPdQ Z/dRdS Z0dTdU Z1dVdW Z2dXdY Z3dZd[ Z4d\d] Z5d^d_ Z6d`da Z7dbdc Z8ddde Z9dfdg Z:dS )hDatabaseAPI20TestaB   Test a database self.driver for DB API 2.0 compatibility.
        This implementation tests Gadfly, but the TestCase
        is structured so that other self.drivers can subclass this
        test case to ensure compiliance with the DB-API. It is
        expected that this TestCase may be expanded in the future
        if ambiguities or edge conditions are discovered.

        The 'Optional Extensions' are not yet being tested.

        self.drivers should subclass this test, overriding setUp, tearDown,
        self.driver, connect_args and connect_kw_args. Class specification
        should be as follows:

        import dbapi20
        class mytest(dbapi20.DatabaseAPI20Test):
           [...]

        Don't 'import DatabaseAPI20Test from dbapi20', or you will
        confuse the unit tester - just 'import dbapi20'.
    NZdbapi20test_z'create table %sbooze (name varchar(20))z)create table %sbarflys (name varchar(20))zdrop table %sboozezdrop table %sbarflyslowerc             C   s   |j | j d S )N)executeddl1)selfcursor r
   R/tmp/pip-install-q3hcpn_q/PyMySQL/pymysql/tests/thirdparty/test_MySQLdb/dbapi20.pyexecuteDDL1m   s    zDatabaseAPI20Test.executeDDL1c             C   s   |j | j d S )N)r   ddl2)r   r	   r
   r
   r   executeDDL2p   s    zDatabaseAPI20Test.executeDDL2c             C   s   dS )z self.drivers should override this method to perform required setup
            if any is necessary, such as creating the database.
        Nr
   )r   r
   r
   r   setUps   s    zDatabaseAPI20Test.setUpc             C   sj   | j  }zR|j }xD| j| jfD ]4}y|j| |j  W q  | jjk
rR   Y q X q W W d|j  X dS )z self.drivers should override this method to perform required cleanup
            if any is necessary, such as deleting the test database.
            The default drops the tables that may be created.
        N)	_connectr	   xddl1xddl2r   commitdriverErrorclose)r   concurZddlr
   r
   r   tearDowny   s    
zDatabaseAPI20Test.tearDownc             C   s6   y| j j| j| jS  tk
r0   | jd Y nX d S )Nz-No connect method found in self.driver module)r   connectconnect_argsconnect_kw_argsAttributeErrorfail)r   r
   r
   r   r      s
    zDatabaseAPI20Test._connectc             C   s   | j  }|j  d S )N)r   r   )r   r   r
   r
   r   test_connect   s    zDatabaseAPI20Test.test_connectc             C   s<   y| j j}| j|d W n tk
r6   | jd Y nX d S )Nz2.0zDriver doesn't define apilevel)r   apilevelassertEqualr   r   )r   r    r
   r
   r   test_apilevel   s
    zDatabaseAPI20Test.test_apilevelc             C   s>   y| j j}| j|dk W n tk
r8   | jd Y nX d S )Nr      r      z"Driver doesn't define threadsafety)r   r#   r   r$   )r   threadsafety
assertTruer   r   )r   r%   r
   r
   r   test_threadsafety   s
    z#DatabaseAPI20Test.test_threadsafetyc             C   s>   y| j j}| j|dk W n tk
r8   | jd Y nX d S )Nqmarknumericnamedformatpyformatz Driver doesn't define paramstyle)r(   r)   r*   r+   r,   )r   
paramstyler&   r   r   )r   r-   r
   r
   r   test_paramstyle   s    z!DatabaseAPI20Test.test_paramstylec             C   s   | j t| jjt | j t| jjt | j t| jj| jj | j t| jj| jj | j t| jj| jj | j t| jj	| jj | j t| jj
| jj | j t| jj| jj | j t| jj| jj d S )N)r&   
issubclassr   Warning	Exceptionr   InterfaceErrorDatabaseErrorOperationalErrorIntegrityErrorInternalErrorProgrammingErrorNotSupportedError)r   r
   r
   r   test_Exceptions   s     z!DatabaseAPI20Test.test_Exceptionsc             C   s   | j  }| j}| j|j|jk | j|j|jk | j|j|jk | j|j|jk | j|j|jk | j|j|jk | j|j	|j	k | j|j
|j
k | j|j|jk d S )N)r   r   r&   r0   r   r2   r3   r4   r5   r6   r7   r8   )r   r   drvr
   r
   r   %test_ExceptionsAsConnectionAttributes   s    z7DatabaseAPI20Test.test_ExceptionsAsConnectionAttributesc          
   C   s$   | j  }z|j  W d |j  X d S )N)r   r   r   )r   r   r
   r
   r   test_commit   s    zDatabaseAPI20Test.test_commitc             C   s<   | j  }t|dr8y|j  W n | jjk
r6   Y nX d S )Nrollback)r   hasattrr=   r   r8   )r   r   r
   r
   r   test_rollback   s    
zDatabaseAPI20Test.test_rollbackc          
   C   s$   | j  }z|j }W d |j  X d S )N)r   r	   r   )r   r   r   r
   r
   r   test_cursor   s    zDatabaseAPI20Test.test_cursorc          
   C   s   | j  }z~|j }|j }| j| |jd| j  |jd| j  |j }| jt|d | jt|d d | j|d d d W d |j  X d S )Nz.insert into %sbooze values ('Victoria Bitter')zselect name from %sboozer#   r   zVictoria Bitter)	r   r	   r   r   table_prefixfetchallr!   lenr   )r   r   Zcur1Zcur2Zboozer
   r
   r   test_cursor_isolation   s    

z'DatabaseAPI20Test.test_cursor_isolationc             C   s   | j  }z|j }| j| | j|jd d |jd| j  | jt|jdd | jt|jd dd | j|jd d j dd	 | j|jd d | j	j
d
|jd d   | j| | j|jd d W d |j  X d S )Nzccursor.description should be none after executing a statement that can return no rows (such as DDL)zselect name from %sboozer#   z-cursor.description describes too many columnsr      z1cursor.description[x] tuples must have 7 elementsnamez0cursor.description[x][0] must return column namez8cursor.description[x][1] must return column type. Got %rzVcursor.description not being set to None when executing no-result statements (eg. DDL))r   r	   r   r!   descriptionr   rA   rC   r   r   STRINGr   r   )r   r   r   r
   r
   r   test_description  s(    




z"DatabaseAPI20Test.test_descriptionc          
   C   s   | j  }z|j }| j| | j|jdd |jd| j  | j|jd
kd |jd| j  | j|jdkd | j| | j|jdd W d |j	  X d S )Nr#   zAcursor.rowcount should be -1 after executing no-result statementsz.insert into %sbooze values ('Victoria Bitter')zccursor.rowcount should == number or rows inserted, or set to -1 after executing an insert statementzselect name from %sboozezbcursor.rowcount should == number of rows returned, or set to -1 after executing a select statementzJcursor.rowcount not being reset to -1 after executing no-result statementsrJ   )rJ   r#   rJ   )rJ   r#   rJ   )
r   r	   r   r!   rowcountr   rA   r&   r   r   )r   r   r   r
   r
   r   test_rowcount1  s"    





zDatabaseAPI20Test.test_rowcountc          
   C   s   | j  }z|j }| jrt|dr|j| jd	}| jt|d | j|d d |j }| jt|dd | jt|d dd | j|d d dd W d |j  X d S )
NcallprocFOOr#   r   zcallproc produced no result setz$callproc produced invalid result setZfooz!callproc produced invalid results)rN   )	r   r	   
lower_funcr>   rM   r!   rC   rB   r   )r   r   r   rr
   r
   r   test_callprocO  s    
zDatabaseAPI20Test.test_callprocc             C   s\   | j  }z|j }W d |j  X | j| jj| j| | j| jj|j | j| jj|j d S )N)r   r	   r   assertRaisesr   r   r   r   )r   r   r   r
   r
   r   
test_closeb  s    
zDatabaseAPI20Test.test_closec          
   C   s.   | j  }z|j }| j| W d |j  X d S )N)r   r	   _paraminsertr   )r   r   r   r
   r
   r   test_executet  s
    zDatabaseAPI20Test.test_executec             C   s^  | j | |jd| j  | j|jdk | jjdkrJ|jd| j d n| jjdkrj|jd| j d nr| jjdkr|jd	| j d
di nN| jjdkr|jd| j d n.| jjdkr|jd| j d
di n
| jd | j|jdk |jd| j  |j }| j	t
|dd |d d |d d g}|j  | j	|d dd | j	|d dd d S )Nz.insert into %sbooze values ('Victoria Bitter')r#   r(   zinsert into %sbooze values (?)Cooper'sr)   zinsert into %sbooze values (:1)r*   z"insert into %sbooze values (:beer)beerr+   z insert into %sbooze values (%%s)r,   z&insert into %sbooze values (%%(beer)s)zInvalid paramstylezselect name from %sboozer   z%cursor.fetchall returned too few rowsr   zFcursor.fetchall retrieved incorrect data, or data inserted incorrectlyzVictoria BitterrJ   )rJ   r#   )rV   )rV   )rV   rJ   )rJ   r#   )r   r   rA   r&   rK   r   r-   r   rB   r!   rC   sort)r   r   resbeersr
   r
   r   rT   |  sF    


zDatabaseAPI20Test._paraminsertc          
   C   sx  | j  }z^|j }| j| ddg}ddiddig}| jjdkrV|jd| j | n| jjdkrv|jd| j | nj| jjdkr|jd	| j | nJ| jjd
kr|jd| j | n*| jjdkr|jd| j | n
| jd | j|j	dkd|j	  |j
d| j  |j }| jt|dd |d d |d d g}|j  | j|d dd | j|d dd W d |j  X d S )NCooper'sBoag'srW   r(   zinsert into %sbooze values (?)r)   zinsert into %sbooze values (:1)r*   z"insert into %sbooze values (:beer)r+   z insert into %sbooze values (%%s)r,   z&insert into %sbooze values (%%(beer)s)zUnknown paramstyler#   r   zIinsert using cursor.executemany set cursor.rowcount to incorrect value %rzselect name from %sboozez2cursor.fetchall retrieved incorrect number of rowsr   zincorrect data retrieved)r[   )r\   rJ   )rJ   r   )r   r	   r   r   r-   ZexecutemanyrA   r   r&   rK   r   rB   r!   rC   rX   r   )r   r   r   largsZmargsrY   rZ   r
   r
   r   test_executemany  sP    


z"DatabaseAPI20Test.test_executemanyc          
   C   s  | j  }z|j }| j| jj|j | j| | j| jj|j |jd| j  | j	|j d d | j
|jdk |jd| j  | j| jj|j |jd| j  |j }| j	t|dd | j	|d dd | j	|j d d	 | j
|jdk W d |j  X d S )Nzselect name from %sboozez?cursor.fetchone should return None if a query retrieves no rowsr#   r   z.insert into %sbooze values ('Victoria Bitter')z2cursor.fetchone should have retrieved a single rowzVictoria Bitterz(cursor.fetchone retrieved incorrect dataz<cursor.fetchone should return None if no more rows availablerJ   )rJ   r   rJ   )rJ   r#   )r   r	   rR   r   r   fetchoner   r   rA   r!   r&   rK   rC   r   )r   r   r   rP   r
   r
   r   test_fetchone  s.    

zDatabaseAPI20Test.test_fetchonezCarlton ColdzCarlton DraftzMountain GoatZRedbackzVictoria BitterZXXXXc                s    fdd j D }|S )zX Return a list of sql commands to setup the DB for the fetch
            tests.
        c                s   g | ]}d  j |f qS )z!insert into %sbooze values ('%s'))rA   ).0s)r   r
   r   
<listcomp>  s   z/DatabaseAPI20Test._populate.<locals>.<listcomp>)samples)r   Zpopulater
   )r   r   	_populate  s    

zDatabaseAPI20Test._populatec             C   sd  | j  }zJ|j }| j| jj|jd | j| x| j D ]}|j| q<W |jd| j	  |j }| j
t|dd d|_|jd}| j
t|dd |jd}| j
t|dd |jd}| j
t|d	d
 | j|jdk d|_|jd| j	  |j }| j
t|dd |j }| j
t|d |j }| j
t|d	 | j|jdk d|_|jd| j	  |j }| j|jdk | j
t|d | j
t|d dd |D }|j  x,td	dD ]}| j
|| | j| d qW |j }| j
t|d	d | j|jdk | j| |jd| j	  |j }| j
t|d	d | j|jdk W d |j  X d S )N   zselect name from %sboozer#   zQcursor.fetchmany retrieved incorrect number of rows, default of arraysize is one.
   r$   z3cursor.fetchmany retrieved incorrect number of rowsr   r   zLcursor.fetchmany should return an empty sequence after results are exhausted   z0cursor.arraysize not being honoured by fetchmanyc             S   s   g | ]}|d  qS )r   r
   )ra   rP   r
   r
   r   rc   V  s    z4DatabaseAPI20Test.test_fetchmany.<locals>.<listcomp>z,incorrect data retrieved by cursor.fetchmanyzfcursor.fetchmany should return an empty sequence if called after the whole result set has been fetchedzselect name from %sbarflyszKcursor.fetchmany should return an empty sequence if query retrieved no rowsrJ   )rJ   rh   rJ   )rJ   rh   rJ   )rJ   rh   rJ   )rJ   rh   rJ   )rJ   r   )r   r	   rR   r   r   	fetchmanyr   re   r   rA   r!   rC   	arraysizer&   rK   rX   rangerd   r   r   )r   r   r   sqlrP   rowsir
   r
   r   test_fetchmany   sl    




z DatabaseAPI20Test.test_fetchmanyc             C   sz  | j  }z`|j }| j| jj|j | j| x| j D ]}|j| q:W | j| jj|j |jd| j	  |j }| j
|jdt| jfk | jt|t| jd dd |D }|j  x0tdt| jD ]}| j|| | j| d qW |j }| jt|dd | j
|jdt| jfk | j| |jd	| j	  |j }| j
|jdk | jt|dd
 W d |j  X d S )Nzselect name from %sboozer#   z)cursor.fetchall did not retrieve all rowsc             S   s   g | ]}|d  qS )r   r
   )ra   rP   r
   r
   r   rc     s    z3DatabaseAPI20Test.test_fetchall.<locals>.<listcomp>r   z(cursor.fetchall retrieved incorrect rowszacursor.fetchall should return an empty list if called after the whole result set has been fetchedzselect name from %sbarflyszMcursor.fetchall should return an empty list if a select query returns no rowsrJ   rJ   rJ   )rJ   r   )r   r	   rR   r   r   rB   r   re   r   rA   r&   rK   rC   rd   r!   rX   rk   r   r   )r   r   r   rl   rm   rn   r
   r
   r   test_fetchallr  s<    



zDatabaseAPI20Test.test_fetchallc       
      C   sB  | j  }z(|j }| j| x| j D ]}|j| q(W |jd| j  |j }|jd}|j }|j }| j	|j
d
k | jt|dd | jt|dd |d g}|j|d d |d d g |j|d  |j|d d |d d g |j  x2tdt| jD ]}	| j||	 | j|	 d qW W d |j  X d S )Nzselect name from %sboozer   r#   rh   z+fetchmany returned incorrect number of rowsz*fetchall returned incorrect number of rowsr   z$incorrect data retrieved or insertedrJ   )rJ   rh   )r   r	   r   re   r   rA   r_   ri   rB   r&   rK   r!   rC   extendappendrX   rk   rd   r   )
r   r   r   rl   Zrows1Zrows23Zrows4Zrows56rm   rn   r
   r
   r   test_mixedfetch  s2    


z!DatabaseAPI20Test.test_mixedfetchc             C   s   t ddS )z Should create a procedure called deleteme
            that returns two result sets, first the
            number of rows in booze then "name from booze"
        zHelper not implementedN)NotImplementedError)r   r   r
   r
   r   help_nextset_setUp  s    z$DatabaseAPI20Test.help_nextset_setUpc             C   s   t ddS )z*If cleaning up is needed after nextSetTestzHelper not implementedN)rt   )r   r   r
   r
   r   help_nextset_tearDown  s    z'DatabaseAPI20Test.help_nextset_tearDownc             C   s   | j  }z|j }t|ds d S z| j| | j }x| j D ]}|j| q>W | j| |jd |j }|d t	| j
kst|j st|j }t	|t	| j
kst|j }|d kstdW d | j| X W d |j  X d S )NnextsetZdeletemer   z'No more return sets, should return None)r   r	   r>   r   re   r   ru   rM   r_   rC   rd   AssertionErrorrw   rB   rv   r   )r   r   r   rl   Znumberofrowsnamesrb   r
   r
   r   test_nextset  s*    



zDatabaseAPI20Test.test_nextsetc             C   s   t dd S )Nz"Drivers need to override this test)rt   )r   r
   r
   r   rz     s    c          
   C   s6   | j  }z|j }| jt|dd W d |j  X d S )Nrj   z cursor.arraysize must be defined)r   r	   r&   r>   r   )r   r   r   r
   r
   r   test_arraysize  s    
z DatabaseAPI20Test.test_arraysizec          
   C   s8   | j  }z |j }|jd | j| W d |j  X d S )N   )r|   )r   r	   ZsetinputsizesrT   r   )r   r   r   r
   r
   r   test_setinputsizes  s    
z$DatabaseAPI20Test.test_setinputsizesc          
   C   sD   | j  }z,|j }|jd |jdd | j| W d |j  X d S )Ni  i  r   )r   r	   ZsetoutputsizerT   r   )r   r   r   r
   r
   r   test_setoutputsize_basic  s    
z*DatabaseAPI20Test.test_setoutputsize_basicc             C   s   t dd S )Nz!Driver need to override this test)rt   )r   r
   r
   r   test_setoutputsize  s    z$DatabaseAPI20Test.test_setoutputsizec          
   C   s   | j  }zx|j }| j| |jd| j  |jd| j  |j }| jt|d | jt|d d | j|d d d d W d |j  X d S )Nz!insert into %sbooze values (NULL)zselect name from %sboozer#   r   zNULL value not returned as None)	r   r	   r   r   rA   rB   r!   rC   r   )r   r   r   rP   r
   r
   r   	test_None  s    
zDatabaseAPI20Test.test_Nonec             C   s&   | j jddd}| j jtjd}d S )N     r|   r   )	r   r   r|   r   r   r   r   r   r   )r   DateZDateFromTickstimemktime)r   Zd1Zd2r
   r
   r   	test_Date)  s    zDatabaseAPI20Test.test_Datec             C   s&   | j jddd}| j jtjd}d S )N   -        r#   r   )	r   r#   r#   r   r   r   r   r   r   )r   ZTimeZTimeFromTicksr   r   )r   t1t2r
   r
   r   	test_Time/  s    zDatabaseAPI20Test.test_Timec             C   s,   | j jdddddd}| j jtjd}d S )	N  r   r|   r   r   r   r   )	r   r   r|   r   r   r   r   r   r   )r   Z	TimestampZTimestampFromTicksr   r   )r   r   r   r
   r
   r   test_Timestamp5  s    z DatabaseAPI20Test.test_Timestampc             C   s   | j jd}| j jd}d S )Ns	   Something    )r   Binary)r   br
   r
   r   test_Binary=  s    zDatabaseAPI20Test.test_Binaryc             C   s   | j t| jdd d S )NrH   zmodule.STRING must be defined)r&   r>   r   )r   r
   r
   r   test_STRINGA  s    zDatabaseAPI20Test.test_STRINGc             C   s   | j t| jdd d S )NBINARYzmodule.BINARY must be defined.)r&   r>   r   )r   r
   r
   r   test_BINARYF  s    zDatabaseAPI20Test.test_BINARYc             C   s   | j t| jdd d S )NNUMBERzmodule.NUMBER must be defined.)r&   r>   r   )r   r
   r
   r   test_NUMBERK  s    zDatabaseAPI20Test.test_NUMBERc             C   s   | j t| jdd d S )NZDATETIMEz module.DATETIME must be defined.)r&   r>   r   )r   r
   r
   r   test_DATETIMEP  s    zDatabaseAPI20Test.test_DATETIMEc             C   s   | j t| jdd d S )NZROWIDzmodule.ROWID must be defined.)r&   r>   r   )r   r
   r
   r   
test_ROWIDU  s    zDatabaseAPI20Test.test_ROWID);__name__
__module____qualname____doc__r   r   r   rA   r   r   r   r   Z	lowerfuncr   r   r   r   r   r   r"   r'   r.   r9   r;   r<   r?   r@   rD   rI   rL   rO   rQ   rS   rU   rT   r^   r`   rd   re   ro   rp   rs   ru   rv   rz   r{   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r
   r
   r
   r   r   G   s|   		
!24,
R1!	r   )
r   Z
__rcs_id____version__
__author__Z	unittest2ZunittestImportErrorr   ZTestCaser   r
   r
   r
   r   <module>   s   0