comparison tests/test_MySQLdb_dbapi20.py @ 18:d55bfb1a4701 MySQLdb

Tons of changes from major refactoring/cleanup. This is all really broken right now. In particular, all results are returned as strings.
author adustman
date Fri, 14 Mar 2008 23:06:29 +0000
parents
children
comparison
equal deleted inserted replaced
17:7c7a89123d65 18:d55bfb1a4701
1 #!/usr/bin/env python
2 import dbapi20
3 import unittest
4 import MySQLdb
5
6 class test_MySQLdb(dbapi20.DatabaseAPI20Test):
7 driver = MySQLdb
8 connect_args = ()
9 connect_kw_args = dict(db='test',
10 read_default_file='~/.my.cnf',
11 charset='utf8',
12 sql_mode="ANSI,STRICT_TRANS_TABLES,TRADITIONAL")
13
14 def test_setoutputsize(self): pass
15 def test_setoutputsize_basic(self): pass
16 def test_nextset(self): pass
17
18 """The tests on fetchone and fetchall and rowcount bogusly
19 test for an exception if the statement cannot return a
20 result set. MySQL always returns a result set; it's just that
21 some things return empty result sets."""
22
23 def test_fetchall(self):
24 con = self._connect()
25 try:
26 cur = con.cursor()
27 # cursor.fetchall should raise an Error if called
28 # without executing a query that may return rows (such
29 # as a select)
30 self.assertRaises(self.driver.Error, cur.fetchall)
31
32 self.executeDDL1(cur)
33 for sql in self._populate():
34 cur.execute(sql)
35
36 # cursor.fetchall should raise an Error if called
37 # after executing a a statement that cannot return rows
38 ## self.assertRaises(self.driver.Error,cur.fetchall)
39
40 cur.execute('select name from %sbooze' % self.table_prefix)
41 rows = cur.fetchall()
42 self.failUnless(cur.rowcount in (-1,len(self.samples)))
43 self.assertEqual(len(rows),len(self.samples),
44 'cursor.fetchall did not retrieve all rows'
45 )
46 rows = [r[0] for r in rows]
47 rows.sort()
48 for i in range(0,len(self.samples)):
49 self.assertEqual(rows[i],self.samples[i],
50 'cursor.fetchall retrieved incorrect rows'
51 )
52 rows = cur.fetchall()
53 self.assertEqual(
54 len(rows),0,
55 'cursor.fetchall should return an empty list if called '
56 'after the whole result set has been fetched'
57 )
58 self.failUnless(cur.rowcount in (-1,len(self.samples)))
59
60 self.executeDDL2(cur)
61 cur.execute('select name from %sbarflys' % self.table_prefix)
62 rows = cur.fetchall()
63 self.failUnless(cur.rowcount in (-1,0))
64 self.assertEqual(len(rows),0,
65 'cursor.fetchall should return an empty list if '
66 'a select query returns no rows'
67 )
68
69 finally:
70 con.close()
71
72 def test_fetchone(self):
73 con = self._connect()
74 try:
75 cur = con.cursor()
76
77 # cursor.fetchone should raise an Error if called before
78 # executing a select-type query
79 self.assertRaises(self.driver.Error,cur.fetchone)
80
81 # cursor.fetchone should raise an Error if called after
82 # executing a query that cannnot return rows
83 self.executeDDL1(cur)
84 ## self.assertRaises(self.driver.Error,cur.fetchone)
85
86 cur.execute('select name from %sbooze' % self.table_prefix)
87 self.assertEqual(cur.fetchone(),None,
88 'cursor.fetchone should return None if a query retrieves '
89 'no rows'
90 )
91 self.failUnless(cur.rowcount in (-1,0))
92
93 # cursor.fetchone should raise an Error if called after
94 # executing a query that cannnot return rows
95 cur.execute("insert into %sbooze values ('Victoria Bitter')" % (
96 self.table_prefix
97 ))
98 ## self.assertRaises(self.driver.Error,cur.fetchone)
99
100 cur.execute('select name from %sbooze' % self.table_prefix)
101 r = cur.fetchone()
102 self.assertEqual(len(r),1,
103 'cursor.fetchone should have retrieved a single row'
104 )
105 self.assertEqual(r[0],'Victoria Bitter',
106 'cursor.fetchone retrieved incorrect data'
107 )
108 ## self.assertEqual(cur.fetchone(),None,
109 ## 'cursor.fetchone should return None if no more rows available'
110 ## )
111 self.failUnless(cur.rowcount in (-1,1))
112 finally:
113 con.close()
114
115 # Same complaint as for fetchall and fetchone
116 def test_rowcount(self):
117 con = self._connect()
118 try:
119 cur = con.cursor()
120 self.executeDDL1(cur)
121 ## self.assertEqual(cur.rowcount,-1,
122 ## 'cursor.rowcount should be -1 after executing no-result '
123 ## 'statements'
124 ## )
125 cur.execute("insert into %sbooze values ('Victoria Bitter')" % (
126 self.table_prefix
127 ))
128 ## self.failUnless(cur.rowcount in (-1,1),
129 ## 'cursor.rowcount should == number or rows inserted, or '
130 ## 'set to -1 after executing an insert statement'
131 ## )
132 cur.execute("select name from %sbooze" % self.table_prefix)
133 self.failUnless(cur.rowcount in (-1,1),
134 'cursor.rowcount should == number of rows returned, or '
135 'set to -1 after executing a select statement'
136 )
137 self.executeDDL2(cur)
138 ## self.assertEqual(cur.rowcount,-1,
139 ## 'cursor.rowcount not being reset to -1 after executing '
140 ## 'no-result statements'
141 ## )
142 finally:
143 con.close()
144
145 def test_callproc(self):
146 pass # performed in test_MySQL_capabilities
147
148 def help_nextset_setUp(self,cur):
149 ''' Should create a procedure called deleteme
150 that returns two result sets, first the
151 number of rows in booze then "name from booze"
152 '''
153 sql="""
154 create procedure deleteme()
155 begin
156 select count(*) from %(tp)sbooze;
157 select name from %(tp)sbooze;
158 end
159 """ % dict(tp=self.table_prefix)
160 cur.execute(sql)
161
162 def help_nextset_tearDown(self,cur):
163 'If cleaning up is needed after nextSetTest'
164 cur.execute("drop procedure deleteme")
165
166 def test_nextset(self):
167 from warnings import warn
168 con = self._connect()
169 try:
170 cur = con.cursor()
171 if not hasattr(cur,'nextset'):
172 return
173
174 try:
175 self.executeDDL1(cur)
176 sql=self._populate()
177 for sql in self._populate():
178 cur.execute(sql)
179
180 self.help_nextset_setUp(cur)
181
182 cur.callproc('deleteme')
183 numberofrows=cur.fetchone()
184 assert numberofrows[0]== len(self.samples)
185 assert cur.nextset()
186 names=cur.fetchall()
187 assert len(names) == len(self.samples)
188 s=cur.nextset()
189 if s:
190 empty = cur.fetchall()
191 self.assertEquals(len(empty), 0,
192 "non-empty result set after other result sets")
193 #warn("Incompatibility: MySQL returns an empty result set for the CALL itself",
194 # Warning)
195 #assert s == None,'No more return sets, should return None'
196 finally:
197 self.help_nextset_tearDown(cur)
198
199 finally:
200 con.close()
201
202
203 if __name__ == '__main__':
204 unittest.main()
205 print '''"Huh-huh, he said 'unit'." -- Butthead'''