示例#1
0
    async def test_import_routes_multitenant_middleware(self):
        # imports all default admin routes
        context = InjectionContext()
        context.injector.bind_instance(ProtocolRegistry, ProtocolRegistry())
        profile = InMemoryProfile.test_profile()
        context.injector.bind_instance(
            test_module.MultitenantManager,
            test_module.MultitenantManager(profile),
        )
        await DefaultContextBuilder().load_plugins(context)
        server = self.get_admin_server(
            {
                "admin.admin_insecure_mode": False,
                "admin.admin_api_key": "test-api-key",
            },
            context,
        )

        # cover multitenancy start code
        app = await server.make_application()
        app["swagger_dict"] = {}
        await server.on_startup(app)

        # multitenant authz
        [mt_authz_middle] = [
            m for m in app.middlewares
            if ".check_multitenant_authorization" in str(m)
        ]

        mock_request = async_mock.MagicMock(
            method="GET",
            headers={"Authorization": "Bearer ..."},
            path="/multitenancy/etc",
            text=async_mock.CoroutineMock(return_value="abc123"),
        )
        with self.assertRaises(test_module.web.HTTPUnauthorized):
            await mt_authz_middle(mock_request, None)

        mock_request = async_mock.MagicMock(
            method="GET",
            headers={},
            path="/protected/non-multitenancy/non-server",
            text=async_mock.CoroutineMock(return_value="abc123"),
        )
        with self.assertRaises(test_module.web.HTTPUnauthorized):
            await mt_authz_middle(mock_request, None)

        mock_request = async_mock.MagicMock(
            method="GET",
            headers={"Authorization": "Bearer ..."},
            path="/protected/non-multitenancy/non-server",
            text=async_mock.CoroutineMock(return_value="abc123"),
        )
        mock_handler = async_mock.CoroutineMock()
        await mt_authz_middle(mock_request, mock_handler)
        assert mock_handler.called_once_with(mock_request)

        # multitenant setup context exception paths
        [setup_ctx_middle
         ] = [m for m in app.middlewares if ".setup_context" in str(m)]

        mock_request = async_mock.MagicMock(
            method="GET",
            headers={"Authorization": "Non-bearer ..."},
            path="/protected/non-multitenancy/non-server",
            text=async_mock.CoroutineMock(return_value="abc123"),
        )
        with self.assertRaises(test_module.web.HTTPUnauthorized):
            await setup_ctx_middle(mock_request, None)

        mock_request = async_mock.MagicMock(
            method="GET",
            headers={"Authorization": "Bearer ..."},
            path="/protected/non-multitenancy/non-server",
            text=async_mock.CoroutineMock(return_value="abc123"),
        )
        with async_mock.patch.object(
                server.multitenant_manager,
                "get_profile_for_token",
                async_mock.CoroutineMock(),
        ) as mock_get_profile:
            mock_get_profile.side_effect = [
                test_module.MultitenantManagerError("corrupt token"),
                test_module.StorageNotFoundError("out of memory"),
            ]
            for i in range(2):
                with self.assertRaises(test_module.web.HTTPUnauthorized):
                    await setup_ctx_middle(mock_request, None)
    async def test_called_auto_present(self):
        request_context = RequestContext.test_context()
        request_context.connection_record = async_mock.MagicMock()
        request_context.connection_record.connection_id = "dummy"
        request_context.message = PresentationRequest()
        request_context.message.indy_proof_request = async_mock.MagicMock(
            return_value={
                "name": "proof-request",
                "version": "1.0",
                "nonce": "1234567890",
                "requested_attributes": {
                    "0_favourite_uuid": {
                        "name": "favourite",
                        "restrictions": [
                            {
                                "cred_def_id": CD_ID,
                            }
                        ],
                    },
                    "1_icon_uuid": {
                        "name": "icon",
                        "restrictions": [
                            {
                                "cred_def_id": CD_ID,
                            }
                        ],
                    },
                },
                "requested_predicates": {},
            }
        )
        request_context.message_receipt = MessageReceipt()
        presentation_proposal = PresentationProposal(
            comment="Hello World", presentation_proposal=PRES_PREVIEW
        )
        px_rec_instance = test_module.V10PresentationExchange(
            presentation_proposal_dict=presentation_proposal,
            auto_present=True,
        )
        with async_mock.patch.object(
            test_module, "PresentationManager", autospec=True
        ) as mock_pres_mgr, async_mock.patch.object(
            test_module, "V10PresentationExchange", autospec=True
        ) as mock_pres_ex_cls, async_mock.patch.object(
            test_module, "IndyHolder", autospec=True
        ) as mock_holder:

            mock_holder.get_credentials_for_presentation_request_by_referent = (
                async_mock.CoroutineMock(
                    return_value=[{"cred_info": {"referent": "dummy"}}]
                )
            )
            request_context.inject = async_mock.MagicMock(return_value=mock_holder)

            mock_pres_ex_cls.return_value = px_rec_instance
            mock_pres_ex_cls.retrieve_by_tag_filter = async_mock.CoroutineMock(
                return_value=px_rec_instance
            )
            mock_pres_mgr.return_value.receive_request = async_mock.CoroutineMock(
                return_value=px_rec_instance
            )

            mock_pres_mgr.return_value.create_presentation = async_mock.CoroutineMock(
                return_value=(px_rec_instance, "presentation_message")
            )
            request_context.connection_ready = True
            handler = test_module.PresentationRequestHandler()
            responder = MockResponder()
            await handler.handle(request_context, responder)
            mock_pres_mgr.return_value.create_presentation.assert_called_once()

        mock_pres_mgr.return_value.receive_request.assert_called_once_with(
            px_rec_instance
        )
        messages = responder.messages
        assert len(messages) == 1
        (result, target) = messages[0]
        assert result == "presentation_message"
        assert target == {}
    async def test_called_auto_present_bait_and_switch(self):
        request_context = RequestContext.test_context()
        request_context.connection_record = async_mock.MagicMock()
        request_context.connection_record.connection_id = "dummy"
        request_context.message = PresentationRequest()
        request_context.message.indy_proof_request = async_mock.MagicMock(
            return_value={
                "name": "proof-request",
                "version": "1.0",
                "nonce": "1234567890",
                "requested_attributes": {
                    "0_favourite_uuid": {
                        "name": "favourite",
                        "restrictions": [
                            {
                                "cred_def_id": CD_ID,
                            }
                        ],
                    }
                },
                "requested_predicates": {},
            }
        )
        request_context.message_receipt = MessageReceipt()
        px_rec_instance = test_module.V10PresentationExchange(
            presentation_proposal_dict={
                "presentation_proposal": {
                    "@type": DIDCommPrefix.qualify_current(
                        "present-proof/1.0/presentation-preview"
                    ),
                    "attributes": [
                        {"name": "favourite", "cred_def_id": CD_ID, "value": "potato"}
                    ],
                    "predicates": [],
                }
            },
            auto_present=True,
        )

        with async_mock.patch.object(
            test_module, "PresentationManager", autospec=True
        ) as mock_pres_mgr, async_mock.patch.object(
            test_module, "V10PresentationExchange", autospec=True
        ) as mock_pres_ex_cls, async_mock.patch.object(
            test_module, "IndyHolder", autospec=True
        ) as mock_holder:

            by_reft = async_mock.CoroutineMock(
                return_value=[
                    {
                        "cred_info": {
                            "referent": "dummy-0",
                            "cred_def_id": CD_ID,
                            "attrs": {"ident": "zero", "favourite": "yam"},
                        }
                    },
                    {
                        "cred_info": {
                            "referent": "dummy-1",
                            "cred_def_id": CD_ID,
                            "attrs": {"ident": "one", "favourite": "turnip"},
                        }
                    },
                    {
                        "cred_info": {
                            "referent": "dummy-2",
                            "cred_def_id": CD_ID,
                            "attrs": {
                                "ident": "two",
                                "favourite": "the idea of a potato but not a potato",
                            },
                        }
                    },
                ]
            )
            mock_holder.get_credentials_for_presentation_request_by_referent = by_reft
            request_context.inject = async_mock.MagicMock(return_value=mock_holder)

            mock_pres_ex_cls.return_value = px_rec_instance
            mock_pres_ex_cls.retrieve_by_tag_filter = async_mock.CoroutineMock(
                return_value=px_rec_instance
            )
            mock_pres_mgr.return_value.receive_request = async_mock.CoroutineMock(
                return_value=px_rec_instance
            )

            mock_pres_mgr.return_value.create_presentation = async_mock.CoroutineMock(
                return_value=(px_rec_instance, "presentation_message")
            )
            request_context.connection_ready = True
            handler = test_module.PresentationRequestHandler()
            responder = MockResponder()

            await handler.handle(request_context, responder)
            mock_pres_mgr.return_value.create_presentation.assert_not_called()

        mock_pres_mgr.return_value.receive_request.assert_called_once_with(
            px_rec_instance
        )
        assert not responder.messages
