def test_repair_is_deferred(self):
        soledad = mock()
        when(soledad).get_all_docs().thenReturn(defer.succeed((1, [])))

        d = SoledadMaintenance(soledad).repair()

        self.assertIsInstance(d, defer.Deferred)
    def test_repair_delete_public_key_active_docs(self):
        soledad = mock()
        key = self._public_key(SOME_EMAIL_ADDRESS, SOME_KEY_ID)
        active_doc = SoledadDocument(doc_id='some_doc', json=key.get_active_json(SOME_EMAIL_ADDRESS))
        when(soledad).get_all_docs().thenReturn(defer.succeed((1, [active_doc])))

        yield SoledadMaintenance(soledad).repair()

        verify(soledad).delete_doc(active_doc)
    def test_repair_recreates_public_key_active_doc_if_necessary(self):
        soledad = mock()

        private_key = self._private_key(SOME_EMAIL_ADDRESS, SOME_KEY_ID)
        private_key_doc = SoledadDocument(doc_id='some_doc', json=private_key.get_json())
        when(soledad).get_all_docs().thenReturn(defer.succeed((1, [private_key_doc])))

        yield SoledadMaintenance(soledad).repair()

        verify(soledad).create_doc_from_json('{"key_id": "4914254E384E264C", "tags": ["keymanager-active"], "type": "OpenPGPKey-active", "private": false, "address": "*****@*****.**"}')
    def test_repair_only_deletes_key_docs(self):
        soledad = mock()
        key = self._public_key(SOME_EMAIL_ADDRESS, SOME_FINGERPRINT)
        key_doc = SoledadDocument(doc_id='some_doc',
                                  json=key.get_active_json())
        other_doc = SoledadDocument(doc_id='something', json='{}')
        when(soledad).get_all_docs().thenReturn(
            defer.succeed((1, [key_doc, other_doc])))

        yield SoledadMaintenance(soledad).repair()

        verify(soledad, never).delete_doc(other_doc)
    def test_repair_recreates_public_key_active_doc_if_necessary(self):
        soledad = mock()

        private_key = self._private_key(SOME_EMAIL_ADDRESS, SOME_FINGERPRINT)
        private_key_doc = SoledadDocument(doc_id='some_doc',
                                          json=private_key.get_active_json())
        when(soledad).get_all_docs().thenReturn(
            defer.succeed((1, [private_key_doc])))

        yield SoledadMaintenance(soledad).repair()

        verify(soledad).create_doc_from_json(
            '{"encr_used": false, "sign_used": false, "validation": "Weak_Chain", "version": 1, "address": "*****@*****.**", "last_audited_at": 0, "fingerprint": "4914254E384E264C", "type": "OpenPGPKey-active", "private": false, "tags": ["keymanager-active"]}'
        )
    def test_repair_keeps_active_and_key_doc_if_private_key_exists(self):
        soledad = mock()
        key = self._public_key(SOME_EMAIL_ADDRESS, SOME_KEY_ID)
        private_key = self._private_key(SOME_EMAIL_ADDRESS, SOME_KEY_ID)
        active_doc = SoledadDocument(doc_id='some_doc', json=key.get_active_json(SOME_EMAIL_ADDRESS))
        key_doc = SoledadDocument(doc_id='some_doc', json=key.get_json())
        private_key_doc = SoledadDocument(doc_id='some_doc', json=private_key.get_json())
        when(soledad).get_all_docs().thenReturn(defer.succeed((1, [key_doc, active_doc, private_key_doc])))

        yield SoledadMaintenance(soledad).repair()

        verify(soledad, never).delete_doc(key_doc)
        verify(soledad, never).delete_doc(active_doc)
        verify(soledad, never).delete_doc(private_key_doc)
def repair(args):
    leap_session, soledad = args

    yield SoledadMaintenance(soledad).repair()

    defer.returnValue(args)