o
    g                     @   s4  d dl Z d dlZd dlZd dlZd dlZd dlmZmZ d dl	m
Z
mZ G dd dejZG dd dejZG dd	 d	ejZG d
d dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZdd Zdd Zedkre  dS dS )    N)check_disallow_instantiationSHORT_TIMEOUT)TESTFNunlinkc                   @   s   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eejdkddd Zdd  Zd!S )"ModuleTestsc                 C      |  tjddtj  d S )Nz2.0zapilevel is %s, should be 2.0)assertEqualsqliteZapilevelself r   H/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/sqlite3/test/dbapi.pytest_api_level"      
zModuleTests.test_api_levelc                 C   r   )N   zthreadsafety is %d, should be 1)r   r	   Zthreadsafetyr
   r   r   r   test_thread_safety&   r   zModuleTests.test_thread_safetyc                 C   r   )NZqmarkz%paramstyle is '%s', should be 'qmark')r   r	   Z
paramstyler
   r   r   r   test_param_style*   s
   
zModuleTests.test_param_stylec                 C      |  ttjtd d S )Nz&Warning is not a subclass of Exception)
assertTrue
issubclassr	   Warning	Exceptionr
   r   r   r   test_warning/      zModuleTests.test_warningc                 C   r   )Nz$Error is not a subclass of Exception)r   r   r	   Errorr   r
   r   r   r   
test_error3   r   zModuleTests.test_errorc                 C      |  ttjtjd d S )Nz)InterfaceError is not a subclass of Error)r   r   r	   InterfaceErrorr   r
   r   r   r   test_interface_error7      z ModuleTests.test_interface_errorc                 C   r   )Nz(DatabaseError is not a subclass of Error)r   r   r	   DatabaseErrorr   r
   r   r   r   test_database_error;   r   zModuleTests.test_database_errorc                 C   r   )Nz,DataError is not a subclass of DatabaseError)r   r   r	   	DataErrorr    r
   r   r   r   test_data_error?   r   zModuleTests.test_data_errorc                 C   r   )Nz3OperationalError is not a subclass of DatabaseError)r   r   r	   OperationalErrorr    r
   r   r   r   test_operational_errorC   r   z"ModuleTests.test_operational_errorc                 C   r   )Nz1IntegrityError is not a subclass of DatabaseError)r   r   r	   IntegrityErrorr    r
   r   r   r   test_integrity_errorG   r   z ModuleTests.test_integrity_errorc                 C   r   )Nz0InternalError is not a subclass of DatabaseError)r   r   r	   InternalErrorr    r
   r   r   r   test_internal_errorK   r   zModuleTests.test_internal_errorc                 C   r   )Nz3ProgrammingError is not a subclass of DatabaseError)r   r   r	   ProgrammingErrorr    r
   r   r   r   test_programming_errorO   r   z"ModuleTests.test_programming_errorc                 C   r   )Nz4NotSupportedError is not a subclass of DatabaseError)r   r   r	   NotSupportedErrorr    r
   r   r   r   test_not_supported_errorS   s
   
z$ModuleTests.test_not_supported_errordarwinz#shared cache is deprecated on macOSc              	   C   sP   dD ]#}|  t}t| W d    n1 sw   Y  | d|j qd S )N)TFzdbapi.py)ZassertWarnsDeprecationWarningr	   Zenable_shared_cacheZassertInfilename)r   enablecmr   r   r   test_shared_cache_deprecatedZ   s   z(ModuleTests.test_shared_cache_deprecatedc                 C   s    t d}t| t|d d S )N:memory:zselect 1)r	   connectr   typer   cxr   r   r   test_disallow_instantiationa   s   
z'ModuleTests.test_disallow_instantiationN)__name__
__module____qualname__r   r   r   r   r   r   r!   r#   r%   r'   r)   r+   r-   unittestZskipIfsysplatformr3   r9   r   r   r   r   r   !   s"    
r   c                   @   s|   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S )ConnectionTestsc                 C   s0   t d| _| j }|d |dd d S )Nr4   z4create table test(id integer primary key, name text)!insert into test(name) values (?)foo)r	   r5   r8   cursorexecuter   cur   r   r   setUph   s   

zConnectionTests.setUpc                 C      | j   d S Nr8   closer
   r   r   r   tearDownn      zConnectionTests.tearDownc                 C   rI   rJ   r8   commitr
   r   r   r   test_commitq   rN   zConnectionTests.test_commitc                 C      | j   | j   dS )zV
        A commit should also work when no changes were made to the database.
        NrO   r
   r   r   r   test_commit_after_no_changest      
z,ConnectionTests.test_commit_after_no_changesc                 C   rI   rJ   r8   rollbackr
   r   r   r   test_rollback{   rN   zConnectionTests.test_rollbackc                 C   rR   )zX
        A rollback should also work when no changes were made to the database.
        NrU   r
   r   r   r   test_rollback_after_no_changes~   rT   z.ConnectionTests.test_rollback_after_no_changesc                 C   s   | j  }d S rJ   r8   rD   rF   r   r   r   test_cursor   rN   zConnectionTests.test_cursorc                 C   s@   d}|  tj t|}W d    d S 1 sw   Y  d S )Nz/foo/bar/bla/23534/mydb.db)assertRaisesr	   r$   r5   )r   ZYOU_CANNOT_OPEN_THISconr   r   r   test_failed_open   s   "z ConnectionTests.test_failed_openc                 C   rI   rJ   rK   r
   r   r   r   