示例#4
0
    async def test_respond_on_interactive_actions(self):
        """Test the respond method for interactive actions in Slack."""

        result = amock.Mock()
        result.json = amock.CoroutineMock()
        result.json.return_value = {"success": "payload sent."}

        payload = {
            "type":
            "message_action",
            "team": {
                "id": "TXXXXXX",
                "domain": "coverbands"
            },
            "user": {
                "id": "UXXXXXX",
                "name": "dreamweaver"
            },
            "response_url":
            "https://hooks.slack.com/app-actions/T0MJR11A4/21974584944/yk1S9ndf35Q1flupVG5JbpM6",
        }

        interactive_action = InteractiveAction(payload)
        with amock.patch("aiohttp.ClientSession.post") as patched_request:
            patched_request.return_value = asyncio.Future()
            patched_request.return_value.set_result(result)
            await interactive_action.respond("Respond called with response_url"
                                             )
            self.assertTrue(patched_request.called)

        payload = {
            "type": "view_closed",
            "team": {
                "id": "TXXXXXX",
                "domain": "coverbands"
            },
            "user": {
                "id": "UXXXXXX",
                "name": "dreamweaver"
            },
        }

        interactive_action = InteractiveAction(payload)
        with amock.patch("aiohttp.ClientSession.post") as patched_request:
            patched_request.return_value = asyncio.Future()
            patched_request.return_value.set_result(result)
            await interactive_action.respond(
                "Respond called without response_url")
            self.assertFalse(patched_request.called)

        with OpsDroid() as opsdroid:
            connector = ConnectorSlack({"token": "abc123"},
                                       opsdroid=OpsDroid())
            raw_message = {
                "text": "Hello world",
                "user_id": "user_id",
                "user": "******",
                "room": "default",
            }
            message = Message(
                text="Hello world",
                user_id="user_id",
                user="******",
                target="default",
                connector=connector,
                raw_event=raw_message,
            )
            opsdroid.send = amock.CoroutineMock()

            with amock.patch("aiohttp.ClientSession.post") as patched_request:
                patched_request.return_value = asyncio.Future()
                patched_request.return_value.set_result(result)
                await interactive_action.respond(message)
                self.assertTrue(opsdroid.send.called)
                self.assertFalse(patched_request.called)
 async def test_listen(self):
     self.connector.side_effect = Exception()
     await self.connector.listen(amock.CoroutineMock())
    async def test_record(self):
        with async_mock.patch.object(
                test_wallet, "load_postgres_plugin",
                async_mock.MagicMock()) as mock_load, async_mock.patch.object(
                    indy.wallet, "create_wallet", async_mock.CoroutineMock(
                    )) as mock_create, async_mock.patch.object(
                        indy.wallet, "open_wallet", async_mock.CoroutineMock()
                    ) as mock_open, async_mock.patch.object(
                        indy.anoncreds, "prover_create_master_secret",
                        async_mock.CoroutineMock()
                    ) as mock_master, async_mock.patch.object(
                        indy.wallet, "close_wallet", async_mock.CoroutineMock(
                        )) as mock_close, async_mock.patch.object(
                            indy.wallet, "delete_wallet",
                            async_mock.CoroutineMock()) as mock_delete:
            fake_wallet = IndyWallet({
                "auto_create":
                True,
                "auto_remove":
                True,
                "name":
                "test_pg_wallet",
                "key":
                await IndyWallet.generate_wallet_key(),
                "key_derivation_method":
                "RAW",
                "storage_type":
                "postgres_storage",
                "storage_config":
                json.dumps({"url": "dummy"}),
                "storage_creds":
                json.dumps({
                    "account": "postgres",
                    "password": "******",
                    "admin_account": "postgres",
                    "admin_password": "******",
                }),
            })
            await fake_wallet.open()
            storage = IndyStorage(fake_wallet)

            for record_x in [
                    None,
                    StorageRecord(
                        type="connection",
                        value=json.dumps({
                            "initiator":
                            "self",
                            "invitation_key":
                            "9XgL7Y4TBTJyVJdomT6axZGUFg9npxcrXnRT4CG8fWYg",
                            "state":
                            "invitation",
                            "routing_state":
                            "none",
                            "error_msg":
                            None,
                            "their_label":
                            None,
                            "created_at":
                            "2019-05-14 21:58:24.143260+00:00",
                            "updated_at":
                            "2019-05-14 21:58:24.143260+00:00",
                        }),
                        tags={
                            "initiator": "self",
                            "invitation_key":
                            "9XgL7Y4TBTJyVJdomT6axZGUFg9npxcrXnRT4CG8fWYg",
                            "state": "invitation",
                            "routing_state": "none",
                        },
                        id=None,
                    ),
                    StorageRecord(
                        type=None,
                        value=json.dumps({
                            "initiator":
                            "self",
                            "invitation_key":
                            "9XgL7Y4TBTJyVJdomT6axZGUFg9npxcrXnRT4CG8fWYg",
                            "state":
                            "invitation",
                            "routing_state":
                            "none",
                            "error_msg":
                            None,
                            "their_label":
                            None,
                            "created_at":
                            "2019-05-14 21:58:24.143260+00:00",
                            "updated_at":
                            "2019-05-14 21:58:24.143260+00:00",
                        }),
                        tags={
                            "initiator": "self",
                            "invitation_key":
                            "9XgL7Y4TBTJyVJdomT6axZGUFg9npxcrXnRT4CG8fWYg",
                            "state": "invitation",
                            "routing_state": "none",
                        },
                        id="f96f76ec-0e9b-4f32-8237-f4219e6cf0c7",
                    ),
                    StorageRecord(
                        type="connection",
                        value=None,
                        tags={
                            "initiator": "self",
                            "invitation_key":
                            "9XgL7Y4TBTJyVJdomT6axZGUFg9npxcrXnRT4CG8fWYg",
                            "state": "invitation",
                            "routing_state": "none",
                        },
                        id="f96f76ec-0e9b-4f32-8237-f4219e6cf0c7",
                    ),
            ]:
                with pytest.raises(StorageError):
                    await storage.add_record(record_x)

            with pytest.raises(StorageError):
                await storage.get_record(None, "dummy-id")
            with pytest.raises(StorageError):
                await storage.get_record("connection", None)

            with async_mock.patch.object(
                    test_module.non_secrets, "get_wallet_record",
                    async_mock.CoroutineMock()) as mock_get_record:
                mock_get_record.side_effect = test_module.IndyError(
                    test_module.ErrorCode.CommonInvalidStructure)
                with pytest.raises(test_module.StorageError):
                    await storage.get_record("connection", "dummy-id")

            with async_mock.patch.object(
                    test_module.non_secrets,
                    "update_wallet_record_value",
                    async_mock.CoroutineMock(),
            ) as mock_update_value, async_mock.patch.object(
                    test_module.non_secrets,
                    "update_wallet_record_tags",
                    async_mock.CoroutineMock(),
            ) as mock_update_tags, async_mock.patch.object(
                    test_module.non_secrets,
                    "delete_wallet_record",
                    async_mock.CoroutineMock(),
            ) as mock_delete:
                mock_update_value.side_effect = test_module.IndyError(
                    test_module.ErrorCode.CommonInvalidStructure)
                mock_update_tags.side_effect = test_module.IndyError(
                    test_module.ErrorCode.CommonInvalidStructure)
                mock_delete.side_effect = test_module.IndyError(
                    test_module.ErrorCode.CommonInvalidStructure)

                rec = StorageRecord(
                    type="connection",
                    value=json.dumps({
                        "initiator":
                        "self",
                        "invitation_key":
                        "9XgL7Y4TBTJyVJdomT6axZGUFg9npxcrXnRT4CG8fWYg",
                        "state":
                        "invitation",
                        "routing_state":
                        "none",
                        "error_msg":
                        None,
                        "their_label":
                        None,
                        "created_at":
                        "2019-05-14 21:58:24.143260+00:00",
                        "updated_at":
                        "2019-05-14 21:58:24.143260+00:00",
                    }),
                    tags={
                        "initiator": "self",
                        "invitation_key":
                        "9XgL7Y4TBTJyVJdomT6axZGUFg9npxcrXnRT4CG8fWYg",
                        "state": "invitation",
                        "routing_state": "none",
                    },
                    id="f96f76ec-0e9b-4f32-8237-f4219e6cf0c7",
                )

                with pytest.raises(test_module.StorageError):
                    await storage.update_record_value(rec, "dummy-value")

                with pytest.raises(test_module.StorageError):
                    await storage.update_record_tags(rec, {"tag": "tag"})

                with pytest.raises(test_module.StorageError):
                    await storage.delete_record(rec)
