]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Improve tests for opening Sqlite by URI (GH-93047)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Sat, 21 May 2022 15:05:13 +0000 (08:05 -0700)
committerGitHub <noreply@github.com>
Sat, 21 May 2022 15:05:13 +0000 (08:05 -0700)
* Test with with escaped non-ascii characters
* Test read-only open of existing DB.
(cherry picked from commit 4e2b66489289cfd4db2a02edf173ac03cbb2fffe)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Lib/test/test_sqlite3/test_dbapi.py

index 2949e13e3566741d6d5705a6f48b0cb652dae03e..07adbc878a8f0905b16e229ca27d3313257ff7ab 100644 (file)
@@ -670,21 +670,58 @@ class OpenTests(unittest.TestCase):
     @unittest.skipIf(sys.platform == "darwin", "skipped on macOS")
     @unittest.skipUnless(TESTFN_UNDECODABLE, "only works if there are undecodable paths")
     def test_open_with_undecodable_path(self):
-        self.addCleanup(unlink, TESTFN_UNDECODABLE)
         path = TESTFN_UNDECODABLE
-        with managed_connect(path) as cx:
+        self.addCleanup(unlink, path)
+        with managed_connect(path, in_mem=True) as cx:
             self.assertTrue(os.path.exists(path))
             cx.execute(self._sql)
 
     def test_open_uri(self):
-        with managed_connect(TESTFN) as cx:
+        path = TESTFN
+        uri = "file:" + urllib.parse.quote(os.fsencode(path))
+        self.assertFalse(os.path.exists(path))
+        with managed_connect(uri, uri=True) as cx:
+            self.assertTrue(os.path.exists(path))
             cx.execute(self._sql)
-        with managed_connect(f"file:{TESTFN}", uri=True) as cx:
+
+    def test_open_unquoted_uri(self):
+        path = TESTFN
+        uri = "file:" + path
+        self.assertFalse(os.path.exists(path))
+        with managed_connect(uri, uri=True) as cx:
+            self.assertTrue(os.path.exists(path))
             cx.execute(self._sql)
+
+    def test_open_uri_readonly(self):
+        path = TESTFN
+        self.addCleanup(unlink, path)
+        uri = "file:" + urllib.parse.quote(os.fsencode(path)) + "?mode=ro"
+        self.assertFalse(os.path.exists(path))
+        # Cannot create new DB
         with self.assertRaises(sqlite.OperationalError):
-            with managed_connect(f"file:{TESTFN}?mode=ro", uri=True) as cx:
+            sqlite.connect(uri, uri=True)
+        self.assertFalse(os.path.exists(path))
+        sqlite.connect(path).close()
+        self.assertTrue(os.path.exists(path))
+        # Cannot modify new DB
+        with managed_connect(uri, uri=True) as cx:
+            with self.assertRaises(sqlite.OperationalError):
                 cx.execute(self._sql)
 
+    @unittest.skipIf(sys.platform == "win32", "skipped on Windows")
+    @unittest.skipIf(sys.platform == "darwin", "skipped on macOS")
+    @unittest.skipUnless(TESTFN_UNDECODABLE, "only works if there are undecodable paths")
+    def test_open_undecodable_uri(self):
+        path = TESTFN_UNDECODABLE
+        uri = "file:" + urllib.parse.quote(path)
+        self.assertFalse(os.path.exists(path))
+        try:
+            with managed_connect(uri, uri=True, in_mem=True) as cx:
+                self.assertTrue(os.path.exists(path))
+                cx.execute(self._sql)
+        finally:
+            unlink(path)
+
     def test_factory_database_arg(self):
         def factory(database, *args, **kwargs):
             nonlocal database_arg