test_close   rN   zConnectionTests.test_closec                 C   s   |  | jjtj |  | jjtj |  | jjtj |  | jjtj |  | jjtj |  | jjtj |  | jj	tj	 |  | jj
tj
 |  | jjtj |  | jjtj d S rJ   )r   r8   r   r	   r   r   r    r"   r$   r&   r(   r*   r,   r
   r   r   r   test_exceptions   s   zConnectionTests.test_exceptionsc                 C   s   t d}| }| |jd |d | |jd |dd | |jd |ddg | }| |jd |  | |jd |ddg | }| |jd d S )	Nr4   Fz?create table transactiontest(id integer primary key, name text)z,insert into transactiontest(name) values (?)rB   Tz-select name from transactiontest where name=?rC   )r	   r5   rD   r   in_transactionrE   fetchonerP   )r   r8   rG   rowr   r   r   test_in_transaction   s   

z#ConnectionTests.test_in_transactionc                 C   s8   |  t d| j_W d    d S 1 sw   Y  d S )NT)r[   AttributeErrorr8   r`   r
   r   r   r   test_in_transaction_ro   s   
"z&ConnectionTests.test_in_transaction_roc                 C   sZ   |  tt G dd d}| }t|}|d W d   dS 1 s&w   Y  dS )z| Checks that we can successfully connect to a database using an object that
            is PathLike, i.e. has __fspath__(). c                   @      e Zd Zdd ZdS )z=ConnectionTests.test_open_with_path_like_object.<locals>.Pathc                 S   s   t S rJ   )r   r
   r   r   r   
__fspath__      zHConnectionTests.test_open_with_path_like_object.<locals>.Path.__fspath__N)r:   r;   r<   rg   r   r   r   r   Path       ri   create table test(id integer)N)
addCleanupr   r   r	   r5   rE   )r   ri   pathr8   r   r   r   test_open_with_path_like_object   s   "z/ConnectionTests.test_open_with_path_like_objectc              	   C   s   |  tt tt}|d W d    n1 sw   Y  tjdt dd}|d W d    n1 s9w   Y  tjdt d dd,}| tj |d W d    n1 s`w   Y  W d    d S W d    d S 1 sxw   Y  d S )Nrk   zfile:T)Zurizinsert into test(id) values(0)z?mode=rozinsert into test(id) values(1))rl   r   r   r	   r5   rE   r[   r$   r7   r   r   r   test_open_uri   s   "zConnectionTests.test_open_uriN)r:   r;   r<   rH   rM   rQ   rS   rW   rX   rZ   r]   r^   r_   rc   re   rn   ro   r   r   r   r   r@   f   s    r@   c                   @      e Zd Zdd Zdd ZdS )UninitialisedConnectionTestsc                 C   s   t jt j| _d S rJ   )r	   
Connection__new__r8   r
   r   r   r   rH         z"UninitialisedConnectionTests.setUpc              	      s    fdd fdd fdd fdd fdd fddf}|D ] } j |d  tjd	| W d    q"1 s=w   Y  q"d S )
Nc                          j jS rJ   )r8   isolation_levelr   r
   r   r   <lambda>       zEUninitialisedConnectionTests.test_uninit_operations.<locals>.<lambda>c                      ru   rJ   )r8   total_changesr   r
   r   r   rw      rx   c                      ru   rJ   )r8   r`   r   r
   r   r   rw      rx   c                      
    j  S rJ   )r8   Ziterdumpr   r
   r   r   rw         
 c                      rz   rJ   rY   r   r
   r   r   rw      r{   c                      rz   rJ   rK   r   r
   r   r   rw      r{   )funcz#Base Connection.__init__ not called)subTestZassertRaisesRegexr	   r*   )r   Zfuncsr|   r   r
   r   test_uninit_operations   s   





z3UninitialisedConnectionTests.test_uninit_operationsN)r:   r;   r<   rH   r~   r   r   r   r   rq      s    rq   c                   @   s  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#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$dEdF Z%dGdH Z&dIdJ Z'dKdL Z(dMdN Z)dOdP Z*dQdR Z+dSdT Z,dUdV Z-dWdX Z.dYdZ Z/d[d\ Z0d]d^ Z1d_d` Z2dadb Z3dcdd Z4dedf Z5dgS )hCursorTestsc                 C   s6   t d| _| j | _| jd | jdd d S )Nr4   z\create table test(id integer primary key, name text, income number, unique_test text unique)rA   rB   r	   r5   r8   rD   rG   rE   r
   r   r   r   rH      s   zCursorTests.setUpc                 C      | j   | j  d S rJ   rG   rL   r8   r
   r   r   r   rM         
