def test_tmp_cachedir(self):
        """
        Test the cache directory processor with temporary directory.
        """

        sut = Cachedir()
        insert = {
            'inserts': ['a'],
            'deletes': [],
            'data': {
                'a': {}
            }
        }
        expected = copy.deepcopy(insert)

        # >>> hashlib.sha1('a').hexdigest()
        # '86f7e437faa5a7fce15d1ddcb9eaeaea377667b8'
        expected_dir = '/path/to/tempdir'
        expected_path = expected_dir + '/86/f7e437faa5a7fce15d1ddcb9eaeaea377667b8'
        expected['data']['a']['cachedir'] = expected_path

        matches = MatchesSendDeltaItemInvocation(expected, sut)
        send = Mock(spec=Scheduler.send)
        with patch('tempfile.mkdtemp', spec=tempfile.mkdtemp, return_value=expected_dir) as mkdtemp_mock:
            with patch('os.makedirs', spec=os.makedirs) as makedirs_mock:
                with patch('shutil.rmtree', spec=shutil.rmtree) as rmtree_mock:
                    sut(insert, send)

        self.assertEquals(send.call_count, 1)
        self.assertThat(send.call_args, matches)

        mkdtemp_mock.assert_called_once_with()
        rmtree_mock.assert_called_once_with(expected_path, ignore_errors=True)
        makedirs_mock.assert_called_once_with(expected_path)

        with patch('shutil.rmtree', spec=shutil.rmtree) as rmtree_mock:
            sut.detach()

        rmtree_mock.assert_called_once_with(expected_dir, ignore_errors=True)
    def test_cachedir(self):
        """
        Test the cache directory processor.
        """

        sut = Cachedir(directory='/path/to/testdir', destkey='test_cachedir')

        # insert operation.
        insert = {
            'inserts': ['a'],
            'deletes': [],
            'data': {
                'a': {}
            }
        }
        expected = copy.deepcopy(insert)

        # >>> hashlib.sha1('a').hexdigest()
        # '86f7e437faa5a7fce15d1ddcb9eaeaea377667b8'
        expected_path = '/path/to/testdir/86/f7e437faa5a7fce15d1ddcb9eaeaea377667b8'
        expected['data']['a']['test_cachedir'] = expected_path

        matches = MatchesSendDeltaItemInvocation(expected, sut)
        send = Mock(spec=Scheduler.send)
        with patch('tempfile.mkdtemp', spec=tempfile.mkdtemp) as mkdtemp_mock:
            with patch('os.makedirs', spec=os.makedirs) as makedirs_mock:
                with patch('shutil.rmtree', spec=shutil.rmtree) as rmtree_mock:
                    sut(insert, send)

        self.assertEquals(send.call_count, 1)
        self.assertThat(send.call_args, matches)

        self.assertEquals(mkdtemp_mock.call_count, 0)
        rmtree_mock.assert_called_once_with(expected_path, ignore_errors=True)
        makedirs_mock.assert_called_once_with(expected_path)

        # delete operation.
        delete = {
            'inserts': [],
            'deletes': ['a'],
            'data': {
                'a': {}
            }
        }
        expected = copy.deepcopy(delete)

        matches = MatchesSendDeltaItemInvocation(expected, sut)
        send = Mock(spec=Scheduler.send)
        with patch('tempfile.mkdtemp', spec=tempfile.mkdtemp) as mkdtemp_mock:
            with patch('os.makedirs', spec=os.makedirs) as makedirs_mock:
                with patch('shutil.rmtree', spec=shutil.rmtree) as rmtree_mock:
                    sut(delete, send)

        self.assertEquals(send.call_count, 1)
        self.assertThat(send.call_args, matches)

        self.assertEquals(mkdtemp_mock.call_count, 0)
        rmtree_mock.assert_called_once_with(expected_path, ignore_errors=False)
        self.assertEquals(makedirs_mock.call_count, 0)

        # detach method
        with patch('shutil.rmtree', spec=shutil.rmtree) as rmtree_mock:
            sut.detach()

        self.assertEquals(rmtree_mock.call_count, 0)