1111from paths_cli .wizard .wizard import *
1212from paths_cli .wizard .steps import SINGLE_ENGINE_STEP
1313
14+ import openpathsampling as paths
15+
16+ class MockStore :
17+ def __init__ (self ):
18+ self .all_entries = []
19+ self .name_dict = {}
20+
21+ def register (self , obj ):
22+ self .all_entries .append (obj )
23+ if obj .is_named :
24+ self .name_dict [obj .name ] = obj
25+
26+ def __getitem__ (self , key ):
27+ if isinstance (key , int ):
28+ return self .all_entries [key ]
29+ else :
30+ return self .name_dict [key ]
31+
32+ def __len__ (self ):
33+ return len (self .all_entries )
34+
35+ class MockStorage :
36+ def __init__ (self ):
37+ self .engines = MockStore ()
38+ self .volumes = MockStore ()
39+ self .cvs = MockStore ()
40+ self .networks = MockStore ()
41+ self .schemes = MockStore ()
42+
43+ def save (self , obj ):
44+ class_to_store = {
45+ paths .engines .DynamicsEngine : self .engines ,
46+ paths .Volume : self .volumes ,
47+ CoordinateFunctionCV : self .cvs ,
48+ paths .TransitionNetwork : self .networks ,
49+ paths .MoveScheme : self .schemes ,
50+ }
51+ for cls in class_to_store :
52+ if isinstance (obj , cls ):
53+ store = class_to_store [cls ]
54+ break
55+
56+ store .register (obj )
1457
1558
1659class TestWizard :
@@ -196,8 +239,17 @@ def test_storage_description_line(self, count):
196239 line = self .wizard ._storage_description_line ('cvs' )
197240 assert line == expected
198241
199- def test_save_to_file (self ):
200- pytest .skip ()
242+ def test_save_to_file (self , toy_engine ):
243+ console = MockConsole ([])
244+ self .wizard .console = console
245+ self .wizard .register (toy_engine , 'Engine' , 'engines' )
246+ storage = MockStorage ()
247+ self .wizard .save_to_file (storage )
248+ assert len (storage .cvs ) == len (storage .volumes ) == 0
249+ assert len (storage .networks ) == len (storage .schemes ) == 0
250+ assert len (storage .engines ) == 1
251+ assert storage .engines [toy_engine .name ] == toy_engine
252+ assert "Everything has been stored" in self .wizard .console .log_text
201253
202254 @pytest .mark .parametrize ('req,count,expected' , [
203255 (('cvs' , 1 , 1 ), 0 , (True , True )),
@@ -222,8 +274,48 @@ def test_ask_do_another(self, inputs, expected):
222274 if len (inputs ) > 1 :
223275 assert "Sorry" in console .log_text
224276
225- def test_do_one (self ):
226- pytest .skip ()
227-
228- def test_run_wizard (self ):
229- pytest .skip ()
277+ @pytest .mark .parametrize ('min_max,do_another' , [
278+ ((1 , 1 ), False ), ((2 , float ('inf' )), True ), ((1 , 2 ), 'asked' )
279+ ])
280+ def test_do_one (self , toy_engine , min_max , do_another ):
281+ step = mock .Mock (
282+ func = mock .Mock (return_value = toy_engine ),
283+ display_name = 'Engine' ,
284+ store_name = 'engines'
285+ )
286+ req = ('engines' , * min_max )
287+ # mock user interaction with response 'asked'
288+ with mock .patch .object (Wizard , '_ask_do_another' ,
289+ return_value = 'asked' ):
290+ result = self .wizard ._do_one (step , req )
291+
292+ assert result == do_another
293+ assert self .wizard .engines [toy_engine .name ] == toy_engine
294+
295+ def test_do_one_restart (self ):
296+ step = mock .Mock (
297+ func = mock .Mock (side_effect = RestartObjectException ()),
298+ display_name = 'Engine' , store_name = 'engines'
299+ )
300+ req = ('engines' , 1 , 1 )
301+ result = self .wizard ._do_one (step , req )
302+ assert result is True
303+ assert len (self .wizard .engines ) == 0
304+
305+ def test_run_wizard (self , toy_engine ):
306+ step = mock .Mock (
307+ func = mock .Mock (return_value = toy_engine ),
308+ display_name = 'Engine' ,
309+ store_name = 'engines' ,
310+ minimum = 1 ,
311+ maximum = 1
312+ )
313+ self .wizard .steps = [step ]
314+ storage = MockStorage ()
315+ with mock .patch .object (Wizard , 'get_storage' ,
316+ mock .Mock (return_value = storage )):
317+ self .wizard .run_wizard ()
318+ assert len (storage .cvs ) == len (storage .volumes ) == 0
319+ assert len (storage .networks ) == len (storage .schemes ) == 0
320+ assert len (storage .engines ) == 1
321+ assert storage .engines [toy_engine .name ] == toy_engine
0 commit comments