Example #1
0
    def test_fetch(self, dummy_endpoint):
        with aioresponses() as m, Session() as session:
            body = b'hello world'
            m.post(
                dummy_endpoint + 'function', status=200, body=body,
                headers={'Content-Type': 'text/plain; charset=utf-8',
                         'Content-Length': str(len(body))},
            )
            rqst = Request(session, 'POST', 'function')
            with rqst.fetch() as resp:
                assert isinstance(resp, Response)
                assert resp.status == 200
                assert resp.content_type == 'text/plain'
                assert resp.text() == body.decode()
                assert resp.content_length == len(body)

        with aioresponses() as m, Session() as session:
            body = b'{"a": 1234, "b": null}'
            m.post(
                dummy_endpoint + 'function', status=200, body=body,
                headers={'Content-Type': 'application/json; charset=utf-8',
                         'Content-Length': str(len(body))},
            )
            rqst = Request(session, 'POST', 'function')
            with rqst.fetch() as resp:
                assert isinstance(resp, Response)
                assert resp.status == 200
                assert resp.content_type == 'application/json'
                assert resp.text() == body.decode()
                assert resp.json() == {'a': 1234, 'b': None}
                assert resp.content_length == len(body)
 def test_mocking_as_context_manager(self):
     with aioresponses() as aiomock:
         aiomock.add(self.url, payload={'foo': 'bar'})
         resp = yield from self.session.get(self.url)
         self.assertEqual(resp.status, 200)
         payload = yield from resp.json()
         self.assertDictEqual(payload, {'foo': 'bar'})
Example #3
0
def test_vfolder_list_files():
    with Session() as session:
        with aioresponses() as m:
            vfolder_name = 'fake-vfolder-name'
            payload = {
                "files": [
                    {
                        "mode": "-rw-r--r--",
                        "size": 4751244,
                        "ctime": 1528277299.2744732,
                        "mtime": 1528277299.2744732,
                        "atime": 1528277300.7658687,
                        "filename": "bigtxt.txt",
                    },
                    {
                        "mode": "-rw-r--r--",
                        "size": 200000,
                        "ctime": 1528333257.6576185,
                        "mtime": 1528288069.625786,
                        "atime": 1528332829.692922,
                        "filename": "200000",
                    }
                ],
                "folder_path": "/mnt/local/1f6bd27fde1248cabfb50306ea83fc0a",
            }
            m.get(build_url(session.config,
                            '/folders/{}/files'.format(vfolder_name)),
                  status=200, payload=payload)
            resp = session.VFolder(vfolder_name).list_files('.')
            assert resp == payload
Example #4
0
def test_delete_vfolder():
    with Session() as session:
        with aioresponses() as m:
            vfolder_name = 'fake-vfolder-name'
            m.delete(build_url(session.config, '/folders/{}'.format(vfolder_name)),
                     status=204)
            resp = session.VFolder(vfolder_name).delete()
            assert resp == {}
def test_load(event_loop):
    cache = stub(get=lambda url: None, add=lambda url, content: None)
    transport = asyncio.AsyncTransport(loop=event_loop, cache=cache)

    with aioresponses() as m:
        m.get('http://tests.python-zeep.org/test.xml', body='x')
        result = transport.load('http://tests.python-zeep.org/test.xml')
        assert result == b'x'
Example #6
0
def test_vfolder_delete_invitation():
    with Session() as session:
        with aioresponses() as m:
            payload = {'msg': 'Vfolder invitation is deleted: fake-inv-id.'}
            m.delete(build_url(session.config, '/folders/invitations/delete'),
                     status=200, payload=payload)
            resp = session.VFolder.delete_invitation('inv-id')
            assert resp == payload
Example #7
0
 async def test_fetch_timeout_async(self, dummy_endpoint):
     with aioresponses() as m:
         async with AsyncSession() as session:
             m.post(dummy_endpoint,
                    exception=asyncio.TimeoutError())
             rqst = Request(session, 'POST', '/')
             with pytest.raises(asyncio.TimeoutError):
                 async with rqst.fetch():
                     pass
Example #8
0
 async def test_fetch_client_error_async(self, dummy_endpoint):
     with aioresponses() as m:
         async with AsyncSession() as session:
             m.post(dummy_endpoint,
                    exception=aiohttp.ClientConnectionError())
             rqst = Request(session, 'POST', '/')
             with pytest.raises(BackendClientError):
                 async with rqst.fetch():
                     pass
def test_load_cache(event_loop):
    cache = InMemoryCache()
    transport = asyncio.AsyncTransport(loop=event_loop, cache=cache)

    with aioresponses() as m:
        m.get('http://tests.python-zeep.org/test.xml', body='x')
        result = transport.load('http://tests.python-zeep.org/test.xml')
        assert result == b'x'

    assert cache.get('http://tests.python-zeep.org/test.xml') == b'x'
Example #10
0
def test_vfolder_delete_files():
    with Session() as session:
        with aioresponses() as m:
            vfolder_name = 'fake-vfolder-name'
            files = ['fake-file1', 'fake-file2']
            m.delete(build_url(session.config,
                               '/folders/{}/delete_files'.format(vfolder_name)),
                     status=200, payload={})
            resp = session.VFolder(vfolder_name).delete_files(files)
            assert resp == '{}'
