Coverage for tests / conftest.py: 96%

55 statements  

« prev     ^ index     » next       coverage.py v7.13.0, created at 2026-01-06 21:09 +0000

1import shutil 1abcdefghi

2import subprocess 1abcdefghi

3import sys 1abcdefghi

4from collections.abc import Generator 1abcdefghi

5from dataclasses import dataclass, field 1abcdefghi

6from pathlib import Path 1abcdefghi

7from typing import Any, Callable, Union 1abcdefghi

8from unittest.mock import patch 1abcdefghi

9 

10import pytest 1abcdefghi

11from pydantic import BaseModel 1abcdefghi

12from sqlmodel import SQLModel 1abcdefghi

13from sqlmodel.main import default_registry 1abcdefghi

14 

15top_level_path = Path(__file__).resolve().parent.parent 1abcdefghi

16docs_src_path = top_level_path / "docs_src" 1abcdefghi

17 

18 

19@pytest.fixture(autouse=True) 1abcdefghi

20def clear_sqlmodel() -> Any: 1abcdefghi

21 # Clear the tables in the metadata for the default base model 

22 SQLModel.metadata.clear() 1abcdefghi

23 # Clear the Models associated with the registry, to avoid warnings 

24 default_registry.dispose() 1abcdefghi

25 yield 1abcdefghi

26 SQLModel.metadata.clear() 1abcdefghi

27 default_registry.dispose() 1abcdefghi

28 

29 

30@pytest.fixture() 1abcdefghi

31def cov_tmp_path(tmp_path: Path) -> Generator[Path, None, None]: 1abcdefghi

32 yield tmp_path 1abcdefghi

33 for coverage_path in tmp_path.glob(".coverage*"): 1abcdefghi

34 coverage_destiny_path = top_level_path / "coverage" / coverage_path.name 

35 shutil.copy(coverage_path, coverage_destiny_path) 

36 

37 

38def coverage_run(*, module: str, cwd: Union[str, Path]) -> subprocess.CompletedProcess: 1abcdefghi

39 result = subprocess.run( 2Zg0g1g2g3g4g5g6g7g

40 [ 

41 "coverage", 

42 "run", 

43 "--parallel-mode", 

44 "--source=docs_src,tests,sqlmodel", 

45 "-m", 

46 module, 

47 ], 

48 cwd=str(cwd), 

49 capture_output=True, 

50 encoding="utf-8", 

51 ) 

52 return result 2Zg0g1g2g3g4g5g6g7g

53 

54 

55def get_testing_print_function( 1abcdefghi

56 calls: list[list[Union[str, dict[str, Any]]]], 

57) -> Callable[..., Any]: 

58 def new_print(*args: Any) -> None: 1abcdefghi

59 data: list[Any] = [] 2CbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbffgf# $ % ' j k l Sb;eTbUbVbWbXbYb=em n Zb0b1b2b3b4b5b6bo hfif( ) 7b8b9b!bjfkflfmfnfofpfqfrfsftf#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?bufvf* + , - p q r @b?e[b]b^b_b`b{b@es t |b}b~bacbcccdcecu wfxf. / fcgchcicyfzfAfBfCfDfEfFfGfHfIfjckclcmcncocpcqcrcsctcucvcwcxcycJfKf: ; = ? v w x zc[eAcBcCcDcEcFc]ey z GcHcIcJcKcLcMcNcA LfMf@ [ OcPcQcRcNfOfPfQfRfSfTfUfVfWfXfScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cYfZf] ^ _ ` B C D 8c^e9c!c#c$c%c'c_eE F (c)c*c+c,c-c.c/cG 0f1f{ | :c;c=c?c2f3f4f5f6f7f8f9f!f#f$f@c[c]c^c_c`c{c|c}c~cadbdcdddedfd%f'f} ~ abbbH I J gd`ehdidjdkdldmd{eK L ndodpdqdrdsdtdudM (f)fcbdbvdwdxdyd*f+f,f-f.f/f:f;f=f?f@fzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOd[f]febfbgbhbN O P Pd|eQdRdSdTdUdVd}eQ R WdXdYdZd0d1d2d3dS ^f_fibjb4d5d6d7d`f{f|f}f~fagbgcgdgegfg8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:dgghgkblbmbnbT U V ;d~e=d?d@d[d]d^dafW X _d`d{d|d}d~daebeY igjgobpbcedeeefekglgmgngogpgqgrgsgtguggeheiejekelemeneoepeqereseteuevevgwgqbrbsbtbZ 0 1 webfxeyezeAeBeCecf2 3 DeEeFeGeHeIeJeKe4 xgygubvbLeMeNeOezgAgBgCgDgEgFgGgHgIgJgPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4eKgLgwbxbybzb5 6 7 5edf6e7e8e9e!e#eef8 9 $e%e'e(e)e*e+e,e! MgNgAbBb-e.e/e:eOgPgQgRgSgTgUgVgWgXgYg

