diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2022-12-22 18:41:20 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2022-12-23 12:16:50 -0500 |
commit | 26f8752a6c34c849221fa3c8c686ff67cd68e328 (patch) | |
tree | dfe464c0c0a1d52b5dd8f873d30c96e83317a32b /tests | |
parent | 4678d7f1da009689449a6550768139c32b50c646 (diff) | |
download | alembic-26f8752a6c34c849221fa3c8c686ff67cd68e328.tar.gz |
dont use repr to quote string in compare_server_default
Fixed issue where server default compare would not work for string defaults
that contained backslashes, due to mis-rendering of these values when
comparing their contents.
The server default comparison still has a lot of not-robust behaviors,
however at least get in place a parameterized test suite so that we
can add new scenarios quickly.
Made a slight adjustment to SQLite's compare server default implementation
to better handle defaults with or without parens around them, from both
the reflected and the local metadata side.
Implemented basic server default comparison for the Oracle backend;
previously, Oracle's formatting of reflected defaults prevented any
matches from occurring.
Change-Id: If5a69eec4b22d243a564d2c89e78ae33ba5be88f
Fixes: #1145
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test_autogen_diffs.py | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/tests/test_autogen_diffs.py b/tests/test_autogen_diffs.py index 86b2460..88806ff 100644 --- a/tests/test_autogen_diffs.py +++ b/tests/test_autogen_diffs.py @@ -862,6 +862,79 @@ class CompareTypeSpecificityTest(TestBase): ) +class CompareServerDefaultTest(TestBase): + __backend__ = True + + @testing.fixture() + def connection(self): + with config.db.begin() as conn: + yield conn + + @testing.fixture() + def metadata(self, connection): + m = MetaData() + yield m + m.drop_all(connection) + + @testing.combinations( + (VARCHAR(30), text("'some default'"), text("'some new default'")), + (VARCHAR(30), "some default", "some new default"), + (VARCHAR(30), text("'//slash'"), text("'s//l//ash'")), + (Integer(), text("15"), text("20")), + (Integer(), "15", "20"), + id_="sss", + argnames="type_,default_text,new_default_text", + ) + def test_server_default_yes_positives( + self, type_, default_text, new_default_text, connection, metadata + ): + t1 = Table( + "t1", metadata, Column("x", type_, server_default=default_text) + ) + t1.create(connection) + + new_metadata = MetaData() + Table( + "t1", + new_metadata, + Column("x", type_, server_default=new_default_text), + ) + + mc = MigrationContext.configure( + connection, opts={"compare_server_default": True} + ) + + diff = api.compare_metadata(mc, new_metadata) + eq_(len(diff), 1) + eq_(diff[0][0][0], "modify_default") + + @testing.combinations( + (VARCHAR(30), text("'some default'")), + (VARCHAR(30), "some default"), + (VARCHAR(30), text("'//slash'")), + (VARCHAR(30), text("'has '' quote'")), + (Integer(), text("15")), + (Integer(), "15"), + id_="ss", + argnames="type_,default_text", + ) + def test_server_default_no_false_positives( + self, type_, default_text, connection, metadata + ): + t1 = Table( + "t1", metadata, Column("x", type_, server_default=default_text) + ) + t1.create(connection) + + mc = MigrationContext.configure( + connection, opts={"compare_server_default": True} + ) + + diff = api.compare_metadata(mc, metadata) + + assert not diff + + class CompareMetadataToInspectorTest(TestBase): __backend__ = True |