{ "info": { "author": "Simon Jagoe", "author_email": "simon@simonjagoe.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 1 - Planning", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: MacOS", "Operating System :: Microsoft :: Windows", "Operating System :: OS Independent", "Operating System :: POSIX", "Operating System :: Unix", "Programming Language :: Python", "Topic :: Software Development", "Topic :: Software Development :: Testing" ], "description": "=====================================\n usagi: Web API test plugin for haas\n=====================================\n\n.. image:: https://api.travis-ci.org/sjagoe/usagi.png?branch=master\n :target: https://travis-ci.org/sjagoe/usagi\n :alt: Build status\n\n.. image:: https://coveralls.io/repos/sjagoe/usagi/badge.png?branch=master\n :target: https://coveralls.io/r/sjagoe/usagi?branch=master\n :alt: Coverage status\n\n\n``usagi`` is a plugin for haas_ that adds support for discovering Web\nAPI test cases descibed in YAML.\n\n``usagi`` requires ``haas v0.6.0`` or later.\n\n\n.. _haas: https://github.com/sjagoe/haas\n\n\nCurrent Features\n================\n\n* Describe web API tests using YAML.\n\n* Template URLs to avoid repeating items.\n\n* Variables and target hostname can be provided by environment variables.\n\n* YAML format contains multiple test cases.\n\n* Each test case is a grouping of related tests.\n\n* Make flexible assertions about the server's response.\n\n* Contribute web API test runner functionality through plugins.\n\n* Assert that the SHA256 of the response body matches an expected value.\n\n* Filter JSON response bodies before comparison using ``jq`` filter\n syntax: http://stedolan.github.io/jq/\n\n\nPlugins\n-------\n\n* Var loaders\n\n * Load from environment\n\n * Template string based on other vars\n\n * Load from file, either plaintext or JSON\n\n* Assertions\n\n * Assert status code\n\n * Assert header is present or matches value or regexp\n\n\nTODO\n====\n\n* Add more assertions!\n\n\nTest config format\n==================\n\n* ``version``: Currently required, but unverified (we are at\n ``v0.1.0.devN``, after all).\n\n* ``config``: Common test case configuration.\n\n * ``host``: The name (or IP) of the host to test.\n\n * Can come from env, template, file, like ``vars``.\n\n * ``scheme``: The scheme (``http``, ``https``) to use to connect to ``host``\n\n * ``vars``: Common variable definitions for all test cases; formatted\n as a dictionary of var name to type and value.\n\n * Simple string vars are allowed.\n\n * Others are specified as a dictionary with key ``type`` to\n determine how to load.\n\n* ``cases``: Collection of test cases. Each case contains multiple tests\n\n * ``name``: The name of the test case\n\n * ``tests``: Collection of individual tests\n\n * ``name``: The name of the test\n\n * ``url``: The URI/path relative to ``host`` against which the test\n will be executed.\n\n * ``method``: The HTTP method to use for the test.\n\n * ``assertions``: List of assertions to make about the test.\n\n\nExample Test\n------------\n\n.. code-block:: yaml\n\n ---\n version: '1.0'\n\n config:\n # Host is loaded as an environment variable\n host:\n type: env\n env: TEST_HOSTNAME\n vars:\n\n # Simple string var\n api_root: \"/api/v1/json\"\n\n # Template var\n metadata:\n type: template\n template: \"{api_root}/metadata\"\n\n # Variable loaded as JSON from file\n expected_index:\n type: file\n file: some_file.json\n format: json\n\n cases:\n - name: \"Basic\"\n tests:\n - name: \"Test root URL\"\n url: \"/\"\n assertions:\n - name: status_code\n expected: 200\n - name: header\n header: Content-Type\n value: text/plain\n\n - name: \"A case\"\n tests:\n - name: \"Authentication failure\"\n url:\n type: template\n template: \"{metadata}/auth/required\"\n parameters:\n method: GET\n headers:\n Content-Type: application/json\n assertions:\n - name: status_code\n expected: 401\n - name: header\n header: WWW-Authenticate\n regexp: \"Basic realm=.*\"\n - name: \"POST json\"\n url:\n type: template\n template: \"{metadata}/post\"\n parameters:\n method: POST\n body:\n format: json\n lookup-var: false\n value:\n some: [\"json-compatible\", \"structure\"]\n assertions:\n - name: status_code\n expected: 204", "description_content_type": null, "docs_url": null, "download_url": null, "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/sjagoe/usagi", "keywords": null, "license": "BSD", "maintainer": null, "maintainer_email": null, "name": "usagi", "package_url": "https://pypi.org/project/usagi/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/usagi/", "project_urls": { "Homepage": "https://github.com/sjagoe/usagi" }, "release_url": "https://pypi.org/project/usagi/0.3.1/", "requires_dist": [ "jsonschema", "pyyaml", "requests", "six", "stevedore", "haas (>=0.6.0)", "jq (>=0.1.3,<0.2)", "unittest2; python_version==\"2.6\"" ], "requires_python": null, "summary": "Web API testing for haas", "version": "0.3.1" }, "last_serial": 1699283, "releases": { "0.1.0.dev188+26eeb77": [], "0.1.1": [ { "comment_text": "", "digests": { "md5": "b374f9df5076c3a48674a9f388ed2a8c", "sha256": "812ee981fcaef1f2e4467dd30d0f74f733b505c0e929a92b71059181cced5d0b" }, "downloads": -1, "filename": "usagi-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b374f9df5076c3a48674a9f388ed2a8c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 26741, "upload_time": "2014-12-13T17:10:52", "url": "https://files.pythonhosted.org/packages/0c/4c/cf61e72194fc52dda34cffc95a3deb2941cc66cafa58f899a9474eebe3d5/usagi-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ef68bc3bad68016bbcfc0758822cbd4d", "sha256": "e27319ae7ae8eb75afe726deca1133733e2b881e1fe26107341c24ab2a51df9a" }, "downloads": -1, "filename": "usagi-0.1.1.tar.gz", "has_sig": false, "md5_digest": "ef68bc3bad68016bbcfc0758822cbd4d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17836, "upload_time": "2014-12-13T17:11:50", "url": "https://files.pythonhosted.org/packages/84/43/be086dd2250b770aa49143d4db182a5060869af453291d107381ee037433/usagi-0.1.1.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "aef312a3e2ac866a97b43ee167808b62", "sha256": "23584094c128b248eff2b18b020360a42e21d49e4a5fa99f8b75cd21ef22314f" }, "downloads": -1, "filename": "usagi-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "aef312a3e2ac866a97b43ee167808b62", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27392, "upload_time": "2015-03-12T16:18:41", "url": "https://files.pythonhosted.org/packages/12/7d/d0977659d240b36a8d1df5077d3f39d70fd460e6875f98e907e327bc79c7/usagi-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bde9abe731a1b5e5d57ade87b10b0b0a", "sha256": "c9d6d1dfec2e12df221c719a0cd7ea9155075588d874af1bcb8e5ce89dd4860f" }, "downloads": -1, "filename": "usagi-0.2.0.tar.gz", "has_sig": false, "md5_digest": "bde9abe731a1b5e5d57ade87b10b0b0a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17879, "upload_time": "2015-03-12T16:18:45", "url": "https://files.pythonhosted.org/packages/61/f5/8c7080d08cc1fc0d0e6700b7e22c357271bd53e0da3145b270167106a9b8/usagi-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "a54bb546b5cf0b92f780a7c41f788ec9", "sha256": "d2ffbe6ac690a4ac7a189eb04e2da4b10a95c77b7324a494fb7746ecbe01537b" }, "downloads": -1, "filename": "usagi-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a54bb546b5cf0b92f780a7c41f788ec9", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 28159, "upload_time": "2015-04-29T09:58:24", "url": "https://files.pythonhosted.org/packages/70/31/8ce18b6287c69ed3aebed313b34c56cbf81c5f36a587516ac0d235ea915d/usagi-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d836c5fc125ad5421f6d36a5292eeb80", "sha256": "3ec896491e51c1a1ba930ad2efd7c1a1cc3974d2b5754ea81c2b14d8dfbd62c1" }, "downloads": -1, "filename": "usagi-0.3.0.tar.gz", "has_sig": false, "md5_digest": "d836c5fc125ad5421f6d36a5292eeb80", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18689, "upload_time": "2015-04-29T09:58:26", "url": "https://files.pythonhosted.org/packages/f6/44/6779eba02b859b5ee43213328bfe06d37054e3b9569c091b619790bf032f/usagi-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "56683bdd0fd18ad888f03076b995e42a", "sha256": "77aeb3153933c996823ba6ccb4720091a7282183dbf8749d942c06459ffef4a8" }, "downloads": -1, "filename": "usagi-0.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "56683bdd0fd18ad888f03076b995e42a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 28158, "upload_time": "2015-08-29T10:21:02", "url": "https://files.pythonhosted.org/packages/41/e9/ef2486729712c95708f8cff6645764c27abfa2419a620a1a010a83eb3763/usagi-0.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "49ebccebf035b6af1834d8f3c321201e", "sha256": "bbcae90adfeb2b566fde7e41bf7a28ac80dad032f3e5a5594b12e773dab52cc4" }, "downloads": -1, "filename": "usagi-0.3.1.tar.gz", "has_sig": false, "md5_digest": "49ebccebf035b6af1834d8f3c321201e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18688, "upload_time": "2015-08-29T10:21:10", "url": "https://files.pythonhosted.org/packages/ee/ba/4dfa7c5c669e93bb41a66847ec5ce0ddef07c17eb9b118917dc13dd68d44/usagi-0.3.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "56683bdd0fd18ad888f03076b995e42a", "sha256": "77aeb3153933c996823ba6ccb4720091a7282183dbf8749d942c06459ffef4a8" }, "downloads": -1, "filename": "usagi-0.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "56683bdd0fd18ad888f03076b995e42a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 28158, "upload_time": "2015-08-29T10:21:02", "url": "https://files.pythonhosted.org/packages/41/e9/ef2486729712c95708f8cff6645764c27abfa2419a620a1a010a83eb3763/usagi-0.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "49ebccebf035b6af1834d8f3c321201e", "sha256": "bbcae90adfeb2b566fde7e41bf7a28ac80dad032f3e5a5594b12e773dab52cc4" }, "downloads": -1, "filename": "usagi-0.3.1.tar.gz", "has_sig": false, "md5_digest": "49ebccebf035b6af1834d8f3c321201e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18688, "upload_time": "2015-08-29T10:21:10", "url": "https://files.pythonhosted.org/packages/ee/ba/4dfa7c5c669e93bb41a66847ec5ce0ddef07c17eb9b118917dc13dd68d44/usagi-0.3.1.tar.gz" } ] }