| 1 | #-*- coding: ISO-8859-1 -*-
|
|---|
| 2 | # pysqlite2/test/hooks.py: tests for various SQLite-specific hooks
|
|---|
| 3 | #
|
|---|
| 4 | # Copyright (C) 2006 Gerhard Häring <[email protected]>
|
|---|
| 5 | #
|
|---|
| 6 | # This file is part of pysqlite.
|
|---|
| 7 | #
|
|---|
| 8 | # This software is provided 'as-is', without any express or implied
|
|---|
| 9 | # warranty. In no event will the authors be held liable for any damages
|
|---|
| 10 | # arising from the use of this software.
|
|---|
| 11 | #
|
|---|
| 12 | # Permission is granted to anyone to use this software for any purpose,
|
|---|
| 13 | # including commercial applications, and to alter it and redistribute it
|
|---|
| 14 | # freely, subject to the following restrictions:
|
|---|
| 15 | #
|
|---|
| 16 | # 1. The origin of this software must not be misrepresented; you must not
|
|---|
| 17 | # claim that you wrote the original software. If you use this software
|
|---|
| 18 | # in a product, an acknowledgment in the product documentation would be
|
|---|
| 19 | # appreciated but is not required.
|
|---|
| 20 | # 2. Altered source versions must be plainly marked as such, and must not be
|
|---|
| 21 | # misrepresented as being the original software.
|
|---|
| 22 | # 3. This notice may not be removed or altered from any source distribution.
|
|---|
| 23 |
|
|---|
| 24 | import os, unittest
|
|---|
| 25 | import sqlite3 as sqlite
|
|---|
| 26 |
|
|---|
| 27 | class CollationTests(unittest.TestCase):
|
|---|
| 28 | def setUp(self):
|
|---|
| 29 | pass
|
|---|
| 30 |
|
|---|
| 31 | def tearDown(self):
|
|---|
| 32 | pass
|
|---|
| 33 |
|
|---|
| 34 | def CheckCreateCollationNotCallable(self):
|
|---|
| 35 | con = sqlite.connect(":memory:")
|
|---|
| 36 | try:
|
|---|
| 37 | con.create_collation("X", 42)
|
|---|
| 38 | self.fail("should have raised a TypeError")
|
|---|
| 39 | except TypeError, e:
|
|---|
| 40 | self.failUnlessEqual(e.args[0], "parameter must be callable")
|
|---|
| 41 |
|
|---|
| 42 | def CheckCreateCollationNotAscii(self):
|
|---|
| 43 | con = sqlite.connect(":memory:")
|
|---|
| 44 | try:
|
|---|
| 45 | con.create_collation("collä", cmp)
|
|---|
| 46 | self.fail("should have raised a ProgrammingError")
|
|---|
| 47 | except sqlite.ProgrammingError, e:
|
|---|
| 48 | pass
|
|---|
| 49 |
|
|---|
| 50 | def CheckCollationIsUsed(self):
|
|---|
| 51 | if sqlite.version_info < (3, 2, 1): # old SQLite versions crash on this test
|
|---|
| 52 | return
|
|---|
| 53 | def mycoll(x, y):
|
|---|
| 54 | # reverse order
|
|---|
| 55 | return -cmp(x, y)
|
|---|
| 56 |
|
|---|
| 57 | con = sqlite.connect(":memory:")
|
|---|
| 58 | con.create_collation("mycoll", mycoll)
|
|---|
| 59 | sql = """
|
|---|
| 60 | select x from (
|
|---|
| 61 | select 'a' as x
|
|---|
| 62 | union
|
|---|
| 63 | select 'b' as x
|
|---|
| 64 | union
|
|---|
| 65 | select 'c' as x
|
|---|
| 66 | ) order by x collate mycoll
|
|---|
| 67 | """
|
|---|
| 68 | result = con.execute(sql).fetchall()
|
|---|
| 69 | if result[0][0] != "c" or result[1][0] != "b" or result[2][0] != "a":
|
|---|
| 70 | self.fail("the expected order was not returned")
|
|---|
| 71 |
|
|---|
| 72 | con.create_collation("mycoll", None)
|
|---|
| 73 | try:
|
|---|
| 74 | result = con.execute(sql).fetchall()
|
|---|
| 75 | self.fail("should have raised an OperationalError")
|
|---|
| 76 | except sqlite.OperationalError, e:
|
|---|
| 77 | self.failUnlessEqual(e.args[0].lower(), "no such collation sequence: mycoll")
|
|---|
| 78 |
|
|---|
| 79 | def CheckCollationRegisterTwice(self):
|
|---|
| 80 | """
|
|---|
| 81 | Register two different collation functions under the same name.
|
|---|
| 82 | Verify that the last one is actually used.
|
|---|
| 83 | """
|
|---|
| 84 | con = sqlite.connect(":memory:")
|
|---|
| 85 | con.create_collation("mycoll", cmp)
|
|---|
| 86 | con.create_collation("mycoll", lambda x, y: -cmp(x, y))
|
|---|
| 87 | result = con.execute("""
|
|---|
| 88 | select x from (select 'a' as x union select 'b' as x) order by x collate mycoll
|
|---|
| 89 | """).fetchall()
|
|---|
| 90 | if result[0][0] != 'b' or result[1][0] != 'a':
|
|---|
| 91 | self.fail("wrong collation function is used")
|
|---|
| 92 |
|
|---|
| 93 | def CheckDeregisterCollation(self):
|
|---|
| 94 | """
|
|---|
| 95 | Register a collation, then deregister it. Make sure an error is raised if we try
|
|---|
| 96 | to use it.
|
|---|
| 97 | """
|
|---|
| 98 | con = sqlite.connect(":memory:")
|
|---|
| 99 | con.create_collation("mycoll", cmp)
|
|---|
| 100 | con.create_collation("mycoll", None)
|
|---|
| 101 | try:
|
|---|
| 102 | con.execute("select 'a' as x union select 'b' as x order by x collate mycoll")
|
|---|
| 103 | self.fail("should have raised an OperationalError")
|
|---|
| 104 | except sqlite.OperationalError, e:
|
|---|
| 105 | if not e.args[0].startswith("no such collation sequence"):
|
|---|
| 106 | self.fail("wrong OperationalError raised")
|
|---|
| 107 |
|
|---|
| 108 | def suite():
|
|---|
| 109 | collation_suite = unittest.makeSuite(CollationTests, "Check")
|
|---|
| 110 | return unittest.TestSuite((collation_suite,))
|
|---|
| 111 |
|
|---|
| 112 | def test():
|
|---|
| 113 | runner = unittest.TextTestRunner()
|
|---|
| 114 | runner.run(suite())
|
|---|
| 115 |
|
|---|
| 116 | if __name__ == "__main__":
|
|---|
| 117 | test()
|
|---|