|
10 | 10 | from google.cloud import bigquery
|
11 | 11 | from google.cloud.bigquery.dataset import DatasetListItem
|
12 | 12 | from google.cloud.bigquery.table import TableListItem
|
| 13 | +import packaging.version |
13 | 14 | import pytest
|
14 | 15 | import sqlalchemy
|
15 | 16 |
|
@@ -178,3 +179,53 @@ def test_follow_dialect_attribute_convention():
|
178 | 179 |
|
179 | 180 | assert sqlalchemy_bigquery.dialect is sqlalchemy_bigquery.BigQueryDialect
|
180 | 181 | assert sqlalchemy_bigquery.base.dialect is sqlalchemy_bigquery.BigQueryDialect
|
| 182 | + |
| 183 | + |
| 184 | +@pytest.mark.parametrize( |
| 185 | + "args,kw,error", |
| 186 | + [ |
| 187 | + ((), {}, "The unnest function requires a single argument."), |
| 188 | + ((1, 1), {}, "The unnest function requires a single argument."), |
| 189 | + ((1,), {"expr": 1}, "The unnest function requires a single argument."), |
| 190 | + ((1, 1), {"expr": 1}, "The unnest function requires a single argument."), |
| 191 | + ( |
| 192 | + (), |
| 193 | + {"expr": sqlalchemy.Column("x", sqlalchemy.String)}, |
| 194 | + "The argument to unnest must have an ARRAY type.", |
| 195 | + ), |
| 196 | + ( |
| 197 | + (sqlalchemy.Column("x", sqlalchemy.String),), |
| 198 | + {}, |
| 199 | + "The argument to unnest must have an ARRAY type.", |
| 200 | + ), |
| 201 | + ], |
| 202 | +) |
| 203 | +def test_unnest_function_errors(args, kw, error): |
| 204 | + # Make sure the unnest function is registered with SQLAlchemy, which |
| 205 | + # happens when sqlalchemy_bigquery is imported. |
| 206 | + import sqlalchemy_bigquery # noqa |
| 207 | + |
| 208 | + with pytest.raises(TypeError, match=error): |
| 209 | + sqlalchemy.func.unnest(*args, **kw) |
| 210 | + |
| 211 | + |
| 212 | +@pytest.mark.parametrize( |
| 213 | + "args,kw", |
| 214 | + [ |
| 215 | + ((), {"expr": sqlalchemy.Column("x", sqlalchemy.ARRAY(sqlalchemy.String))}), |
| 216 | + ((sqlalchemy.Column("x", sqlalchemy.ARRAY(sqlalchemy.String)),), {}), |
| 217 | + ], |
| 218 | +) |
| 219 | +def test_unnest_function(args, kw): |
| 220 | + # Make sure the unnest function is registered with SQLAlchemy, which |
| 221 | + # happens when sqlalchemy_bigquery is imported. |
| 222 | + import sqlalchemy_bigquery # noqa |
| 223 | + |
| 224 | + f = sqlalchemy.func.unnest(*args, **kw) |
| 225 | + assert isinstance(f.type, sqlalchemy.String) |
| 226 | + if packaging.version.parse(sqlalchemy.__version__) >= packaging.version.parse( |
| 227 | + "1.4" |
| 228 | + ): |
| 229 | + assert isinstance( |
| 230 | + sqlalchemy.select([f]).subquery().c.unnest.type, sqlalchemy.String |
| 231 | + ) |
0 commit comments