dbtextdb_test.py

00001 #!/usr/bin/python
00002 #
00003 # Copyright 2008 Google Inc. All Rights Reserved.
00004 
00005 """Test for dbtext_query."""
00006 
00007 __author__ = 'herman@google.com (Herman Sheremetyev)'
00008 
00009 import time
00010 import unittest
00011 from dbtextdb import *
00012 
00013 
00014 class DBTextTest(unittest.TestCase):
00015 
00016   def setUp(self):
00017     self.time_now = '%s' % int(time.time())
00018     self.time_now = self.time_now[0:-2] + '00'
00019 
00020   def testParseQuery(self):
00021     db_conn = DBText('./tests')
00022     # bad command
00023     query_bad_command = 'selecta * from table;'
00024     self.assertRaises(ParseError, db_conn.ParseQuery, query_bad_command)
00025     #  normal query
00026     query_normal = 'select * from subscriber;'
00027     db_conn.ParseQuery(query_normal)
00028     self.assert_(db_conn.command == 'SELECT')
00029     self.assert_(db_conn.table == 'subscriber')
00030     self.assert_(db_conn.columns == ['*'])
00031     db_conn.CleanUp()
00032     # normal query with condition
00033     query_normal_cond = 'select * from subscriber where column="value";'
00034     db_conn.ParseQuery(query_normal_cond)
00035     self.assert_(db_conn.command == 'SELECT')
00036     self.assert_(db_conn.table == 'subscriber')
00037     self.assert_(db_conn.columns == ['*'])
00038     self.assert_(db_conn.strings == ['value'])
00039     self.assert_(not db_conn.count)
00040     self.assert_(db_conn.conditions == {'column': 'value'})
00041     db_conn.CleanUp()
00042     # normal query with multiple conditions
00043     query_normal_cond = ('select * from subscriber where column="value1" and '
00044                          'col2=" another value " and col3= foo and a="";')
00045     db_conn.ParseQuery(query_normal_cond)
00046     self.assert_(db_conn.command == 'SELECT')
00047     self.assert_(db_conn.table == 'subscriber')
00048     self.assert_(db_conn.columns == ['*'])
00049     self.assert_(db_conn.strings == ['value1', ' another value ', ''])
00050     self.assertEqual(db_conn.conditions, {'column': 'value1',
00051                                           'col2': ' another value ',
00052                                           'col3': 'foo', 'a': ''})
00053     db_conn.CleanUp()
00054     # normal query with count
00055     query_normal_count = 'select count(*) from subscriber;'
00056     db_conn.ParseQuery(query_normal_count)
00057     self.assert_(db_conn.command == 'SELECT')
00058     self.assert_(db_conn.table == 'subscriber')
00059     self.assert_(db_conn.columns == ['*'])
00060     self.assert_(db_conn.count == True)
00061     db_conn.CleanUp()
00062     # normal query with now()
00063     query_normal_count = 'select count(*) from subscriber where time=now();'
00064     db_conn.ParseQuery(query_normal_count)
00065     self.assert_(db_conn.command == 'SELECT')
00066     self.assert_(db_conn.table == 'subscriber')
00067     self.assert_(db_conn.columns == ['*'])
00068     self.assert_(db_conn.count == True)
00069     self.assertEqual(db_conn.conditions, {'time': self.time_now})
00070     db_conn.CleanUp()
00071     # normal delete query
00072     query_normal_delete = 'delete from subscriber where foo = 2;'
00073     db_conn.ParseQuery(query_normal_delete)
00074     self.assert_(db_conn.command == 'DELETE')
00075     self.assert_(db_conn.table == 'subscriber')
00076     self.assertEqual(db_conn.conditions, {'foo': '2'})
00077     db_conn.CleanUp()
00078     # normal insert values query with no into
00079     query_normal_insert_values = ('insert subscriber (col1, col2, col3) '
00080                                   'values (1, "foo", "");')
00081     db_conn.ParseQuery(query_normal_insert_values)
00082     self.assert_(db_conn.command == 'INSERT')
00083     self.assert_(db_conn.table == 'subscriber')
00084     self.assertEqual(db_conn.targets, {'col1': '1', 'col2': 'foo', 'col3': ''})
00085     db_conn.CleanUp()
00086     # normal insert values query with into
00087     query_normal_insert_into_values = ('insert into subscriber (col1, col2) '
00088                                        'values (1, "foo");')
00089     db_conn.ParseQuery(query_normal_insert_into_values)
00090     self.assert_(db_conn.command == 'INSERT')
00091     self.assert_(db_conn.table == 'subscriber')
00092     self.assertEqual(db_conn.targets, {'col1': '1', 'col2': 'foo'})
00093     db_conn.CleanUp()
00094     # normal insert values query with now()
00095     query_normal_insert_into_values = ('insert into subscriber (a, b, c) '
00096                                        'values (NOW(), "foo", now());')
00097     db_conn.ParseQuery(query_normal_insert_into_values)
00098     self.assert_(db_conn.command == 'INSERT')
00099     self.assert_(db_conn.table == 'subscriber')
00100     self.assertEqual(db_conn.targets, {'a': self.time_now, 'b': 'foo',
00101                                        'c': self.time_now})
00102     db_conn.CleanUp()
00103     # bad insert: missing table
00104     bad_insert_query_missing_table = ('insert into (col1, col2) '
00105                                       'values (1, "foo");')
00106     self.assertRaises(ParseError, db_conn.ParseQuery,
00107                       bad_insert_query_missing_table)
00108     db_conn.CleanUp()
00109     # bad insert: missing parens
00110     bad_insert_query_missing_parens = ('insert into test col1, col2 '
00111                                        'values (1, "foo");')
00112     self.assertRaises(ParseError, db_conn.ParseQuery,
00113                       bad_insert_query_missing_parens)
00114     db_conn.CleanUp()
00115     # bad insert: missing paren
00116     bad_insert_query_missing_paren = ('insert into test (col1, col2) '
00117                                       'values 1, "foo");')
00118     self.assertRaises(ParseError, db_conn.ParseQuery,
00119                       bad_insert_query_missing_paren)
00120     db_conn.CleanUp()
00121     # bad insert: missing quote
00122     bad_insert_query_missing_quote = ('insert into test (col1, col2) '
00123                                       '(values 1, "foo);')
00124     self.assertRaises(ParseError, db_conn.ParseQuery,
00125                       bad_insert_query_missing_quote)
00126     db_conn.CleanUp()
00127     # bad insert: missing values
00128     bad_insert_query_missing_values = ('insert into test (col1, col2) '
00129                                        '( 1, "foo");')
00130     self.assertRaises(ParseError, db_conn.ParseQuery,
00131                       bad_insert_query_missing_values)
00132     db_conn.CleanUp()
00133     # bad insert: mislplaced values
00134     bad_insert_query_misplaced_values = ('insert into test values (col1, col2) '
00135                                          '( 1, "foo");')
00136     self.assertRaises(ParseError, db_conn.ParseQuery,
00137                       bad_insert_query_misplaced_values)
00138     db_conn.CleanUp()
00139     # bad insert: extra values
00140     bad_insert_query_extra_values = ('insert into test values (col1, col2) '
00141                                      ' values values ( 1, "foo");')
00142     self.assertRaises(ParseError, db_conn.ParseQuery,
00143                       bad_insert_query_extra_values)
00144     db_conn.CleanUp()
00145     # bad insert: extra paren set
00146     bad_insert_query_extra_paren_set = ('insert into test values (col1, col2) '
00147                                         ' values ( 1, "foo")();')
00148     self.assertRaises(ParseError, db_conn.ParseQuery,
00149                       bad_insert_query_extra_paren_set)
00150     db_conn.CleanUp()
00151     # bad insert: mismatched value pairs
00152     bad_insert_query_mismatched_vals = ('insert into test values (col1, col2) '
00153                                         ' values ("foo");')
00154     self.assertRaises(ParseError, db_conn.ParseQuery,
00155                       bad_insert_query_mismatched_vals)
00156     db_conn.CleanUp()
00157     # normal insert set  query with no into
00158     query_normal_insert_set = ('insert subscriber set col= 1, col2 ="\'f\'b";')
00159     db_conn.ParseQuery(query_normal_insert_set)
00160     self.assert_(db_conn.command == 'INSERT')
00161     self.assert_(db_conn.table == 'subscriber')
00162     self.assertEqual(db_conn.targets, {'col': '1', 'col2': '\'f\'b'})
00163     db_conn.CleanUp()
00164     # normal update
00165     query_normal_update = ('update subscriber set col1= 1, col2 ="foo";')
00166     db_conn.ParseQuery(query_normal_update)
00167     self.assert_(db_conn.command == 'UPDATE')
00168     self.assert_(db_conn.table == 'subscriber')
00169     self.assertEqual(db_conn.targets, {'col1': '1', 'col2': 'foo'})
00170     db_conn.CleanUp()
00171     # normal update with condition
00172     query_normal_update_cond = ('update subscriber set col1= 1, col2 ="foo" '
00173                                 'where   foo = "bar" and id=1 and a="";')
00174     db_conn.ParseQuery(query_normal_update_cond)
00175     self.assert_(db_conn.command == 'UPDATE')
00176     self.assert_(db_conn.table == 'subscriber')
00177     self.assertEqual(db_conn.targets, {'col1': '1', 'col2': 'foo'})
00178     self.assertEqual(db_conn.conditions, {'foo': 'bar', 'id': '1', 'a': ''})
00179     db_conn.CleanUp()
00180     # bad update: extra parens
00181     bad_update_query_extra_paren = ('update test set (col1 = "foo");')
00182     self.assertRaises(ParseError, db_conn.ParseQuery,
00183                       bad_update_query_extra_paren)
00184     db_conn.CleanUp()
00185     # bad update: missing table
00186     bad_update_query_missing_table = ('update SET col1 = "foo";')
00187     self.assertRaises(ParseError, db_conn.ParseQuery,
00188                       bad_update_query_missing_table)
00189     db_conn.CleanUp()
00190     # bad update: missing set
00191     bad_update_query_missing_set = ('update test sett col1 = "foo";')
00192     self.assertRaises(ParseError, db_conn.ParseQuery,
00193                       bad_update_query_missing_set)
00194     db_conn.CleanUp()
00195     # bad update: missing val
00196     bad_update_query_missing_val = ('update test set col1 =;')
00197     self.assertRaises(ParseError, db_conn.ParseQuery,
00198                       bad_update_query_missing_val)
00199     db_conn.CleanUp()
00200     # bad update: missing comma
00201     bad_update_query_missing_comma = ('update test set col1 = "foo" crap =5;')
00202     self.assertRaises(ParseError, db_conn.ParseQuery,
00203                       bad_update_query_missing_comma)
00204     db_conn.CleanUp()
00205     # bad update: missing equal
00206     bad_update_query_missing_equal = ('update test set col1 = "foo", and 5;')
00207     self.assertRaises(ParseError, db_conn.ParseQuery,
00208                       bad_update_query_missing_equal)
00209     db_conn.CleanUp()
00210     # bad update: missing col
00211     bad_update_query_missing_col = ('update test set col1 = "foo", = 5;')
00212     self.assertRaises(ParseError, db_conn.ParseQuery,
00213                       bad_update_query_missing_col)
00214     db_conn.CleanUp()
00215     # bad update: double col
00216     bad_update_query_double_col = ('update test set col1 = "foo", and a = 5;')
00217     self.assertRaises(ParseError, db_conn.ParseQuery,
00218                       bad_update_query_double_col)
00219     db_conn.CleanUp()
00220     # normal query with multiple columns
00221     query_normal_count = 'select col1, "col 2",col3  , "col4" from subscriber;'
00222     db_conn.ParseQuery(query_normal_count)
00223     self.assert_(db_conn.command == 'SELECT')
00224     self.assert_(db_conn.table == 'subscriber')
00225     self.assert_(db_conn.strings == ['col 2', 'col4'])
00226     self.assert_(db_conn.columns == ['col1', "'col 2'", 'col3', "'col4'"])
00227     db_conn.CleanUp()
00228     # normal query with ORDER BY
00229     query_normal_order_by = ('select col1, col2 from test'
00230                              ' ORDER by col1;')
00231     db_conn.ParseQuery(query_normal_order_by)
00232     self.assert_(db_conn.command == 'SELECT')
00233     self.assert_(db_conn.table == 'test')
00234     self.assert_(db_conn.columns == ['col1', 'col2'])
00235     self.assert_(db_conn.order_by == 'col1')
00236     db_conn.CleanUp()
00237     # normal query with ORDER BY with conditions
00238     query_normal_order_by_cond = ('select col1, col2 from test where col="asdf"'
00239                                   ' and col2  = "foo" ORDER by col;')
00240     db_conn.ParseQuery(query_normal_order_by_cond)
00241     self.assert_(db_conn.command == 'SELECT')
00242     self.assert_(db_conn.table == 'test')
00243     self.assert_(db_conn.columns == ['col1', 'col2'])
00244     self.assert_(db_conn.conditions == {'col': 'asdf', 'col2': 'foo'})
00245     self.assert_(db_conn.order_by == 'col')
00246     db_conn.CleanUp()
00247     # normal query with CONCAT
00248     query_normal_concat = ('select concat(uname,"@", domain) as email_addr '
00249                            'from subscriber where id=3;')
00250     db_conn.ParseQuery(query_normal_concat)
00251     self.assert_(db_conn.command == 'SELECT')
00252     self.assert_(db_conn.table == 'subscriber')
00253     self.assert_(db_conn.columns == ['email_addr'])
00254     self.assert_(db_conn.conditions == {'id': '3'})
00255     self.assert_(db_conn.aliases == {'email_addr': ['uname', "'@'", 'domain']})
00256     db_conn.CleanUp()
00257     # normal query with multiple CONCAT
00258     query_normal_mult_concat = ('select concat(uname,"@", domain) as email,'
00259                                 ' foo as "bar" from table where id=3;')
00260     db_conn.ParseQuery(query_normal_mult_concat)
00261     self.assert_(db_conn.command == 'SELECT')
00262     self.assert_(db_conn.table == 'table')
00263     self.assert_(db_conn.columns == ['email', "'bar'"])
00264     self.assert_(db_conn.conditions == {'id': '3'})
00265     self.assert_(db_conn.aliases == {"'bar'": ['foo'],
00266                                      'email': ['uname', "'@'", 'domain']})
00267     db_conn.CleanUp()
00268     # bad query with CONCAT missing AS
00269     bad_query_concat_no_as = ('select concat(col1,col2) from test'
00270                               ' ORDER by col1 col2;')
00271     self.assertRaises(ParseError, db_conn.ParseQuery,
00272                       bad_query_concat_no_as)
00273     db_conn.CleanUp()
00274     # bad query with CONCAT missing AS arg
00275     bad_query_concat_no_as_arg = ('select concat(col1,col2) as from test'
00276                                   ' ORDER by col1 col2;')
00277     self.assertRaises(ParseError, db_conn.ParseQuery,
00278                       bad_query_concat_no_as_arg)
00279     db_conn.CleanUp()
00280     # bad query with CONCAT missing paren
00281     bad_query_concat_no_paren = ('select concat(col1,col2  as foo from test'
00282                                  ' ORDER by col1 col2;')
00283     self.assertRaises(ParseError, db_conn.ParseQuery,
00284                       bad_query_concat_no_paren)
00285     db_conn.CleanUp()
00286     # bad query with ORDER BY multiple columns
00287     bad_query_mult_order_by = ('select col1, col2 from test'
00288                                ' ORDER by col1 col2;')
00289     self.assertRaises(ParseError, db_conn.ParseQuery,
00290                       bad_query_mult_order_by)
00291     db_conn.CleanUp()
00292     # bad select query: missing FROM
00293     bad_query_missing_from = 'select * subscriber;'
00294     self.assertRaises(ParseError, db_conn.ParseQuery,
00295                       bad_query_missing_from)
00296     db_conn.CleanUp()
00297     # bad select query: missing comma in columns
00298     bad_query_missing_comma = 'select col1 col2 col3 from subscriber;'
00299     self.assertRaises(ParseError, db_conn.ParseQuery,
00300                       bad_query_missing_comma)
00301     db_conn.CleanUp()
00302     # bad select query: extra comma in columns
00303     bad_query_extra_comma = 'select col1,col2, from subscriber;'
00304     self.assertRaises(ParseError, db_conn.ParseQuery,
00305                       bad_query_extra_comma)
00306     db_conn.CleanUp()
00307     bad_query_extra_comma = 'select col1,,col2 from subscriber;'
00308     self.assertRaises(ParseError, db_conn.ParseQuery,
00309                       bad_query_extra_comma)
00310     db_conn.CleanUp()
00311     bad_query_extra_comma = 'select ,col1,col2 from subscriber;'
00312     self.assertRaises(ParseError, db_conn.ParseQuery,
00313                       bad_query_extra_comma)
00314     db_conn.CleanUp()
00315     # bad conditions: missing AND
00316     bad_query_missing_and = ('select * from subscriber where column = asdf '
00317                              ' something=missing_and;')
00318     self.assertRaises(ParseError, db_conn.ParseQuery,
00319                       bad_query_missing_and)
00320     db_conn.CleanUp()
00321     # bad conditions: missing value
00322     bad_query_missing_value = ('select * from subscriber where column = asdf'
00323                                ' and something=;')
00324     self.assertRaises(ParseError, db_conn.ParseQuery,
00325                       bad_query_missing_value)
00326     db_conn.CleanUp()
00327     # bad query: unterminated string
00328     bad_query_unterm_str = ('select * from test where column ="asdf;')
00329     self.assertRaises(ParseError, db_conn.ParseQuery,
00330                       bad_query_unterm_str)
00331     db_conn.CleanUp()
00332     # bad select query: missing table
00333     bad_select_query_missing_table = ('select * from where column ="asdf";')
00334     self.assertRaises(ParseError, db_conn.ParseQuery,
00335                       bad_select_query_missing_table)
00336     db_conn.CleanUp()
00337 
00338   def testOpenTable(self):
00339     # check that header is retrieved and parsed correctly
00340     query = ('select * from test;')
00341     db_conn = DBText('./tests')
00342     db_conn.ParseQuery(query)
00343     db_conn.OpenTable()
00344     self.assertEqual(db_conn.header, {'col2': {'auto': False, 'null': True,
00345                                                'type': 'string', 'pos': 2},
00346                                       'id': {'auto': True, 'null': False,
00347                                              'type': 'int', 'pos': 1},
00348                                       'col1': {'auto': False, 'null': False,
00349                                                'type': 'string', 'pos': 0}})
00350 
00351     # check that data is retrieved and parsed correctly
00352     query = ('select * from test;')
00353     db_conn = DBText('./tests')
00354     db_conn.ParseQuery(query)
00355     db_conn.OpenTable()
00356     self.assertEqual(db_conn.data,
00357                      [{'col1': 'item1\\:', 'id': 1, 'col2': 'item2'},
00358                       {'col1': 'it\\:em1\\\\', 'id': 2, 'col2': ''},
00359                       {'col1': '\\:item3', 'id': 3, 'col2': 'asdf\\:'}])
00360 
00361     # missing table
00362     query = ('select * from non_existent_table;')
00363     db_conn = DBText('./tests')
00364     db_conn.ParseQuery(query)
00365     self.assertRaises(ExecuteError, db_conn.OpenTable)
00366 
00367     # type string value in type int column
00368     query = ('select * from bad_table_wrong_type;')
00369     db_conn = DBText('./tests')
00370     db_conn.ParseQuery(query)
00371     self.assertRaises(ExecuteError, db_conn.OpenTable)
00372 
00373     # row has fewer fields than header
00374     query = ('select * from bad_table_short_row;')
00375     db_conn = DBText('./tests')
00376     db_conn.ParseQuery(query)
00377     self.assertRaises(ExecuteError, db_conn.OpenTable)
00378 
00379     # row has more fields than header
00380     query = ('select * from bad_table_long_row;')
00381     db_conn = DBText('./tests')
00382     db_conn.ParseQuery(query)
00383     self.assertRaises(ExecuteError, db_conn.OpenTable)
00384 
00385     # value mismatch: non-null column is null
00386     query = ('select * from bad_table_null;')
00387     db_conn = DBText('./tests')
00388     db_conn.ParseQuery(query)
00389     self.assertRaises(ExecuteError, db_conn.OpenTable)
00390 
00391     # value mismatch: int column is string
00392     query = ('select * from bad_table_int;')
00393     db_conn = DBText('./tests')
00394     db_conn.ParseQuery(query)
00395     self.assertRaises(ExecuteError, db_conn.OpenTable)
00396 
00397   def testExecute(self):
00398     db_conn = DBText('./tests')
00399     writethru = False
00400 
00401     # test count
00402     query = ("select count(*) from subscriber where username='monitor' and"
00403              " domain='test.com';")
00404     result = db_conn.Execute(query, writethru)
00405     self.assertEqual(result, [2])
00406     db_conn.CleanUp()
00407 
00408     query = ('select count(*) from subscriber where '
00409              "username='test2';")
00410     result = db_conn.Execute(query, writethru)
00411     self.assertEqual(result, [1])
00412     db_conn.CleanUp()
00413 
00414     query = ('select count(*) from subscriber where '
00415              "username='test1';")
00416     result = db_conn.Execute(query, writethru)
00417     self.assertEqual(result, [3])
00418     db_conn.CleanUp()
00419 
00420     # test concat
00421     query = ("select concat(username, '@', domain) as email_addr from "
00422              'subscriber where id = 3;')
00423     result = db_conn.Execute(query, writethru)
00424     self.assertEqual(result, [['test2@test.com']])
00425     db_conn.CleanUp()
00426 
00427     # test select
00428     query = ("select * from subscriber where username='test2' and"
00429              " domain='test.com';")
00430     expected_result = [[3, 'test2', 'test.com', 'password', '', '',
00431                         'test-team@test.com', 1202336327,
00432                         '9fe9bfa1315b8202838838c3807a0a32',
00433                         'fac1f260ebda200719de4aa29880ee05', '', '']]
00434     result = db_conn.Execute(query, writethru)
00435     self.assertEqual(result, expected_result)
00436     db_conn.CleanUp()
00437 
00438     query = ('select * from subscriber where id = 3;')
00439     expected_result = [[3, 'test2', 'test.com', 'password', '', '',
00440                         'test-team@test.com', 1202336327,
00441                         '9fe9bfa1315b8202838838c3807a0a32',
00442                         'fac1f260ebda200719de4aa29880ee05', '', '']]
00443     result = db_conn.Execute(query, writethru)
00444     self.assertEqual(result, expected_result)
00445     db_conn.CleanUp()
00446 
00447     # test order by
00448     query = ('select * from test order by non_existent_column;')
00449     self.assertRaises(ExecuteError, db_conn.Execute, query, writethru)
00450     db_conn.CleanUp()
00451 
00452     query = ('select * from unsorted_table order by id;')
00453     result = db_conn.Execute(query, writethru)
00454     self.assertEqual(result, [[1, 'fred', 'test.com', 2125551234],
00455                               [2, 'james', 'test4.com', 2125551231],
00456                               [3, 'mike', 'test2.com', 2125551239],
00457                               [4, 'alex', 'test1.com', 2125551237],
00458                               [5, 'john', 'test.com', 2125551240]])
00459     db_conn.CleanUp()
00460 
00461     query = ('select * from unsorted_table order by user;')
00462     result = db_conn.Execute(query, writethru)
00463     self.assertEqual(result, [[4, 'alex', 'test1.com', 2125551237],
00464                               [1, 'fred', 'test.com', 2125551234],
00465                               [2, 'james', 'test4.com', 2125551231],
00466                               [5, 'john', 'test.com', 2125551240],
00467                               [3, 'mike', 'test2.com', 2125551239]])
00468     db_conn.CleanUp()
00469 
00470     query = ('select * from unsorted_table order by domain;')
00471     result = db_conn.Execute(query, writethru)
00472     self.assertEqual(result, [[1, 'fred', 'test.com', 2125551234],
00473                               [5, 'john', 'test.com', 2125551240],
00474                               [4, 'alex', 'test1.com', 2125551237],
00475                               [3, 'mike', 'test2.com', 2125551239],
00476                               [2, 'james', 'test4.com', 2125551231]])
00477     db_conn.CleanUp()
00478 
00479     query = ('select * from unsorted_table order by number;')
00480     result = db_conn.Execute(query, writethru)
00481     self.assertEqual(result, [[2, 'james', 'test4.com', 2125551231],
00482                               [1, 'fred', 'test.com', 2125551234],
00483                               [4, 'alex', 'test1.com', 2125551237],
00484                               [3, 'mike', 'test2.com', 2125551239],
00485                               [5, 'john', 'test.com', 2125551240]])
00486     db_conn.CleanUp()
00487 
00488     # test delete
00489     query = ('delete from unsorted_table where id = 3;')
00490     result = db_conn.Execute(query, writethru)
00491     self.assertEqual(result, [1])
00492     self.assertEqual(db_conn.data, [{'id': 1, 'user': 'fred', 'domain':
00493                                      'test.com', 'number': 2125551234},
00494                                     {'id': 4, 'user': 'alex', 'domain':
00495                                      'test1.com', 'number': 2125551237},
00496                                     {'id': 2, 'user': 'james', 'domain':
00497                                      'test4.com', 'number': 2125551231},
00498                                     {'id': 5, 'user': 'john', 'domain':
00499                                      'test.com', 'number': 2125551240}])
00500     db_conn.CleanUp()
00501 
00502     query = ('delete from unsorted_table where id = 5;')
00503     result = db_conn.Execute(query, writethru)
00504     self.assertEqual(db_conn.data, [{'id': 1, 'user': 'fred', 'domain':
00505                                      'test.com', 'number': 2125551234},
00506                                     {'id': 4, 'user': 'alex', 'domain':
00507                                      'test1.com', 'number': 2125551237},
00508                                     {'id': 2, 'user': 'james', 'domain':
00509                                      'test4.com', 'number': 2125551231},
00510                                     {'id': 3, 'user': 'mike', 'domain':
00511                                      'test2.com', 'number': 2125551239}])
00512     db_conn.CleanUp()
00513 
00514     # test insert with auto increment
00515     query = ("insert into unsorted_table set user='jake', domain='test.com',"
00516              'number = 2125551456;')
00517     result = db_conn.Execute(query, writethru)
00518     self.assertEqual(db_conn.data, [{'id': 1, 'user': 'fred', 'domain':
00519                                      'test.com', 'number': 2125551234},
00520                                     {'id': 4, 'user': 'alex', 'domain':
00521                                      'test1.com', 'number': 2125551237},
00522                                     {'id': 2, 'user': 'james', 'domain':
00523                                      'test4.com', 'number': 2125551231},
00524                                     {'id': 3, 'user': 'mike', 'domain':
00525                                      'test2.com', 'number': 2125551239},
00526                                     {'id': 5, 'user': 'john', 'domain':
00527                                      'test.com', 'number': 2125551240},
00528                                     {'id': 6, 'user': 'jake', 'domain':
00529                                      'test.com', 'number': 2125551456}])
00530     db_conn.CleanUp()
00531 
00532     # test insert with null value
00533     query = ("insert into test set col1='asdf';")
00534     result = db_conn.Execute(query, writethru)
00535     self.assertEqual(db_conn.data, [{'col2': 'item2', 'id': 1, 'col1':
00536                                      'item1\\:'},
00537                                     {'col2': '', 'id': 2, 'col1':
00538                                      'it\\:em1\\\\'},
00539                                     {'col2': 'asdf\\:', 'id': 3, 'col1':
00540                                      '\\:item3'},
00541                                     {'col2': '', 'id': 4, 'col1': 'asdf'}])
00542     db_conn.CleanUp()
00543 
00544     # test insert with null value alternate syntax
00545     query = ("insert test ( col1) values ('asdf');")
00546     result = db_conn.Execute(query, writethru)
00547     self.assertEqual(db_conn.data, [{'col2': 'item2', 'id': 1, 'col1':
00548                                      'item1\\:'},
00549                                     {'col2': '', 'id': 2, 'col1':
00550                                      'it\\:em1\\\\'},
00551                                     {'col2': 'asdf\\:', 'id': 3, 'col1':
00552                                      '\\:item3'},
00553                                     {'col2': '', 'id': 4, 'col1': 'asdf'}])
00554     db_conn.CleanUp()
00555 
00556     # test insert with colon inside value
00557     query = ("insert into test set col1='as:df';")
00558     result = db_conn.Execute(query, writethru)
00559     self.assertEqual(db_conn.data, [{'col2': 'item2', 'id': 1, 'col1':
00560                                      'item1\\:'},
00561                                     {'col2': '', 'id': 2, 'col1':
00562                                      'it\\:em1\\\\'},
00563                                     {'col2': 'asdf\\:', 'id': 3, 'col1':
00564                                      '\\:item3'},
00565                                     {'col2': '', 'id': 4, 'col1': 'as\:df'}])
00566     db_conn.CleanUp()
00567 
00568     # test insert with escaped colon inside value
00569     query = ("insert into test set col1='as\:df';")
00570     result = db_conn.Execute(query, writethru)
00571     self.assertEqual(db_conn.data, [{'col2': 'item2', 'id': 1, 'col1':
00572                                      'item1\\:'},
00573                                     {'col2': '', 'id': 2, 'col1':
00574                                      'it\\:em1\\\\'},
00575                                     {'col2': 'asdf\\:', 'id': 3, 'col1':
00576                                      '\\:item3'},
00577                                     {'col2': '', 'id': 4, 'col1': 'as\\\\\\:df'}])
00578     db_conn.CleanUp()
00579 
00580     # bad insert with non-null column not provided
00581     query = ("insert test ( col2) values ('asdf');")
00582     self.assertRaises(ExecuteError, db_conn.Execute, query, writethru)
00583     db_conn.CleanUp()
00584 
00585     # bad insert with auto column forced
00586     query = ("insert test (col1, id) values ('asdf', 4);")
00587     self.assertRaises(ExecuteError, db_conn.Execute, query, writethru)
00588     db_conn.CleanUp()
00589 
00590     # test update with null value
00591     query = ("update test set col2='' where id = 3;")
00592     result = db_conn.Execute(query, writethru)
00593     self.assertEqual(db_conn.data, [{'col2': 'item2', 'id': 1, 'col1':
00594                                      'item1\\:'},
00595                                     {'col2': '', 'id': 2, 'col1':
00596                                      'it\\:em1\\\\'},
00597                                     {'col2': '', 'id': 3, 'col1':
00598                                      '\\:item3'}])
00599     db_conn.CleanUp()
00600 
00601 
00602 if __name__ == '__main__':
00603   unittest.main()