Example #11
0
def test_vfolder_invite():
    with Session() as session:
        with aioresponses() as m:
            vfolder_name = 'fake-vfolder-name'
            user_ids = ['*****@*****.**', '*****@*****.**']
            payload = {'invited_ids': user_ids}
            m.post(build_url(session.config,
                             '/folders/{}/invite'.format(vfolder_name)),
                   status=201, payload=payload)
            resp = session.VFolder(vfolder_name).invite('rw', user_ids)
            assert resp == payload
Example #12
0
def test_vfolder_accept_invitation():
    with Session() as session:
        with aioresponses() as m:
            payload = {
                'msg': ('Access key (inv-ak by [email protected]) now can access'
                        ' vfolder fake-vfolder-id'),
            }
            m.post(build_url(session.config, '/folders/invitations/accept'),
                   status=200, payload=payload)
            resp = session.VFolder.accept_invitation('inv-id', 'inv-ak')
            assert resp == payload
Example #13
0
def test_create_vfolder_in_other_host():
    with Session() as session:
        with aioresponses() as m:
            payload = {
                'id': 'fake-vfolder-id',
                'name': 'fake-vfolder-name',
                'host': 'fake-vfolder-host',
            }
            m.post(build_url(session.config, '/folders'), status=201,
                   payload=payload)
            resp = session.VFolder.create('fake-vfolder-name', 'fake-vfolder-host')
            assert resp == payload
Example #14
0
def test_vfolder_upload(tmpdir):
    with Session() as session:
        with aioresponses() as m:
            mockfile = tmpdir.join('example.jpg')
            mockfile.write('mock file')
            vfolder_name = 'fake-vfolder-name'
            m.post(build_url(session.config,
                             '/folders/{}/upload'.format(vfolder_name)),
                   status=201)
            resp = session.VFolder(vfolder_name).upload([mockfile.strpath],
                                                        basedir=tmpdir.strpath)
            assert resp == ''
def test_http_error(event_loop):
    transport = asyncio.AsyncTransport(loop=event_loop)

    with aioresponses() as m:
        m.get(
            'http://tests.python-zeep.org/test.xml',
            body='x',
            status=500,
        )
        with pytest.raises(exceptions.TransportError) as exc:
            transport.load('http://tests.python-zeep.org/test.xml')
            assert exc.value.status_code == 500
            assert exc.value.message is None
Example #16
0
 async def test_response_async(self, defconfig, dummy_endpoint):
     body = b'{"test": 5678}'
     with aioresponses() as m:
         m.post(
             dummy_endpoint + 'function', status=200, body=body,
             headers={'Content-Type': 'application/json',
                      'Content-Length': str(len(body))},
         )
         async with AsyncSession(config=defconfig) as session:
             rqst = Request(session, 'POST', '/function')
             async with rqst.fetch() as resp:
                 assert await resp.text() == '{"test": 5678}'
                 assert await resp.json() == {'test': 5678}
async def test_post(event_loop):
    cache = stub(get=lambda url: None, add=lambda url, content: None)
    transport = asyncio.AsyncTransport(loop=event_loop, cache=cache)

    envelope = etree.Element('Envelope')

    with aioresponses() as m:
        m.post('http://tests.python-zeep.org/test.xml', body='x')
        result = await transport.post_xml(
            'http://tests.python-zeep.org/test.xml',
            envelope=envelope,
            headers={})

        assert result.content == b'x'
Example #18
0
def test_vfolder_get_info():
    with Session() as session:
        with aioresponses() as m:
            vfolder_name = 'fake-vfolder-name'
            payload = {
                'name': vfolder_name,
                'id': 'fake-vfolder-id',
                'host': 'fake-vfolder-host',
                'numFiles': 5,
                'created': '2018-06-02 09:04:15.585917+00:00',
                'is_owner': True,
                'permission': 'wd',
            }
            m.get(build_url(session.config, '/folders/{}'.format(vfolder_name)),
                  status=200, payload=payload)
            resp = session.VFolder(vfolder_name).info()
            assert resp == payload
Example #19
0
def test_vfolder_invitations():
    with Session() as session:
        with aioresponses() as m:
            payload = {
                'invitations': [
                    {
                        'id': 'fake-invitation-id',
                        'inviter': '*****@*****.**',
                        'perm': 'ro',
                        'vfolder_id': 'fake-vfolder-id',
                    }
                ]
            }
            m.get(build_url(session.config, '/folders/invitations/list'),
                  status=200, payload=payload)
            resp = session.VFolder.invitations()
            assert resp == payload
    def test_address_as_instance_of_url_combined_with_pass_through(self):
        external_api = 'http://httpbin.org/status/201'

        @asyncio.coroutine
        def doit():
            api_resp = yield from self.session.get(self.url)
            # we have to hit actual url,
            # otherwise we do not test pass through option properly
            ext_rep = yield from self.session.get(URL(external_api))
            return api_resp, ext_rep

        with aioresponses(passthrough=[external_api]) as m:
            m.get(self.url, status=200)
            api, ext = yield from doit()

            self.assertEqual(api.status, 200)
            self.assertEqual(ext.status, 201)