示例#7
0
 async def test_replace_usernames(self):
     connector = ConnectorSlack({"token": "abc123"}, opsdroid=OpsDroid())
     connector.lookup_username = amock.CoroutineMock()
     connector.lookup_username.return_value = {"name": "user"}
     result = await connector.replace_usernames("Hello <@U023BECGF>!")
     self.assertEqual(result, "Hello user!")
示例#8
0
    async def setUp(self):
        self.context = RequestContext(base_context=InjectionContext(
            enforce_typing=False))

        Ledger = async_mock.MagicMock(BaseLedger, autospec=True)
        self.ledger = Ledger()
        self.ledger.get_schema = async_mock.CoroutineMock(
            return_value=async_mock.MagicMock())
        self.ledger.get_credential_definition = async_mock.CoroutineMock(
            return_value={"value": {
                "revocation": {
                    "...": "..."
                }
            }})
        self.ledger.get_revoc_reg_def = async_mock.CoroutineMock(
            return_value={
                "ver": "1.0",
                "id": RR_ID,
                "revocDefType": "CL_ACCUM",
                "tag": RR_ID.split(":")[-1],
                "credDefId": CD_ID,
                "value": {
                    "IssuanceType": "ISSUANCE_BY_DEFAULT",
                    "maxCredNum": 1000,
                    "publicKeys": {
                        "accumKey": {
                            "z": "1 ..."
                        }
                    },
                    "tailsHash":
                    "3MLjUFQz9x9n5u9rFu8Ba9C5bo4HNFjkPNc54jZPSNaZ",
                    "tailsLocation": "http://sample.ca/path",
                },
            })
        self.ledger.get_revoc_reg_delta = async_mock.CoroutineMock(
            return_value=(
                {
                    "ver": "1.0",
                    "value": {
                        "prevAccum": "1 ...",
                        "accum": "21 ...",
                        "issued": [1]
                    },
                },
                NOW,
            ))
        self.ledger.get_revoc_reg_entry = async_mock.CoroutineMock(
            return_value=(
                {
                    "ver": "1.0",
                    "value": {
                        "prevAccum": "1 ...",
                        "accum": "21 ...",
                        "issued": [1]
                    },
                },
                NOW,
            ))
        self.context.injector.bind_instance(BaseLedger, self.ledger)

        Holder = async_mock.MagicMock(IndyHolder, autospec=True)
        self.holder = Holder()
        get_creds = async_mock.CoroutineMock(return_value=(
            {
                "cred_info": {
                    "referent": "dummy_reft",
                    "attrs": {
                        "player": "Richie Knucklez",
                        "screenCapture": "aW1hZ2luZSBhIHNjcmVlbiBjYXB0dXJl",
                        "highScore": "1234560",
                    },
                }
            },  # leave this comma: return a tuple
        ))
        self.holder.get_credentials_for_presentation_request_by_referent = get_creds
        self.holder.get_credential = async_mock.CoroutineMock(
            return_value=json.dumps({
                "schema_id": S_ID,
                "cred_def_id": CD_ID,
                "rev_reg_id": RR_ID,
                "cred_rev_id": 1,
            }))
        self.holder.create_presentation = async_mock.CoroutineMock(
            return_value="{}")
        self.holder.create_revocation_state = async_mock.CoroutineMock(
            return_value=json.dumps({
                "witness": {
                    "omega": "1 ..."
                },
                "rev_reg": {
                    "accum": "21 ..."
                },
                "timestamp": NOW,
            }))
        self.context.injector.bind_instance(IndyHolder, self.holder)

        Verifier = async_mock.MagicMock(IndyVerifier, autospec=True)
        self.verifier = Verifier()
        self.verifier.verify_presentation = async_mock.CoroutineMock(
            return_value="true")
        self.context.injector.bind_instance(IndyVerifier, self.verifier)

        self.manager = PresentationManager(self.context)
