|
7 | 7 | create_view, |
8 | 8 | refresh_materialized_view |
9 | 9 | ) |
| 10 | +from sqlalchemy_utils.view import CreateView |
10 | 11 | from sqlalchemy_utils.compat import _select_args |
11 | 12 |
|
12 | 13 |
|
@@ -121,16 +122,18 @@ def life_cycle( |
121 | 122 | engine, |
122 | 123 | metadata, |
123 | 124 | column, |
124 | | - cascade_on_drop |
| 125 | + cascade_on_drop, |
| 126 | + replace=False, |
125 | 127 | ): |
126 | 128 | __table__ = create_view( |
127 | 129 | name='trivial_view', |
128 | 130 | selectable=sa.select(*_select_args(column)), |
129 | 131 | metadata=metadata, |
130 | | - cascade_on_drop=cascade_on_drop |
| 132 | + cascade_on_drop=cascade_on_drop, |
| 133 | + replace=replace, |
131 | 134 | ) |
132 | | - __table__.create(engine) |
133 | | - __table__.drop(engine) |
| 135 | + metadata.create_all(engine) |
| 136 | + metadata.drop_all(engine) |
134 | 137 |
|
135 | 138 |
|
136 | 139 | class SupportsCascade(TrivialViewTestCases): |
@@ -164,13 +167,67 @@ def test_life_cycle_no_cascade( |
164 | 167 | self.life_cycle(engine, Base.metadata, User.id, cascade_on_drop=False) |
165 | 168 |
|
166 | 169 |
|
| 170 | +class SupportsReplace(TrivialViewTestCases): |
| 171 | + def test_life_cycle_replace( |
| 172 | + self, |
| 173 | + connection, |
| 174 | + engine, |
| 175 | + Base, |
| 176 | + User |
| 177 | + ): |
| 178 | + self.life_cycle( |
| 179 | + engine, |
| 180 | + Base.metadata, |
| 181 | + User.id, |
| 182 | + cascade_on_drop=False, |
| 183 | + replace=True, |
| 184 | + ) |
| 185 | + |
| 186 | + def test_life_cycle_replace_existing( |
| 187 | + self, |
| 188 | + connection, |
| 189 | + engine, |
| 190 | + Base, |
| 191 | + User |
| 192 | + ): |
| 193 | + __table__ = create_view( |
| 194 | + name='trivial_view', |
| 195 | + selectable=sa.select(*_select_args(User.id)), |
| 196 | + metadata=Base.metadata, |
| 197 | + ) |
| 198 | + Base.metadata.create_all(engine) |
| 199 | + view = CreateView( |
| 200 | + name='trivial_view', |
| 201 | + selectable=sa.select(*_select_args(User.id)), |
| 202 | + replace=True, |
| 203 | + ) |
| 204 | + connection.execute(view) |
| 205 | + connection.commit() |
| 206 | + Base.metadata.drop_all(engine) |
| 207 | + |
| 208 | + def test_replace_materialized( |
| 209 | + self, |
| 210 | + connection, |
| 211 | + engine, |
| 212 | + Base, |
| 213 | + User |
| 214 | + ): |
| 215 | + with pytest.raises(ValueError): |
| 216 | + CreateView( |
| 217 | + name='trivial_view', |
| 218 | + selectable=sa.select(*_select_args(User.id)), |
| 219 | + materialized=True, |
| 220 | + replace=True, |
| 221 | + ) |
| 222 | + |
| 223 | + |
167 | 224 | @pytest.mark.usefixtures('postgresql_dsn') |
168 | | -class TestPostgresTrivialView(SupportsCascade, SupportsNoCascade): |
| 225 | +class TestPostgresTrivialView(SupportsCascade, SupportsNoCascade, SupportsReplace): |
169 | 226 | pass |
170 | 227 |
|
171 | 228 |
|
172 | 229 | @pytest.mark.usefixtures('mysql_dsn') |
173 | | -class TestMySqlTrivialView(SupportsCascade, SupportsNoCascade): |
| 230 | +class TestMySqlTrivialView(SupportsCascade, SupportsNoCascade, SupportsReplace): |
174 | 231 | pass |
175 | 232 |
|
176 | 233 |
|
|
0 commit comments