Example #21
0
 def test_streaming_fetch(self, dummy_endpoint):
     # Read content by chunks.
     with aioresponses() as m, Session() as session:
         body = b'hello world'
         m.post(
             dummy_endpoint + 'function', status=200, body=body,
             headers={'Content-Type': 'text/plain; charset=utf-8',
                      'Content-Length': str(len(body))},
         )
         rqst = Request(session, 'POST', 'function')
         with rqst.fetch() as resp:
             assert resp.status == 200
             assert resp.content_type == 'text/plain'
             assert resp.read(3) == b'hel'
             assert resp.read(2) == b'lo'
             resp.read()
             with pytest.raises(AssertionError):
                 assert resp.text()
    def test_multiple_requests(self):
        with aioresponses() as m:
            m.get(self.url, status=200)
            m.get(self.url, status=201)
            m.get(self.url, status=202)
            resp = yield from self.session.get(self.url)
            self.assertEqual(resp.status, 200)
            resp = yield from self.session.get(self.url)
            self.assertEqual(resp.status, 201)
            resp = yield from self.session.get(self.url)
            self.assertEqual(resp.status, 202)

            key = ('GET', self.url)
            self.assertIn(key, m.requests)
            self.assertEqual(len(m.requests[key]), 3)
            self.assertEqual(m.requests[key][0].args, tuple())
            self.assertEqual(m.requests[key][0].kwargs,
                             {'allow_redirects': True})
Example #23
0
def test_vfolder_download(mocker):
    import asynctest
    mock_reader = asynctest.CoroutineMock()
    mock_from_response = mocker.patch(
        'ai.backend.client.vfolder.aiohttp.MultipartReader.from_response',
        return_value=mock_reader)
    mock_reader.next = asynctest.CoroutineMock()
    mock_reader.next.return_value = None
    with Session() as session:
        with aioresponses() as m:
            vfolder_name = 'fake-vfolder-name'
            m.get(build_url(session.config,
                            '/folders/{}/download'.format(vfolder_name)),
                  status=200,
                  headers={'X-TOTAL-PAYLOADS-LENGTH': '0'}, body='')
            session.VFolder(vfolder_name).download(['fake-file1'])
            assert mock_from_response.called == 1
            assert mock_reader.next.called == 1
Example #24
0
 def test_invalid_requests(self, dummy_endpoint):
     with aioresponses() as m, Session() as session:
         body = json.dumps({
             'type': 'https://api.backend.ai/probs/kernel-not-found',
             'title': 'Kernel Not Found',
         }).encode('utf8')
         m.post(
             dummy_endpoint, status=404, body=body,
             headers={'Content-Type': 'application/problem+json; charset=utf-8',
                      'Content-Length': str(len(body))},
         )
         rqst = Request(session, 'POST', '/')
         with pytest.raises(BackendAPIError) as e:
             with rqst.fetch():
                 pass
             assert e.status == 404
             assert e.data['type'] == \
                 'https://api.backend.ai/probs/kernel-not-found'
             assert e.data['title'] == 'Kernel Not Found'
Example #25
0
    async def test_agent_app_list_apps_running(self):
        self._prepare_additional_fixture_data()
        await self.pg_data_mocker.create()

        with aioresponses(passthrough=[TEST_LOCAL_AIOHTTP_ADDRESS]) as rsps:
            build_mesos_cluster(rsps,
                                "ead07ffb-5a61-42c9-9386-21b680597e6c-S0")
            resp = await self.client.get(
                "/agents/ead07ffb-5a61-42c9-9386-21b680597e6c-S0/apps",
                headers={"Authorization": f"Token {self.user_auth_key}"},
            )
            self.assertEqual(200, resp.status)
            data = await resp.json()
            self.assertEqual(5, len(data["apps"]))
            expected_app_ids = sorted([
                "captura/wetl/visitcentral",
                "portal/api",
                "captura/kirby/feeder",
                "infra/asgard/api",
                "infra/rabbitmq",
            ])
            self.assertEqual(expected_app_ids,
                             sorted([app["id"] for app in data["apps"]]))
Example #26
0
async def test_get_artist_with_wikipedia_description(
        client, music_brainz_response_with_wikipedia, cover_art_response,
        wikipedia_response):
    with aioresponses() as mocked:
        mocked.get(_get_music_brainz_url('asd'),
                   status=200,
                   body=music_brainz_response_with_wikipedia)
        mocked.get(_get_cover_art_url('album-id'),
                   status=200,
                   body=cover_art_response)
        mocked.get(_get_wiki_url('nirvana'),
                   status=200,
                   body=wikipedia_response)

        response = await client.get(f'/api/mashup/asd')

        assert response.status_code == 200
        data = json.loads(await response.get_data())

        assert data['name'] == 'nirvana'
        assert data['description'] == 'some description'
        assert len(data['albums']) == 1
        assert data['albums'][0]['title'] == 'some album'
 async def test_fetch_very_old_nightly_metadata_from_txt(self):
     record = {
         'id': 'a',
         'download': {
             'url': ('http://server.org/firefox-6.0a1.en-US.linux-x86_64'
                     '.tar.bz2'),
         }
     }
     with aioresponses() as m:
         m.get(
             'http://server.org/firefox-6.0a1.en-US.linux-x86_64.json',
             status=404,
         )
         m.get('http://server.org/firefox-6.0a1.en-US.linux-x86_64.txt',
               body=('20100704054020 55f39d8d866c'),
               headers={'Content-type': 'text/plain'})
         received = await inventory_to_records.fetch_nightly_metadata(
             self.session, record)
     assert received == {
         'buildid': '20100704054020',
         'moz_source_repo': 'http://hg.mozilla.org/mozilla-central',
         'moz_source_stamp': '55f39d8d866c'
     }