示例#9
0
 async def test_fetch_genesis_transactions(self):
     with async_mock.patch.object(test_module, "fetch",
                                  async_mock.CoroutineMock()) as mock_fetch:
         await test_module.fetch_genesis_transactions(
             "http://1.2.3.4:9000/genesis")
示例#10
0
    async def test_create_presentation_bad_revoc_state(self):
        self.context.connection_record = async_mock.MagicMock()
        self.context.connection_record.connection_id = CONN_ID

        exchange_in = V10PresentationExchange()
        indy_proof_req = await PRES_PREVIEW.indy_proof_request(
            name=PROOF_REQ_NAME,
            version=PROOF_REQ_VERSION,
            nonce=PROOF_REQ_NONCE,
            ledger=await self.context.inject(BaseLedger, required=False),
        )

        exchange_in.presentation_request = indy_proof_req
        request = async_mock.MagicMock()
        request.indy_proof_request = async_mock.MagicMock()
        request._thread_id = "dummy"
        self.context.message = request

        Holder = async_mock.MagicMock(IndyHolder, autospec=True)
        self.holder = Holder()
        get_creds = async_mock.CoroutineMock(return_value=(
            {
                "cred_info": {
                    "referent": "dummy_reft"
                },
                "attrs": {
                    "player": "Richie Knucklez",
                    "screenCapture": "aW1hZ2luZSBhIHNjcmVlbiBjYXB0dXJl",
                    "highScore": "1234560",
                },
            },  # leave this comma: return a tuple
        ))
        self.holder.get_credentials_for_presentation_request_by_referent = get_creds

        self.holder.get_credential = async_mock.CoroutineMock(
            return_value=json.dumps({
                "schema_id": S_ID,
                "cred_def_id": CD_ID,
                "rev_reg_id": RR_ID,
                "cred_rev_id": 1,
            }))
        self.holder.create_presentation = async_mock.CoroutineMock(
            return_value="{}")
        self.holder.create_revocation_state = async_mock.CoroutineMock(
            side_effect=test_module.IndyHolderError("Problem",
                                                    {"message": "Nope"}))
        self.context.injector.clear_binding(IndyHolder)
        self.context.injector.bind_instance(IndyHolder, self.holder)

        more_magic_rr = async_mock.MagicMock(
            get_or_fetch_local_tails_path=async_mock.CoroutineMock(
                return_value="/tmp/sample/tails/path"))
        with async_mock.patch.object(
                V10PresentationExchange, "save",
                autospec=True) as save_ex, async_mock.patch.object(
                    test_module, "AttachDecorator", autospec=True
                ) as mock_attach_decorator, async_mock.patch.object(
                    test_module, "RevocationRegistry",
                    autospec=True) as mock_rr:
            mock_rr.from_definition = async_mock.MagicMock(
                return_value=more_magic_rr)

            mock_attach_decorator.from_indy_dict = async_mock.MagicMock(
                return_value=mock_attach_decorator)

            req_creds = await indy_proof_req_preview2indy_requested_creds(
                indy_proof_req, holder=self.holder)

            with self.assertRaises(test_module.IndyHolderError):
                await self.manager.create_presentation(exchange_in, req_creds)
示例#11
0
    async def test_create_presentation_multi_matching_proposal_creds_names(
            self):
        self.context.connection_record = async_mock.MagicMock()
        self.context.connection_record.connection_id = CONN_ID

        exchange_in = V10PresentationExchange()
        indy_proof_req = await PRES_PREVIEW_NAMES.indy_proof_request(
            name=PROOF_REQ_NAME,
            version=PROOF_REQ_VERSION,
            nonce=PROOF_REQ_NONCE,
            ledger=await self.context.inject(BaseLedger, required=False),
        )

        exchange_in.presentation_request = indy_proof_req
        request = async_mock.MagicMock()
        request.indy_proof_request = async_mock.MagicMock()
        request._thread_id = "dummy"
        self.context.message = request

        Holder = async_mock.MagicMock(IndyHolder, autospec=True)
        self.holder = Holder()
        get_creds = async_mock.CoroutineMock(return_value=(
            {
                "cred_info": {
                    "referent": "dummy_reft_0",
                    "cred_def_id": CD_ID,
                    "attrs": {
                        "player": "Richie Knucklez",
                        "screenCapture": "aW1hZ2luZSBhIHNjcmVlbiBjYXB0dXJl",
                        "highScore": "1234560",
                    },
                }
            },
            {
                "cred_info": {
                    "referent": "dummy_reft_1",
                    "cred_def_id": CD_ID,
                    "attrs": {
                        "player": "Richie Knucklez",
                        "screenCapture":
                        "aW1hZ2luZSBhbm90aGVyIHNjcmVlbiBjYXB0dXJl",
                        "highScore": "1515880",
                    },
                }
            },
        ))
        self.holder.get_credentials_for_presentation_request_by_referent = get_creds
        self.holder.get_credential = async_mock.CoroutineMock(
            return_value=json.dumps({
                "schema_id": S_ID,
                "cred_def_id": CD_ID,
                "rev_reg_id": RR_ID,
                "cred_rev_id": 1,
            }))
        self.holder.create_presentation = async_mock.CoroutineMock(
            return_value="{}")
        self.holder.create_revocation_state = async_mock.CoroutineMock(
            return_value=json.dumps({
                "witness": {
                    "omega": "1 ..."
                },
                "rev_reg": {
                    "accum": "21 ..."
                },
                "timestamp": NOW,
            }))
        self.context.injector.clear_binding(IndyHolder)
        self.context.injector.bind_instance(IndyHolder, self.holder)

        more_magic_rr = async_mock.MagicMock(
            get_or_fetch_local_tails_path=async_mock.CoroutineMock(
                return_value="/tmp/sample/tails/path"))
        with async_mock.patch.object(
                V10PresentationExchange, "save",
                autospec=True) as save_ex, async_mock.patch.object(
                    test_module, "AttachDecorator", autospec=True
                ) as mock_attach_decorator, async_mock.patch.object(
                    test_module, "RevocationRegistry",
                    autospec=True) as mock_rr:
            mock_rr.from_definition = async_mock.MagicMock(
                return_value=more_magic_rr)

            mock_attach_decorator.from_indy_dict = async_mock.MagicMock(
                return_value=mock_attach_decorator)

            req_creds = await indy_proof_req_preview2indy_requested_creds(
                indy_proof_req, preview=PRES_PREVIEW_NAMES, holder=self.holder)
            assert not req_creds["self_attested_attributes"]
            assert len(req_creds["requested_attributes"]) == 1
            assert len(req_creds["requested_predicates"]) == 1

            (exchange_out, pres_msg) = await self.manager.create_presentation(
                exchange_in, req_creds)
            save_ex.assert_called_once()
            assert exchange_out.state == V10PresentationExchange.STATE_PRESENTATION_SENT