60 for arg in args: 2CbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbffgf# $ % ' j k l Sb;eTbUbVbWbXbYb=em n Zb0b1b2b3b4b5b6bo hfif( ) 7b8b9b!bjfkflfmfnfofpfqfrfsftf#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?bufvf* + , - p q r @b?e[b]b^b_b`b{b@es t |b}b~bacbcccdcecu wfxf. / fcgchcicyfzfAfBfCfDfEfFfGfHfIfjckclcmcncocpcqcrcsctcucvcwcxcycJfKf: ; = ? v w x zc[eAcBcCcDcEcFc]ey z GcHcIcJcKcLcMcNcA LfMf@ [ OcPcQcRcNfOfPfQfRfSfTfUfVfWfXfScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cYfZf] ^ _ ` B C D 8c^e9c!c#c$c%c'c_eE F (c)c*c+c,c-c.c/cG 0f1f{ | :c;c=c?c2f3f4f5f6f7f8f9f!f#f$f@c[c]c^c_c`c{c|c}c~cadbdcdddedfd%f'f} ~ abbbH I J gd`ehdidjdkdldmd{eK L ndodpdqdrdsdtdudM (f)fcbdbvdwdxdyd*f+f,f-f.f/f:f;f=f?f@fzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOd[f]febfbgbhbN O P Pd|eQdRdSdTdUdVd}eQ R WdXdYdZd0d1d2d3dS ^f_fibjb4d5d6d7d`f{f|f}f~fagbgcgdgegfg8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:dgghgkblbmbnbT U V ;d~e=d?d@d[d]d^dafW X _d`d{d|d}d~daebeY igjgobpbcedeeefekglgmgngogpgqgrgsgtguggeheiejekelemeneoepeqereseteuevevgwgqbrbsbtbZ 0 1 webfxeyezeAeBeCecf2 3 DeEeFeGeHeIeJeKe4 xgygubvbLeMeNeOezgAgBgCgDgEgFgGgHgIgJgPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4eKgLgwbxbybzb5 6 7 5edf6e7e8e9e!e#eef8 9 $e%e'e(e)e*e+e,e! MgNgAbBb-e.e/e:eOgPgQgRgSgTgUgVgWgXgYg

61 if isinstance(arg, BaseModel): 2CbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbffgf# $ % ' j k l Sb;eTbUbVbWbXbYb=em n Zb0b1b2b3b4b5b6bo hfif( ) 7b8b9b!bjfkflfmfnfofpfqfrfsftf#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?bufvf* + , - p q r @b?e[b]b^b_b`b{b@es t |b}b~bacbcccdcecu wfxf. / fcgchcicyfzfAfBfCfDfEfFfGfHfIfjckclcmcncocpcqcrcsctcucvcwcxcycJfKf: ; = ? v w x zc[eAcBcCcDcEcFc]ey z GcHcIcJcKcLcMcNcA LfMf@ [ OcPcQcRcNfOfPfQfRfSfTfUfVfWfXfScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cYfZf] ^ _ ` B C D 8c^e9c!c#c$c%c'c_eE F (c)c*c+c,c-c.c/cG 0f1f{ | :c;c=c?c2f3f4f5f6f7f8f9f!f#f$f@c[c]c^c_c`c{c|c}c~cadbdcdddedfd%f'f} ~ abbbH I J gd`ehdidjdkdldmd{eK L ndodpdqdrdsdtdudM (f)fcbdbvdwdxdyd*f+f,f-f.f/f:f;f=f?f@fzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOd[f]febfbgbhbN O P Pd|eQdRdSdTdUdVd}eQ R WdXdYdZd0d1d2d3dS ^f_fibjb4d5d6d7d`f{f|f}f~fagbgcgdgegfg8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:dgghgkblbmbnbT U V ;d~e=d?d@d[d]d^dafW X _d`d{d|d}d~daebeY igjgobpbcedeeefekglgmgngogpgqgrgsgtguggeheiejekelemeneoepeqereseteuevevgwgqbrbsbtbZ 0 1 webfxeyezeAeBeCecf2 3 DeEeFeGeHeIeJeKe4 xgygubvbLeMeNeOezgAgBgCgDgEgFgGgHgIgJgPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4eKgLgwbxbybzb5 6 7 5edf6e7e8e9e!e#eef8 9 $e%e'e(e)e*e+e,e! MgNgAbBb-e.e/e:eOgPgQgRgSgTgUgVgWgXgYg