Example #28
0
def test_list_vfolders():
    with Session() as session:
        with aioresponses() as m:
            payload = [
                {
                    'name': 'fake-vfolder1',
                    'id': 'fake-vfolder1-id',
                    'host': 'fake-vfolder1-host',
                    'is_owner': True,
                    'permissions': 'wd',
                },
                {
                    'name': 'fake-vfolder2',
                    'id': 'fake-vfolder2-id',
                    'host': 'fake-vfolder2-host',
                    'is_owner': True,
                    'permissions': 'wd',
                }
            ]
            m.get(build_url(session.config, '/folders'), status=200,
                  payload=payload)
            resp = session.VFolder.list()
            assert resp == payload
Example #29
0
async def test_slackbot_send_custom_json():
    from rasa.core.channels.slack import SlackBot

    with aioresponses() as mocked:
        mocked.post(
            "https://www.slack.com/api/chat.postMessage",
            payload={"ok": True, "purpose": "Testing bots"},
        )

        bot = SlackBot("DummyToken", "General")
        await bot.send_custom_json("ID", {"test_key": "test_value"})

        r = latest_request(mocked, "POST", "https://www.slack.com/api/chat.postMessage")

        assert r

        request_params = json_of_latest_request(r)

        assert request_params == {
            "as_user": True,
            "channel": "General",
            "test_key": "test_value",
        }
 async def test_stream_files_to_dir(self, guid, page1, page2, file_name,
                                    expected_json):
     with aioresponses() as m:
         m.get(
             f"{settings.OSF_API_URL}v2/registrations/{guid}/wikis/",
             body=page1,
         )
         m.get(
             f"{settings.OSF_API_URL}v2/registrations/{guid}/wikis/?page=2&page=2",
             body=page2,
         )
         with tempfile.TemporaryDirectory() as temp_dir:
             await dump_json_to_dir(
                 f"{settings.OSF_API_URL}v2/registrations/{guid}/wikis/",
                 temp_dir,
                 file_name,
             )
             assert len(os.listdir(temp_dir)) == 1
             assert os.listdir(temp_dir)[0] == file_name
             info = json.loads(
                 open(os.path.join(temp_dir, file_name)).read())
             assert len(info) == 11
             assert info == expected_json
Example #31
0
def test_mutate(
    monkeypatch,
    adm_req_samples,
    index,
    m_request,
    m_expiry,
    m_trust_data,
    m_alerting,
    allowed,
    status_code,
    detection_mode,
):
    with aioresponses() as aio:
        aio.get(re.compile(r".*"), callback=fix.async_callback, repeat=True)
        monkeypatch.setenv("DETECTION_MODE", str(detection_mode))
        client = pytest.fa.APP.test_client()
        response = client.post("/mutate", json=adm_req_samples[index])
        admission_response = response.get_json()["response"]

        assert response.status_code == 200
        assert response.is_json
        assert admission_response["allowed"] == allowed
        assert admission_response["status"]["code"] == status_code
Example #32
0
async def test_offline_status(hypixel_client: Hypixel, key: UUID) -> None:
    """Test to check the offline_status method returns correct data."""
    with aioresponses() as m:
        m.get(
            f"https://api.hypixel.net/status?key={str(key)}&uuid=74" +
            "86aa03aca5470e888dde8a43eb8c10",
            status=200,
            headers={
                "RateLimit-Limit": "120",
                "RateLimit-Remaining": "119",
                "RateLimit-Reset": "8",
            },
            payload={
                "success": True,
                "session": {
                    "online": False,
                },
            },
        )
        client = hypixel_client
        data = await client.player_status("7486aa03aca5470e888dde8a43eb8c10")

        assert data.online is False
Example #33
0
    async def test_apps_stats_app_not_found(self):
        with aioresponses(passthrough=[
                TEST_LOCAL_AIOHTTP_ADDRESS, settings.STATS_API_URL
        ]) as rsps:
            agent_id = "ead07ffb-5a61-42c9-9386-21b680597e6c-S0"
            build_mesos_cluster(rsps, agent_id)  # namespace=asgard-infra

            app_stats_datapoints = get_fixture(
                f"agents/{agent_id}/app_stats.json")

            resp = await self.client.get(
                f"/apps/asgard/api/not-exist/stats?account_id={ACCOUNT_DEV_ID}",
                headers={
                    "Authorization":
                    f"Token {USER_WITH_MULTIPLE_ACCOUNTS_AUTH_KEY}"
                },
            )
            self.assertEqual(HTTPStatus.OK, resp.status)
            data = await resp.json()
            self.assertEqual(
                AppStats(cpu_pct="0", ram_pct="0", cpu_thr_pct="0").dict(),
                data["stats"],
            )
Example #34
0
    async def test_agents_with_atrrs_two_attrs_filter(self):
        self._prepare_additional_fixture_data()
        await self.pg_data_mocker.create()

        with aioresponses(passthrough=[TEST_LOCAL_AIOHTTP_ADDRESS]) as rsps:
            build_mesos_cluster(
                rsps,
                "ead07ffb-5a61-42c9-9386-21b680597e6c-S0",  # namespace=asgard-infra
                "ead07ffb-5a61-42c9-9386-21b680597e6c-S3",  # namespace=asgard-infra
                "ead07ffb-5a61-42c9-9386-21b680597e6c-S4",  # namespace=asgard-dev
                "ead07ffb-5a61-42c9-9386-21b680597e6c-S44",  # namespace=dev
            )
            resp = await self.client.get(
                "/agents/with-attrs?workload=general&dc=gcp",
                headers={"Authorization": f"Token {self.user_auth_key}"},
            )
            self.assertEqual(200, resp.status)
            data = await resp.json()
            self.assertEqual(1, len(data["agents"]))
            self.assertEqual(
                "ead07ffb-5a61-42c9-9386-21b680597e6c-S0",
                data["agents"][0]["id"],
            )