示例#12
0
    async def test_create_presentation_no_revocation(self):
        self.context.connection_record = async_mock.MagicMock()
        self.context.connection_record.connection_id = CONN_ID

        Ledger = async_mock.MagicMock(BaseLedger, autospec=True)
        self.ledger = Ledger()
        self.ledger.get_schema = async_mock.CoroutineMock(
            return_value=async_mock.MagicMock())
        self.ledger.get_credential_definition = async_mock.CoroutineMock(
            return_value={"value": {
                "revocation": None
            }})
        self.context.injector.clear_binding(BaseLedger)
        self.context.injector.bind_instance(BaseLedger, self.ledger)

        exchange_in = V10PresentationExchange()
        indy_proof_req = await PRES_PREVIEW.indy_proof_request(
            name=PROOF_REQ_NAME,
            version=PROOF_REQ_VERSION,
            nonce=PROOF_REQ_NONCE,
            ledger=await self.context.inject(BaseLedger, required=False),
        )

        exchange_in.presentation_request = indy_proof_req
        request = async_mock.MagicMock()
        request.indy_proof_request = async_mock.MagicMock()
        request._thread_id = "dummy"
        self.context.message = request

        Holder = async_mock.MagicMock(IndyHolder, autospec=True)
        self.holder = Holder()
        get_creds = async_mock.CoroutineMock(return_value=(
            {
                "cred_info": {
                    "referent": "dummy_reft"
                },
                "attrs": {
                    "player": "Richie Knucklez",
                    "screenCapture": "aW1hZ2luZSBhIHNjcmVlbiBjYXB0dXJl",
                    "highScore": "1234560",
                },
            },  # leave this comma: return a tuple
        ))
        self.holder.get_credentials_for_presentation_request_by_referent = get_creds
        self.holder.get_credential = async_mock.CoroutineMock(
            return_value=json.dumps({
                "schema_id": S_ID,
                "cred_def_id": CD_ID,
                "rev_reg_id": None,
                "cred_rev_id": None,
            }))
        self.holder.create_presentation = async_mock.CoroutineMock(
            return_value="{}")
        self.context.injector.clear_binding(IndyHolder)
        self.context.injector.bind_instance(IndyHolder, self.holder)

        with async_mock.patch.object(
                V10PresentationExchange, "save",
                autospec=True) as save_ex, async_mock.patch.object(
                    test_module, "AttachDecorator",
                    autospec=True) as mock_attach_decorator:

            mock_attach_decorator.from_indy_dict = async_mock.MagicMock(
                return_value=mock_attach_decorator)

            req_creds = await indy_proof_req_preview2indy_requested_creds(
                indy_proof_req, holder=self.holder)

            (exchange_out, pres_msg) = await self.manager.create_presentation(
                exchange_in, req_creds)
            save_ex.assert_called_once()
            assert exchange_out.state == V10PresentationExchange.STATE_PRESENTATION_SENT
示例#13
0
    async def test_create_presentation_self_asserted(self):
        self.context.connection_record = async_mock.MagicMock()
        self.context.connection_record.connection_id = CONN_ID
        PRES_PREVIEW_SELFIE = PresentationPreview(
            attributes=[
                PresAttrSpec(name="player", value="Richie Knucklez"),
                PresAttrSpec(
                    name="screenCapture",
                    mime_type="image/png",
                    value="aW1hZ2luZSBhIHNjcmVlbiBjYXB0dXJl",
                ),
            ],
            predicates=[
                PresPredSpec(
                    name="highScore",
                    cred_def_id=None,
                    predicate=">=",
                    threshold=1000000,
                )
            ],
        )

        exchange_in = V10PresentationExchange()
        indy_proof_req = await PRES_PREVIEW_SELFIE.indy_proof_request(
            name=PROOF_REQ_NAME,
            version=PROOF_REQ_VERSION,
            nonce=PROOF_REQ_NONCE,
            ledger=await self.context.inject(BaseLedger, required=False),
        )

        exchange_in.presentation_request = indy_proof_req
        request = async_mock.MagicMock()
        request.indy_proof_request = async_mock.MagicMock()
        request._thread_id = "dummy"
        self.context.message = request

        more_magic_rr = async_mock.MagicMock(
            get_or_fetch_local_tails_path=async_mock.CoroutineMock(
                return_value="/tmp/sample/tails/path"))
        with async_mock.patch.object(
                V10PresentationExchange, "save",
                autospec=True) as save_ex, async_mock.patch.object(
                    test_module, "AttachDecorator", autospec=True
                ) as mock_attach_decorator, async_mock.patch.object(
                    test_module, "RevocationRegistry",
                    autospec=True) as mock_rr:
            mock_rr.from_definition = async_mock.MagicMock(
                return_value=more_magic_rr)

            mock_attach_decorator.from_indy_dict = async_mock.MagicMock(
                return_value=mock_attach_decorator)

            req_creds = await indy_proof_req_preview2indy_requested_creds(
                indy_proof_req, holder=self.holder)
            assert len(req_creds["self_attested_attributes"]) == 3
            assert not req_creds["requested_attributes"]
            assert not req_creds["requested_predicates"]

            (exchange_out, pres_msg) = await self.manager.create_presentation(
                exchange_in, req_creds)
            save_ex.assert_called_once()
            assert exchange_out.state == V10PresentationExchange.STATE_PRESENTATION_SENT
    async def test_generate_registry_etc(self):
        rec = IssuerRevRegRecord(
            issuer_did=TEST_DID,
            cred_def_id=CRED_DEF_ID,
            revoc_reg_id=REV_REG_ID,
        )
        issuer = async_mock.MagicMock(IndyIssuer)
        self.profile.context.injector.bind_instance(IndyIssuer, issuer)

        with async_mock.patch.object(
                issuer, "create_and_store_revocation_registry",
                async_mock.CoroutineMock()) as mock_create_store_rr:
            mock_create_store_rr.side_effect = IndyIssuerError("Not this time")

            with self.assertRaises(RevocationError):
                await rec.generate_registry(self.profile)

        issuer.create_and_store_revocation_registry.return_value = (
            REV_REG_ID,
            json.dumps({
                "value": {
                    "tailsHash":
                    "59NY25UEV8a5CzNkXFQMppwofUxtYtf4FDp1h9xgeLcK",
                    "tailsLocation": "point at infinity",
                }
            }),
            json.dumps({"revoc_reg_entry": "dummy-entry"}),
        )

        with async_mock.patch.object(test_module, "move",
                                     async_mock.MagicMock()) as mock_move:
            await rec.generate_registry(self.profile)

        assert rec.revoc_reg_id == REV_REG_ID
        assert rec.state == IssuerRevRegRecord.STATE_GENERATED
        assert rec.tails_hash == "59NY25UEV8a5CzNkXFQMppwofUxtYtf4FDp1h9xgeLcK"
        assert rec.tails_local_path == join(
            indy_client_dir(join("tails", REV_REG_ID)), rec.tails_hash)
        with self.assertRaises(RevocationError):
            await rec.set_tails_file_public_uri(self.profile, "dummy")

        await rec.set_tails_file_public_uri(self.profile,
                                            "http://localhost/dummy")
        assert rec.tails_public_uri == "http://localhost/dummy"
        assert rec.revoc_reg_def["value"][
            "tailsLocation"] == "http://localhost/dummy"

        await rec.send_def(self.profile)
        assert rec.state == IssuerRevRegRecord.STATE_POSTED
        self.ledger.send_revoc_reg_def.assert_called_once()

        await rec.send_entry(self.profile)
        assert rec.state == IssuerRevRegRecord.STATE_ACTIVE
        self.ledger.send_revoc_reg_entry.assert_called_once()

        rev_reg = await rec.get_registry()
        assert type(rev_reg) == RevocationRegistry

        queried = await IssuerRevRegRecord.query_by_cred_def_id(
            session=self.session,
            cred_def_id=CRED_DEF_ID,
            state=IssuerRevRegRecord.STATE_ACTIVE,
        )
        assert len(queried) == 1

        retrieved = await IssuerRevRegRecord.retrieve_by_revoc_reg_id(
            session=self.session, revoc_reg_id=rec.revoc_reg_id)
        assert retrieved.revoc_reg_id == rec.revoc_reg_id

        await rec.set_state(self.session)
        assert rec.state == IssuerRevRegRecord.STATE_FULL

        data = rec.serialize()
        model_instance = IssuerRevRegRecord.deserialize(data)
        assert isinstance(model_instance, IssuerRevRegRecord)
        assert model_instance == rec
    async def test_called_auto_present_indy(self):
        request_context = RequestContext.test_context()
        request_context.connection_record = async_mock.MagicMock()
        request_context.connection_record.connection_id = "dummy"
        request_context.message = V20PresRequest()
        request_context.message.attachment = async_mock.MagicMock(
            return_value=INDY_PROOF_REQ)
        request_context.message_receipt = MessageReceipt()

        pres_proposal = V20PresProposal(
            formats=[
                V20PresFormat(
                    attach_id="indy",
                    format_=V20PresFormat.Format.INDY.aries,
                )
            ],
            proposals_attach=[
                AttachDecorator.data_base64(INDY_PROOF_REQ, ident="indy")
            ],
        )
        mock_px_rec = test_module.V20PresExRecord(
            pres_proposal=pres_proposal.serialize(),
            auto_present=True,
        )

        with async_mock.patch.object(
                test_module, "V20PresManager",
                autospec=True) as mock_pres_mgr, async_mock.patch.object(
                    test_module, "V20PresExRecord", autospec=True
                ) as mock_pres_ex_rec_cls, async_mock.patch.object(
                    test_indy_handler, "IndyHolder",
                    autospec=True) as mock_holder:

            mock_holder.get_credentials_for_presentation_request_by_referent = (
                async_mock.CoroutineMock(return_value=[{
                    "cred_info": {
                        "referent": "dummy"
                    }
                }]))
            request_context.inject = async_mock.MagicMock(
                return_value=mock_holder)

            mock_pres_ex_rec_cls.return_value = mock_px_rec
            mock_pres_ex_rec_cls.retrieve_by_tag_filter = async_mock.CoroutineMock(
                return_value=mock_px_rec)
            mock_pres_mgr.return_value.receive_pres_request = async_mock.CoroutineMock(
                return_value=mock_px_rec)

            mock_pres_mgr.return_value.create_pres = async_mock.CoroutineMock(
                return_value=(mock_px_rec, "pres message"))

            request_context.connection_ready = True
            handler = test_module.V20PresRequestHandler()
            responder = MockResponder()

            await handler.handle(request_context, responder)
            mock_pres_mgr.return_value.create_pres.assert_called_once()

        mock_pres_mgr.return_value.receive_pres_request.assert_called_once_with(
            mock_px_rec)
        messages = responder.messages
        assert len(messages) == 1
        (result, target) = messages[0]
        assert result == "pres message"
        assert target == {}
