Skip to content

Commit 4ca71d6

Browse files
committed
began working on a parametric form of testing with multiple codegen strategies parametrized on the same expected input output pairs
1 parent 07edf4c commit 4ca71d6

3 files changed

Lines changed: 339 additions & 1 deletion

File tree

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ dev-dependencies = [
3535
"coverage>=7.6.9",
3636
"docker>=7.1.0",
3737
"sqlmodel>=0.0.27",
38+
"uuid>=1.30",
3839
]
3940

4041
[build-system]

tests/test_parametric.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
'''
2+
wouldn't it be nice if I could have something that
3+
veries the same SQL code -> SQLModel code consequence
4+
across all implementations? let's try
5+
'''
6+
7+
import sqlite3
8+
from pathlib import Path
9+
from tempfile import tempdir
10+
from typing import Callable
11+
12+
from uuid import uuid4
13+
14+
from sqlmodelgen import (
15+
gen_code_from_sql,
16+
gen_code_from_sqlite,
17+
)
18+
19+
from helpers.helpers import collect_code_info
20+
21+
CodeGenFunc = Callable[[str, bool], str]
22+
23+
def gen_from_parse(sql: str, rels: bool) -> str:
24+
return gen_code_from_sql(sql, rels)
25+
26+
def gen_from_sqlite(sql: str, rels: bool) -> str:
27+
# TODO: prepare interface for possibly several sql
28+
# statements
29+
sqlite_path = Path(tempdir) / f"{uuid4()}.sqlite"
30+
31+
with sqlite3.connect(sqlite_path) as conn:
32+
cursor = conn.cursor()
33+
cursor.execute(sql)
34+
conn.commit()
35+
36+
return gen_code_from_sqlite(str(sqlite_path), rels)
37+
38+
codegens: list[CodeGenFunc] = [
39+
gen_from_parse,
40+
gen_from_sqlite,
41+
]
42+
codegen_ids = [codegen.__name__ for codegen in codegens]
43+
44+
def verify(codegen: CodeGenFunc, sql: str, expected: str, rels: bool):
45+
generated = codegen(sql, rels)
46+
assert collect_code_info(generated) == collect_code_info(expected)
47+
48+
import pytest
49+
@pytest.mark.parametrize("codegen", codegens, ids=codegen_ids)
50+
def test_basic(codegen):
51+
verify(
52+
codegen=codegen,
53+
sql='''CREATE TABLE Persons (
54+
PersonID int NOT NULL,
55+
LastName varchar NOT NULL,
56+
FirstName varchar NOT NULL,
57+
Address varchar NOT NULL,
58+
City varchar NOT NULL
59+
);''',
60+
expected='''from sqlmodel import SQLModel
61+
62+
class Persons(SQLModel, table = True):
63+
__tablename__ = 'Persons'
64+
65+
PersonID: int
66+
LastName: str
67+
FirstName: str
68+
Address: str
69+
City: str''',
70+
rels=False
71+
)

0 commit comments

Comments
 (0)