Example #35
0
 async def mock_form_unhappy_path(input_text: Text, output_text: Text,
                                  slot: Optional[Text]) -> None:
     response_error = {
         "error":
         f"Failed to extract slot {slot} with action restaurant_form",
         "action_name": "restaurant_form",
     }
     with aioresponses() as mocked:
         # Request which rejects form execution
         mocked.post(
             "https://example.com/webhooks/actions",
             repeat=False,
             exception=ClientResponseError(400, "",
                                           json.dumps(response_error)),
         )
         # Request after returning from unhappy path which sets next requested slot
         mocked.post(
             "https://example.com/webhooks/actions",
             payload=response_for_slot(slot),
             repeat=True,
         )
         responses = await form_bot_agent.handle_text(input_text)
         assert responses[0]["text"] == output_text
Example #36
0
async def test_remote_action_endpoint_responds_400(
        default_dispatcher_collecting,
        default_domain):
    tracker = DialogueStateTracker("default",
                                   default_domain.slots)

    endpoint = EndpointConfig("https://example.com/webhooks/actions")
    remote_action = action.RemoteAction("my_action", endpoint)

    with aioresponses() as mocked:
        # noinspection PyTypeChecker
        mocked.post(
            'https://example.com/webhooks/actions',
            exception=ClientResponseError(
                400, None, '{"action_name": "my_action"}'))

        with pytest.raises(Exception) as execinfo:
            await remote_action.run(default_dispatcher_collecting,
                                    tracker,
                                    default_domain)

    assert execinfo.type == ActionExecutionRejection
    assert "Custom action 'my_action' rejected to run" in str(execinfo.value)
Example #37
0
def test_analyze_update(tmp_path: Path) -> None:
    runner = CliRunner()
    src = (Path(__file__).parent / "data" / "kubernetes" / "gafaelfawr" /
           "Chart.yaml")
    dst = tmp_path / "Chart.yaml"
    shutil.copy(src, dst)
    yaml = YAML()
    output = StringIO()
    yaml.dump({"entries": {"gafaelfawr": [{"version": "1.4.0"}]}}, output)
    sqre = output.getvalue()

    with aioresponses() as mock:
        mock.get("https://lsst-sqre.github.io/charts/index.yaml", body=sqre)
        result = runner.invoke(
            main,
            ["analyze", "--path",
             str(tmp_path), "--update"],
            env={"NEOPHILE_CACHE_ENABLED": "0"},
        )

    assert result.exit_code == 0
    data = yaml.load(dst)
    assert data["dependencies"][0]["version"] == "1.4.0"
Example #38
0
    def test_metadata_document_retrieval(self):
        """
        SCENARIO:  an IEDA metadata document URL is retrieved and properly
        transformed.

        EXPECTED RESULT:  A byte-stream of a valid metadata document.  There
        are no ERROR or WARNING messages logged.
        """

        url = self.pattern + '/600121iso.xml'
        harvester = SchemaDotOrgHarvester()

        content = ir.read_binary('tests.data.ieda', '600121iso.xml')
        with self.assertLogs(logger=harvester.logger, level='DEBUG') as cm:
            with aioresponses() as m:
                m.get(self.regex, body=content)
                doc1 = asyncio.run(harvester.retrieve_metadata_document(url))

            self.assertLogLevelCallCount(cm.output, level='ERROR', n=0)
            self.assertLogLevelCallCount(cm.output, level='WARNING', n=0)

        doc2 = lxml.etree.parse(io.BytesIO(content))
        self.assertEqual(lxml.etree.tostring(doc1), lxml.etree.tostring(doc2))
Example #39
0
def test_proxing_post_to_backend():
    host = 'mock-server'
    port = '80'
    tag = 'mock_server'
    heart_beat_payload = {
        "host": host,
        "port": port,
        "tag": tag
    }
    response = client.post('/heartbeat', json=heart_beat_payload)
    input = {'this is what': 'client sent'}
    output = {'this is what': 'proxied server sent'}

    def assertion_fun(url, **kwargs):
        payload = json.loads(kwargs['data'].decode('utf-8'))
        assert payload == input
        return CallbackResult(status=200, payload=output)

    with aioresponses(real_http=True) as mock_server:
        mock_server.post("http://" + host + ':' + port + '/?', callback=assertion_fun)
        resp2 = client.post(f'/{tag}', json=input)
        assert resp2.status_code == 200
        assert output == resp2.json()
    async def test_get_app_stats_exception_on_search(self):
        """
        Returns AppStats with errors filled if any exception happend during ES query
        """
        with aioresponses() as rsps:
            agent_id = "ead07ffb-5a61-42c9-9386-21b680597e6c-S0"
            build_mesos_cluster(rsps, agent_id)

            index_name = "asgard-app-stats-2019-03-29-*"
            url = f"{settings.STATS_API_URL}/{index_name}/_search"
            rsps.get(url, exception=Exception("Connection error to ES"))

            stats = await self.apps_backend.get_app_stats(
                MesosApp(id="infra-asgard-api"), self.user, self.account)
            self.assertEqual(
                AppStats(
                    cpu_pct="0",
                    ram_pct="0",
                    cpu_thr_pct="0",
                    errors={"global": "Connection error to ES"},
                ),
                stats,
            )
 async def test_putting_slave_multiple_tasks_statistics_on_rabbitMQ(self):
     self.maxDiff = None
     with aioresponses() as m:
         m.get('http://10.11.43.96:5050/slaves', payload=slaves)
         slave_ips = await get_slave_ip_list("10.11.43.96")
         m.get(
             f'http://{slave_ips[0]}/monitor/statistics.json',
             payload=slave_statistics_response_mock_multiple_tasks)
         slave_statistics = await get_slave_statistics(
             slave_ips[0], self.loggerMock)
         queue = asynctest.mock.CoroutineMock(
             put=asynctest.mock.CoroutineMock(),
             connect=asynctest.mock.CoroutineMock())
     await send_slave_statistics_to_queue(slave_statistics, queue,
                                          self.loggerMock)
     self.assertEquals([
         asynctest.mock.call(
             body=slave_statistics[0],
             routing_key=conf.STATUS_COLLECTOR_RABBITMQ_RK),
         asynctest.mock.call(
             body=slave_statistics[1],
             routing_key=conf.STATUS_COLLECTOR_RABBITMQ_RK)
     ], queue.put.await_args_list)