62 data.append(arg.model_dump()) 2CbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbffgfj k l SbTbUbVbWbXbYbm n Zb0b1b2b3b4b5b6bo hfif7b8b9b!bjfkflfmfnfofpfqfrfsftf#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?bufvfp q r @b[b]b^b_b`b{bs t |b}b~bacbcccdcecu wfxffcgchcicyfzfAfBfCfDfEfFfGfHfIfjckclcmcncocpcqcrcsctcucvcwcxcycJfKfv w x zcAcBcCcDcEcFcy z GcHcIcJcKcLcMcNcA LfMfOcPcQcRcNfOfPfQfRfSfTfUfVfWfXfScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cYfZfB C D 8c9c!c#c$c%c'cE F (c)c*c+c,c-c.c/cG 0f1f:c;c=c?c2f3f4f5f6f7f8f9f!f#f$f@c[c]c^c_c`c{c|c}c~cadbdcdddedfd%f'fH I J gdhdidjdkdldmdK L ndodpdqdrdsdtdudM (f)fvdwdxdyd*f+f,f-f.f/f:f;f=f?f@fzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOd[f]fN O P PdQdRdSdTdUdVdQ R WdXdYdZd0d1d2d3dS ^f_f4d5d6d7d`f{f|f}f~fagbgcgdgegfg8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:dgghgT U V ;d=d?d@d[d]d^dW X _d`d{d|d}d~daebeY igjgcedeeefekglgmgngogpgqgrgsgtguggeheiejekelemeneoepeqereseteuevevgwgZ 0 1 wexeyezeAeBeCe2 3 DeEeFeGeHeIeJeKe4 xgygLeMeNeOezgAgBgCgDgEgFgGgHgIgJgPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4eKgLg5 6 7 5e6e7e8e9e!e#e8 9 $e%e'e(e)e*e+e,e! MgNg-e.e/e:eOgPgQgRgSgTgUgVgWgXgYg

63 elif isinstance(arg, list): 2CbDbEbFbGbHbIbJbKbLbMbNbObPbQbRb# $ % ' j k l Sb;eTbUbVbWbXbYb=em n Zb0b1b2b3b4b5b6bo ( ) 7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b* + , - p q r @b?e[b]b^b_b`b{b@es t |b}b~bacbcccdcecu . / fcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyc: ; = ? v w x zc[eAcBcCcDcEcFc]ey z GcHcIcJcKcLcMcNcA @ [ OcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c] ^ _ ` B C D 8c^e9c!c#c$c%c'c_eE F (c)c*c+c,c-c.c/cG { | :c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfd} ~ abbbH I J gd`ehdidjdkdldmd{eK L ndodpdqdrdsdtdudM cbdbvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdebfbgbhbN O P Pd|eQdRdSdTdUdVd}eQ R WdXdYdZd0d1d2d3dS ibjb4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:dkblbmbnbT U V ;d~e=d?d@d[d]d^dafW X _d`d{d|d}d~daebeY obpbcedeeefegeheiejekelemeneoepeqereseteueveqbrbsbtbZ 0 1 webfxeyezeAeBeCecf2 3 DeEeFeGeHeIeJeKe4 ubvbLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4ewbxbybzb5 6 7 5edf6e7e8e9e!e#eef8 9 $e%e'e(e)e*e+e,e! AbBb-e.e/e:e

64 new_list = [] 2# $ % ' j k l m n o ( ) * + , - p q r s t u . / : ; = ? v w x y z A @ [ ] ^ _ ` B C D E F G { | } ~ abbbH I J K L M cbdbebfbgbhbN O P Q R S ibjbkblbmbnbT U V W X Y obpbqbrbsbtbZ 0 1 2 3 4 ubvbwbxbybzb5 6 7 8 9 ! AbBb

65 for item in arg: 2# $ % ' j k l m n o ( ) * + , - p q r s t u . / : ; = ? v w x y z A @ [ ] ^ _ ` B C D E F G { | } ~ abbbH I J K L M cbdbebfbgbhbN O P Q R S ibjbkblbmbnbT U V W X Y obpbqbrbsbtbZ 0 1 2 3 4 ubvbwbxbybzb5 6 7 8 9 ! AbBb

66 if isinstance(item, BaseModel): 2# $ % ' j k l m n o ( ) * + , - p q r s t u . / : ; = ? v w x y z A @ [ ] ^ _ ` B C D E F G { | } ~ abbbH I J K L M cbdbebfbgbhbN O P Q R S ibjbkblbmbnbT U V W X Y obpbqbrbsbtbZ 0 1 2 3 4 ubvbwbxbybzb5 6 7 8 9 ! AbBb

67 new_list.append(item.model_dump()) 2# $ % ' j k l m n o ( ) * + , - p q r s t u . / : ; = ? v w x y z A @ [ ] ^ _ ` B C D E F G { | } ~ abbbH I J K L M cbdbebfbgbhbN O P Q R S ibjbkblbmbnbT U V W X Y obpbqbrbsbtbZ 0 1 2 3 4 ubvbwbxbybzb5 6 7 8 9 ! AbBb

