@@ -52,6 +52,17 @@ def echo(self, *args: Any, **kwargs: Any) -> None:
5252 self .echo_calls .append ((args , kwargs ))
5353
5454
55+ class WritableConfig (dict [str , Any ]):
56+ encoding : str | None = None
57+
58+ def __init__ (self , value : dict [str , Any ]) -> None :
59+ super ().__init__ (value )
60+ self .write_calls = 0
61+
62+ def write (self ) -> None :
63+ self .write_calls += 1
64+
65+
5566class FakeSQLExecute :
5667 calls : list [dict [str , Any ]] = []
5768 effects : list [Any ] = []
@@ -148,12 +159,70 @@ def test_connect_uses_character_set_from_connection_config() -> None:
148159 assert FakeSQLExecute .calls [- 1 ]['character_set' ] == 'utf16'
149160
150161
151- def test_connect_uses_character_set_from_main_config () -> None :
152- client = DummyClient (config = {'main' : {'default_character_set' : 'utf32' }, 'connection' : {}})
162+ def test_connect_migrates_deprecated_character_set_from_main_config (
163+ monkeypatch : pytest .MonkeyPatch ,
164+ ) -> None :
165+ config_wo = WritableConfig ({'main' : {'default_character_set' : 'utf32' }})
166+ client = DummyClient (
167+ config = {'main' : {}, 'connection' : {'default_character_set' : 'utf16' }},
168+ config_without_package_defaults = config_wo ,
169+ )
170+ secho_calls : list [tuple [str , dict [str , Any ]]] = []
171+ monkeypatch .setattr (
172+ client_connection .click ,
173+ 'secho' ,
174+ lambda message , ** kwargs : secho_calls .append ((message , kwargs )),
175+ )
153176
154177 client .connect (host = 'db' , port = 3307 )
155178
156179 assert FakeSQLExecute .calls [- 1 ]['character_set' ] == 'utf32'
180+ assert config_wo .encoding == 'utf-8'
181+ assert config_wo ['connection' ]['default_character_set' ] == 'utf32'
182+ assert 'default_character_set' not in config_wo ['main' ]
183+ assert config_wo .write_calls == 1
184+ assert secho_calls == [
185+ (
186+ 'Mycli 2.0 migration: automatically moving default_character_set from [main] to [connection] in ~/.myclirc .' ,
187+ {'err' : True , 'fg' : 'red' },
188+ )
189+ ]
190+
191+
192+ def test_connect_uses_existing_connection_character_set_when_migrating (
193+ monkeypatch : pytest .MonkeyPatch ,
194+ ) -> None :
195+ config_wo = WritableConfig ({
196+ 'main' : {'default_character_set' : 'utf32' },
197+ 'connection' : {'default_character_set' : 'utf16' },
198+ })
199+ client = DummyClient (
200+ config = {'main' : {}, 'connection' : {'default_character_set' : 'latin1' }},
201+ config_without_package_defaults = config_wo ,
202+ )
203+ secho_calls : list [tuple [str , dict [str , Any ]]] = []
204+ monkeypatch .setattr (
205+ client_connection .click ,
206+ 'secho' ,
207+ lambda message , ** kwargs : secho_calls .append ((message , kwargs )),
208+ )
209+
210+ client .connect (host = 'db' , port = 3307 )
211+
212+ assert FakeSQLExecute .calls [- 1 ]['character_set' ] == 'utf16'
213+ assert config_wo ['connection' ]['default_character_set' ] == 'utf16'
214+ assert 'default_character_set' not in config_wo ['main' ]
215+ assert config_wo .write_calls == 1
216+ assert secho_calls == [
217+ (
218+ 'Mycli 2.0 migration: automatically moving default_character_set from [main] to [connection] in ~/.myclirc .' ,
219+ {'err' : True , 'fg' : 'red' },
220+ ),
221+ (
222+ 'But connection.default_character_set already existed, with the value: "utf16".' ,
223+ {'err' : True , 'fg' : 'red' },
224+ ),
225+ ]
157226
158227
159228def test_connect_uses_default_character_set_when_none_configured () -> None :
0 commit comments