zCursorTests.tearDownc                 C      | j d d S )Ndelete from testrG   rE   r
   r   r   r   test_execute_no_args      z CursorTests.test_execute_no_argsc                 C   >   |  tj | jd W d    d S 1 sw   Y  d S )Nzselect asdf)r[   r	   r$   rG   rE   r
   r   r   r   test_execute_illegal_sql      "z$CursorTests.test_execute_illegal_sqlc                 C   r   )Nzselect 5+4; select 4+5)r[   r	   r   rG   rE   r
   r   r   r   test_execute_too_much_sql   r   z%CursorTests.test_execute_too_much_sqlc                 C   r   )Nzselect 5+4; -- foo barr   r
   r   r   r   test_execute_too_much_sql2   r   z&CursorTests.test_execute_too_much_sql2c                 C   r   )NzT
            select 5+4;

            /*
            foo
            */
            r   r
   r   r   r   test_execute_too_much_sql3   r   z&CursorTests.test_execute_too_much_sql3c                 C   s<   |  t | jd W d    d S 1 sw   Y  d S N*   )r[   	TypeErrorrG   rE   r
   r   r   r   test_execute_wrong_sql_arg  s   "z&CursorTests.test_execute_wrong_sql_argc                 C      | j dd d S )Ninsert into test(id) values (?))r   r   r
   r   r   r   test_execute_arg_int     z CursorTests.test_execute_arg_intc                 C   r   )N#insert into test(income) values (?))gq=
ף@r   r
   r   r   r   test_execute_arg_float	  r   z"CursorTests.test_execute_arg_floatc                 C   r   )NrA   )ZHugor   r
   r   r   r   test_execute_arg_string  r   z#CursorTests.test_execute_arg_stringc                 C   s@   | j dd | j d| j jf | j  }| |d d d S )NrA   )Hu goz select name from test where id=?r   r   )rG   rE   	lastrowidra   r   r   rb   r   r   r   &test_execute_arg_string_with_zero_byte  s   
z2CursorTests.test_execute_arg_string_with_zero_bytec                 C   sN   |  t}| jdd W d    n1 sw   Y  | t|jd d S )Nr   r   z"parameters are of unsupported type)r[   
ValueErrorrG   rE   r   str	exception)r   r2   r   r   r   test_execute_non_iterable  s   z%CursorTests.test_execute_non_iterablec                 C   s@   |  tj | jdd W d    d S 1 sw   Y  d S )Nr   )   ZEgonr[   r	   r*   rG   rE   r
   r   r   r   test_execute_wrong_no_of_args1  s   "z*CursorTests.test_execute_wrong_no_of_args1c                 C   r   Nr   r   r
   r   r   r   test_execute_wrong_no_of_args2      "z*CursorTests.test_execute_wrong_no_of_args2c                 C   r   r   r   r
   r   r   r   test_execute_wrong_no_of_args3%  r   z*CursorTests.test_execute_wrong_no_of_args3c                 C   s:   | j d | j ddg | j  }| |d d d S )N%insert into test(name) values ('foo')"select name from test where name=?rC   r   rG   rE   ra   r   r   r   r   r   test_execute_param_list*  s   
z#CursorTests.test_execute_param_listc                 C   sH   G dd d}| j d | j d|  | j  }| |d d d S )Nc                   @   rp   )z2CursorTests.test_execute_param_sequence.<locals>.Lc                 S      dS )Nr   r   r
   r   r   r   __len__2  rh   z:CursorTests.test_execute_param_sequence.<locals>.L.__len__c                 S   s   |dksJ dS )Nr   rC   r   r   xr   r   r   __getitem__4  s   z>CursorTests.test_execute_param_sequence.<locals>.L.__getitem__Nr:   r;   r<   r   r   r   r   r   r   L1      r   r   r   r   rC   r   )r   r   rb   r   r   r   test_execute_param_sequence0  s
   
z'CursorTests.test_execute_param_sequencec                 C   sZ   G dd d}| j d | t | j d|  W d    d S 1 s&w   Y  d S )Nc                   @   rp   )z:CursorTests.test_execute_param_sequence_bad_len.<locals>.Lc                 S   s   dd  d S )Nr   r   r   r
   r   r   r   r   @     zBCursorTests.test_execute_param_sequence_bad_len.<locals>.L.__len__c                 S   s   t rJ   )AssertionError)Zslfr   r   r   r   r   B  rh   zFCursorTests.test_execute_param_sequence_bad_len.<locals>.L.__getitem__Nr   r   r   r   r   r   ?  r   r   r   r   )rG   rE   r[   ZeroDivisionError)r   r   r   r   r   #test_execute_param_sequence_bad_len=  s
   "z/CursorTests.test_execute_param_sequence_bad_lenc                 C   s<   | j d | j dddi | j  }| |d d d S )Nr   &select name from test where name=:namenamerC   r   r   r   r   r   r   test_execute_dict_mappingI  s   
z%CursorTests.test_execute_dict_mappingc                 C   sJ   G dd dt }| jd | jd|  | j }| |d d d S )Nc                   @   rf   )z8CursorTests.test_execute_dict_mapping_mapping.<locals>.Dc                 S   r   NrC   r   )r   keyr   r   r   __missing__Q  rh   zDCursorTests.test_execute_dict_mapping_mapping.<locals>.D.__missing__N)r:   r;   r<   r   r   r   r   r   DP  rj   r   r   r   r   rC   )dictrG   rE   ra   r   )r   r   rb   r   r   r   !test_execute_dict_mapping_mappingO  s
   
