Skip to content

Commit 426c832

Browse files
committed
Add tests
1 parent 9ba902b commit 426c832

File tree

5 files changed

+256
-0
lines changed

5 files changed

+256
-0
lines changed

tests/test_tutorial/test_str_fields_and_column_length/__init__.py

Whitespace-only changes.
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import importlib
2+
import runpy
3+
import sys
4+
from types import ModuleType
5+
from unittest.mock import patch
6+
7+
import pytest
8+
from sqlalchemy import create_mock_engine
9+
from sqlalchemy.exc import OperationalError
10+
from sqlalchemy.sql.type_api import TypeEngine
11+
from sqlmodel import create_engine
12+
13+
from ...conftest import needs_py310
14+
15+
16+
def mysql_dump(sql: TypeEngine, *args, **kwargs):
17+
dialect = sql.compile(dialect=mysql_engine.dialect)
18+
sql_str = str(dialect).rstrip()
19+
if sql_str:
20+
print(sql_str + ";")
21+
22+
23+
mysql_engine = create_mock_engine("mysql://", mysql_dump)
24+
25+
26+
@pytest.fixture(
27+
name="mod",
28+
params=[
29+
pytest.param("tutorial001_py39"),
30+
pytest.param("tutorial001_py310", marks=needs_py310),
31+
],
32+
)
33+
def get_module(request: pytest.FixtureRequest) -> ModuleType:
34+
with patch("sqlmodel.create_engine"): # To avoid "No module named 'MySQLdb'" error
35+
mod = importlib.import_module(
36+
f"docs_src.tutorial.str_fields_and_column_length.{request.param}"
37+
)
38+
return mod
39+
40+
41+
def test_sqlite_ddl_sql(mod: ModuleType, caplog: pytest.LogCaptureFixture):
42+
mod.sqlite_url = "sqlite://"
43+
mod.engine = create_engine(mod.sqlite_url, echo=True)
44+
mod.create_db_and_tables()
45+
assert "CREATE TABLE hero (" in caplog.text
46+
assert "name VARCHAR NOT NULL" in caplog.text
47+
48+
49+
def test_mysql_ddl_sql(mod: ModuleType, capsys: pytest.CaptureFixture[str]):
50+
importlib.reload(mod)
51+
52+
mod.SQLModel.metadata.create_all(bind=mysql_engine, checkfirst=False)
53+
captured = capsys.readouterr()
54+
assert "CREATE TABLE hero (" in captured.out
55+
assert "name VARCHAR(255) NOT NULL" in captured.out
56+
57+
58+
# For coverage
59+
def test_run_main(mod: ModuleType):
60+
# Remove module to avoid double-import warning
61+
sys.modules.pop(mod.__name__, None)
62+
63+
with pytest.raises(OperationalError):
64+
runpy.run_module(mod.__name__, run_name="__main__")
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import importlib
2+
import runpy
3+
import sys
4+
from types import ModuleType
5+
from unittest.mock import patch
6+
7+
import pytest
8+
from sqlalchemy import create_mock_engine
9+
from sqlalchemy.exc import OperationalError
10+
from sqlalchemy.sql.type_api import TypeEngine
11+
from sqlmodel import create_engine
12+
13+
from ...conftest import needs_py310
14+
15+
16+
def mysql_dump(sql: TypeEngine, *args, **kwargs):
17+
dialect = sql.compile(dialect=mysql_engine.dialect)
18+
sql_str = str(dialect).rstrip()
19+
if sql_str:
20+
print(sql_str + ";")
21+
22+
23+
mysql_engine = create_mock_engine("mysql://", mysql_dump)
24+
25+
26+
@pytest.fixture(
27+
name="mod",
28+
params=[
29+
pytest.param("tutorial002_py39"),
30+
pytest.param("tutorial002_py310", marks=needs_py310),
31+
],
32+
)
33+
def get_module(request: pytest.FixtureRequest) -> ModuleType:
34+
with patch("sqlmodel.create_engine"): # To avoid "No module named 'MySQLdb'" error
35+
mod = importlib.import_module(
36+
f"docs_src.tutorial.str_fields_and_column_length.{request.param}"
37+
)
38+
return mod
39+
40+
41+
def test_sqlite_ddl_sql(mod: ModuleType, caplog: pytest.LogCaptureFixture):
42+
mod.sqlite_url = "sqlite://"
43+
mod.engine = create_engine(mod.sqlite_url, echo=True)
44+
mod.create_db_and_tables()
45+
assert "CREATE TABLE hero (" in caplog.text
46+
assert "name VARCHAR(100) NOT NULL" in caplog.text
47+
48+
49+
def test_mysql_ddl_sql(mod: ModuleType, capsys: pytest.CaptureFixture[str]):
50+
importlib.reload(mod)
51+
52+
mod.SQLModel.metadata.create_all(bind=mysql_engine, checkfirst=False)
53+
captured = capsys.readouterr()
54+
assert "CREATE TABLE hero (" in captured.out
55+
assert "name VARCHAR(100) NOT NULL" in captured.out
56+
57+
58+
# For coverage
59+
def test_run_main(mod: ModuleType):
60+
# Remove module to avoid double-import warning
61+
sys.modules.pop(mod.__name__, None)
62+
63+
with pytest.raises(OperationalError):
64+
runpy.run_module(mod.__name__, run_name="__main__")
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import importlib
2+
import runpy
3+
import sys
4+
from types import ModuleType
5+
from unittest.mock import patch
6+
7+
import pytest
8+
from sqlalchemy import create_mock_engine
9+
from sqlalchemy.exc import CompileError, OperationalError
10+
from sqlalchemy.sql.type_api import TypeEngine
11+
from sqlmodel import create_engine
12+
13+
from ...conftest import needs_py310
14+
15+
16+
def mysql_dump(sql: TypeEngine, *args, **kwargs):
17+
dialect = sql.compile(dialect=mysql_engine.dialect)
18+
sql_str = str(dialect).rstrip()
19+
if sql_str:
20+
print(sql_str + ";")
21+
22+
23+
mysql_engine = create_mock_engine("mysql://", mysql_dump)
24+
25+
26+
@pytest.fixture(
27+
name="mod",
28+
params=[
29+
pytest.param("tutorial003_py39"),
30+
pytest.param("tutorial003_py310", marks=needs_py310),
31+
],
32+
)
33+
def get_module(request: pytest.FixtureRequest) -> ModuleType:
34+
with patch("sqlmodel.create_engine"): # To avoid "No module named 'MySQLdb'" error
35+
mod = importlib.import_module(
36+
f"docs_src.tutorial.str_fields_and_column_length.{request.param}"
37+
)
38+
return mod
39+
40+
41+
def test_sqlite_ddl_sql(mod: ModuleType, caplog: pytest.LogCaptureFixture):
42+
mod.sqlite_url = "sqlite://"
43+
mod.engine = create_engine(mod.sqlite_url, echo=True)
44+
mod.create_db_and_tables()
45+
assert "CREATE TABLE hero (" in caplog.text
46+
assert "name VARCHAR NOT NULL" in caplog.text
47+
48+
49+
def test_mysql_ddl_sql(mod: ModuleType):
50+
importlib.reload(mod)
51+
52+
with pytest.raises(CompileError) as exc_info:
53+
mod.SQLModel.metadata.create_all(bind=mysql_engine, checkfirst=False)
54+
55+
assert "VARCHAR requires a length on dialect mysql" in str(exc_info.value)
56+
57+
58+
# For coverage
59+
def test_run_main(mod: ModuleType):
60+
# Remove module to avoid double-import warning
61+
sys.modules.pop(mod.__name__, None)
62+
63+
with pytest.raises(OperationalError):
64+
runpy.run_module(mod.__name__, run_name="__main__")
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import importlib
2+
import runpy
3+
import sys
4+
from types import ModuleType
5+
from unittest.mock import patch
6+
7+
import pytest
8+
from sqlalchemy import create_mock_engine
9+
from sqlalchemy.exc import OperationalError
10+
from sqlalchemy.sql.type_api import TypeEngine
11+
from sqlmodel import create_engine
12+
13+
from ...conftest import needs_py310
14+
15+
16+
def mysql_dump(sql: TypeEngine, *args, **kwargs):
17+
dialect = sql.compile(dialect=mysql_engine.dialect)
18+
sql_str = str(dialect).rstrip()
19+
if sql_str:
20+
print(sql_str + ";")
21+
22+
23+
mysql_engine = create_mock_engine("mysql://", mysql_dump)
24+
25+
26+
@pytest.fixture(
27+
name="mod",
28+
params=[
29+
pytest.param("tutorial004_py39"),
30+
pytest.param("tutorial004_py310", marks=needs_py310),
31+
],
32+
)
33+
def get_module(request: pytest.FixtureRequest) -> ModuleType:
34+
with patch("sqlmodel.create_engine"): # To avoid "No module named 'MySQLdb'" error
35+
mod = importlib.import_module(
36+
f"docs_src.tutorial.str_fields_and_column_length.{request.param}"
37+
)
38+
return mod
39+
40+
41+
def test_sqlite_ddl_sql(mod: ModuleType, caplog: pytest.LogCaptureFixture):
42+
mod.sqlite_url = "sqlite://"
43+
mod.engine = create_engine(mod.sqlite_url, echo=True)
44+
mod.create_db_and_tables()
45+
assert "CREATE TABLE hero (" in caplog.text
46+
assert "name VARCHAR(255) NOT NULL" in caplog.text
47+
48+
49+
def test_mysql_ddl_sql(mod: ModuleType, capsys: pytest.CaptureFixture[str]):
50+
importlib.reload(mod)
51+
52+
mod.SQLModel.metadata.create_all(bind=mysql_engine, checkfirst=False)
53+
captured = capsys.readouterr()
54+
assert "CREATE TABLE hero (" in captured.out
55+
assert "name VARCHAR(255) NOT NULL" in captured.out
56+
57+
58+
# For coverage
59+
def test_run_main(mod: ModuleType):
60+
# Remove module to avoid double-import warning
61+
sys.modules.pop(mod.__name__, None)
62+
63+
with pytest.raises(OperationalError):
64+
runpy.run_module(mod.__name__, run_name="__main__")

0 commit comments

Comments
 (0)