)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14200,"name":"Maksim Malchuk","email":"maksim.malchuk@gmail.com","username":"mmalchuk"},"change_message_id":"d7fc8e60055125ca2df309284dbc3d5bba1f4443","unresolved":true,"context_lines":[{"line_number":9,"context_line":"This commit migrates the internal configuration state tracking"},{"line_number":10,"context_line":"(KOLLA_DEFAULTS_STATE) from JSON to YAML."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Depends-On: https://review.opendev.org/c/openstack/kolla/+/982275"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I78f89dd7a4379f842153feb476f5bee824c12ffc"},{"line_number":15,"context_line":"Signed-off-by: Piotr Milewski \u003cvurmil@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"2a9b961a_7a9852cc","line":12,"range":{"start_line":12,"start_character":0,"end_line":12,"end_character":65},"updated":"2026-06-17 20:24:35.000000000","message":"useless since this change on the top of the depended change in the relation chain","commit_id":"83ff47ae7b19e3418cf707fc2d11e882f36e92c0"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":37306,"name":"Piotr Milewski","display_name":"Piotr Milewski","email":"vurmil@gmail.com","username":"vurmil"},"change_message_id":"faa3ae05d655cafdd3911bf9474c3d7e9831a292","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"d04c45e1_37ab62b0","updated":"2026-07-10 17:16:55.000000000","message":"recheck - debian failure (kolla_toolbox)","commit_id":"fffd72f78163363cbaaa75192ab491e705fbb184"}],"tests/test_set_config.py":[{"author":{"_account_id":27339,"name":"Michal Arbet","email":"michal.arbet@ultimum.io","username":"michalarbet"},"change_message_id":"b0dd34c3f3ca5f2dcc09350234001d1df1784d6a","unresolved":true,"context_lines":[{"line_number":494,"context_line":"                      config_file._cmp_file(\u0027/var/lib/kolla/config_files/bar\u0027,"},{"line_number":495,"context_line":"                                            \u0027/foo\u0027))"},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"    @mock.patch(\u0027os.makedirs\u0027)"},{"line_number":498,"context_line":"    @mock.patch(\u0027os.path.exists\u0027)"},{"line_number":499,"context_line":"    @mock.patch(\u0027builtins.open\u0027, new_callable\u003dmock.mock_open,"},{"line_number":500,"context_line":"                read_data\u003d\u0027{\"foo\": \"bar\"}\u0027)"},{"line_number":501,"context_line":"    def test_get_defaults_state_exist("},{"line_number":502,"context_line":"            self, mock_open, mock_exists, mock_makedirs):"},{"line_number":503,"context_line":"        \"\"\"Test get_defaults_state() when the default state file exists."},{"line_number":504,"context_line":""},{"line_number":505,"context_line":"        This test mocks the behavior of the function when the default state"},{"line_number":506,"context_line":"        file exists. It ensures that:"},{"line_number":507,"context_line":"        - The directory for Kolla defaults is created if needed."},{"line_number":508,"context_line":"        - The state file is opened and read successfully."},{"line_number":509,"context_line":"        - The correct state data is returned as a dictionary."},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"        Mocks:"},{"line_number":512,"context_line":"        - os.makedirs: Ensures the directory is created."},{"line_number":513,"context_line":"        - os.path.exists: Simulates that the state file exists."},{"line_number":514,"context_line":"        - open: Mocks the file opening and reading, returning a sample JSON"},{"line_number":515,"context_line":"                content."},{"line_number":516,"context_line":"        \"\"\""},{"line_number":517,"context_line":""},{"line_number":518,"context_line":"        # Simulate that the state file exists"},{"line_number":519,"context_line":"        mock_exists.side_effect \u003d lambda \\"},{"line_number":520,"context_line":"            path: path \u003d\u003d set_configs.KOLLA_DEFAULTS_STATE"},{"line_number":521,"context_line":""},{"line_number":522,"context_line":"        result \u003d set_configs.get_defaults_state()"},{"line_number":523,"context_line":""},{"line_number":524,"context_line":"        # Check that the directory creation was called"},{"line_number":525,"context_line":"        mock_makedirs.assert_called_once_with(set_configs.KOLLA_DEFAULTS,"},{"line_number":526,"context_line":"                                              exist_ok\u003dTrue)"},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"        # Verify that the function checked if the state file exists"},{"line_number":529,"context_line":"        mock_exists.assert_called_once_with(set_configs.KOLLA_DEFAULTS_STATE)"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"        # Verify that the state file was opened for reading"},{"line_number":532,"context_line":"        mock_open.assert_called_once_with("},{"line_number":533,"context_line":"            set_configs.KOLLA_DEFAULTS_STATE, \u0027r\u0027)"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"        # Validate the result is as expected"},{"line_number":536,"context_line":"        self.assertEqual(result, {\"foo\": \"bar\"})"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"    @mock.patch(\u0027os.makedirs\u0027)"},{"line_number":539,"context_line":"    @mock.patch(\u0027os.path.exists\u0027, return_value\u003dFalse)"},{"line_number":540,"context_line":"    def test_get_defaults_state_not_exist(self, mock_exists, mock_makedirs):"},{"line_number":541,"context_line":"        \"\"\"Test get_defaults_state() when the default state file doesn\u0027t exist."},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"        This test simulates the scenario where the default state file is"},{"line_number":544,"context_line":"        missing."},{"line_number":545,"context_line":"        It verifies that:"},{"line_number":546,"context_line":"        - The directory for Kolla defaults is created if needed."},{"line_number":547,"context_line":"        - The state file is checked but not found."},{"line_number":548,"context_line":"        - An empty dictionary is returned since the state file is missing."},{"line_number":549,"context_line":""},{"line_number":550,"context_line":"        Mocks:"},{"line_number":551,"context_line":"        - os.makedirs: Ensures the directory is created."},{"line_number":552,"context_line":"        - os.path.exists: Simulates that the state file does not exist."},{"line_number":553,"context_line":"        \"\"\""},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"        # Simulate that the file does not exist"},{"line_number":556,"context_line":"        mock_exists.side_effect \u003d lambda path: False"},{"line_number":557,"context_line":""},{"line_number":558,"context_line":"        result \u003d set_configs.get_defaults_state()"},{"line_number":559,"context_line":""},{"line_number":560,"context_line":"        # Check that the directory creation was called"},{"line_number":561,"context_line":"        mock_makedirs.assert_called_once_with(set_configs.KOLLA_DEFAULTS,"},{"line_number":562,"context_line":"                                              exist_ok\u003dTrue)"},{"line_number":563,"context_line":"        # Verify that the function checked if the state file exists"},{"line_number":564,"context_line":"        mock_exists.assert_called_once_with(set_configs.KOLLA_DEFAULTS_STATE)"},{"line_number":565,"context_line":""},{"line_number":566,"context_line":"        # Result should be an empty dictionary since the state file is missing"},{"line_number":567,"context_line":"        self.assertEqual(result, {})"},{"line_number":568,"context_line":""},{"line_number":569,"context_line":"    @mock.patch(\u0027builtins.open\u0027, new_callable\u003dmock.mock_open)"},{"line_number":570,"context_line":"    @mock.patch(\u0027yaml.dump\u0027)"},{"line_number":571,"context_line":"    def test_set_defaults_state(self, mock_yaml_dump, mock_open):"},{"line_number":572,"context_line":"        \"\"\"Test set_defaults_state() to ensure proper saving of the state."},{"line_number":573,"context_line":""},{"line_number":574,"context_line":"        This test verifies that the provided state is correctly saved as a yaml"},{"line_number":575,"context_line":"        file. It checks:"},{"line_number":576,"context_line":"        - The state file is opened for writing."},{"line_number":577,"context_line":"        - The provided state dictionary is dumped into the file in YAML format."},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"        Mocks:"},{"line_number":580,"context_line":"        - open: Mocks the file opening for writing."},{"line_number":581,"context_line":"        - yaml.dump: Mocks the YAML dumping process."},{"line_number":582,"context_line":"        \"\"\""},{"line_number":583,"context_line":""},{"line_number":584,"context_line":"        state \u003d {\"foo\": \"bar\"}"},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"        set_configs.set_defaults_state(state)"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"        mock_open.assert_called_once_with("},{"line_number":589,"context_line":"            set_configs.KOLLA_DEFAULTS_STATE, \u0027w\u0027)"},{"line_number":590,"context_line":""},{"line_number":591,"context_line":"        mock_yaml_dump.assert_called_once_with(state, mock_open(),"},{"line_number":592,"context_line":"                                               default_flow_style\u003dFalse)"},{"line_number":593,"context_line":""},{"line_number":594,"context_line":"    @mock.patch.object(set_configs, \u0027set_defaults_state\u0027)"},{"line_number":595,"context_line":"    @mock.patch.object(set_configs, \u0027ConfigFile\u0027)"},{"line_number":596,"context_line":"    @mock.patch(\u0027os.path.exists\u0027)"},{"line_number":597,"context_line":"    @mock.patch.object(set_configs, \u0027get_defaults_state\u0027, return_value\u003d{})"},{"line_number":598,"context_line":"    def test_handle_defaults_state_not_exist_config_exist("},{"line_number":599,"context_line":"            self, mock_get_defaults_state, mock_exists, mock_config_file,"},{"line_number":600,"context_line":"            mock_set_defaults_state):"},{"line_number":601,"context_line":"        \"\"\"Test handle_defaults() when no existing default config is present."},{"line_number":602,"context_line":""},{"line_number":603,"context_line":"        This test simulates the case where no prior default configuration file"},{"line_number":604,"context_line":"        exists and a new configuration file needs to be backed up. It verifies:"},{"line_number":605,"context_line":"        - The current default state is retrieved (empty in this case)."},{"line_number":606,"context_line":"        - The configuration file exists, and a backup is created for it."},{"line_number":607,"context_line":"        - The new state is saved after processing the configuration."},{"line_number":608,"context_line":""},{"line_number":609,"context_line":"        Mocks:"},{"line_number":610,"context_line":"        - get_defaults_state: Returns an empty state."},{"line_number":611,"context_line":"        - os.path.exists: Simulates that the source file exists."},{"line_number":612,"context_line":"        - ConfigFile: Mocks the behavior of the ConfigFile class for file"},{"line_number":613,"context_line":"          copying."},{"line_number":614,"context_line":"        - set_defaults_state: Ensures the new state is saved."},{"line_number":615,"context_line":"        \"\"\""},{"line_number":616,"context_line":""},{"line_number":617,"context_line":"        config \u003d {"},{"line_number":618,"context_line":"            \u0027config_files\u0027: ["},{"line_number":619,"context_line":"                {"},{"line_number":620,"context_line":"                    \u0027source\u0027: \u0027/source/file\u0027, \u0027dest\u0027: \u0027/dest/file\u0027"},{"line_number":621,"context_line":"                 }"},{"line_number":622,"context_line":"            ]"},{"line_number":623,"context_line":"        }"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"        # Simulate the file exists"},{"line_number":626,"context_line":"        mock_exists.return_value \u003d True"},{"line_number":627,"context_line":""},{"line_number":628,"context_line":"        copy \u003d {"},{"line_number":629,"context_line":"            \u0027source\u0027: \u0027/dest/file\u0027,"},{"line_number":630,"context_line":"            \u0027dest\u0027: set_configs.KOLLA_DEFAULTS + \u0027/dest/file\u0027,"},{"line_number":631,"context_line":"            \u0027preserve_properties\u0027: True"},{"line_number":632,"context_line":"        }"},{"line_number":633,"context_line":""},{"line_number":634,"context_line":"        expected_state \u003d {"},{"line_number":635,"context_line":"            \u0027/dest/file\u0027: copy"},{"line_number":636,"context_line":"        }"},{"line_number":637,"context_line":""},{"line_number":638,"context_line":"        # Create a mock instance of ConfigFile"},{"line_number":639,"context_line":"        mock_config_file_instance \u003d mock_config_file.return_value"},{"line_number":640,"context_line":"        mock_config_file_instance.copy \u003d mock.MagicMock()"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"        # Call the function being tested"},{"line_number":643,"context_line":"        set_configs.handle_defaults(config)"},{"line_number":644,"context_line":""},{"line_number":645,"context_line":"        # Check that the directory creation was called"},{"line_number":646,"context_line":"        mock_get_defaults_state.assert_called_once()"},{"line_number":647,"context_line":""},{"line_number":648,"context_line":"        # Verify that the ConfigFile was instantiated correctly"},{"line_number":649,"context_line":"        mock_config_file.assert_called_once_with(**copy)"},{"line_number":650,"context_line":""},{"line_number":651,"context_line":"        # Ensure the copy method was called for the ConfigFile instance"},{"line_number":652,"context_line":"        mock_config_file_instance.copy.assert_called_once()"},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"        # Check that the updated state was saved"},{"line_number":655,"context_line":"        mock_set_defaults_state.assert_called_once_with(expected_state)"},{"line_number":656,"context_line":""},{"line_number":657,"context_line":"    @mock.patch.object(set_configs, \u0027set_defaults_state\u0027)"},{"line_number":658,"context_line":"    @mock.patch.object(set_configs, \u0027ConfigFile\u0027)"},{"line_number":659,"context_line":"    @mock.patch(\u0027os.path.exists\u0027)"},{"line_number":660,"context_line":"    @mock.patch.object(set_configs, \u0027get_defaults_state\u0027, return_value\u003d{})"},{"line_number":661,"context_line":"    def test_handle_defaults_state_not_exist_config_not_exist("},{"line_number":662,"context_line":"            self, mock_get_defaults_state, mock_exists, mock_config_file,"},{"line_number":663,"context_line":"            mock_set_defaults_state):"},{"line_number":664,"context_line":"        \"\"\"Test handle_defaults() with no config file and no default state."},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"        This test simulates the scenario where the configuration file does not"},{"line_number":667,"context_line":"        exist, and no existing default state is present. It verifies:"},{"line_number":668,"context_line":"        - The current default state is retrieved (empty)."},{"line_number":669,"context_line":"        - Since the configuration file doesn\u0027t exist, no backup is made."},{"line_number":670,"context_line":"        - The state is updated accordingly."},{"line_number":671,"context_line":""},{"line_number":672,"context_line":"        Mocks:"},{"line_number":673,"context_line":"        - get_defaults_state: Returns an empty state."},{"line_number":674,"context_line":"        - os.path.exists: Simulates that the source"},{"line_number":675,"context_line":"                          exists (in /var/lib/kolla/config/) but the"},{"line_number":676,"context_line":"                          destination does not"},{"line_number":677,"context_line":"                          (real destination where file should be copied to)."},{"line_number":678,"context_line":"        - ConfigFile: Ensures no ConfigFile instance is created since no backup"},{"line_number":679,"context_line":"                      is needed."},{"line_number":680,"context_line":"        - set_defaults_state: Ensures the updated state is saved."},{"line_number":681,"context_line":"        \"\"\""},{"line_number":682,"context_line":""},{"line_number":683,"context_line":"        config \u003d {"},{"line_number":684,"context_line":"            \u0027config_files\u0027: ["},{"line_number":685,"context_line":"                {"},{"line_number":686,"context_line":"                    \u0027source\u0027: \u0027/source/file\u0027, \u0027dest\u0027: \u0027/dest/file\u0027"},{"line_number":687,"context_line":"                 }"},{"line_number":688,"context_line":"            ]"},{"line_number":689,"context_line":"        }"},{"line_number":690,"context_line":""},{"line_number":691,"context_line":"        # Simulate source exists but dest does not"},{"line_number":692,"context_line":"        def mock_exists_side_effect(path):"},{"line_number":693,"context_line":"            if path \u003d\u003d \u0027/source/file\u0027:"},{"line_number":694,"context_line":"                return True  # Source exists"},{"line_number":695,"context_line":"            return False  # Destination does not exist"},{"line_number":696,"context_line":""},{"line_number":697,"context_line":"        mock_exists.side_effect \u003d mock_exists_side_effect"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"        copy \u003d {"},{"line_number":700,"context_line":"            \u0027source\u0027: \u0027/dest/file\u0027,"},{"line_number":701,"context_line":"            \u0027dest\u0027: None,"},{"line_number":702,"context_line":"            \u0027preserve_properties\u0027: True"},{"line_number":703,"context_line":"        }"},{"line_number":704,"context_line":""},{"line_number":705,"context_line":"        expected_state \u003d {"},{"line_number":706,"context_line":"            \u0027/dest/file\u0027: copy"},{"line_number":707,"context_line":"        }"},{"line_number":708,"context_line":""},{"line_number":709,"context_line":"        # Create a mock instance of ConfigFile"},{"line_number":710,"context_line":"        mock_config_file_instance \u003d mock_config_file.return_value"},{"line_number":711,"context_line":"        mock_config_file_instance.copy \u003d mock.MagicMock()"},{"line_number":712,"context_line":""},{"line_number":713,"context_line":"        # Call the function being tested"},{"line_number":714,"context_line":"        set_configs.handle_defaults(config)"},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        # Ensure the current default state was retrieved"},{"line_number":717,"context_line":"        mock_get_defaults_state.assert_called_once()"},{"line_number":718,"context_line":""},{"line_number":719,"context_line":"        # Verify that ConfigFile was not instantiated (because"},{"line_number":720,"context_line":"        # dest doesn\u0027t exist - nothing to backup)"},{"line_number":721,"context_line":"        mock_config_file.assert_not_called()"},{"line_number":722,"context_line":""},{"line_number":723,"context_line":"        # Check that the updated state was saved"},{"line_number":724,"context_line":"        mock_set_defaults_state.assert_called_once_with(expected_state)"},{"line_number":725,"context_line":""},{"line_number":726,"context_line":"    @mock.patch.object(set_configs, \u0027set_defaults_state\u0027)"},{"line_number":727,"context_line":"    @mock.patch.object(set_configs, \u0027ConfigFile\u0027)"},{"line_number":728,"context_line":"    @mock.patch(\u0027os.remove\u0027)"},{"line_number":729,"context_line":"    @mock.patch(\u0027shutil.rmtree\u0027)"},{"line_number":730,"context_line":"    @mock.patch(\u0027os.path.isfile\u0027)"},{"line_number":731,"context_line":"    @mock.patch(\u0027os.path.exists\u0027)"},{"line_number":732,"context_line":"    @mock.patch.object(set_configs, \u0027get_defaults_state\u0027, return_value\u003d{"},{"line_number":733,"context_line":"        \"/dest/file\": {"},{"line_number":734,"context_line":"            \"source\": \"/dest/file\","},{"line_number":735,"context_line":"            \"preserve_properties\": True,"},{"line_number":736,"context_line":"            \"dest\": None"},{"line_number":737,"context_line":"        }"},{"line_number":738,"context_line":"    })"},{"line_number":739,"context_line":"    def test_handle_defaults_state_exist_config_exist_is_file("},{"line_number":740,"context_line":"            self, mock_get_defaults_state, mock_exists, mock_isfile,"},{"line_number":741,"context_line":"            mock_rmtree, mock_remove, mock_config_file,"},{"line_number":742,"context_line":"            mock_set_defaults_state):"},{"line_number":743,"context_line":"        \"\"\"Test handle_defaults() when the configuration exists and is a file."},{"line_number":744,"context_line":""},{"line_number":745,"context_line":"        This test simulates the scenario where a configuration file already"},{"line_number":746,"context_line":"        exists."},{"line_number":747,"context_line":"        It verifies:"},{"line_number":748,"context_line":"        - The current default state is retrieved."},{"line_number":749,"context_line":"        - The destination is identified as a file."},{"line_number":750,"context_line":"        - The file is removed."},{"line_number":751,"context_line":"        - The updated state is saved correctly after the file is handled."},{"line_number":752,"context_line":""},{"line_number":753,"context_line":"        Mocks:"},{"line_number":754,"context_line":"        - get_defaults_state: Returns an existing state."},{"line_number":755,"context_line":"        - os.path.exists: Simulates the destination file exists."},{"line_number":756,"context_line":"        - os.path.isfile: Ensures the destination is identified as a file."},{"line_number":757,"context_line":"        - os.remove: Ensures the file is removed."},{"line_number":758,"context_line":"        - set_defaults_state: Ensures the state is saved after processing."},{"line_number":759,"context_line":"        \"\"\""},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"        config \u003d {"},{"line_number":762,"context_line":"            \u0027config_files\u0027: ["},{"line_number":763,"context_line":"                {"},{"line_number":764,"context_line":"                    \u0027source\u0027: \u0027/source/file\u0027, \u0027dest\u0027: \u0027/dest/file\u0027"},{"line_number":765,"context_line":"                 }"},{"line_number":766,"context_line":"            ]"},{"line_number":767,"context_line":"        }"},{"line_number":768,"context_line":""},{"line_number":769,"context_line":"        # Simulate that destination exists and is a file"},{"line_number":770,"context_line":"        mock_exists.side_effect \u003d lambda path: path \u003d\u003d \"/dest/file\""},{"line_number":771,"context_line":"        mock_isfile.side_effect \u003d lambda path: path \u003d\u003d \"/dest/file\""},{"line_number":772,"context_line":""},{"line_number":773,"context_line":"        # Expected state after handling defaults"},{"line_number":774,"context_line":"        expected_state \u003d {"},{"line_number":775,"context_line":"            \"/dest/file\": {"},{"line_number":776,"context_line":"                \"source\": \"/dest/file\","},{"line_number":777,"context_line":"                \"preserve_properties\": True,"},{"line_number":778,"context_line":"                \"dest\": None"},{"line_number":779,"context_line":"            }"},{"line_number":780,"context_line":"        }"},{"line_number":781,"context_line":""},{"line_number":782,"context_line":"        # Call the function being tested"},{"line_number":783,"context_line":"        set_configs.handle_defaults(config)"},{"line_number":784,"context_line":""},{"line_number":785,"context_line":"        # Ensure the current default state was retrieved"},{"line_number":786,"context_line":"        mock_get_defaults_state.assert_called_once()"},{"line_number":787,"context_line":""},{"line_number":788,"context_line":"        # Verify that the file check was performed"},{"line_number":789,"context_line":"        mock_isfile.assert_called_once_with(\"/dest/file\")"},{"line_number":790,"context_line":""},{"line_number":791,"context_line":"        # Ensure the file is removed since it exists"},{"line_number":792,"context_line":"        mock_remove.assert_called_once_with(\"/dest/file\")"},{"line_number":793,"context_line":""},{"line_number":794,"context_line":"        # Ensure rmtree was not called since it\u0027s a file, not a directory"},{"line_number":795,"context_line":"        mock_rmtree.assert_not_called()"},{"line_number":796,"context_line":""},{"line_number":797,"context_line":"        # Verify that the updated state was saved"},{"line_number":798,"context_line":"        mock_set_defaults_state.assert_called_once_with(expected_state)"},{"line_number":799,"context_line":""},{"line_number":800,"context_line":"    @mock.patch.object(set_configs, \u0027set_defaults_state\u0027)"},{"line_number":801,"context_line":"    @mock.patch.object(set_configs, \u0027ConfigFile\u0027)"},{"line_number":802,"context_line":"    @mock.patch(\u0027os.remove\u0027)"},{"line_number":803,"context_line":"    @mock.patch(\u0027shutil.rmtree\u0027)"},{"line_number":804,"context_line":"    @mock.patch(\u0027os.path.isfile\u0027)"},{"line_number":805,"context_line":"    @mock.patch(\u0027os.path.exists\u0027)"},{"line_number":806,"context_line":"    @mock.patch.object(set_configs, \u0027get_defaults_state\u0027, return_value\u003d{"},{"line_number":807,"context_line":"        \"/dest/file\": {"},{"line_number":808,"context_line":"            \"source\": \"/dest/file\","},{"line_number":809,"context_line":"            \"preserve_properties\": True,"},{"line_number":810,"context_line":"            \"dest\": None"},{"line_number":811,"context_line":"        }"},{"line_number":812,"context_line":"    })"},{"line_number":813,"context_line":"    def test_handle_defaults_state_exist_config_exist_is_dir("},{"line_number":814,"context_line":"            self, mock_get_defaults_state, mock_exists, mock_isfile,"},{"line_number":815,"context_line":"            mock_rmtree, mock_remove, mock_config_file,"},{"line_number":816,"context_line":"            mock_set_defaults_state):"},{"line_number":817,"context_line":"        \"\"\"Test handle_defaults() when the conf file exists and is a directory."},{"line_number":818,"context_line":""},{"line_number":819,"context_line":"        This test simulates the scenario where the configuration exists as"},{"line_number":820,"context_line":"        a directory."},{"line_number":821,"context_line":"        It verifies:"},{"line_number":822,"context_line":"        - The current default state is retrieved."},{"line_number":823,"context_line":"        - The configuration is identified as a directory."},{"line_number":824,"context_line":"        - The configuration directory is removed using shutil.rmtree()."},{"line_number":825,"context_line":"        - The updated state is saved correctly after handling the directory."},{"line_number":826,"context_line":""},{"line_number":827,"context_line":"        Mocks:"},{"line_number":828,"context_line":"        - get_defaults_state: Returns an existing state."},{"line_number":829,"context_line":"        - os.path.exists: Simulates the destination directory exists."},{"line_number":830,"context_line":"        - os.path.isfile: Ensures the destination is not a file"},{"line_number":831,"context_line":"          (it’s a directory)."},{"line_number":832,"context_line":"        - shutil.rmtree: Ensures the directory is removed."},{"line_number":833,"context_line":"        - ConfigFile: Mocks the ConfigFile handling."},{"line_number":834,"context_line":"        - set_defaults_state: Ensures the state is saved after processing."},{"line_number":835,"context_line":"        \"\"\""},{"line_number":836,"context_line":""},{"line_number":837,"context_line":"        config \u003d {"},{"line_number":838,"context_line":"            \u0027config_files\u0027: ["},{"line_number":839,"context_line":"                {"},{"line_number":840,"context_line":"                    \u0027source\u0027: \u0027/source/file\u0027, \u0027dest\u0027: \u0027/dest/file\u0027"},{"line_number":841,"context_line":"                 }"},{"line_number":842,"context_line":"            ]"},{"line_number":843,"context_line":"        }"},{"line_number":844,"context_line":""},{"line_number":845,"context_line":"        # Simulate that destination exists and is a file"},{"line_number":846,"context_line":"        mock_exists.side_effect \u003d lambda path: path \u003d\u003d \"/dest/file\""},{"line_number":847,"context_line":"        # Simulate that destination exists, but it\u0027s a directory, not a file"},{"line_number":848,"context_line":"        mock_isfile.side_effect \u003d lambda path: False"},{"line_number":849,"context_line":""},{"line_number":850,"context_line":"        # Expected state after handling defaults"},{"line_number":851,"context_line":"        expected_state \u003d {"},{"line_number":852,"context_line":"            \"/dest/file\": {"},{"line_number":853,"context_line":"                \"source\": \"/dest/file\","},{"line_number":854,"context_line":"                \"preserve_properties\": True,"},{"line_number":855,"context_line":"                \"dest\": None"},{"line_number":856,"context_line":"            }"},{"line_number":857,"context_line":"        }"},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"        # Create a mock instance of ConfigFile"},{"line_number":860,"context_line":"        mock_config_file_instance \u003d mock_config_file.return_value"},{"line_number":861,"context_line":"        mock_config_file_instance.copy \u003d mock.MagicMock()"},{"line_number":862,"context_line":""},{"line_number":863,"context_line":"        # Call the function being tested"},{"line_number":864,"context_line":"        set_configs.handle_defaults(config)"},{"line_number":865,"context_line":""},{"line_number":866,"context_line":"        # Ensure the current default state was retrieved"},{"line_number":867,"context_line":"        mock_get_defaults_state.assert_called_once()"},{"line_number":868,"context_line":""},{"line_number":869,"context_line":"        # Verify that a file check was performed"},{"line_number":870,"context_line":"        mock_isfile.assert_called_once_with(\"/dest/file\")"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"        # Check that os.remove was called for the existing file"},{"line_number":873,"context_line":"        mock_remove.assert_not_called()"},{"line_number":874,"context_line":""},{"line_number":875,"context_line":"        # Since it\u0027s a directory, ensure rmtree was called to remove it"},{"line_number":876,"context_line":"        mock_rmtree.assert_called_once_with(\"/dest/file\")"},{"line_number":877,"context_line":""},{"line_number":878,"context_line":"        # Verify that the updated state was saved"},{"line_number":879,"context_line":"        mock_set_defaults_state.assert_called_once_with(expected_state)"},{"line_number":880,"context_line":""},{"line_number":881,"context_line":"    @mock.patch.object(set_configs, \u0027set_defaults_state\u0027)"},{"line_number":882,"context_line":"    @mock.patch.object(set_configs, \u0027ConfigFile\u0027)"},{"line_number":883,"context_line":"    @mock.patch(\u0027os.path.exists\u0027)"},{"line_number":884,"context_line":"    @mock.patch.object(set_configs, \u0027get_defaults_state\u0027, return_value\u003d{"},{"line_number":885,"context_line":"        \"/dest/file\": {"},{"line_number":886,"context_line":"            \"source\": \"/source/file\","},{"line_number":887,"context_line":"            \"dest\": \"/dest/file\","},{"line_number":888,"context_line":"            \"preserve_properties\": True"},{"line_number":889,"context_line":"        }"},{"line_number":890,"context_line":"    })"},{"line_number":891,"context_line":"    def test_handle_defaults_state_exist_config_restored("},{"line_number":892,"context_line":"            self, mock_get_defaults_state, mock_exists, mock_config_file,"},{"line_number":893,"context_line":"            mock_set_defaults_state):"},{"line_number":894,"context_line":"        \"\"\"Test handle_defaults() when dest is not None in the default state."},{"line_number":895,"context_line":""},{"line_number":896,"context_line":"        This test simulates the case where the destination in the default state"},{"line_number":897,"context_line":"        is not None, meaning a swap of source and destination is required."},{"line_number":898,"context_line":"        It verifies:"},{"line_number":899,"context_line":"        - The current default state is retrieved."},{"line_number":900,"context_line":"        - The source and destination are swapped in the ConfigFile"},{"line_number":901,"context_line":"          and restored."},{"line_number":902,"context_line":"        - The state is updated correctly after processing."},{"line_number":903,"context_line":""},{"line_number":904,"context_line":"        Mocks:"},{"line_number":905,"context_line":"        - get_defaults_state: Returns the current state."},{"line_number":906,"context_line":"        - ConfigFile: Mocks the behavior of ConfigFile with swapped"},{"line_number":907,"context_line":"          source/dest."},{"line_number":908,"context_line":"        - set_defaults_state: Ensures the state is saved after the swap and"},{"line_number":909,"context_line":"          processing."},{"line_number":910,"context_line":"        \"\"\""},{"line_number":911,"context_line":""},{"line_number":912,"context_line":"        # Configuration input (irrelevant in this case, as we\u0027re"},{"line_number":913,"context_line":"        # only focusing on state)"},{"line_number":914,"context_line":"        # Everything else is covered by other tests"},{"line_number":915,"context_line":"        config \u003d {}"},{"line_number":916,"context_line":""},{"line_number":917,"context_line":"        copy \u003d {"},{"line_number":918,"context_line":"            \"source\": \"/dest/file\","},{"line_number":919,"context_line":"            \"dest\": \"/source/file\",  # Swapped source and dest"},{"line_number":920,"context_line":"            \"preserve_properties\": True"},{"line_number":921,"context_line":"        }"},{"line_number":922,"context_line":""},{"line_number":923,"context_line":"        # Expected state after swapping source and dest"},{"line_number":924,"context_line":"        expected_state \u003d {"},{"line_number":925,"context_line":"            \"/dest/file\": {"},{"line_number":926,"context_line":"                \"source\": \"/dest/file\","},{"line_number":927,"context_line":"                \"dest\": \"/source/file\",  # Swapped source and dest"},{"line_number":928,"context_line":"                \"preserve_properties\": True"},{"line_number":929,"context_line":"            }"},{"line_number":930,"context_line":"        }"},{"line_number":931,"context_line":""},{"line_number":932,"context_line":"        # Create a mock instance of ConfigFile"},{"line_number":933,"context_line":"        mock_config_file_instance \u003d mock_config_file.return_value"},{"line_number":934,"context_line":"        mock_config_file_instance.copy \u003d mock.MagicMock()"},{"line_number":935,"context_line":""},{"line_number":936,"context_line":"        # Call the function being tested"},{"line_number":937,"context_line":"        set_configs.handle_defaults(config)"},{"line_number":938,"context_line":""},{"line_number":939,"context_line":"        # Ensure the current default state was retrieved"},{"line_number":940,"context_line":"        mock_get_defaults_state.assert_called_once()"},{"line_number":941,"context_line":""},{"line_number":942,"context_line":"        # Verify that ConfigFile was instantiated with the swapped"},{"line_number":943,"context_line":"        # source and dest"},{"line_number":944,"context_line":"        mock_config_file.assert_called_once_with(**copy)"},{"line_number":945,"context_line":""},{"line_number":946,"context_line":"        # Ensure the copy method was called for the ConfigFile instance"},{"line_number":947,"context_line":"        mock_config_file_instance.copy.assert_called_once()"},{"line_number":948,"context_line":""},{"line_number":949,"context_line":"        # Ensure the copy method was called on the ConfigFile instance"},{"line_number":950,"context_line":"        mock_config_file_instance.copy.assert_called_once()"},{"line_number":951,"context_line":""},{"line_number":952,"context_line":"        # Verify that the updated state was saved"},{"line_number":953,"context_line":"        mock_set_defaults_state.assert_called_once_with(expected_state)"},{"line_number":954,"context_line":""},{"line_number":955,"context_line":""},{"line_number":956,"context_line":"class ValidateConfigDirectoriesTest(base.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":3,"id":"a5f02664_711bd012","line":953,"range":{"start_line":497,"start_character":0,"end_line":953,"end_character":71},"updated":"2026-07-17 09:08:03.000000000","message":"You are changing the approach from read/write from json -\u003e yaml, but you are not changing tests ?","commit_id":"fffd72f78163363cbaaa75192ab491e705fbb184"}]}