Example #42
0
async def test_that_subsequent_failure_to_fetch_discovery_data_is_handled(caplog):
    oidc = OpenIdConnectDiscovery()
    oidc.init(dummy_oidc_url)

    with aioresponses() as mock:
        mock.get(
            dummy_oidc_url, payload={"userinfo_endpoint": dummy_userinfo_endpoint_url}
        )
        await oidc.get_discovery_data()

    caplog.set_level(logging.INFO)

    # NOTE: Reaching into the internals to trigger JWKS kid data refresh
    oidc._discovery_data_cached_at = -3600
    # NOTE: Not mocking JWKS endpoint, which would cause a "Cannot connect" error on
    #       the first try.
    parsed = await oidc.get_discovery_data()

    assert parsed == {"userinfo_endpoint": dummy_userinfo_endpoint_url}
    assert (
        "Failed to refresh OIDC discovery data, re-using old data. Exception was: ClientConnectorError"
        in caplog.text
    )
    async def test_request_with_non_deepcopyable_parameter(self):
        def non_deep_copyable():
            """A generator does not allow deepcopy."""
            for line in ["header1,header2", "v1,v2", "v10,v20"]:
                yield line

        generator_value = non_deep_copyable()

        with aioresponses() as m:
            m.get(self.url, status=200)
            resp = await self.session.get(self.url, data=generator_value)
            self.assertEqual(resp.status, 200)

            key = ('GET', URL(self.url))
            self.assertIn(key, m.requests)
            self.assertEqual(len(m.requests[key]), 1)

            request = m.requests[key][0]
            self.assertEqual(request.args, tuple())
            self.assertEqual(request.kwargs, {
                'allow_redirects': True,
                "data": generator_value
            })
Example #44
0
async def test_that_subsequent_failure_to_fetch_jwks_kid_data_is_handled(caplog):
    validator = Oauth2JwtAccessTokenValidator()
    validator.init(dummy_jwks_uri, [dummy_audience])

    token = make_access_token(sub="johndoe")

    with aioresponses() as mock:
        mock.get(dummy_jwks_uri, payload=dummy_jwks_response_data)
        await validator.parse(token)

    caplog.set_level(logging.INFO)

    # NOTE: Reaching into the internals to trigger JWKS kid data refresh
    validator._jwks_cached_at = -3600
    # NOTE: Not mocking JWKS endpoint, which would cause a "Cannot connect" error on
    #       the first try.
    parsed = await validator.parse(token)

    assert isinstance(parsed, JwtAccessToken)
    assert (
        "Failed to refresh JWKS kid mapping, re-using old data. Exception was: ClientConnectorError"
        in caplog.text
    )
Example #45
0
    async def test_partial_results(self):
        async with KustoClient(self.HOST) as client:
            query = """set truncationmaxrecords = 5;
range x from 1 to 10 step 1"""
            properties = ClientRequestProperties()
            properties.set_option(
                ClientRequestProperties.
                results_defer_partial_query_failures_option_name, False)
            with aioresponses() as aioresponses_mock:
                self._mock_query(aioresponses_mock)
                with pytest.raises(KustoMultiApiError) as e:
                    await client.execute_query("PythonTest", query, properties)
                errors = e.value.get_api_errors()
                assert len(errors) == 1
                assert errors[0].code == "LimitsExceeded"

                properties.set_option(
                    ClientRequestProperties.
                    results_defer_partial_query_failures_option_name, True)
                self._mock_query(aioresponses_mock)
                response = await client.execute_query("PythonTest", query,
                                                      properties)
            self._assert_partial_results_response(response)
Example #46
0
 async def test_replies_to_private_message_for_single_url(self, bot):
     """Send reply to a private message without an index number if incoming
     message consists only of one URL.
     """
     url = 'https://www.deezer.com/track/1'
     message = make_mock_message(text=url, chat_type=ChatType.PRIVATE)
     reply_text = ('Test Artist 1 - Test Title 1\n'
                   '<a href="https://www.test.com/d">Deezer</a> | '
                   '<a href="https://www.test.com/g">Google Music</a> | '
                   '<a href="https://www.test.com/sc">SoundCloud</a> | '
                   '<a href="https://www.test.com/yn">Yandex Music</a> | '
                   '<a href="https://www.test.com/s">Spotify</a> | '
                   '<a href="https://www.test.com/ym">YouTube Music</a> | '
                   '<a href="https://www.test.com/y">YouTube</a> | '
                   '<a href="https://www.test.com/am">Apple Music</a> | '
                   '<a href="https://www.test.com/t">Tidal</a>')
     api_url = f'{bot.config.ODESLI_API_URL}?url={url}'
     payload = make_response(song_id=1)
     with aioresponses() as m:
         m.get(api_url, status=HTTPStatus.OK, payload=payload)
         await bot.dispatcher.message_handlers.notify(message)
         assert message.reply.called
         assert message.reply.called_with_text == reply_text
