def test_open_not_existing(self):
        fake_file_path = '/fake_path/file_storage.data'
        fake_dir_name = os.path.dirname(fake_file_path)
        mock_chmod_calls = [
            mock.call(fake_dir_name,
                      stat.S_IRWXU | stat.S_IRGRP | stat.S_IXGRP),
            mock.call(fake_file_path, stat.S_IRUSR | stat.S_IWUSR)
        ]
        mock_open_calls = [
            mock.call(fake_file_path, 'w'),
            mock.call(fake_file_path, 'r+'),
        ]

        self.mock_object(passwd.os.path, 'isfile', return_value=False)
        self.mock_object(passwd.os.path, 'isdir', return_value=False)
        mock_makedirs = self.mock_object(passwd.os, 'makedirs')
        mock_chmod = self.mock_object(passwd.os, 'chmod')
        mock_open = self.mock_object(passwd,
                                     'open',
                                     return_value=mock.MagicMock())

        file_storage = passwd.FileStorage(fake_file_path)
        file_storage.open()
        mock_makedirs.assert_called_with(fake_dir_name)
        mock_chmod.assert_has_calls(mock_chmod_calls, any_order=True)
        mock_open.assert_has_calls(mock_open_calls, any_order=True)
    def test_open(self):
        fake_file_path = 'file_storage.data'
        self.mock_object(passwd.os.path, 'isfile', return_value=True)
        self.mock_object(passwd.os.path, 'isdir', return_value=True)
        mock_open = self.mock_object(passwd, 'open', mock.mock_open())

        file_storage = passwd.FileStorage(fake_file_path)
        file_storage.open()
        mock_open.assert_called_once_with(fake_file_path, 'r+')
    def test_save_not_dictionary(self):
        fake_file_name = 'file_storage.data'
        fake_file = self._get_fake_file('')
        fake_os_stat = self._get_fake_os_stat(0)

        self._mock_file_open(fake_file, fake_os_stat)

        file_storage = passwd.FileStorage(fake_file_name)
        file_storage.open()
        self.assertRaises(TypeError, file_storage.save, [])
    def test_load_malformed_file(self):
        fake_file_name = 'file_storage.data'
        fake_file = self._get_fake_file('[1, 2, 3]')
        fake_os_stat = self._get_fake_os_stat(1)

        self._mock_file_open(fake_file, fake_os_stat)

        file_storage = passwd.FileStorage(fake_file_name)
        file_storage.open()
        self.assertRaises(ValueError, file_storage.load)
    def test_close(self):
        fake_file_name = 'file_storage.data'
        fake_file = mock.MagicMock()

        self.mock_object(passwd.os.path, 'isfile', return_value=True)
        self.mock_object(passwd.os.path, 'isdir', return_value=True)
        self.mock_object(passwd, 'open', return_value=fake_file)

        file_storage = passwd.FileStorage(fake_file_name)
        file_storage.open()
        file_storage.close()
        fake_file.close.assert_called_once_with()
    def test_load_empty_file(self):
        fake_file_name = 'file_storage.data'
        fake_file = self._get_fake_file()
        fake_os_stat = self._get_fake_os_stat(0)

        self._mock_file_open(fake_file, fake_os_stat)

        file_storage = passwd.FileStorage(fake_file_name)
        file_storage.open()
        result = file_storage.load()
        expected = {}
        self.assertEqual(expected, result)
    def test_open_not_closed(self):
        fake_file_path = 'file_storage.data'
        fake_file = mock.MagicMock()
        mock_open_calls = [
            mock.call(fake_file_path, 'r+'),
            mock.call(fake_file_path, 'r+'),
        ]
        self.mock_object(passwd.os.path, 'isfile', return_value=True)
        self.mock_object(passwd.os.path, 'isdir', return_value=True)
        mock_open = self.mock_object(passwd, 'open', return_value=fake_file)

        file_storage = passwd.FileStorage(fake_file_path)
        file_storage.open()
        file_storage.open()
        mock_open.assert_has_calls(mock_open_calls)
        fake_file.close.assert_called_once_with()
    def test_save(self):
        fake_file_name = 'file_storage.data'
        fake_file = self._get_fake_file('')
        fake_os_stat = self._get_fake_os_stat(0)

        self._mock_file_open(fake_file, fake_os_stat)

        passwords = {
            'resource1': {
                'user1': 'resource1-user1',
                'user2': 'resource1-user2',
            },
            'resource2': {
                'user1': 'resource2-user1',
                'user2': 'resource2-user2'
            }
        }
        fake_file_content = json.dumps(passwords)
        file_storage = passwd.FileStorage(fake_file_name)
        file_storage.open()
        file_storage.save(passwords)
        self.assertEqual(fake_file_content, fake_file.getvalue())
    def test_load(self):
        passwords = {
            'resource1': {
                'user1': 'resource1-user1',
                'user2': 'resource1-user2',
            },
            'resource2': {
                'user1': 'resource2-user1',
                'user2': 'resource2-user2'
            }
        }
        fake_file_name = 'file_storage.data'
        fake_file_content = json.dumps(passwords)
        fake_file = self._get_fake_file(fake_file_content)
        fake_os_stat = self._get_fake_os_stat(1)

        self._mock_file_open(fake_file, fake_os_stat)

        file_storage = passwd.FileStorage(fake_file_name)
        file_storage.open()
        result = file_storage.load()
        self.assertEqual(passwords, result)