z-CursorTests.test_execute_dict_mapping_mappingc                 C   P   | j d | tj | j dddi W d    d S 1 s!w   Y  d S )Nr   z1select name from test where name=:name and id=:idr   rC   rG   rE   r[   r	   r*   r
   r   r   r   )test_execute_dict_mapping_too_little_argsY     "z5CursorTests.test_execute_dict_mapping_too_little_argsc                 C   sJ   | j d | tj | j d W d    d S 1 sw   Y  d S )Nr   r   r   r
   r   r   r   !test_execute_dict_mapping_no_args^  s   "z-CursorTests.test_execute_dict_mapping_no_argsc                 C   r   )Nr   r   r   rC   r   r
   r   r   r   !test_execute_dict_mapping_unnamedc  r   z-CursorTests.test_execute_dict_mapping_unnamedc                 C   rI   rJ   )rG   rL   r
   r   r   r   r^   h  rN   zCursorTests.test_closec                 C   sD   | j d | j d | j d | j d | | j jd d S )Nr   r   zupdate test set name='bar'   rG   rE   r   rowcountr
   r   r   r   test_rowcount_executek  s
   z!CursorTests.test_rowcount_executec                 C   s    | j d | | j jd dS )z
        pysqlite does not know the rowcount of SELECT statements, because we
        don't fetch all rows after executing the select statement. The rowcount
        has thus to be -1.
        zselect 5 union select 6Nr   r
   r   r   r   test_rowcount_selectr  s   z CursorTests.test_rowcount_selectc                 C   s2   | j d | j dg d | | j jd d S )Nr   rA   ))r   )r      r   )rG   rE   executemanyr   r   r
   r   r   r   test_rowcount_executemany{  s   z%CursorTests.test_rowcount_executemanyc                 C   s0   | j d | j d | jd| jjdd d S )Nr   r   z"total changes reported wrong value)msg)rG   rE   Z
assertLessr8   ry   r
   r   r   r   test_total_changes  s   zCursorTests.test_total_changesc                 C   s"   | j ddd tddD  d S )Nr   c                 S   s   g | ]}|fqS r   r   ).0r   r   r   r   
<listcomp>  s    z:CursorTests.test_execute_many_sequence.<locals>.<listcomp>d   n   )rG   r   ranger
   r   r   r   test_execute_many_sequence  s   "z&CursorTests.test_execute_many_sequencec                 C   s"   G dd d}| j d|  d S )Nc                   @   $   e Zd Zdd Zdd Zdd ZdS )z6CursorTests.test_execute_many_iterator.<locals>.MyIterc                 S   s
   d| _ d S N   )valuer
   r   r   r   __init__  s   
z?CursorTests.test_execute_many_iterator.<locals>.MyIter.__init__c                 S   s   | S rJ   r   r
   r   r   r   __iter__  rh   z?CursorTests.test_execute_many_iterator.<locals>.MyIter.__iter__c                 S   s$   | j dkrt|  j d7  _ | j fS )N
   r   )r   StopIterationr
   r   r   r   __next__  s   
z?CursorTests.test_execute_many_iterator.<locals>.MyIter.__next__N)r:   r;   r<   r   r   r   r   r   r   r   MyIter  s    r   r   rG   r   )r   r   r   r   r   test_execute_many_iterator  s   z&CursorTests.test_execute_many_iteratorc                 C   s   dd }| j d|  d S )Nc                  s   s    t dD ]} | fV  qd S r   )r   )ir   r   r   mygen  s   
z6CursorTests.test_execute_many_generator.<locals>.mygenr   r   )r   r   r   r   r   test_execute_many_generator  s   z'CursorTests.test_execute_many_generatorc                 C   s@   |  t | jddg W d    d S 1 sw   Y  d S )Nr   r   r[   r   rG   r   r
   r   r   r   test_execute_many_wrong_sql_arg  s   "z+CursorTests.test_execute_many_wrong_sql_argc                 C   sB   |  tj | jddg W d    d S 1 sw   Y  d S )Nzselect ?r   )r[   r	   r*   rG   r   r
   r   r   r   test_execute_many_select  s   "z$CursorTests.test_execute_many_selectc                 C   s>   |  t | jdd W d    d S 1 sw   Y  d S )Nr   r   r   r
   r   r   r   test_execute_many_not_iterable  s   "z*CursorTests.test_execute_many_not_iterablec                 C   sv   | j d | j dd | j dd | j d g }| j D ]	}||d  q| |d d | |d d	 d S )
Nr   r   )r   )   zselect id from test order by idr   r   r   r   )rG   rE   appendr   )r   Zlstrb   r   r   r   test_fetch_iter  s   
zCursorTests.test_fetch_iterc                 C   s@   | j d | j  }| |d d | j  }| |d  d S )Nselect name from testr   rC   r   r   r   r   r   test_fetchone  
   