示例#16
0
 async def test_listen(self):
     """Test that listen does nothing."""
     opsdroid = amock.CoroutineMock()
     connector = ConnectorFacebook({}, opsdroid=opsdroid)
     await connector.listen()
示例#17
0
    async def test_close(self):
        self.transport._close_http_session = mock.CoroutineMock()

        await self.transport.close()

        self.transport._close_http_session.assert_called()
示例#18
0
 def test_init(self):
     opsdroid = amock.CoroutineMock()
     connector = ConnectorFacebook({}, opsdroid=opsdroid)
     self.assertEqual(None, connector.default_target)
     self.assertEqual("facebook", connector.name)
示例#19
0
async def test_enqueue_message_x_redis_error(queue):
    queue.redis.rpush = async_mock.CoroutineMock(
        side_effect=aioredis.RedisError)
    with pytest.raises(OutboundQueueError):
        await queue.enqueue_message(payload="", endpoint=ENDPOINT)
示例#20
0
 def test_property(self):
     opsdroid = amock.CoroutineMock()
     connector = ConnectorFacebook({}, opsdroid=opsdroid)
     self.assertEqual("facebook", connector.name)
示例#21
0
    async def test_block_actions_interactivity(self):
        """Test the block_actions interactivity type in Slack interactions handler."""

        connector = ConnectorSlack({"token": "abc123"}, opsdroid=OpsDroid())
        connector.opsdroid = amock.CoroutineMock()
        connector.opsdroid.parse = amock.CoroutineMock()

        req_ob = {
            "type":
            "block_actions",
            "team": {
                "id": "T9TK3CUKW",
                "domain": "example"
            },
            "user": {
                "id": "UA8RXUSPL",
                "username": "******",
                "team_id": "T9TK3CUKW",
            },
            "channel": {
                "id": "CBR2V3XEX",
                "name": "review-updates"
            },
            "actions": [
                {
                    "action_id": "WaXA",
                    "block_id": "=qXel",
                    "text": {
                        "type": "plain_text",
                        "text": "View",
                        "emoji": True
                    },
                    "value": "click_me_123",
                    "type": "button",
                    "action_ts": "1548426417.840180",
                },
                {
                    "type": "overflow",
                    "block_id": "B5XNP",
                    "action_id": "BnhtF",
                    "selected_option": {
                        "text": {
                            "type": "plain_text",
                            "text": "Option 1",
                            "emoji": True,
                        },
                        "value": "value-0",
                    },
                    "action_ts": "1576336883.317406",
                },
                {
                    "type": "datepicker",
                    "block_id": "CAwR",
                    "action_id": "VS+",
                    "selected_date": "2019-12-31",
                    "initial_date": "1990-04-28",
                    "action_ts": "1576337318.133466",
                },
                {
                    "type":
                    "multi_static_select",
                    "block_id":
                    "rOL",
                    "action_id":
                    "Cd9",
                    "selected_options": [
                        {
                            "text": {
                                "type": "plain_text",
                                "text": "Choice 1",
                                "emoji": True,
                            },
                            "value": "value-0",
                        },
                        {
                            "text": {
                                "type": "plain_text",
                                "text": "Choice 2",
                                "emoji": True,
                            },
                            "value": "value-1",
                        },
                    ],
                    "placeholder": {
                        "type": "plain_text",
                        "text": "Select items",
                        "emoji": True,
                    },
                    "action_ts":
                    "1576337351.609054",
                },
                {
                    "type": "static_select",
                    "block_id": "OGN1",
                    "action_id": "4jd",
                    "selected_option": {
                        "text": {
                            "type": "plain_text",
                            "text": "Choice 2",
                            "emoji": True,
                        },
                        "value": "value-1",
                    },
                    "placeholder": {
                        "type": "plain_text",
                        "text": "Select an item",
                        "emoji": True,
                    },
                    "action_ts": "1576337378.859991",
                },
            ],
        }

        mock_request = amock.CoroutineMock()
        mock_request.post = amock.CoroutineMock()
        mock_request.post.return_value = {"payload": json.dumps(req_ob)}

        response = await connector.slack_interactions_handler(mock_request)
        self.assertTrue(connector.opsdroid.parse.called)
        self.assertEqual(connector.opsdroid.parse.call_count,
                         len(req_ob["actions"]))
        self.assertEqual(type(response), aiohttp.web.Response)
        self.assertEqual(response.status, 200)