Example #47
0
def test_invalid_requests(dummy_endpoint):
    with aioresponses() as m, Session() as session:
        body = json.dumps({
            'type': 'https://api.backend.ai/probs/kernel-not-found',
            'title': 'Kernel Not Found',
        }).encode('utf8')
        m.post(
            dummy_endpoint,
            status=404,
            body=body,
            headers={
                'Content-Type': 'application/problem+json; charset=utf-8',
                'Content-Length': str(len(body))
            },
        )
        rqst = Request(session, 'POST', '/')
        with pytest.raises(BackendAPIError) as e:
            with rqst.fetch():
                pass
            assert e.status == 404
            assert e.data['type'] == \
                'https://api.backend.ai/probs/kernel-not-found'
            assert e.data['title'] == 'Kernel Not Found'
Example #48
0
    async def test_call_on_event_when_sse_event_is_found(self):
        """
        A cada par de linhas:
            event: ...
            data: ...
        Chamamos o método `on_event()`
        """
        content = open("./tests/fixtures/sse/single-event.txt").read()

        with asynctest.patch.object(self.consumer, 'keep_runnig', side_effect=[True, False]), \
                asynctest.patch.object(self.consumer, "on_event") as on_event_mock:
            with aioresponses() as m:
                m.get("http://localhost:8080/v2/events",
                      status=200,
                      body=content)
                await self.consumer.start()
                args_list = on_event_mock.await_args_list
                self.assertEqual([
                    asynctest.mock.call(
                        b'event_stream_attached',
                        b'{"remoteAddress":"172.18.0.1","eventType":"event_stream_attached","timestamp":"2018-09-03T18:03:45.685Z"}'
                    )
                ], args_list)
async def director_v2_service_mock() -> AsyncIterable[aioresponses]:
    """uses aioresponses to mock all calls of an aiohttpclient
    WARNING: any request done through the client will go through aioresponses. It is
    unfortunate but that means any valid request (like calling the test server) prefix must be set as passthrough.
    Other than that it seems to behave nicely
    """
    PASSTHROUGH_REQUESTS_PREFIXES = ["http://127.0.0.1", "ws://"]
    get_computation_pattern = re.compile(
        r"^http://[a-z\-_]*director-v2:[0-9]+/v2/computations/.*$"
    )
    delete_computation_pattern = get_computation_pattern
    # NOTE: GitHK I have to copy paste that fixture for some unclear reason for now.
    # I think this is due to some conflict between these non-pytest-simcore fixtures and the loop fixture being defined at different locations?? not sure..
    # anyway I think this should disappear once the garbage collector moves to its own micro-service
    with aioresponses(passthrough=PASSTHROUGH_REQUESTS_PREFIXES) as mock:
        mock.get(
            get_computation_pattern,
            status=202,
            payload={"state": str(RunningState.NOT_STARTED.value)},
            repeat=True,
        )
        mock.delete(delete_computation_pattern, status=204, repeat=True)
        yield mock
    async def test_scan_candidates(self):
        with aioresponses() as m:
            candidates_listing = utils.ARCHIVE_URL + 'pub/firefox/candidates/'
            m.get(
                candidates_listing,
                payload={
                    'prefixes':
                    ['54.0-candidates/', '52.0.2esr-candidates/', 'archived/'],
                    'files': []
                })
            m.get(candidates_listing + '52.0.2esr-candidates/',
                  payload={
                      'prefixes': [
                          'build1/',
                          'build2/',
                          'build3/',
                      ],
                      'files': []
                  })
            m.get(candidates_listing + '54.0-candidates/',
                  payload={
                      'prefixes': [
                          'build11/',
                          'build9/',
                          'build3/',
                          'pop/',
                      ],
                      'files': []
                  })
            await inventory_to_records.scan_candidates(self.session, 'firefox')

            assert inventory_to_records._candidates_build_folder == {
                'firefox': {
                    '54.0': 'build11/',
                    '52.0.2esr': 'build3/',
                }
            }
Example #51
0
def test_fetch_data_custom_batch_size(mocker):
    with aioresponses() as aiomock:
        base_query = 'https://api.wootric.com/v1/responses?access_token=x'
        for i in range(8):
            aiomock.get(f'{base_query}&page={i}',
                        status=200,
                        payload=[{
                            'page': i
                        }])
        for i in range(8, 11):
            aiomock.get(f'{base_query}&page={i}', status=200, payload=[])
        mocker.spy(woot, 'batch_fetch')
        data = woot.fetch_wootric_data(base_query, batch_size=3)
        assert data == [
            {
                'page': 1
            },
            {
                'page': 2
            },
            {
                'page': 3
            },
            {
                'page': 4
            },
            {
                'page': 5
            },
            {
                'page': 6
            },
            {
                'page': 7
            },
        ]
        assert woot.batch_fetch.call_count == 3