zCursorTests.test_fetchonec                 C   s"   | j  }| }| |d  d S rJ   )r8   rD   ra   r   )r   currb   r   r   r   test_fetchone_no_statement  s   
z&CursorTests.test_fetchone_no_statementc                 C   sr   |  | jjd d| j_| jd | jd | jd | jd | jd | j }|  t|d d S )Nr   r   r   z#insert into test(name) values ('A')z#insert into test(name) values ('B')z#insert into test(name) values ('C')r   )r   rG   Z	arraysizerE   	fetchmanylenr   resr   r   r   test_array_size  s   
zCursorTests.test_array_sizec                 C   sD   | j d | j d}| t|d | j d}| |g  d S )Nr   r   r   rG   rE   r   r   r   r   r   r   r   test_fetchmany  s
   zCursorTests.test_fetchmanyc                 C   s.   | j d | j jdd}| t|d dS )z0Checks if fetchmany works with keyword argumentsr   r   )sizer   Nr   r   r   r   r   test_fetchmany_kw_arg  s   z!CursorTests.test_fetchmany_kw_argc                 C   s@   | j d | j  }| t|d | j  }| |g  d S )Nr   r   )rG   rE   fetchallr   r   r   r   r   r   test_fetchall  r   zCursorTests.test_fetchallc                 C   s   | j g d d S )N)r      r   )rG   Zsetinputsizesr
   r   r   r   test_setinputsizes  rt   zCursorTests.test_setinputsizesc                 C   r   )Nr   r   rG   Zsetoutputsizer
   r   r   r   test_setoutputsize  r   zCursorTests.test_setoutputsizec                 C   r   r   r  r
   r   r   r   test_setoutputsize_no_column  r   z(CursorTests.test_setoutputsize_no_columnc                 C   s   |  | jj| j d S rJ   )r   rG   
connectionr8   r
   r   r   r   test_cursor_connection  s   z"CursorTests.test_cursor_connectionc                 C   sD   |  t dd }| j|}W d    d S 1 sw   Y  d S )Nc                   S      d S rJ   r   r   r   r   r   f      z1CursorTests.test_wrong_cursor_callable.<locals>.f)r[   r   r8   rD   )r   r	  r   r   r   r   test_wrong_cursor_callable  s   "z&CursorTests.test_wrong_cursor_callablec                 C   sN   G dd d}| }|  t t|}W d    d S 1 s w   Y  d S )Nc                   @   s   e Zd ZdS )z0CursorTests.test_cursor_wrong_class.<locals>.FooN)r:   r;   r<   r   r   r   r   Foo   s    r  )r[   r   r	   ZCursor)r   r  rC   r   r   r   r   test_cursor_wrong_class  s
   "z#CursorTests.test_cursor_wrong_classc              	   C   sb   d}dD ]*}| j |d | j||d | | jjd W d   q1 s)w   Y  qdS )zV
        INSERT OR REPLACE and REPLACE INTO should produce the same behavior.
        z+{} INTO test(id, unique_test) VALUES (?, ?))zINSERT OR REPLACEZREPLACE	statement)r   rC   r   N)r}   rG   rE   formatr   r   )r   sqlr  r   r   r   test_last_row_id_on_replace  s   z'CursorTests.test_last_row_id_on_replacec                 C   s@   | j dd | | j jd | j dd | | j jd d S )Nz2insert or ignore into test(unique_test) values (?))testr   )rG   rE   r   r   r
   r   r   r   test_last_row_id_on_ignore  s   z&CursorTests.test_last_row_id_on_ignorec              
   C   s   g }dD ][}d}| j d|dF | j|||f ||| jjf | tj | j|||f W d    n1 sBw   Y  ||| jjf W d    q1 sZw   Y  qg d}| 	|| d S )N)FAILABORTROLLBACKz.INSERT OR {} INTO test(unique_test) VALUES (?)zINSERT OR {}r  )r  r   r  r  r   r  r  r  r  )
r}   r  rG   rE   r   r   r[   r	   r&   r   )r   resultsr  r  Zexpectedr   r   r   test_last_row_id_insert_o_r  s   z'CursorTests.test_last_row_id_insert_o_rN)6r:   r;   r<   rH   rM   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r^   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r   r   r   r   r      sh    		
		

r   c                   @   s\   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S )ThreadTestsc                 C   (   t d| _| j | _| jd d S )Nr4   z\create table test(id integer primary key, name text, bin binary, ratio number, ts timestamp))r	   r5   r\   rD   r   rE   r
   r   r   r   rH   ,     zThreadTests.setUpc                 C   r   rJ   )r   rL   r\   r
   r   r   r   rM   1  r   zThreadTests.tearDownc                 C   V   dd }g }t j|| j|dd}|  |  t|dkr)| d| d S d S )Nc                 S   D   z|   }|d W d S  tjy   Y d S    |d Y d S Ndid not raise ProgrammingErrorraised wrong exception)rD   r   r	   r*   )r\   errorsr   r   r   r   run6     