示例#22
0
 def test_property(self):
     opsdroid = amock.CoroutineMock()
     connector = Connector({"name": "shell"}, opsdroid=opsdroid)
     self.assertEqual("shell", connector.configuration.get("name"))
示例#23
0
 async def test_get_messages_loop(self):
     self.connector._get_messages = amock.CoroutineMock()
     self.connector._get_messages.side_effect = Exception()
     with contextlib.suppress(Exception):
         await self.connector.get_messages_loop()
示例#24
0
    async def test_send_message(self):
        context = InjectionContext()
        mgr = OutboundTransportManager(context)

        transport_cls = async_mock.Mock(spec=[])
        with self.assertRaises(OutboundTransportRegistrationError):
            mgr.register_class(transport_cls, "transport_cls")

        transport = async_mock.MagicMock()
        transport.handle_message = async_mock.CoroutineMock()
        transport.wire_format.encode_message = async_mock.CoroutineMock()
        transport.start = async_mock.CoroutineMock()
        transport.stop = async_mock.CoroutineMock()
        transport.schemes = ["http"]

        transport_cls = async_mock.MagicMock()
        transport_cls.schemes = ["http"]
        transport_cls.return_value = transport
        mgr.register_class(transport_cls, "transport_cls")
        assert mgr.get_registered_transport_for_scheme(
            "http") == "transport_cls"

        await mgr.start()
        await mgr.task_queue
        transport.start.assert_awaited_once_with()
        assert mgr.get_running_transport_for_scheme("http") == "transport_cls"

        message = OutboundMessage(payload="{}")
        assert "payload" in str(message)
        message.target = ConnectionTarget(
            endpoint="http://localhost",
            recipient_keys=[1, 2],
            routing_keys=[3],
            sender_key=4,
        )

        send_session = InMemoryProfile.test_session()
        send_profile = send_session.profile
        setattr(send_profile, "session",
                async_mock.MagicMock(return_value=send_session))
        mgr.enqueue_message(send_profile, message)
        await mgr.flush()

        transport.wire_format.encode_message.assert_awaited_once_with(
            send_session,
            message.payload,
            message.target.recipient_keys,
            message.target.routing_keys,
            message.target.sender_key,
        )
        transport.handle_message.assert_awaited_once_with(
            send_profile,
            transport.wire_format.encode_message.return_value,
            message.target.endpoint,
            None,
            None,
        )

        with self.assertRaises(OutboundDeliveryError):
            mgr.get_running_transport_for_endpoint("localhost")

        message.target = ConnectionTarget(
            endpoint="localhost",
            recipient_keys=[1, 2],
            routing_keys=[3],
            sender_key=4,
        )
        with self.assertRaises(OutboundDeliveryError) as context:
            mgr.enqueue_message(send_profile, message)
        assert "No supported transport" in str(context.exception)

        await mgr.stop()

        assert mgr.get_running_transport_for_scheme("http") is None
        transport.stop.assert_awaited_once_with()