async def test_repeated_discovery_failure_for_static_seed():
    """
    When gossip fetch fails `maximum_retry_count` times, we should fail with a
    DiscoverFailed error.
    """

    class always_fail(DiscoveryRetryPolicy):
        def __init__(self):
            super().__init__()

        def should_retry(self, _):
            return False

        async def wait(self, seed):
            pass

    seed = NodeService("1.2.3.4", 2113, None)
    retry = always_fail()
    gossip = data.make_gossip("2.3.4.5")
    with aioresponses() as mock:
        successful_discoverer = ClusterDiscovery(
            StaticSeedFinder([seed]), aiohttp.ClientSession(), retry
        )

        mock.get("http://1.2.3.4:2113/gossip", status=500)
        mock.get("http://1.2.3.4:2113/gossip", payload=gossip)

        with pytest.raises(DiscoveryFailed):
            assert await successful_discoverer.discover() == NodeService(
                "2.3.4.5", 1113, None
            )
            stats = retry.stats[seed]

            assert stats.attempts == 1
            assert stats.successes == 0
            assert stats.failures == 1
            assert stats.consecutive_failures == 1
 async def test_fetch_release_metadata_mac(self):
     record = {
         'source': {
             'product': 'firefox'
         },
         'target': {
             'version': '57.0b4',
             'platform': 'macosx',
             'locale': 'fr-FR',
         }
     }
     archive_url = utils.ARCHIVE_URL + 'pub/firefox/candidates/'
     with aioresponses() as m:
         candidate_folder = (archive_url +
                             '57.0b4-candidates/build1/mac/en-US/')
         m.get(candidate_folder,
               payload={
                   'prefixes': [],
                   'files': [{
                       'name': 'firefox-57.0b4.json'
                   }]
               })
         m.get(candidate_folder + 'firefox-57.0b4.json',
               payload={'buildid': '20170928180207'})
         received = await inventory_to_records.fetch_release_metadata(
             self.session, record)
         assert received == {
             'buildid': '20170928180207',
             'buildnumber': 1,
         }
     # Now cached, no need to mock HTTP responses.
     received = await inventory_to_records.fetch_release_metadata(
         self.session, record)
     assert received == {
         'buildid': '20170928180207',
         'buildnumber': 1,
     }
Example #54
0
    def test__retrieve_record__bad_series_identifier(self):
        """
        SCENARIO:  We have a valid landing page URL but the JSON-LD document
        has a series identifier that is not in the format that we want.

        EXPECTED RESULT:  RuntimeError
        """
        landing_page_url = (
            'https://www.archive.arm.gov/metadata/adc/html/wsacrcrcal.html'
        )

        harvester = ARMHarvester()

        # External calls to read the:
        #
        #   2) HTML document for the landing page
        #   3) XML document associated with the landing page
        #
        contents = [
            ir.read_binary('tests.data.arm', 'wsacrcrcal.bad_series_id.html'),
            ir.read_binary('tests.data.arm', 'wsacrcrcal.xml'),
        ]
        status_codes = [200, 200, 200]
        headers = [
            {'Content-Type': 'text/html'},
            {'Content-Type': 'application/xml'},
        ]

        z = zip(contents, status_codes, headers)
        with aioresponses() as m:
            for content, status_code, headers in z:
                m.get(self.regex,
                      body=content, status=status_code, headers=headers)

            with self.assertLogs(logger=harvester.logger, level='DEBUG'):
                with self.assertRaises(RuntimeError):
                    asyncio.run(harvester.retrieve_record(landing_page_url))
Example #55
0
async def test_get_forecast():
    """Test with valid forecast data."""
    with open("tests/data/forecast_data.json") as file:
        forecast_data = json.load(file)
    with open("tests/data/location_data.json") as file:
        location_data = json.load(file)

    session = aiohttp.ClientSession()

    with aioresponses() as session_mock:
        # pylint:disable=line-too-long
        session_mock.get(
            "https://dataservice.accuweather.com/forecasts/v1/daily/5day/268068?apikey=32-character-string-1234567890qw&details=true&metric=True",
            payload=forecast_data,
            headers=HEADERS,
        )
        session_mock.get(
            "https://dataservice.accuweather.com/locations/v1/cities/geoposition/search?apikey=32-character-string-1234567890qw&q=52.0677904%252C19.4795644",
            payload=location_data,
            headers=HEADERS,
        )

        accuweather = AccuWeather(VALID_API_KEY,
                                  session,
                                  latitude=LATITUDE,
                                  longitude=LONGITUDE)
        forecast = await accuweather.async_get_forecast()

    await session.close()

    assert forecast[0]["IconDay"] == 15
    assert forecast[0]["PrecipitationProbabilityDay"] == 57
    assert forecast[0]["WindDay"]["Speed"]["Value"] == 13.0
    assert forecast[0]["TemperatureMax"]["Value"] == 24.8
    assert forecast[0]["TemperatureMax"]["Unit"] == "C"
    assert forecast[0]["Ozone"]["Value"] == 23
    assert accuweather.requests_remaining == 23
 def test_raising_custom_error(self):
     with aioresponses() as aiomock:
         aiomock.get(self.url, exception=HttpProcessingError(message='foo'))
         with self.assertRaises(HttpProcessingError):
             yield from self.session.get(self.url)
 def test_unknown_request(self):
     with aioresponses() as aiomock:
         aiomock.add(self.url, payload={'foo': 'bar'})
         with self.assertRaises(ClientConnectionError):
             yield from self.session.get('http://example.com/foo')
 def test_shortcut_method(self, http_method, mocked):
     with aioresponses() as m:
         getattr(m, http_method.lower())(self.url)
         mocked.assert_called_once_with(self.url, method=http_method)