77from commitizen .exceptions import VersionProviderUnknown
88from commitizen .providers import get_provider
99from commitizen .providers .commitizen_provider import CommitizenProvider
10+ from commitizen .providers .composer_provider import ComposerProvider
11+ from commitizen .providers .pep621_provider import Pep621Provider
12+ from commitizen .providers .uv_provider import UvProvider
1013
1114if TYPE_CHECKING :
15+ from pathlib import Path
16+
1217 from commitizen .config .base_config import BaseConfig
1318
1419
@@ -22,3 +27,98 @@ def test_raise_for_unknown_provider(config: BaseConfig):
2227 config .settings ["version_provider" ] = "unknown"
2328 with pytest .raises (VersionProviderUnknown ):
2429 get_provider (config )
30+
31+
32+ @pytest .mark .parametrize ("encoding" , ["utf-8" , "latin-1" ])
33+ def test_file_provider_get_encoding (config : BaseConfig , encoding : str ):
34+ """_get_encoding should return the configured encoding."""
35+ config .settings ["encoding" ] = encoding
36+ provider = ComposerProvider (config )
37+ assert provider ._get_encoding () == encoding
38+
39+
40+ def test_json_provider_uses_encoding_with_encoding_fixture (
41+ config : BaseConfig ,
42+ chdir : Path ,
43+ data_dir : Path ,
44+ ):
45+ """JsonProvider should correctly read a JSON file with non-ASCII content."""
46+ source = data_dir / "encoding_test_composer.json"
47+ target = chdir / "composer.json"
48+ target .write_text (source .read_text (encoding = "utf-8" ), encoding = "utf-8" )
49+
50+ config .settings ["encoding" ] = "utf-8"
51+ config .settings ["version_provider" ] = "composer"
52+
53+ provider = get_provider (config )
54+ assert isinstance (provider , ComposerProvider )
55+ assert provider .get_version () == "0.1.0"
56+
57+
58+ def test_toml_provider_uses_encoding_with_encoding_fixture (
59+ config : BaseConfig ,
60+ chdir : Path ,
61+ data_dir : Path ,
62+ ):
63+ """TomlProvider should correctly read a TOML file with non-ASCII content."""
64+ source = data_dir / "encoding_test_pyproject.toml"
65+ target = chdir / "pyproject.toml"
66+ target .write_text (source .read_text (encoding = "utf-8" ), encoding = "utf-8" )
67+
68+ config .settings ["encoding" ] = "utf-8"
69+ config .settings ["version_provider" ] = "uv"
70+
71+ provider = get_provider (config )
72+ assert isinstance (provider , UvProvider )
73+ assert provider .get_version () == "0.4.1"
74+
75+
76+ def test_json_provider_handles_various_unicode_characters (
77+ config : BaseConfig ,
78+ chdir : Path ,
79+ ):
80+ """JsonProvider should handle a wide range of Unicode characters."""
81+ config .settings ["encoding" ] = "utf-8"
82+ config .settings ["version_provider" ] = "composer"
83+
84+ filename = ComposerProvider .filename
85+ file = chdir / filename
86+ file .write_text (
87+ (
88+ "{\n "
89+ ' "name": "多言語-имя-árbol",\n '
90+ ' "description": "Emoji 😀 – 漢字 – العربية",\n '
91+ ' "version": "0.1.0"\n '
92+ "}\n "
93+ ),
94+ encoding = "utf-8" ,
95+ )
96+
97+ provider = get_provider (config )
98+ assert isinstance (provider , ComposerProvider )
99+ assert provider .get_version () == "0.1.0"
100+
101+
102+ def test_toml_provider_handles_various_unicode_characters (
103+ config : BaseConfig ,
104+ chdir : Path ,
105+ ):
106+ """TomlProvider should handle a wide range of Unicode characters."""
107+ config .settings ["encoding" ] = "utf-8"
108+ config .settings ["version_provider" ] = "pep621"
109+
110+ filename = Pep621Provider .filename
111+ file = chdir / filename
112+ file .write_text (
113+ (
114+ "[project]\n "
115+ 'name = "多言語-имя-árbol"\n '
116+ 'description = "Emoji 😀 – 漢字 – العربية"\n '
117+ 'version = "0.1.0"\n '
118+ ),
119+ encoding = "utf-8" ,
120+ )
121+
122+ provider = get_provider (config )
123+ assert isinstance (provider , Pep621Provider )
124+ assert provider .get_version () == "0.1.0"
0 commit comments