dbtextdb_test.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603
  1. #!/usr/bin/python
  2. #
  3. # Copyright 2008 Google Inc. All Rights Reserved.
  4. """Test for dbtext_query."""
  5. __author__ = '[email protected] (Herman Sheremetyev)'
  6. import time
  7. import unittest
  8. from dbtextdb import *
  9. class DBTextTest(unittest.TestCase):
  10. def setUp(self):
  11. self.time_now = '%s' % int(time.time())
  12. self.time_now = self.time_now[0:-2] + '00'
  13. def testParseQuery(self):
  14. db_conn = DBText('./tests')
  15. # bad command
  16. query_bad_command = 'selecta * from table;'
  17. self.assertRaises(ParseError, db_conn.ParseQuery, query_bad_command)
  18. # normal query
  19. query_normal = 'select * from subscriber;'
  20. db_conn.ParseQuery(query_normal)
  21. self.assert_(db_conn.command == 'SELECT')
  22. self.assert_(db_conn.table == 'subscriber')
  23. self.assert_(db_conn.columns == ['*'])
  24. db_conn.CleanUp()
  25. # normal query with condition
  26. query_normal_cond = 'select * from subscriber where column="value";'
  27. db_conn.ParseQuery(query_normal_cond)
  28. self.assert_(db_conn.command == 'SELECT')
  29. self.assert_(db_conn.table == 'subscriber')
  30. self.assert_(db_conn.columns == ['*'])
  31. self.assert_(db_conn.strings == ['value'])
  32. self.assert_(not db_conn.count)
  33. self.assert_(db_conn.conditions == {'column': 'value'})
  34. db_conn.CleanUp()
  35. # normal query with multiple conditions
  36. query_normal_cond = ('select * from subscriber where column="value1" and '
  37. 'col2=" another value " and col3= foo and a="";')
  38. db_conn.ParseQuery(query_normal_cond)
  39. self.assert_(db_conn.command == 'SELECT')
  40. self.assert_(db_conn.table == 'subscriber')
  41. self.assert_(db_conn.columns == ['*'])
  42. self.assert_(db_conn.strings == ['value1', ' another value ', ''])
  43. self.assertEqual(db_conn.conditions, {'column': 'value1',
  44. 'col2': ' another value ',
  45. 'col3': 'foo', 'a': ''})
  46. db_conn.CleanUp()
  47. # normal query with count
  48. query_normal_count = 'select count(*) from subscriber;'
  49. db_conn.ParseQuery(query_normal_count)
  50. self.assert_(db_conn.command == 'SELECT')
  51. self.assert_(db_conn.table == 'subscriber')
  52. self.assert_(db_conn.columns == ['*'])
  53. self.assert_(db_conn.count == True)
  54. db_conn.CleanUp()
  55. # normal query with now()
  56. query_normal_count = 'select count(*) from subscriber where time=now();'
  57. db_conn.ParseQuery(query_normal_count)
  58. self.assert_(db_conn.command == 'SELECT')
  59. self.assert_(db_conn.table == 'subscriber')
  60. self.assert_(db_conn.columns == ['*'])
  61. self.assert_(db_conn.count == True)
  62. self.assertEqual(db_conn.conditions, {'time': self.time_now})
  63. db_conn.CleanUp()
  64. # normal delete query
  65. query_normal_delete = 'delete from subscriber where foo = 2;'
  66. db_conn.ParseQuery(query_normal_delete)
  67. self.assert_(db_conn.command == 'DELETE')
  68. self.assert_(db_conn.table == 'subscriber')
  69. self.assertEqual(db_conn.conditions, {'foo': '2'})
  70. db_conn.CleanUp()
  71. # normal insert values query with no into
  72. query_normal_insert_values = ('insert subscriber (col1, col2, col3) '
  73. 'values (1, "foo", "");')
  74. db_conn.ParseQuery(query_normal_insert_values)
  75. self.assert_(db_conn.command == 'INSERT')
  76. self.assert_(db_conn.table == 'subscriber')
  77. self.assertEqual(db_conn.targets, {'col1': '1', 'col2': 'foo', 'col3': ''})
  78. db_conn.CleanUp()
  79. # normal insert values query with into
  80. query_normal_insert_into_values = ('insert into subscriber (col1, col2) '
  81. 'values (1, "foo");')
  82. db_conn.ParseQuery(query_normal_insert_into_values)
  83. self.assert_(db_conn.command == 'INSERT')
  84. self.assert_(db_conn.table == 'subscriber')
  85. self.assertEqual(db_conn.targets, {'col1': '1', 'col2': 'foo'})
  86. db_conn.CleanUp()
  87. # normal insert values query with now()
  88. query_normal_insert_into_values = ('insert into subscriber (a, b, c) '
  89. 'values (NOW(), "foo", now());')
  90. db_conn.ParseQuery(query_normal_insert_into_values)
  91. self.assert_(db_conn.command == 'INSERT')
  92. self.assert_(db_conn.table == 'subscriber')
  93. self.assertEqual(db_conn.targets, {'a': self.time_now, 'b': 'foo',
  94. 'c': self.time_now})
  95. db_conn.CleanUp()
  96. # bad insert: missing table
  97. bad_insert_query_missing_table = ('insert into (col1, col2) '
  98. 'values (1, "foo");')
  99. self.assertRaises(ParseError, db_conn.ParseQuery,
  100. bad_insert_query_missing_table)
  101. db_conn.CleanUp()
  102. # bad insert: missing parens
  103. bad_insert_query_missing_parens = ('insert into test col1, col2 '
  104. 'values (1, "foo");')
  105. self.assertRaises(ParseError, db_conn.ParseQuery,
  106. bad_insert_query_missing_parens)
  107. db_conn.CleanUp()
  108. # bad insert: missing paren
  109. bad_insert_query_missing_paren = ('insert into test (col1, col2) '
  110. 'values 1, "foo");')
  111. self.assertRaises(ParseError, db_conn.ParseQuery,
  112. bad_insert_query_missing_paren)
  113. db_conn.CleanUp()
  114. # bad insert: missing quote
  115. bad_insert_query_missing_quote = ('insert into test (col1, col2) '
  116. '(values 1, "foo);')
  117. self.assertRaises(ParseError, db_conn.ParseQuery,
  118. bad_insert_query_missing_quote)
  119. db_conn.CleanUp()
  120. # bad insert: missing values
  121. bad_insert_query_missing_values = ('insert into test (col1, col2) '
  122. '( 1, "foo");')
  123. self.assertRaises(ParseError, db_conn.ParseQuery,
  124. bad_insert_query_missing_values)
  125. db_conn.CleanUp()
  126. # bad insert: mislplaced values
  127. bad_insert_query_misplaced_values = ('insert into test values (col1, col2) '
  128. '( 1, "foo");')
  129. self.assertRaises(ParseError, db_conn.ParseQuery,
  130. bad_insert_query_misplaced_values)
  131. db_conn.CleanUp()
  132. # bad insert: extra values
  133. bad_insert_query_extra_values = ('insert into test values (col1, col2) '
  134. ' values values ( 1, "foo");')
  135. self.assertRaises(ParseError, db_conn.ParseQuery,
  136. bad_insert_query_extra_values)
  137. db_conn.CleanUp()
  138. # bad insert: extra paren set
  139. bad_insert_query_extra_paren_set = ('insert into test values (col1, col2) '
  140. ' values ( 1, "foo")();')
  141. self.assertRaises(ParseError, db_conn.ParseQuery,
  142. bad_insert_query_extra_paren_set)
  143. db_conn.CleanUp()
  144. # bad insert: mismatched value pairs
  145. bad_insert_query_mismatched_vals = ('insert into test values (col1, col2) '
  146. ' values ("foo");')
  147. self.assertRaises(ParseError, db_conn.ParseQuery,
  148. bad_insert_query_mismatched_vals)
  149. db_conn.CleanUp()
  150. # normal insert set query with no into
  151. query_normal_insert_set = ('insert subscriber set col= 1, col2 ="\'f\'b";')
  152. db_conn.ParseQuery(query_normal_insert_set)
  153. self.assert_(db_conn.command == 'INSERT')
  154. self.assert_(db_conn.table == 'subscriber')
  155. self.assertEqual(db_conn.targets, {'col': '1', 'col2': '\'f\'b'})
  156. db_conn.CleanUp()
  157. # normal update
  158. query_normal_update = ('update subscriber set col1= 1, col2 ="foo";')
  159. db_conn.ParseQuery(query_normal_update)
  160. self.assert_(db_conn.command == 'UPDATE')
  161. self.assert_(db_conn.table == 'subscriber')
  162. self.assertEqual(db_conn.targets, {'col1': '1', 'col2': 'foo'})
  163. db_conn.CleanUp()
  164. # normal update with condition
  165. query_normal_update_cond = ('update subscriber set col1= 1, col2 ="foo" '
  166. 'where foo = "bar" and id=1 and a="";')
  167. db_conn.ParseQuery(query_normal_update_cond)
  168. self.assert_(db_conn.command == 'UPDATE')
  169. self.assert_(db_conn.table == 'subscriber')
  170. self.assertEqual(db_conn.targets, {'col1': '1', 'col2': 'foo'})
  171. self.assertEqual(db_conn.conditions, {'foo': 'bar', 'id': '1', 'a': ''})
  172. db_conn.CleanUp()
  173. # bad update: extra parens
  174. bad_update_query_extra_paren = ('update test set (col1 = "foo");')
  175. self.assertRaises(ParseError, db_conn.ParseQuery,
  176. bad_update_query_extra_paren)
  177. db_conn.CleanUp()
  178. # bad update: missing table
  179. bad_update_query_missing_table = ('update SET col1 = "foo";')
  180. self.assertRaises(ParseError, db_conn.ParseQuery,
  181. bad_update_query_missing_table)
  182. db_conn.CleanUp()
  183. # bad update: missing set
  184. bad_update_query_missing_set = ('update test sett col1 = "foo";')
  185. self.assertRaises(ParseError, db_conn.ParseQuery,
  186. bad_update_query_missing_set)
  187. db_conn.CleanUp()
  188. # bad update: missing val
  189. bad_update_query_missing_val = ('update test set col1 =;')
  190. self.assertRaises(ParseError, db_conn.ParseQuery,
  191. bad_update_query_missing_val)
  192. db_conn.CleanUp()
  193. # bad update: missing comma
  194. bad_update_query_missing_comma = ('update test set col1 = "foo" crap =5;')
  195. self.assertRaises(ParseError, db_conn.ParseQuery,
  196. bad_update_query_missing_comma)
  197. db_conn.CleanUp()
  198. # bad update: missing equal
  199. bad_update_query_missing_equal = ('update test set col1 = "foo", and 5;')
  200. self.assertRaises(ParseError, db_conn.ParseQuery,
  201. bad_update_query_missing_equal)
  202. db_conn.CleanUp()
  203. # bad update: missing col
  204. bad_update_query_missing_col = ('update test set col1 = "foo", = 5;')
  205. self.assertRaises(ParseError, db_conn.ParseQuery,
  206. bad_update_query_missing_col)
  207. db_conn.CleanUp()
  208. # bad update: double col
  209. bad_update_query_double_col = ('update test set col1 = "foo", and a = 5;')
  210. self.assertRaises(ParseError, db_conn.ParseQuery,
  211. bad_update_query_double_col)
  212. db_conn.CleanUp()
  213. # normal query with multiple columns
  214. query_normal_count = 'select col1, "col 2",col3 , "col4" from subscriber;'
  215. db_conn.ParseQuery(query_normal_count)
  216. self.assert_(db_conn.command == 'SELECT')
  217. self.assert_(db_conn.table == 'subscriber')
  218. self.assert_(db_conn.strings == ['col 2', 'col4'])
  219. self.assert_(db_conn.columns == ['col1', "'col 2'", 'col3', "'col4'"])
  220. db_conn.CleanUp()
  221. # normal query with ORDER BY
  222. query_normal_order_by = ('select col1, col2 from test'
  223. ' ORDER by col1;')
  224. db_conn.ParseQuery(query_normal_order_by)
  225. self.assert_(db_conn.command == 'SELECT')
  226. self.assert_(db_conn.table == 'test')
  227. self.assert_(db_conn.columns == ['col1', 'col2'])
  228. self.assert_(db_conn.order_by == 'col1')
  229. db_conn.CleanUp()
  230. # normal query with ORDER BY with conditions
  231. query_normal_order_by_cond = ('select col1, col2 from test where col="asdf"'
  232. ' and col2 = "foo" ORDER by col;')
  233. db_conn.ParseQuery(query_normal_order_by_cond)
  234. self.assert_(db_conn.command == 'SELECT')
  235. self.assert_(db_conn.table == 'test')
  236. self.assert_(db_conn.columns == ['col1', 'col2'])
  237. self.assert_(db_conn.conditions == {'col': 'asdf', 'col2': 'foo'})
  238. self.assert_(db_conn.order_by == 'col')
  239. db_conn.CleanUp()
  240. # normal query with CONCAT
  241. query_normal_concat = ('select concat(uname,"@", domain) as email_addr '
  242. 'from subscriber where id=3;')
  243. db_conn.ParseQuery(query_normal_concat)
  244. self.assert_(db_conn.command == 'SELECT')
  245. self.assert_(db_conn.table == 'subscriber')
  246. self.assert_(db_conn.columns == ['email_addr'])
  247. self.assert_(db_conn.conditions == {'id': '3'})
  248. self.assert_(db_conn.aliases == {'email_addr': ['uname', "'@'", 'domain']})
  249. db_conn.CleanUp()
  250. # normal query with multiple CONCAT
  251. query_normal_mult_concat = ('select concat(uname,"@", domain) as email,'
  252. ' foo as "bar" from table where id=3;')
  253. db_conn.ParseQuery(query_normal_mult_concat)
  254. self.assert_(db_conn.command == 'SELECT')
  255. self.assert_(db_conn.table == 'table')
  256. self.assert_(db_conn.columns == ['email', "'bar'"])
  257. self.assert_(db_conn.conditions == {'id': '3'})
  258. self.assert_(db_conn.aliases == {"'bar'": ['foo'],
  259. 'email': ['uname', "'@'", 'domain']})
  260. db_conn.CleanUp()
  261. # bad query with CONCAT missing AS
  262. bad_query_concat_no_as = ('select concat(col1,col2) from test'
  263. ' ORDER by col1 col2;')
  264. self.assertRaises(ParseError, db_conn.ParseQuery,
  265. bad_query_concat_no_as)
  266. db_conn.CleanUp()
  267. # bad query with CONCAT missing AS arg
  268. bad_query_concat_no_as_arg = ('select concat(col1,col2) as from test'
  269. ' ORDER by col1 col2;')
  270. self.assertRaises(ParseError, db_conn.ParseQuery,
  271. bad_query_concat_no_as_arg)
  272. db_conn.CleanUp()
  273. # bad query with CONCAT missing paren
  274. bad_query_concat_no_paren = ('select concat(col1,col2 as foo from test'
  275. ' ORDER by col1 col2;')
  276. self.assertRaises(ParseError, db_conn.ParseQuery,
  277. bad_query_concat_no_paren)
  278. db_conn.CleanUp()
  279. # bad query with ORDER BY multiple columns
  280. bad_query_mult_order_by = ('select col1, col2 from test'
  281. ' ORDER by col1 col2;')
  282. self.assertRaises(ParseError, db_conn.ParseQuery,
  283. bad_query_mult_order_by)
  284. db_conn.CleanUp()
  285. # bad select query: missing FROM
  286. bad_query_missing_from = 'select * subscriber;'
  287. self.assertRaises(ParseError, db_conn.ParseQuery,
  288. bad_query_missing_from)
  289. db_conn.CleanUp()
  290. # bad select query: missing comma in columns
  291. bad_query_missing_comma = 'select col1 col2 col3 from subscriber;'
  292. self.assertRaises(ParseError, db_conn.ParseQuery,
  293. bad_query_missing_comma)
  294. db_conn.CleanUp()
  295. # bad select query: extra comma in columns
  296. bad_query_extra_comma = 'select col1,col2, from subscriber;'
  297. self.assertRaises(ParseError, db_conn.ParseQuery,
  298. bad_query_extra_comma)
  299. db_conn.CleanUp()
  300. bad_query_extra_comma = 'select col1,,col2 from subscriber;'
  301. self.assertRaises(ParseError, db_conn.ParseQuery,
  302. bad_query_extra_comma)
  303. db_conn.CleanUp()
  304. bad_query_extra_comma = 'select ,col1,col2 from subscriber;'
  305. self.assertRaises(ParseError, db_conn.ParseQuery,
  306. bad_query_extra_comma)
  307. db_conn.CleanUp()
  308. # bad conditions: missing AND
  309. bad_query_missing_and = ('select * from subscriber where column = asdf '
  310. ' something=missing_and;')
  311. self.assertRaises(ParseError, db_conn.ParseQuery,
  312. bad_query_missing_and)
  313. db_conn.CleanUp()
  314. # bad conditions: missing value
  315. bad_query_missing_value = ('select * from subscriber where column = asdf'
  316. ' and something=;')
  317. self.assertRaises(ParseError, db_conn.ParseQuery,
  318. bad_query_missing_value)
  319. db_conn.CleanUp()
  320. # bad query: unterminated string
  321. bad_query_unterm_str = ('select * from test where column ="asdf;')
  322. self.assertRaises(ParseError, db_conn.ParseQuery,
  323. bad_query_unterm_str)
  324. db_conn.CleanUp()
  325. # bad select query: missing table
  326. bad_select_query_missing_table = ('select * from where column ="asdf";')
  327. self.assertRaises(ParseError, db_conn.ParseQuery,
  328. bad_select_query_missing_table)
  329. db_conn.CleanUp()
  330. def testOpenTable(self):
  331. # check that header is retrieved and parsed correctly
  332. query = ('select * from test;')
  333. db_conn = DBText('./tests')
  334. db_conn.ParseQuery(query)
  335. db_conn.OpenTable()
  336. self.assertEqual(db_conn.header, {'col2': {'auto': False, 'null': True,
  337. 'type': 'string', 'pos': 2},
  338. 'id': {'auto': True, 'null': False,
  339. 'type': 'int', 'pos': 1},
  340. 'col1': {'auto': False, 'null': False,
  341. 'type': 'string', 'pos': 0}})
  342. # check that data is retrieved and parsed correctly
  343. query = ('select * from test;')
  344. db_conn = DBText('./tests')
  345. db_conn.ParseQuery(query)
  346. db_conn.OpenTable()
  347. self.assertEqual(db_conn.data,
  348. [{'col1': 'item1\\:', 'id': 1, 'col2': 'item2'},
  349. {'col1': 'it\\:em1\\\\', 'id': 2, 'col2': ''},
  350. {'col1': '\\:item3', 'id': 3, 'col2': 'asdf\\:'}])
  351. # missing table
  352. query = ('select * from non_existent_table;')
  353. db_conn = DBText('./tests')
  354. db_conn.ParseQuery(query)
  355. self.assertRaises(ExecuteError, db_conn.OpenTable)
  356. # type string value in type int column
  357. query = ('select * from bad_table_wrong_type;')
  358. db_conn = DBText('./tests')
  359. db_conn.ParseQuery(query)
  360. self.assertRaises(ExecuteError, db_conn.OpenTable)
  361. # row has fewer fields than header
  362. query = ('select * from bad_table_short_row;')
  363. db_conn = DBText('./tests')
  364. db_conn.ParseQuery(query)
  365. self.assertRaises(ExecuteError, db_conn.OpenTable)
  366. # row has more fields than header
  367. query = ('select * from bad_table_long_row;')
  368. db_conn = DBText('./tests')
  369. db_conn.ParseQuery(query)
  370. self.assertRaises(ExecuteError, db_conn.OpenTable)
  371. # value mismatch: non-null column is null
  372. query = ('select * from bad_table_null;')
  373. db_conn = DBText('./tests')
  374. db_conn.ParseQuery(query)
  375. self.assertRaises(ExecuteError, db_conn.OpenTable)
  376. # value mismatch: int column is string
  377. query = ('select * from bad_table_int;')
  378. db_conn = DBText('./tests')
  379. db_conn.ParseQuery(query)
  380. self.assertRaises(ExecuteError, db_conn.OpenTable)
  381. def testExecute(self):
  382. db_conn = DBText('./tests')
  383. writethru = False
  384. # test count
  385. query = ("select count(*) from subscriber where username='monitor' and"
  386. " domain='test.com';")
  387. result = db_conn.Execute(query, writethru)
  388. self.assertEqual(result, [2])
  389. db_conn.CleanUp()
  390. query = ('select count(*) from subscriber where '
  391. "username='test2';")
  392. result = db_conn.Execute(query, writethru)
  393. self.assertEqual(result, [1])
  394. db_conn.CleanUp()
  395. query = ('select count(*) from subscriber where '
  396. "username='test1';")
  397. result = db_conn.Execute(query, writethru)
  398. self.assertEqual(result, [3])
  399. db_conn.CleanUp()
  400. # test concat
  401. query = ("select concat(username, '@', domain) as email_addr from "
  402. 'subscriber where id = 3;')
  403. result = db_conn.Execute(query, writethru)
  404. self.assertEqual(result, [['[email protected]']])
  405. db_conn.CleanUp()
  406. # test select
  407. query = ("select * from subscriber where username='test2' and"
  408. " domain='test.com';")
  409. expected_result = [[3, 'test2', 'test.com', 'password', '', '',
  410. '[email protected]', 1202336327,
  411. '9fe9bfa1315b8202838838c3807a0a32',
  412. 'fac1f260ebda200719de4aa29880ee05', '', '']]
  413. result = db_conn.Execute(query, writethru)
  414. self.assertEqual(result, expected_result)
  415. db_conn.CleanUp()
  416. query = ('select * from subscriber where id = 3;')
  417. expected_result = [[3, 'test2', 'test.com', 'password', '', '',
  418. '[email protected]', 1202336327,
  419. '9fe9bfa1315b8202838838c3807a0a32',
  420. 'fac1f260ebda200719de4aa29880ee05', '', '']]
  421. result = db_conn.Execute(query, writethru)
  422. self.assertEqual(result, expected_result)
  423. db_conn.CleanUp()
  424. # test order by
  425. query = ('select * from test order by non_existent_column;')
  426. self.assertRaises(ExecuteError, db_conn.Execute, query, writethru)
  427. db_conn.CleanUp()
  428. query = ('select * from unsorted_table order by id;')
  429. result = db_conn.Execute(query, writethru)
  430. self.assertEqual(result, [[1, 'fred', 'test.com', 2125551234],
  431. [2, 'james', 'test4.com', 2125551231],
  432. [3, 'mike', 'test2.com', 2125551239],
  433. [4, 'alex', 'test1.com', 2125551237],
  434. [5, 'john', 'test.com', 2125551240]])
  435. db_conn.CleanUp()
  436. query = ('select * from unsorted_table order by user;')
  437. result = db_conn.Execute(query, writethru)
  438. self.assertEqual(result, [[4, 'alex', 'test1.com', 2125551237],
  439. [1, 'fred', 'test.com', 2125551234],
  440. [2, 'james', 'test4.com', 2125551231],
  441. [5, 'john', 'test.com', 2125551240],
  442. [3, 'mike', 'test2.com', 2125551239]])
  443. db_conn.CleanUp()
  444. query = ('select * from unsorted_table order by domain;')
  445. result = db_conn.Execute(query, writethru)
  446. self.assertEqual(result, [[1, 'fred', 'test.com', 2125551234],
  447. [5, 'john', 'test.com', 2125551240],
  448. [4, 'alex', 'test1.com', 2125551237],
  449. [3, 'mike', 'test2.com', 2125551239],
  450. [2, 'james', 'test4.com', 2125551231]])
  451. db_conn.CleanUp()
  452. query = ('select * from unsorted_table order by number;')
  453. result = db_conn.Execute(query, writethru)
  454. self.assertEqual(result, [[2, 'james', 'test4.com', 2125551231],
  455. [1, 'fred', 'test.com', 2125551234],
  456. [4, 'alex', 'test1.com', 2125551237],
  457. [3, 'mike', 'test2.com', 2125551239],
  458. [5, 'john', 'test.com', 2125551240]])
  459. db_conn.CleanUp()
  460. # test delete
  461. query = ('delete from unsorted_table where id = 3;')
  462. result = db_conn.Execute(query, writethru)
  463. self.assertEqual(result, [1])
  464. self.assertEqual(db_conn.data, [{'id': 1, 'user': 'fred', 'domain':
  465. 'test.com', 'number': 2125551234},
  466. {'id': 4, 'user': 'alex', 'domain':
  467. 'test1.com', 'number': 2125551237},
  468. {'id': 2, 'user': 'james', 'domain':
  469. 'test4.com', 'number': 2125551231},
  470. {'id': 5, 'user': 'john', 'domain':
  471. 'test.com', 'number': 2125551240}])
  472. db_conn.CleanUp()
  473. query = ('delete from unsorted_table where id = 5;')
  474. result = db_conn.Execute(query, writethru)
  475. self.assertEqual(db_conn.data, [{'id': 1, 'user': 'fred', 'domain':
  476. 'test.com', 'number': 2125551234},
  477. {'id': 4, 'user': 'alex', 'domain':
  478. 'test1.com', 'number': 2125551237},
  479. {'id': 2, 'user': 'james', 'domain':
  480. 'test4.com', 'number': 2125551231},
  481. {'id': 3, 'user': 'mike', 'domain':
  482. 'test2.com', 'number': 2125551239}])
  483. db_conn.CleanUp()
  484. # test insert with auto increment
  485. query = ("insert into unsorted_table set user='jake', domain='test.com',"
  486. 'number = 2125551456;')
  487. result = db_conn.Execute(query, writethru)
  488. self.assertEqual(db_conn.data, [{'id': 1, 'user': 'fred', 'domain':
  489. 'test.com', 'number': 2125551234},
  490. {'id': 4, 'user': 'alex', 'domain':
  491. 'test1.com', 'number': 2125551237},
  492. {'id': 2, 'user': 'james', 'domain':
  493. 'test4.com', 'number': 2125551231},
  494. {'id': 3, 'user': 'mike', 'domain':
  495. 'test2.com', 'number': 2125551239},
  496. {'id': 5, 'user': 'john', 'domain':
  497. 'test.com', 'number': 2125551240},
  498. {'id': 6, 'user': 'jake', 'domain':
  499. 'test.com', 'number': 2125551456}])
  500. db_conn.CleanUp()
  501. # test insert with null value
  502. query = ("insert into test set col1='asdf';")
  503. result = db_conn.Execute(query, writethru)
  504. self.assertEqual(db_conn.data, [{'col2': 'item2', 'id': 1, 'col1':
  505. 'item1\\:'},
  506. {'col2': '', 'id': 2, 'col1':
  507. 'it\\:em1\\\\'},
  508. {'col2': 'asdf\\:', 'id': 3, 'col1':
  509. '\\:item3'},
  510. {'col2': '', 'id': 4, 'col1': 'asdf'}])
  511. db_conn.CleanUp()
  512. # test insert with null value alternate syntax
  513. query = ("insert test ( col1) values ('asdf');")
  514. result = db_conn.Execute(query, writethru)
  515. self.assertEqual(db_conn.data, [{'col2': 'item2', 'id': 1, 'col1':
  516. 'item1\\:'},
  517. {'col2': '', 'id': 2, 'col1':
  518. 'it\\:em1\\\\'},
  519. {'col2': 'asdf\\:', 'id': 3, 'col1':
  520. '\\:item3'},
  521. {'col2': '', 'id': 4, 'col1': 'asdf'}])
  522. db_conn.CleanUp()
  523. # test insert with colon inside value
  524. query = ("insert into test set col1='as:df';")
  525. result = db_conn.Execute(query, writethru)
  526. self.assertEqual(db_conn.data, [{'col2': 'item2', 'id': 1, 'col1':
  527. 'item1\\:'},
  528. {'col2': '', 'id': 2, 'col1':
  529. 'it\\:em1\\\\'},
  530. {'col2': 'asdf\\:', 'id': 3, 'col1':
  531. '\\:item3'},
  532. {'col2': '', 'id': 4, 'col1': 'as\:df'}])
  533. db_conn.CleanUp()
  534. # test insert with escaped colon inside value
  535. query = ("insert into test set col1='as\:df';")
  536. result = db_conn.Execute(query, writethru)
  537. self.assertEqual(db_conn.data, [{'col2': 'item2', 'id': 1, 'col1':
  538. 'item1\\:'},
  539. {'col2': '', 'id': 2, 'col1':
  540. 'it\\:em1\\\\'},
  541. {'col2': 'asdf\\:', 'id': 3, 'col1':
  542. '\\:item3'},
  543. {'col2': '', 'id': 4, 'col1': 'as\\\\\\:df'}])
  544. db_conn.CleanUp()
  545. # bad insert with non-null column not provided
  546. query = ("insert test ( col2) values ('asdf');")
  547. self.assertRaises(ExecuteError, db_conn.Execute, query, writethru)
  548. db_conn.CleanUp()
  549. # bad insert with auto column forced
  550. query = ("insert test (col1, id) values ('asdf', 4);")
  551. self.assertRaises(ExecuteError, db_conn.Execute, query, writethru)
  552. db_conn.CleanUp()
  553. # test update with null value
  554. query = ("update test set col2='' where id = 3;")
  555. result = db_conn.Execute(query, writethru)
  556. self.assertEqual(db_conn.data, [{'col2': 'item2', 'id': 1, 'col1':
  557. 'item1\\:'},
  558. {'col2': '', 'id': 2, 'col1':
  559. 'it\\:em1\\\\'},
  560. {'col2': '', 'id': 3, 'col1':
  561. '\\:item3'}])
  562. db_conn.CleanUp()
  563. if __name__ == '__main__':
  564. unittest.main()