示例#25
0
    async def test_called_auto_present_multi_cred_match_reft(self):
        request_context = RequestContext.test_context()
        request_context.connection_record = async_mock.MagicMock()
        request_context.connection_record.connection_id = "dummy"
        request_context.message = V20PresRequest()
        request_context.message.attachment = async_mock.MagicMock(
            return_value=INDY_PROOF_REQ)
        request_context.message_receipt = MessageReceipt()
        pres_proposal = V20PresProposal(
            formats=[
                V20PresFormat(
                    attach_id="indy",
                    format_=V20PresFormat.Format.INDY.aries,
                )
            ],
            proposals_attach=[
                AttachDecorator.data_base64(INDY_PROOF_REQ, ident="indy")
            ],
        )

        px_rec_instance = test_module.V20PresExRecord(
            pres_proposal=pres_proposal.serialize(),
            auto_present=True,
        )
        with async_mock.patch.object(
                test_module, "V20PresManager",
                autospec=True) as mock_pres_mgr, async_mock.patch.object(
                    test_module, "V20PresExRecord", autospec=True
                ) as mock_pres_ex_rec_cls, async_mock.patch.object(
                    test_module, "IndyHolder", autospec=True) as mock_holder:

            mock_holder.get_credentials_for_presentation_request_by_referent = (
                async_mock.CoroutineMock(return_value=[
                    {
                        "cred_info": {
                            "referent": "dummy-0",
                            "cred_def_id": CD_ID,
                            "attrs": {
                                "ident": "zero",
                                "favourite": "potato",
                                "icon": "cG90YXRv",
                            },
                        }
                    },
                    {
                        "cred_info": {
                            "referent": "dummy-1",
                            "cred_def_id": CD_ID,
                            "attrs": {
                                "ident": "one",
                                "favourite": "spud",
                                "icon": "c3B1ZA==",
                            },
                        }
                    },
                    {
                        "cred_info": {
                            "referent": "dummy-2",
                            "cred_def_id": CD_ID,
                            "attrs": {
                                "ident": "two",
                                "favourite": "patate",
                                "icon": "cGF0YXRl",
                            },
                        }
                    },
                ]))
            request_context.inject = async_mock.MagicMock(
                return_value=mock_holder)

            mock_pres_ex_rec_cls.return_value = px_rec_instance
            mock_pres_ex_rec_cls.retrieve_by_tag_filter = async_mock.CoroutineMock(
                return_value=px_rec_instance)
            mock_pres_mgr.return_value.receive_pres_request = async_mock.CoroutineMock(
                return_value=px_rec_instance)

            mock_pres_mgr.return_value.create_pres = async_mock.CoroutineMock(
                return_value=(px_rec_instance, "pres message"))
            request_context.connection_ready = True
            handler = test_module.V20PresRequestHandler()
            responder = MockResponder()
            await handler.handle(request_context, responder)
            mock_pres_mgr.return_value.create_pres.assert_called_once()

        mock_pres_mgr.return_value.receive_pres_request.assert_called_once_with(
            px_rec_instance)
        messages = responder.messages
        assert len(messages) == 1
        (result, target) = messages[0]
        assert result == "pres message"
        assert target == {}
 async def test_respond(self):
     connector = ConnectorSlack({"api-token": "abc123"},
                                opsdroid=OpsDroid())
     connector.slacker.chat.post_message = amock.CoroutineMock()
     await connector.send(Message("test", "user", "room", connector))
     self.assertTrue(connector.slacker.chat.post_message.called)
    async def test_called_auto_present_x(self):
        request_context = RequestContext.test_context()
        request_context.connection_record = async_mock.MagicMock()
        request_context.connection_record.connection_id = "dummy"
        request_context.message = PresentationRequest()
        request_context.message.indy_proof_request = async_mock.MagicMock(
            return_value={
                "name": "proof-request",
                "version": "1.0",
                "nonce": "1234567890",
                "requested_attributes": {
                    "0_favourite_uuid": {
                        "name": "favourite",
                        "restrictions": [
                            {
                                "cred_def_id": CD_ID,
                            }
                        ],
                    },
                    "1_icon_uuid": {
                        "name": "icon",
                        "restrictions": [
                            {
                                "cred_def_id": CD_ID,
                            }
                        ],
                    },
                },
                "requested_predicates": {},
            }
        )
        request_context.message_receipt = MessageReceipt()
        presentation_proposal = PresentationProposal(
            comment="Hello World", presentation_proposal=PRES_PREVIEW
        )
        mock_px_rec = async_mock.MagicMock(
            presentation_proposal_dict=presentation_proposal,
            auto_present=True,
            save_error_state=async_mock.CoroutineMock(),
        )

        with async_mock.patch.object(
            test_module, "PresentationManager", autospec=True
        ) as mock_pres_mgr, async_mock.patch.object(
            test_module, "V10PresentationExchange", autospec=True
        ) as mock_pres_ex_cls, async_mock.patch.object(
            test_module, "IndyHolder", autospec=True
        ) as mock_holder:

            mock_holder.get_credentials_for_presentation_request_by_referent = (
                async_mock.CoroutineMock(
                    return_value=[{"cred_info": {"referent": "dummy"}}]
                )
            )
            request_context.inject = async_mock.MagicMock(return_value=mock_holder)

            mock_pres_ex_cls.return_value = mock_px_rec
            mock_pres_ex_cls.retrieve_by_tag_filter = async_mock.CoroutineMock(
                return_value=mock_px_rec
            )
            mock_pres_mgr.return_value.receive_request = async_mock.CoroutineMock(
                return_value=mock_px_rec
            )

            mock_pres_mgr.return_value.create_presentation = async_mock.CoroutineMock(
                side_effect=test_module.IndyHolderError()
            )

            request_context.connection_ready = True
            handler = test_module.PresentationRequestHandler()
            responder = MockResponder()

            with async_mock.patch.object(
                handler._logger, "exception", async_mock.MagicMock()
            ) as mock_log_exc:
                await handler.handle(request_context, responder)
                mock_log_exc.assert_called_once()
    async def test_connections_list(self):
        context = RequestContext(
            base_context=InjectionContext(enforce_typing=False)
        )
        mock_req = async_mock.MagicMock()
        mock_req.app = {
            "request_context": context,
        }
        mock_req.query = {
            "invitation_id": "dummy",
            "initiator": ConnectionRecord.INITIATOR_SELF
        }

        test_module.web.json_response = async_mock.CoroutineMock()

        with async_mock.patch.object(
            test_module, "ConnectionRecord", autospec=True
        ) as mock_conn_rec:
            mock_conn_rec.STATE_INVITATION=ConnectionRecord.STATE_INVITATION
            mock_conn_rec.STATE_INACTIVE=ConnectionRecord.STATE_INACTIVE
            mock_conn_rec.query = async_mock.CoroutineMock()
            conns = [  # in order here
                async_mock.MagicMock(
                    serialize=async_mock.MagicMock(
                        return_value={
                            "state": ConnectionRecord.STATE_ACTIVE,
                            "created_at": "1234567890"
                        }
                    )
                ),
                async_mock.MagicMock(
                    serialize=async_mock.MagicMock(
                        return_value={
                            "state": ConnectionRecord.STATE_INVITATION,
                            "created_at": "1234567890"
                        }
                    )
                ),
                async_mock.MagicMock(
                    serialize=async_mock.MagicMock(
                        return_value={
                            "state": ConnectionRecord.STATE_INACTIVE,
                            "created_at": "1234567890"
                        }
                    )
                )
            ]
            mock_conn_rec.query.return_value = [
                conns[2], conns[0], conns[1]  # jumbled
            ]

            await test_module.connections_list(mock_req)
            test_module.web.json_response.assert_called_once_with(
                {
                    "results": [
                        {
                            k: c.serialize.return_value[k] for k in [
                                "state",
                                "created_at"
                            ]
                        } for c in conns
                    ]
                }  # sorted
            )
示例#29
0
    async def test_called_auto_present_pred_multi_match(self):
        request_context = RequestContext.test_context()
        request_context.connection_record = async_mock.MagicMock()
        request_context.connection_record.connection_id = "dummy"
        request_context.message = PresentationRequest()
        request_context.message.indy_proof_request = async_mock.MagicMock(
            return_value={
                "name": "proof-request",
                "version": "1.0",
                "nonce": "1234567890",
                "requested_attributes": {},
                "requested_predicates": {
                    "0_score_GE_uuid": {
                        "name": "score",
                        "p_type": ">=",
                        "p_value": 1000000,
                        "restrictions": [{
                            "cred_def_id": CD_ID,
                        }],
                    }
                },
            })
        request_context.message_receipt = MessageReceipt()
        px_rec_instance = handler.V10PresentationExchange(auto_present=True)

        with async_mock.patch.object(
                handler, "PresentationManager",
                autospec=True) as mock_pres_mgr, async_mock.patch.object(
                    handler, "V10PresentationExchange", autospec=True
                ) as mock_pres_ex_rec, async_mock.patch.object(
                    handler, "IndyHolder", autospec=True) as mock_holder:

            mock_holder.get_credentials_for_presentation_request_by_referent = (
                async_mock.CoroutineMock(return_value=[
                    {
                        "cred_info": {
                            "referent": "dummy-0"
                        }
                    },
                    {
                        "cred_info": {
                            "referent": "dummy-1"
                        }
                    },
                ]))
            request_context.inject = async_mock.MagicMock(
                return_value=mock_holder)

            mock_pres_ex_rec.return_value = px_rec_instance
            mock_pres_ex_rec.retrieve_by_tag_filter = async_mock.CoroutineMock(
                return_value=px_rec_instance)
            mock_pres_mgr.return_value.receive_request = async_mock.CoroutineMock(
                return_value=px_rec_instance)

            mock_pres_mgr.return_value.create_presentation = async_mock.CoroutineMock(
                return_value=(px_rec_instance, "presentation_message"))
            request_context.connection_ready = True
            handler_inst = handler.PresentationRequestHandler()
            responder = MockResponder()
            await handler_inst.handle(request_context, responder)
            mock_pres_mgr.return_value.create_presentation.assert_called_once()

        mock_pres_mgr.return_value.receive_request.assert_called_once_with(
            px_rec_instance)
        messages = responder.messages
        assert len(messages) == 1
        (result, target) = messages[0]
        assert result == "presentation_message"
        assert target == {}
示例#30
0
async def test_resolver_not_found_error(mock_resolver, mock_request,
                                        side_effect, error):
    mock_resolver.resolve = async_mock.CoroutineMock(side_effect=side_effect())
    with pytest.raises(error):
        await test_module.resolve_did(mock_request)