No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_sqlwrapper_querystring.py 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. import os
  2. import logging
  3. import random
  4. from unittest import TestCase
  5. import unittest
  6. from Database.sqlwrapper import SqlWrapper
  7. from django.conf import settings
  8. from Database.sqlsettings import SQLSettings
  9. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Lodel.settings")
  10. #Bad strings for injection tests
  11. INJECTIONS = [ 'foo UNION SELECT 1,2,3,4--', "foo' UNION SELECT 1,2,3--", 'foo" UNION SELECT 1,2,3--', 'foo` UNION SELECT 1,2,3,4--', '--', 'foo`; SELECT 1,2,3', 'foo"; SELECT 1,2,3', "foo'; SELECT 1,2,3", "; SELECT 1,2,3" ]
  12. NAMEINJECT = INJECTIONS + [ '%', '*', "\0", "\b\b\b\b\b\b\b\b\b" ]
  13. #Valid SQL types
  14. VTYPES = [ 'integer', 'varchar(1)', 'varchar(50)', 'text', 'boolean' ]
  15. class SqlWrapperQueryStrTests(TestCase):
  16. def setUp(self):
  17. #creating a test table
  18. sw = SqlWrapper()
  19. self.ttn = 'testtable'
  20. self.cols = [
  21. { 'name': 'pk', 'type': 'INTEGER', 'extra': {'primarykey': True} },
  22. { 'name': 'testtxt', 'type': 'TEXT', 'extra': {'nullable': True, 'default': 'hello'} },
  23. { 'name': 'testchr', 'type': 'VARCHAR(50)', 'extra': {'nullable': True, 'default': 'hello world'} },
  24. { 'name': 'testbool', 'type': 'BOOLEAN', 'extra': {'nullable':False, 'default': False}},
  25. ]
  26. sw.create_table( { 'name': self.ttn, 'columns': self.cols} )
  27. #Disable logging but CRITICAL
  28. logging.basicConfig(level=logging.CRITICAL)
  29. pass
  30. def tearDown(self):
  31. sw = SqlWrapper()
  32. sw.drop_table(self.ttn)
  33. @unittest.skip('dev') #TODO remove skip
  34. def test_get_querystring(self):
  35. sw = SqlWrapper()
  36. actions = [ 'add_column', 'alter_column', 'drop_column' ]
  37. dialects = [ 'default', 'mysql', 'postgresql' ]
  38. for action in actions:
  39. for dialect in dialects:
  40. r = sw.get_querystring(action, dialect)
  41. self.assertIsInstance(r, str)
  42. @unittest.skip('dev') #TODO remove skip
  43. def test_get_querystring_badargs(self):
  44. sw = SqlWrapper()
  45. actions = [ 1, -1, print, [], 'foo']
  46. dialects = actions
  47. for action in actions:
  48. for dialect in dialects:
  49. with self.assertRaises(ValueError):
  50. r = sw.get_querystring(action, dialect)
  51. @unittest.skip('dev') #TODO remove skip
  52. def test_add_column(self):
  53. sw = SqlWrapper()
  54. colnames = [ 'taddcol1', 'test-add-col', 'test_add_col', '-test', '_add', '__col__' ]
  55. for i, name in enumerate(colnames):
  56. col = { 'name': name, 'type': VTYPES[i%len(VTYPES)] }
  57. self.assertTrue(sw.add_column(self.ttn, col))
  58. pass
  59. @unittest.skip('dev') #TODO remove skip
  60. def test_add_column_badargs(self):
  61. sw = SqlWrapper()
  62. coolname = 'cool'
  63. i=0
  64. self.assertFalse(sw.add_column(self.ttn, {'type': 'INTEGER'}))
  65. self.assertFalse(sw.add_column(self.ttn, {'name': 'foo'}))
  66. self.assertFalse(sw.add_column(self.ttn, dict()))
  67. self.assertFalse(sw.add_column(self.ttn, print))
  68. self.assertFalse(sw.add_column(self.ttn, ['foo', 'integer']))
  69. self.assertFalse(sw.add_column(self.ttn, None))
  70. self.assertFalse(sw.add_column(self.ttn, 42))
  71. self.assertFalse(sw.add_column(1, {'name':'foo', 'type':'integer'}))
  72. self.assertFalse(sw.add_column(print, {'name':'foo', 'type':'integer'}))
  73. self.assertFalse(sw.add_column([], {'name':'foo', 'type':'integer'}))
  74. self.assertFalse(sw.add_column(dict(), {'name':'foo', 'type':'integer'}))
  75. for badname in NAMEINJECT:
  76. self.assertFalse(sw.add_column(self.ttn, {'name':badname, 'type':'INTEGER'}))
  77. self.assertFalse(sw.add_column(self.ttn, {'name':coolname+str(i), 'type':badname}))
  78. self.assertFalse(sw.add_column(badname, {'name':coolname+str(i), 'type':'INTEGER'}))
  79. i+=1
  80. @unittest.skip('dev') #TODO remove skip
  81. def test_alter_column(self):
  82. sw = SqlWrapper()
  83. colnames = ['talter', 'talter1', 'test_alter', 'test-alter-col', '-test_alter', '__test_alter__']
  84. for i,name in enumerate(random.sample(colnames, len(colnames))):
  85. col = { 'name': name, 'type': VTYPES[i%len(VTYPES)] }
  86. self.assertTrue(sw.add_column( self.ttn, col))
  87. for i,name in enumerate(random.sample(colnames, len(colnames))):
  88. col = {'name': name, 'type': VTYPES[i%len(VTYPES)]}
  89. self.assertTrue(self.ttn, col)
  90. pass
  91. @unittest.skip('dev') #TODO remove skip
  92. def test_alter_column_badargs(self):
  93. sw = SqlWrapper()
  94. colnames = ['tabad', 'tabad1']
  95. for i,name in enumerate(colnames):
  96. col = { 'name': name, 'type': VTYPES[i%len(VTYPES)] }
  97. self.assertTrue(sw.add_column(self.ttn, col))
  98. for i,badname in enumerate(NAMEINJECT):
  99. col = { 'name': badname, 'type': VTYPES[i%len(VTYPES)] }
  100. self.assertFalse(sw.alter_column(self.ttn, col))
  101. col = { 'name': colnames[i%len(colnames)], 'type': badname}
  102. self.assertFalse(sw.alter_column(self.ttn, col))
  103. col = { 'name': badname, 'type': NAMEINJECT[random.randint(0,len(NAMEINJECT))]}
  104. self.assertFalse(sw.alter_column(self.ttn, col))
  105. col = { 'name': colnames[i%len(colnames)], 'type': VTYPES[i%len(VTYPES)] }
  106. self.assertFalse(sw.alter_column(badname, col))
  107. def test_insert(self):
  108. sw = SqlWrapper()
  109. records = [
  110. { 'pk': 0,
  111. 'testchr': 'Hello world !',
  112. 'testtext': 'Wow ! Super text... I\'m amazed',
  113. 'testbool': False
  114. },
  115. { 'pk': 1,
  116. 'testchr': 'Hello"world...--',
  117. 'testtext': 'Another wonderfull text. But this time with spécials chars@;,:--*/+\'{}]{[|~&ù^$*µ$£ê;<ç>\/*-+',
  118. 'testbool': True
  119. },
  120. { 'pk': 2 }, #default values for others
  121. { 'pk': '3',
  122. 'testchr': None,
  123. 'testtext': None,
  124. 'testbool': 'true'
  125. },
  126. { 'pk': 4,
  127. 'testchr': '',
  128. 'testtext': '',
  129. 'testbool': 'false'
  130. },
  131. { 'pk': 5,
  132. 'testbool': 0
  133. },
  134. { 'pk': 6,
  135. 'testbool': 1
  136. },
  137. { 'pk':1024,
  138. 'testbool': False
  139. },
  140. ]