{ "info": { "author": "Florent Pigout", "author_email": "florent.pigout@novapost.fr", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6" ], "description": "=============\nMock services\n=============\n\n.. image:: https://circleci.com/gh/novafloss/mock-services.svg?style=shield\n :target: https://circleci.com/gh/novafloss/mock-services\n :alt: We are under CI!!\n\nAims to provide an easy way to mock an entire service API based on\n`requests-mock`_ and a simple dict definition of a service. The idea is to mock\neverything at start according given rules. Then `mock-services`_ allows to\n*start/stop* http mock locally.\n\nDuring our session we can:\n\n- add rules\n- permit external calls\n- stop mocking\n- reset rules\n- restart mocking\n- etc.\n\n\nMock endpoints explicitly\n=========================\n\n\n*Note:* rules urls must be regex. They always will be compiled before updating\nthe main `requests-mock`_ urls registry.\n\nLet's mock our favorite search engine::\n\n >>> def fake_duckduckgo_cb(request):\n ... return 200, {}, 'Coincoin!'\n\n >>> rules = [\n ... {\n ... 'text': fake_duckduckgo_cb,\n ... 'headers': {'Content-Type': 'text/html'},\n ... 'method': 'GET',\n ... 'url': r'^https://duckduckgo.com/\\?q='\n ... },\n ... ]\n\n >>> from mock_services import update_http_rules\n >>> update_http_rules(rules)\n\n >>> import requests\n >>> requests.get('https://duckduckgo.com/?q=mock-services').content[:15]\n ''\n\n >>> from mock_services import start_http_mock\n >>> start_http_mock()\n\n >>> requests.get('https://duckduckgo.com/?q=mock-services').content\n 'Coincoin!'\n\n\nWhen the http_mock is started if you try to call an external url, it should\nfail::\n\n >>> requests.get('https://www.google.com/#q=mock-services')\n ...\n ConnectionError: Connection refused: GET https://www.google.com/#q=mock-services\n\n\nThen you can allow external calls if needed::\n\n >>> from mock_services import http_mock\n >>> http_mock.set_allow_external(True)\n\n >>> requests.get('https://www.google.com/#q=mock-services').content[:15]\n ''\n\n\nAt anytime you can stop the mocking as follow::\n\n >>> from mock_services import stop_http_mock\n >>> stop_http_mock()\n\n >>> requests.get('https://duckduckgo.com/?q=mock-services').content[:15]\n ''\n\n\nOr stop mocking during a function call::\n\n >>> start_http_mock()\n\n >>> @no_http_mock\n ... def please_do_not_mock_me():\n ... return requests.get('https://duckduckgo.com/?q=mock-services').content[:15] == '', 'mocked!'\n\n >>> please_do_not_mock_me\n\n\nOr start mocking for another function call::\n\n >>> stop_http_mock()\n\n >>> @with_http_mock\n ... def please_mock_me():\n ... assert requests.get('https://duckduckgo.com/?q=mock-services').content == 'Coincoin', 'no mock!'\n\n >>> please_mock_me\n\n\nMock service easy\n=================\n\n\nYou can add REST rules with an explicit method. It will add rules as above and\nautomatically bind callbacks to fake a REST service.\n\n*Note:* *resource* and *id* regex options are mandatory in the rules urls.\n\nAdditionally, `mock_services`_ include `attrs`_ library. It can be use for\nfield validation as follow.\n\nThis service mock will create, get, update and delete resources for you::\n\n >>> import attr\n\n >>> rest_rules = [\n ... {\n ... 'method': 'LIST',\n ... 'url': r'^http://my_fake_service/(?Papi)$'\n ... },\n ... {\n ... 'method': 'GET',\n ... 'url': r'^http://my_fake_service/(?Papi)/(?P\\d+)$',\n ... },\n ... {\n ... 'method': 'GET',\n ... 'url': r'^http://my_fake_service/(?Papi)/(?P\\d+)/(?Pdownload)$',\n ... },\n ... {\n ... 'method': 'POST',\n ... 'url': r'^http://my_fake_service/(?Papi)$',\n ... 'id_name': 'id',\n ... 'id_factory': int,\n ... 'attrs': {\n ... 'bar': attr.ib(),\n ... 'foo':attr.ib(default=True)\n ... }\n ... },\n ... {\n ... 'method': 'PATCH',\n ... 'url': r'^http://my_fake_service/(?Papi)/(?P\\d+)$',\n ... },\n ... {\n ... 'method': 'DELETE',\n ... 'url': r'^http://my_fake_service/(?Papi)/(?P\\d+)$'\n ... },\n ... ]\n\n >>> from mock_services import update_rest_rules\n >>> update_rest_rules(rest_rules)\n\n >>> from mock_services import start_http_mock\n >>> start_http_mock()\n\n >>> response = requests.get('http://my_fake_service/api')\n >>> response.status_code\n 200\n >>> response.json()\n []\n\n >>> response = requests.get('http://my_fake_service/api/1')\n >>> response.status_code\n 404\n\n >>> import json\n\n >>> response = requests.post('http://my_fake_service/api',\n ... data=json.dumps({}),\n ... headers={'content-type': 'application/json'})\n >>> response.status_code\n 400\n\n >>> response = requests.post('http://my_fake_service/api',\n ... data=json.dumps({'bar': 'Python will save the world'}),\n ... headers={'content-type': 'application/json'})\n >>> response.status_code\n 201\n >>> response.json()\n {\n 'id': 1,\n 'foo'; True,\n 'bar'; 'Python will save the world.'\n }\n\n >>> response = requests.patch('http://my_fake_service/api/1',\n ... data=json.dumps({'bar': \"Python will save the world. I don't know how. But it will.\"}),\n ... headers={'content-type': 'application/json'})\n >>> response.status_code\n 200\n\n >>> response = requests.get('http://my_fake_service/api/1')\n >>> response.status_code\n 200\n >>> response.json()\n {\n 'id': 1,\n 'foo'; True,\n 'bar'; \"Python will save the world. I don't know how. But it will.\"\n }\n\n >>> response = requests.delete('http://my_fake_service/api/1')\n >>> response.status_code\n 204\n\n\nMore validation\n===============\n\n\nIs some cases you need to validate a resource against another. Then you can add\nglobal validators per endpoint as follow::\n\n >>> from mock_services import storage\n >>> from mock_services.service import ResourceContext\n >>> from mock_services.exceptions import Http409\n\n >>> def duplicate_foo(request):\n ... data = json.loads(request.body)\n ... ctx = ResourceContext(hostname='my_fake_service', resource='api')\n ... if data['foo'] in [o['foo'] for o in storage.list(ctx)]:\n ... raise Http409\n\n >>> rest_rules_with_validators = [\n ... {\n ... 'method': 'POST',\n ... 'url': r'^http://my_fake_service/(?Papi)$',\n ... 'validators': [\n ... duplicate_foo,\n ... ],\n ... },\n ... ]\n\n >>> response = requests.post('http://my_fake_service/api',\n ... data=json.dumps({'foo': 'bar'}),\n ... headers={'content-type': 'application/json'})\n >>> response.status_code\n 201\n\n >>> response = requests.post('http://my_fake_service/api',\n ... data=json.dumps({'foo': 'bar'}),\n ... headers={'content-type': 'application/json'})\n >>> response.status_code\n 409\n\n\nHave fun in testing external APIs ;)\n\n\n.. _`attrs`: https://github.com/hynek/attrs\n.. _`requests-mock`: https://github.com/openstack/requests-mock\n.. _`mock-services`: https://github.com/novafloss/mock-services\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/novafloss/mock-services", "keywords": "http", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "mock-services", "package_url": "https://pypi.org/project/mock-services/", "platform": "", "project_url": "https://pypi.org/project/mock-services/", "project_urls": { "Homepage": "https://github.com/novafloss/mock-services" }, "release_url": "https://pypi.org/project/mock-services/0.3.1/", "requires_dist": null, "requires_python": "", "summary": "Mock services.", "version": "0.3.1" }, "last_serial": 3676271, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "d6b80860b39e5e797b9f216e5d5d593d", "sha256": "e21741d28282ad69da09f47c3da5e6b8babc09bef8ed7deb0c633a90270013f0" }, "downloads": -1, "filename": "mock_services-0.1-py2-none-any.whl", "has_sig": false, "md5_digest": "d6b80860b39e5e797b9f216e5d5d593d", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 10400, "upload_time": "2015-12-10T16:41:20", "url": "https://files.pythonhosted.org/packages/db/c8/168602ef56adb7f6208f9c82e6caa04ac9f64edcce4d84e980d1f9c88e10/mock_services-0.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "59a98378b01e0d97a2d5e820409c486e", "sha256": "a0a35699529e7c256fdc9ad61900253f35b0052ae0488be377d75124156f9262" }, "downloads": -1, "filename": "mock-services-0.1.tar.gz", "has_sig": false, "md5_digest": "59a98378b01e0d97a2d5e820409c486e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7462, "upload_time": "2015-12-10T16:39:18", "url": "https://files.pythonhosted.org/packages/4d/56/550b281dc1672b09765ef81b3ff5ef964a807120ef567e49d75def7a3f02/mock-services-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "52130efc95c123e361347d91e7615102", "sha256": "469501f6c6ba3b363c7a901162308b05f87abafd8b6b43bb51da2b9ae8161099" }, "downloads": -1, "filename": "mock-services-0.2.tar.gz", "has_sig": false, "md5_digest": "52130efc95c123e361347d91e7615102", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8415, "upload_time": "2016-01-07T11:25:06", "url": "https://files.pythonhosted.org/packages/59/63/759f875507aa092ed9db76e1803bbdb6707f1777d91552a93fc2d1c1a609/mock-services-0.2.tar.gz" } ], "0.2.dev0": [], "0.3": [ { "comment_text": "", "digests": { "md5": "d775a8c9eae374db0fc2ff33c93d414d", "sha256": "bd53a3c9d7e6b3a81d94808d01412b009852343ee7c89abcbfb7ccafa393263b" }, "downloads": -1, "filename": "mock-services-0.3.tar.gz", "has_sig": false, "md5_digest": "d775a8c9eae374db0fc2ff33c93d414d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8584, "upload_time": "2016-10-13T13:00:34", "url": "https://files.pythonhosted.org/packages/52/73/160e9df2e3948d6118426282673b1661b941229771e988f2883e9df998b4/mock-services-0.3.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "e1b130bb22c4ec35af503703d892c034", "sha256": "dc3a3c69b122f6647857f12748cb02a195e8216ba7b8513352d96c2a2768933a" }, "downloads": -1, "filename": "mock_services-0.3.1-py2-none-any.whl", "has_sig": false, "md5_digest": "e1b130bb22c4ec35af503703d892c034", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 12080, "upload_time": "2018-03-16T13:39:23", "url": "https://files.pythonhosted.org/packages/1e/7e/294d8a5b2edf1880ba6f709b8461029a6971e72e646cb906bcf40784ea3a/mock_services-0.3.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "92513ec7e175c011ef6deca8e8e894b6", "sha256": "b07d51a55b18b7399a2c30fdb9008697df17d7717a04afccc9f89656ce82c193" }, "downloads": -1, "filename": "mock-services-0.3.1.tar.gz", "has_sig": false, "md5_digest": "92513ec7e175c011ef6deca8e8e894b6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8668, "upload_time": "2018-03-16T13:39:21", "url": "https://files.pythonhosted.org/packages/a2/6d/291552d2b8c710de5736d4db821707d48f03cecafe908ccfc3dbf08da183/mock-services-0.3.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e1b130bb22c4ec35af503703d892c034", "sha256": "dc3a3c69b122f6647857f12748cb02a195e8216ba7b8513352d96c2a2768933a" }, "downloads": -1, "filename": "mock_services-0.3.1-py2-none-any.whl", "has_sig": false, "md5_digest": "e1b130bb22c4ec35af503703d892c034", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 12080, "upload_time": "2018-03-16T13:39:23", "url": "https://files.pythonhosted.org/packages/1e/7e/294d8a5b2edf1880ba6f709b8461029a6971e72e646cb906bcf40784ea3a/mock_services-0.3.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "92513ec7e175c011ef6deca8e8e894b6", "sha256": "b07d51a55b18b7399a2c30fdb9008697df17d7717a04afccc9f89656ce82c193" }, "downloads": -1, "filename": "mock-services-0.3.1.tar.gz", "has_sig": false, "md5_digest": "92513ec7e175c011ef6deca8e8e894b6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8668, "upload_time": "2018-03-16T13:39:21", "url": "https://files.pythonhosted.org/packages/a2/6d/291552d2b8c710de5736d4db821707d48f03cecafe908ccfc3dbf08da183/mock-services-0.3.1.tar.gz" } ] }