z(ThreadTests.test_con_cursor.<locals>.runr\   r%  targetkwargsr   
	threadingThreadr\   startjoinr   failr   r&  r%  tr   r   r   test_con_cursor5     
zThreadTests.test_con_cursorc                 C   r   )Nc                 S   D   z|    |d W d S  tjy   Y d S    |d Y d S r"  )rP   r   r	   r*   r(  r   r   r   r&  H  r'  z(ThreadTests.test_con_commit.<locals>.runr(  r)  r   r,  r-  r3  r   r   r   test_con_commitG  r6  zThreadTests.test_con_commitc                 C   r   )Nc                 S   r7  r"  )rV   r   r	   r*   r(  r   r   r   r&  Z  r'  z*ThreadTests.test_con_rollback.<locals>.runr(  r)  r   r,  r-  r3  r   r   r   test_con_rollbackY  r6  zThreadTests.test_con_rollbackc                 C   r   )Nc                 S   r7  r"  rL   r   r	   r*   r(  r   r   r   r&  l  r'  z'ThreadTests.test_con_close.<locals>.runr(  r)  r   r,  r-  r3  r   r   r   test_con_closek  r6  zThreadTests.test_con_closec                 C   r   )Nc                 S   F   z|  d |d W d S  tjy   Y d S    |d Y d S )N#insert into test(name) values ('a')r#  r$  rE   r   r	   r*   r   r%  r   r   r   r&  ~     

z0ThreadTests.test_cur_implicit_begin.<locals>.runr?  r)  r   r,  r.  r/  r   r0  r1  r   r2  r3  r   r   r   test_cur_implicit_begin}  r6  z#ThreadTests.test_cur_implicit_beginc                 C   r   )Nc                 S   r7  r"  r:  r?  r   r   r   r&    r'  z'ThreadTests.test_cur_close.<locals>.runr?  r)  r   r,  rA  r3  r   r   r   test_cur_close  r6  zThreadTests.test_cur_closec                 C   sb   dd }g }| j d tj|| j |dd}|  |  t|dkr/| d| d S d S )Nc                 S   r<  )Nr   r#  r$  r>  r?  r   r   r   r&    r@  z)ThreadTests.test_cur_execute.<locals>.runr=  r?  r)  r   r,  r   rE   r.  r/  r0  r1  r   r2  r3  r   r   r   test_cur_execute  s   
zThreadTests.test_cur_executec                 C   sn   dd }g }| j d | j d tj|| j |dd}|  |  t|dkr5| d| d S d S )	Nc                 S   r!  r"  )ra   r   r	   r*   )r   r%  rb   r   r   r   r&    r'  z+ThreadTests.test_cur_iter_next.<locals>.runr=  r   r?  r)  r   r,  rD  r3  r   r   r   test_cur_iter_next  s   
zThreadTests.test_cur_iter_nextN)r:   r;   r<   rH   rM   r5  r8  r9  r;  rB  rC  rE  rF  r   r   r   r   r  +  s    r  c                   @   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S )ConstructorTestsc                 C      t ddd}d S )N  r      )r	   ZDater   dr   r   r   	test_date  r   zConstructorTests.test_datec                 C   rI  )N   '   #   )r	   ZTimer   r4  r   r   r   	test_time  r   zConstructorTests.test_timec                 C   s   t dddddd}d S )NrJ  r   rK  rO  rP  rQ  )r	   Z	Timestampr   Ztsr   r   r   test_timestamp  s   zConstructorTests.test_timestampc                 C      t d}d S r   )r	   ZDateFromTicksrL  r   r   r   test_date_from_ticks  rN   z%ConstructorTests.test_date_from_ticksc                 C   rV  r   )r	   ZTimeFromTicksrR  r   r   r   test_time_from_ticks  rN   z%ConstructorTests.test_time_from_ticksc                 C   rV  r   )r	   ZTimestampFromTicksrT  r   r   r   test_timestamp_from_ticks  rN   z*ConstructorTests.test_timestamp_from_ticksc                 C   rV  )Ns    ')r	   ZBinary)r   br   r   r   test_binary  rN   zConstructorTests.test_binaryN)
r:   r;   r<   rN  rS  rU  rW  rX  rY  r[  r   r   r   r   rH    s    rH  c                   @   rG  )ExtensionTestsc                 C   sB   t d}| }|d |d | d }| |d d S )Nr4   z
            -- bla bla
            /* a stupid comment */
            create table a(i);
            insert into a(i) values (5);
            zselect i from ar   r   )r	   r5   rD   executescriptrE   ra   r   )r   r\   r   r   r   r   r   test_script_string_sql  s   


z%ExtensionTests.test_script_string_sqlc                 C   N   t d}| }| t j |d W d    d S 1 s w   Y  d S )Nr4   z1create table test(x); asdf; create table test2(x)r	   r5   rD   r[   r$   r]  r   r\   r   r   r   r   test_script_syntax_error  
   
"z'ExtensionTests.test_script_syntax_errorc                 C   r_  )Nr4   z5create table test(sadfsadfdsa); select foo from hurz;r`  ra  r   r   r   test_script_error_normal  rc  z'ExtensionTests.test_script_error_normalc                 C   s\   t d}| }| t}|d W d    n1 sw   Y  | t|jd d S )Nr4   s9   create table test(foo); insert into test(foo) values (5);z script argument must be unicode.)	r	   r5   rD   r[   r   r]  r   r   r   )r   r\   r   r2   r   r   r   "test_cursor_executescript_as_bytes  s   
z1ExtensionTests.test_cursor_executescript_as_bytesc                 C   s.   t d}|d d }| |dd d S )Nr4   zselect 5r   r   z Basic test of Connection.execute)r	   r5   rE   ra   r   r   r\   resultr   r   r   test_connection_execute  s   
z&ExtensionTests.test_connection_executec                 C   sb   t d}|d |dddg |d }| |d d dd	 | |d
 d dd	 d S )Nr4   zcreate table test(foo)z insert into test(foo) values (?)r   r  z!select foo from test order by foor   r   z$Basic test of Connection.executemanyr   r  )r	   r5   rE   r   r   r   rf  r   r   r   test_connection_executemany  s   

z*ExtensionTests.test_connection_executemanyc                 C   s8   t d}|d |d d }| |dd d S )Nr4   z9create table test(foo); insert into test(foo) values (5);zselect foo from testr   r   z&Basic test of Connection.executescript)r	   r5   r]  rE   ra   r   rf  r   r   r   test_connection_executescript  s   