68 data.append(new_list) 2# $ % ' j k l m n o ( ) * + , - p q r s t u . / : ; = ? v w x y z A @ [ ] ^ _ ` B C D E F G { | } ~ abbbH I J K L M cbdbebfbgbhbN O P Q R S ibjbkblbmbnbT U V W X Y obpbqbrbsbtbZ 0 1 2 3 4 ubvbwbxbybzb5 6 7 8 9 ! AbBb

69 else: 

70 data.append(arg) 2CbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbj k l Sb;eTbUbVbWbXbYb=em n Zb0b1b2b3b4b5b6bo 7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?bp q r @b?e[b]b^b_b`b{b@es t |b}b~bacbcccdcecu fcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycv w x zc[eAcBcCcDcEcFc]ey z GcHcIcJcKcLcMcNcA OcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cB C D 8c^e9c!c#c$c%c'c_eE F (c)c*c+c,c-c.c/cG :c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdH I J gd`ehdidjdkdldmd{eK L ndodpdqdrdsdtdudM vdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdN O P Pd|eQdRdSdTdUdVd}eQ R WdXdYdZd0d1d2d3dS 4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:dT U V ;d~e=d?d@d[d]d^dafW X _d`d{d|d}d~daebeY cedeeefegeheiejekelemeneoepeqereseteueveZ 0 1 webfxeyezeAeBeCecf2 3 DeEeFeGeHeIeJeKe4 LeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5 6 7 5edf6e7e8e9e!e#eef8 9 $e%e'e(e)e*e+e,e! -e.e/e:e

71 calls.append(data) 2CbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbffgf# $ % ' j k l Sb;eTbUbVbWbXbYb=em n Zb0b1b2b3b4b5b6bo hfif( ) 7b8b9b!bjfkflfmfnfofpfqfrfsftf#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?bufvf* + , - p q r @b?e[b]b^b_b`b{b@es t |b}b~bacbcccdcecu wfxf. / fcgchcicyfzfAfBfCfDfEfFfGfHfIfjckclcmcncocpcqcrcsctcucvcwcxcycJfKf: ; = ? v w x zc[eAcBcCcDcEcFc]ey z GcHcIcJcKcLcMcNcA LfMf@ [ OcPcQcRcNfOfPfQfRfSfTfUfVfWfXfScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cYfZf] ^ _ ` B C D 8c^e9c!c#c$c%c'c_eE F (c)c*c+c,c-c.c/cG 0f1f{ | :c;c=c?c2f3f4f5f6f7f8f9f!f#f$f@c[c]c^c_c`c{c|c}c~cadbdcdddedfd%f'f} ~ abbbH I J gd`ehdidjdkdldmd{eK L ndodpdqdrdsdtdudM (f)fcbdbvdwdxdyd*f+f,f-f.f/f:f;f=f?f@fzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOd[f]febfbgbhbN O P Pd|eQdRdSdTdUdVd}eQ R WdXdYdZd0d1d2d3dS ^f_fibjb4d5d6d7d`f{f|f}f~fagbgcgdgegfg8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:dgghgkblbmbnbT U V ;d~e=d?d@d[d]d^dafW X _d`d{d|d}d~daebeY igjgobpbcedeeefekglgmgngogpgqgrgsgtguggeheiejekelemeneoepeqereseteuevevgwgqbrbsbtbZ 0 1 webfxeyezeAeBeCecf2 3 DeEeFeGeHeIeJeKe4 xgygubvbLeMeNeOezgAgBgCgDgEgFgGgHgIgJgPeQeReSeTeUeVeWeXeYeZe0e1e2e3e4eKgLgwbxbybzb5 6 7 5edf6e7e8e9e!e#eef8 9 $e%e'e(e)e*e+e,e! MgNgAbBb-e.e/e:eOgPgQgRgSgTgUgVgWgXgYg

72 

73 return new_print 1abcdefghi

74 

75 

76@dataclass 1abcdefghi

77class PrintMock: 1abcdefghi

78 calls: list[Any] = field(default_factory=list) 1abcdefghi

79 

80 

81@pytest.fixture(name="print_mock") 1abcdefghi

82def print_mock_fixture() -> Generator[PrintMock, None, None]: 1abcdefghi

83 print_mock = PrintMock() 1abcdefghi

84 new_print = get_testing_print_function(print_mock.calls) 1abcdefghi

85 with patch("builtins.print", new=new_print): 1abcdefghi

86 yield print_mock 1abcdefghi

87 

88 

89needs_py310 = pytest.mark.skipif( 1abcdefghi

90 sys.version_info < (3, 10), reason="requires python3.10+" 

91)