a „oeu†ã@s‚dZddd…ZdZddlZddlZddlZejddkrJeZddd „Z ndd l mZdd d „Z d Z d d„Z Gdd„dej ƒZdS)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$Revision: 1.15.0 $é éþÿÿÿz'Stuart Bishop éNÚ3cCs| ||¡dS©N)Ú assertTrue©ÚselfÚexprÚmsg©r ú6C:\Program Files\Certbot\pkgs\adodbapi\test\dbapi20.pyÚ _failUnlesssr )Ú ExceptioncCs| ||¡dSr)Ú failUnlessrr r r r sFcCs(tjdkrt|tƒr| d¡}| d¡S)N)érÚlatin1)ÚsysÚ version_infoÚ isinstanceÚstrÚdecodeÚencode)Zsvalr r r Ú str2bytesbs rc@s¸eZdZdZdZdZiZdZdeZdeZ deZ deZ d Z d d „Z d d „Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd Zd,d-„Zd.d/„Z d0d1„Z!d2d3„Z"d4d5„Z#d6d7„Z$gd8¢Z%d9d:„Z&d;d<„Z'd=d>„Z(d?d@„Z)dAdB„Z*dCdD„Z+dEdF„Z,dGdF„Z,dHdI„Z-dJdK„Z.dLdM„Z/dNdO„Z0dPdQ„Z1dRdS„Z2dTdU„Z3dVdW„Z4dXdY„Z5dZd[„Z6d\d]„Z7d^d_„Z8d`da„Z9dbdc„Z:dS)dÚDatabaseAPI20Testa 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'. Nr Z dbapi20test_z'create table %sbooze (name varchar(20))zNon-idempotent close is considered a bad thing by some people.) r$rr*Ú assertRaisesr(r)rr'ÚTEST_FOR_NON_IDEMPOTENT_CLOSEZskipTestrUr r r Ú test_closeŠs ÿzDatabaseAPI20Test.test_closecCs6| ¡}z| ¡}| |¡W| ¡n | ¡0dSr)r$rÚ _paraminsertr*rUr r r Ú test_execute¢s  zDatabaseAPI20Test.test_executecCs¾| |¡| d|j¡t||jdvƒ|jjdkrJ| d|jd¡n’|jjdkrj| d|jd¡nr|jjdkrŽ| d |jd d i¡nN|jjd kr®| d |jd¡n.|jjdkrÒ| d|jd d i¡n | d¡t||jdvƒ| d|j¡| ¡}|  t |ƒdd¡|dd|ddg}|  ¡|  |dd d¡|  |ddd¡d}|  |dd|dt |ddƒt |ƒf¡|  |dd|dt |ddƒt |ƒf¡dS)NzSinsert into %sbarflys values ('Victoria Bitter', 'thi%%s :may ca%%(u)se? troub:1e')rfr=zCinsert into %sbarflys values (?, 'thi%%s :may ca%%(u)se? troub:1e')©úCooper'sr>zDinsert into %sbarflys values (:1, 'thi%%s :may ca%%(u)se? troub:1e')r?zGinsert into %sbarflys values (:beer, 'thi%%s :may ca%%(u)se? troub:1e')Úbeerrtr@zEinsert into %sbarflys values (%%s, 'thi%%s :may ca%%(u)se? troub:1e')rAzKinsert into %sbarflys values (%%(beer)s, 'thi%%s :may ca%%(u)se? troub:1e')zInvalid paramstylez!select name, drink from %sbarflysr:z%cursor.fetchall returned too few rowsrr9zFcursor.fetchall retrieved incorrect data, or data inserted incorrectlyrYzthi%s :may ca%(u)se? troub:1ez[cursor.fetchall retrieved incorrect data, or data inserted incorrectly. Got=%s, Expected=%s) r!rr[r rgr(rBr2r\r7r]ÚsortÚrepr)rr-ÚresÚbeersZtroubler r r rqªs” ÿÿ ÿý ÿý ÿý ÿý ÿý ýý ÿý ÿýzDatabaseAPI20Test._paraminsertcCsˆ| ¡}zn| ¡}| |¡ddg}ddiddig}|jjdkrV| d|j|¡nŠ|jjdkrv| d |j|¡nj|jjd kr–| d |j|¡nJ|jjd kr¶| d |j|¡n*|jjdkrÖ| d|j|¡n | d¡t||j dvd|j ƒ|  d|j¡|  ¡}|  t |ƒdd¡|dd|ddg}| ¡|  |ddd|d¡|  |ddd¡W| ¡n | ¡0dS)Nrs)úBoag'srurtrzr=zinsert into %sbooze values (?)r>zinsert into %sbooze values (:1)r?z"insert into %sbooze values (:beer)r@z insert into %sbooze values (%%s)rAz&insert into %sbooze values (%%(beer)s)zUnknown paramstyle)rer:zIinsert using cursor.executemany set cursor.rowcount to incorrect value %rrXr:z2cursor.fetchall retrieved incorrect number of rowsrr9zincorrect data "%s" retrievedzincorrect data retrieved)r$rrr(rBZ executemanyr[r2r rgrr\r7r]rvr*)rr,r-ZlargsZmargsrxryr r r Útest_executemanyñs^   ÿ  ÿ  ÿ  ÿ þ ÿý ÿÿz"DatabaseAPI20Test.test_executemanycCs | ¡}zô| ¡}| |jj|j¡| |¡| |jj|j¡| d|j¡|  | ¡dd¡t ||j dvƒ| d|j¡| |jj|j¡| d|j¡| ¡}|  t |ƒdd¡|  |ddd ¡|  | ¡dd ¡t ||j d vƒW|  ¡n |  ¡0dS) NrXz?cursor.fetchone should return None if a query retrieves no rowsrdrWr9z2cursor.fetchone should have retrieved a single rowrrYz(cursor.fetchone retrieved incorrect dataz^sÿz/DatabaseAPI20Test._populate..)Úsamples)rZpopulater r"r Ú _populateZs þzDatabaseAPI20Test._populatecCsd| ¡}zJ| ¡}| |jj|jd¡| |¡| ¡D]}| |¡q:| d|j ¡| ¡}|  t |ƒdd¡d|_ | d¡}|  t |ƒdd¡| d¡}|  t |ƒdd¡| d¡}|  t |ƒd d ¡t ||jd vƒd|_ | d|j ¡| ¡}|  t |ƒdd ¡| ¡}|  t |ƒd¡| ¡}|  t |ƒd ¡t ||jd vƒd |_ | d|j ¡| ¡}t ||jd vƒ|  t |ƒd ¡|  t |ƒd ¡dd„|Dƒ}| ¡td d ƒD]}|  |||j|d¡q¼| ¡}|  t |ƒd d¡t ||jd vƒ| |¡| d|j ¡| ¡}|  t |ƒd d¡t ||jdvƒW| ¡n | ¡0dS)NérXr9zQcursor.fetchmany retrieved incorrect number of rows, default of arraysize is one.é rz3cursor.fetchmany retrieved incorrect number of rowsr:rzLcursor.fetchmany should return an empty sequence after results are exhausted©reéz0cursor.arraysize not being honoured by fetchmanyr†cSsg|] }|d‘qS©rr ©r~r3r r r r€žóz4DatabaseAPI20Test.test_fetchmany..z,incorrect data retrieved by cursor.fetchmanyzfcursor.fetchmany should return an empty sequence if called after the whole result set has been fetchedúselect name from %sbarflyszKcursor.fetchmany should return an empty sequence if query retrieved no rowsrd)r$rrnr(r)Ú fetchmanyrr‚rr[r7r]Ú arraysizer rgrvÚrangerr!r*)rr,r-Úsqlr3ÚrowsÚir r r Útest_fetchmanyds   ý  ÿ  ÿ ý ÿýý ýz DatabaseAPI20Test.test_fetchmanycCsz| ¡}z`| ¡}| |jj|j¡| |¡| ¡D]}| |¡q8| |jj|j¡| d|j ¡| ¡}t ||j dt |j ƒfvƒ| t |ƒt |j ƒd¡dd„|Dƒ}| ¡tdt |j ƒƒD]}| |||j |d¡qÊ| ¡}| t |ƒdd¡t ||j dt |j ƒfvƒ| |¡| d |j ¡| ¡}t ||j d vƒ| t |ƒdd ¡W| ¡n | ¡0dS) NrXrez)cursor.fetchall did not retrieve all rowscSsg|] }|d‘qSr‡r rˆr r r r€Ùr‰z3DatabaseAPI20Test.test_fetchall..rz(cursor.fetchall retrieved incorrect rowszacursor.fetchall should return an empty list if called after the whole result set has been fetchedrŠrdzMcursor.fetchall should return an empty list if a select query returns no rows)r$rrnr(r)r\rr‚rr[r rgr]rr7rvrr!r*)rr,r-rŽrrr r r Ú test_fetchallÀsN   ýÿý ýzDatabaseAPI20Test.test_fetchallc CsB| ¡}z(| ¡}| |¡| ¡D]}| |¡q&| d|j¡| ¡}| d¡}| ¡}| ¡}t ||j dvƒ|  t |ƒdd¡|  t |ƒdd¡|dg}|  |dd|ddg¡| |d¡|  |dd|ddg¡| ¡tdt |jƒƒD]} |  || |j| d¡qW| ¡n | ¡0dS) NrXr:r…z+fetchmany returned incorrect number of rowsz*fetchall returned incorrect number of rowsrr9z$incorrect data retrieved or inserted)r$rrr‚rr[r|r‹r\r rgr7r]ÚextendÚappendrvrrr*) rr,r-rŽZrows1Zrows23Zrows4Zrows56rrr r r Útest_mixedfetchös8     ÿ ÿ ÿ z!DatabaseAPI20Test.test_mixedfetchcCs tdƒ‚dS)z™Should create a procedure called deleteme that returns two result sets, first the number of rows in booze then "name from booze" úHelper not implementedN©ÚNotImplementedError©rr-r r r Úhelp_nextset_setUpsz$DatabaseAPI20Test.help_nextset_setUpcCs tdƒ‚dS)z*If cleaning up is needed after nextSetTestr–Nr—r™r r r Úhelp_nextset_tearDown&sz'DatabaseAPI20Test.help_nextset_tearDownc Csþ| ¡}zæ| ¡}t|dƒs*W| ¡dSz¬| |¡| ¡}| ¡D]}| |¡qF| |¡| d¡|  ¡}|dt |j ƒksˆJ‚|  ¡s”J‚|  ¡}t |ƒt |j ƒks²J‚|  ¡}|dksÊJdƒ‚W| |¡n | |¡0W| ¡n | ¡0dS)NÚnextsetZdeletemerz'No more return sets, should return None)r$rrSr*rr‚rršrir|r]rrœr\r›)rr,r-rŽZ numberofrowsÚnamesrr r r Ú test_nextset+s. ê      zDatabaseAPI20Test.test_nextsetcCs tdƒ‚dS)Nz"Drivers need to override this testr—r"r r r ržHscCs>| ¡}z&| ¡}t|t|dƒdƒW| ¡n | ¡0dS)NrŒz cursor.arraysize must be defined)r$rr rSr*rUr r r Útest_arraysizeKs ÿz DatabaseAPI20Test.test_arraysizecCs@| ¡}z(| ¡}| d¡| |¡W| ¡n | ¡0dS)N)é)r$rZ setinputsizesrqr*rUr r r Útest_setinputsizesVs   z$DatabaseAPI20Test.test_setinputsizescCsL| ¡}z4| ¡}| d¡| dd¡| |¡W| ¡n | ¡0dS)NièiÐr)r$rZ setoutputsizerqr*rUr r r Útest_setoutputsize_basic_s   z*DatabaseAPI20Test.test_setoutputsize_basiccCs tdƒ‚dS)Nz#Driver needed to override this testr—r"r r r Útest_setoutputsizejsz$DatabaseAPI20Test.test_setoutputsizecCs˜| ¡}z€| ¡}| |¡| d|j¡| d|j¡| ¡}| t|ƒd¡| t|dƒd¡| |dddd¡W| ¡n | ¡0dS)Nz!insert into %sbooze values (NULL)rXr9rzNULL value not returned as NonerZrlr r r Ú test_Nonens zDatabaseAPI20Test.test_NonecCs&|j ddd¡}|j t d¡¡}dS)NéÒé r ) r¥r¦r rrrrrr)r(ZDateZ DateFromTicksÚtimeÚmktime)rZd1Zd2r r r Ú test_Date|szDatabaseAPI20Test.test_DatecCs&|j ddd¡}|j t d¡¡}dS)Né é-é) iÑr9r9rªr«r¬rrr)r(ZTimeZ TimeFromTicksr§r¨©rÚt1Út2r r r Ú test_Time‚szDatabaseAPI20Test.test_TimecCs,|j dddddd¡}|j t d¡¡}dS)Nr¥r¦r rªr«r¬) r¥r¦r rªr«r¬rrr)r(Z TimestampZTimestampFromTicksr§r¨r­r r r Útest_Timestampˆsÿz DatabaseAPI20Test.test_TimestampcCs$|j tdƒ¡}|j tdƒ¡}dS)NZ SomethingÚ)r(ZBinaryr)rÚbr r r Ú test_BinaryszDatabaseAPI20Test.test_BinarycCst|t|jdƒdƒdS)Nrbzmodule.STRING must be defined©r rSr(r"r r r Ú test_STRING”sÿzDatabaseAPI20Test.test_STRINGcCst|t|jdƒdƒdS)NZBINARYzmodule.BINARY must be defined.rµr"r r r Ú test_BINARY™sÿzDatabaseAPI20Test.test_BINARYcCst|t|jdƒdƒdS)NÚNUMBERzmodule.NUMBER must be defined.rµr"r r r Ú test_NUMBERžsÿzDatabaseAPI20Test.test_NUMBERcCst|t|jdƒdƒdS)NZDATETIMEz module.DATETIME must be defined.rµr"r r r Ú test_DATETIME£sÿzDatabaseAPI20Test.test_DATETIMEcCst|t|jdƒdƒdS)NZROWIDzmodule.ROWID must be defined.rµr"r r r Ú test_ROWID¨sÿzDatabaseAPI20Test.test_ROWID);Ú__name__Ú __module__Ú __qualname__Ú__doc__r(r/r0r[rr r%r&Z lowerfuncrr!r#r.r$r5r8r<rCrNrPrQrTrVr^rcrhrkrmrprrrqr{r}rr‚r‘r’r•ršr›ržrŸr¡r¢r£r¤r©r°r±r´r¶r·r¹rºr»r r r r rhsr    +%G2.  \6!   r)N)N)r¿Ú __version__Ú __author__rr§ZunittestrDrr+r Ú exceptionsrorZTestCaserr r r r Ús    ?