z,ExtensionTests.test_connection_executescriptN)
r:   r;   r<   r^  rb  rd  re  rh  rj  rk  r   r   r   r   r\    s    r\  c                   @   sT   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S )ClosedConTestsc                 C   sL   t d}|  | t j | }W d    d S 1 sw   Y  d S Nr4   )r	   r5   rL   r[   r*   rD   ra  r   r   r   test_closed_con_cursor  
   

"z%ClosedConTests.test_closed_con_cursorc                 C   L   t d}|  | t j |  W d    d S 1 sw   Y  d S rm  )r	   r5   rL   r[   r*   rP   r   r\   r   r   r   test_closed_con_commit  ro  z%ClosedConTests.test_closed_con_commitc                 C   rp  rm  )r	   r5   rL   r[   r*   rV   rq  r   r   r   test_closed_con_rollback  ro  z'ClosedConTests.test_closed_con_rollbackc                 C   sV   t d}| }|  | t j |d W d    d S 1 s$w   Y  d S )Nr4   zselect 4)r	   r5   rD   rL   r[   r*   rE   ra  r   r   r   test_closed_cur_execute%  s   
"z&ClosedConTests.test_closed_cur_executec                 C   sZ   t d}|  dd }| t j |dd| W d    d S 1 s&w   Y  d S )Nr4   c                 S   r   Nr   r   )r   r   r   r   r	  /  r
  z5ClosedConTests.test_closed_create_function.<locals>.frC   r   )r	   r5   rL   r[   r*   Zcreate_function)r   r\   r	  r   r   r   test_closed_create_function,  s   
"z*ClosedConTests.test_closed_create_functionc                 C   s`   t d}|  G dd d}| t j |dd| W d    d S 1 s)w   Y  d S )Nr4   c                   @   r   )z8ClosedConTests.test_closed_create_aggregate.<locals>.Aggc                 S   r  rJ   r   r
   r   r   r   r   7  rh   zAClosedConTests.test_closed_create_aggregate.<locals>.Agg.__init__c                 S   r  rJ   r   r   r   r   r   step9  rh   z=ClosedConTests.test_closed_create_aggregate.<locals>.Agg.stepc                 S   r   ru  r   r
   r   r   r   finalize;  rh   zAClosedConTests.test_closed_create_aggregate.<locals>.Agg.finalizeN)r:   r;   r<   r   rw  rx  r   r   r   r   Agg6  s    ry  rC   r   )r	   r5   rL   r[   r*   Zcreate_aggregate)r   r\   ry  r   r   r   test_closed_create_aggregate3  s   
"z+ClosedConTests.test_closed_create_aggregatec                 C   sV   t d}|  dd }| t j || W d    d S 1 s$w   Y  d S )Nr4   c                  W   s   t jS rJ   )r	   ZDENY)argsr   r   r   
authorizerC  s   z=ClosedConTests.test_closed_set_authorizer.<locals>.authorizer)r	   r5   rL   r[   r*   Zset_authorizer)r   r\   r|  r   r   r   test_closed_set_authorizer@  s   
"z)ClosedConTests.test_closed_set_authorizerc                 C   sX   t d}|  dd }| t j ||d W d    d S 1 s%w   Y  d S )Nr4   c                   S   r  rJ   r   r   r   r   r   progressK  r
  zBClosedConTests.test_closed_set_progress_callback.<locals>.progressr   )r	   r5   rL   r[   r*   Zset_progress_handler)r   r\   r~  r   r   r   !test_closed_set_progress_callbackH  s   
"z0ClosedConTests.test_closed_set_progress_callbackc                 C   sJ   t d}|  | t j |  W d    d S 1 sw   Y  d S rm  )r	   r5   rL   r[   r*   rq  r   r   r   test_closed_callO  s
   
"zClosedConTests.test_closed_callN)r:   r;   r<   rn  rr  rs  rt  rv  rz  r}  r  r  r   r   r   r   rl    s    rl  c                   @   rf   )ClosedCurTestsc              	   C   s   t d}| }|  dD ]5}|dv rd}n|dkr#dddgf}ng }| t j t||}||  W d    q1 s?w   Y  qd S )	Nr4   )rE   r   r]  r   r   ra   )rE   r]  )zselect 4 union select 5r   zinsert into foo(bar) values (?)r   ri  )r	   r5   rD   rL   r[   r*   getattr)r   r\   r   Zmethod_nameparamsmethodr   r   r   test_closedV  s   


zClosedCurTests.test_closedN)r:   r;   r<   r  r   r   r   r   r  U  rj   r  c                   @   sX   e Zd 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S )SqliteOnConflictTestszz
    Tests for SQLite's "insert on conflict" feature.

    See https://www.sqlite.org/lang_conflict.html for details.
    c                 C   r  )Nr4   zz
          CREATE TABLE test(
            id INTEGER PRIMARY KEY, name TEXT, unique_name TEXT UNIQUE
          );
        r   r
   r   r   r   rH   o  r  zSqliteOnConflictTests.setUpc                 C   r   rJ   r   r
   r   r   r   rM   x  r   zSqliteOnConflictTests.tearDownc                 C   s   d | j _| j  | _| jd | jd | jd | tj | jd W d    n1 s3w   Y  | j   | jd | 	| j
 g  d S )NBEGIN,INSERT INTO test(name) VALUES ('abort_test')8INSERT OR ROLLBACK INTO test(unique_name) VALUES ('foo')z"SELECT name, unique_name from testr8   rv   rD   rG   rE   r[   r	   r&   rP   r   r   r
   r   r   r   3test_on_conflict_rollback_with_explicit_transaction|  s   
zISqliteOnConflictTests.test_on_conflict_rollback_with_explicit_transactionc                 C   s   d | j _| j  | _| jd | jd | jd | tj | jd W d    n1 s3w   Y  | j   | jd | 	| j
 ddg d S )Nr  r  5INSERT OR ABORT INTO test(unique_name) VALUES ('foo')"SELECT name, unique_name FROM testZ
abort_testNr   r  r
   r   r   r   8test_on_conflict_abort_raises_with_explicit_transactions  s   
zNSqliteOnConflictTests.test_on_conflict_abort_raises_with_explicit_transactionsc                 C   sr   | j d | j d | tj | j d W d    n1 s#w   Y  | j d | | j  g  d S )Nr  r  r  rG   rE   r[   r	   r&   r   r   r
   r   r   r   -test_on_conflict_rollback_without_transaction  s   zCSqliteOnConflictTests.test_on_conflict_rollback_without_transactionc                 C   sv   | j d | j d | tj | j d W d    n1 s#w   Y  | j d | | j  ddg d S )Nr  r  r  r  r   r  r
   r   r   r   2test_on_conflict_abort_raises_without_transactions  s   zHSqliteOnConflictTests.test_on_conflict_abort_raises_without_transactionsc                 C   sZ   | j d | tj | j d W d    n1 sw   Y  | | j  g  d S )Nz4INSERT OR FAIL INTO test(unique_name) VALUES ('foo')r  r
   r   r   r   test_on_conflict_fail  s
   z+SqliteOnConflictTests.test_on_conflict_failc                 C   s<   | j d | j d | j d | | j  dg d S )Nz6INSERT OR IGNORE INTO test(unique_name) VALUES ('foo')zSELECT unique_name FROM testrB   rG   rE   r   r   r
   r   r   r   test_on_conflict_ignore     z-SqliteOnConflictTests.test_on_conflict_ignorec                 C   s<   | j d | j d | j d | | j  dg d S )NzFINSERT OR REPLACE INTO test(name, unique_name) VALUES ('Data!', 'foo')zUINSERT OR REPLACE INTO test(name, unique_name) VALUES ('Very different data!', 'foo')r  )zVery different data!rC   r  r
   r   r   r   test_on_conflict_replace  r  z.SqliteOnConflictTests.test_on_conflict_replaceN)r:   r;   r<   __doc__rH   rM   r  r  r  r  r  r  r  r   r   r   r   r  h  s    	
r  c                   @   s$   e Zd Zed Zdd Zdd ZdS )MultiprocessTestsg     @@c                 C   s   t t d S rJ   )r   r   r
   r   r   r   rM     r   zMultiprocessTests.tearDownc              
   C   sH  dt  d| j d}tjtjd|gddtjtjd}| |j | 	d|j
   tjt | jd	}zAz| |d
 W d    n1 sGw   Y  W n tjyh } z|jt| W Y d }~nd }~ww |jd W |  n|  w | |j z	|jdtd W n tjy   |  |   w | 	|jd d S )Nzif 1:
            import sqlite3
            def wait():
                print("started")
                assert "database is locked" in input()

            cx = sqlite3.connect("z", timeout=a  )
            cx.create_function("wait", 0, wait)
            with cx:
                cx.execute("create table t(t)")
            try:
                # execute two transactions; both will try to lock the db
                cx.executescript('''
                    -- start a transaction and wait for parent
                    begin transaction;
                    select * from t;
                    select wait();
                    rollback;

                    -- start a new transaction; would fail if parent holds lock
                    begin transaction;
                    select * from t;
                    rollback;
                ''')
            finally:
                cx.close()
        z-czutf-8r   )encodingbufsizestdinstdoutstarted)timeoutzinsert into t values('test')zno errorend)inputr  )r   CONNECTION_TIMEOUT
subprocessPopenr>   
executablePIPErl   communicater   r  readlinestripr	   r5   rE   r$   r  writer   rL   ZassertIsNone
returncoder   TimeoutExpiredkill)r   ZSCRIPTprocr8   excr   r   r   &test_ctx_mgr_rollback_if_commit_failed  sH   
z8MultiprocessTests.test_ctx_mgr_rollback_if_commit_failedN)r:   r;   r<   r   r  rM   r  r   r   r   r   r    s    r  c                  C   s.   t ttttttttt	t
g} tdd | D S )Nc                 S   s   g | ]	}t  |qS r   )r=   Z
TestLoaderZloadTestsFromTestCase)r   r4  r   r   r   r     s    zsuite.<locals>.<listcomp>)rl  r  r@   rH  r   r\  r   r  r  r  rq   r=   Z	TestSuite)Ztestsr   r   r   suite  s   r  c                  C   s   t  } | t  d S rJ   )r=   ZTextTestRunnerr&  r  )Zrunnerr   r   r   r    s   r  __main__)r  r.  r=   Zsqlite3r	   r>   Ztest.supportr   r   Ztest.support.os_helperr   r   ZTestCaser   r@   rq   r   r  rH  r\  rl  r  r  r  r  r  r:   r   r   r   r   <module>   s4   Ec  P 4C]G
