{
"info": {
"author": "4teamwork AG",
"author_email": "mailto:info@4teamwork.ch",
"bugtrack_url": null,
"classifiers": [
"Framework :: Plone",
"Framework :: Plone :: 4.3",
"Framework :: Plone :: 5.1",
"Programming Language :: Python",
"Topic :: Software Development :: Libraries :: Python Modules"
],
"description": "ftw.testing\n===========\n\n\nThis package provides helpers for writing tests.\n\n.. contents:: Table of Contents\n\n\nIntegrationTesting\n------------------\n\nFTWIntegrationTesting layer\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe ``FTWIntegrationTesting`` is an opinionated extension of Plone's\ndefault integration testing layer.\n\nThe primary goal is to be able to run ``ftw.testbrowser``\\s traversal\ndriver with integration testing.\n\n**Database isolation and transactions**\n\nThe Plone default integration testing layer does support transactions:\nwhen changes are committed in tests, no isolation is provided\nand the committed changes will apear in the next layer.\n\n- We isolate between tests by making a savepoint in the test setup and\n rolling back to the savepoint in test tear down.\n- With a transaction interceptor we make sure that no code in the test\n can commit or abort a transaction. Transactional behavior is simulated\n by using savepoints.\n\n\n**Usage example:**\n\n.. code:: python\n\n from ftw.testing import FTWIntegrationTesting\n from plone.app.testing import PLONE_FIXTURE\n from plone.app.testing import PloneSandboxLayer\n\n class TestingLayer(PloneSandboxLayer):\n defaultBases = (PLONE_FIXTURE,)\n\n\n TESTING_FIXTURE = TestingLayer()\n INTEGRATION_TESTING = FTWIntegrationTesting(\n bases=(TESTING_FIXTURE,),\n name='my.package:integration')\n\n\n\nFTWIntegrationTestCase\n~~~~~~~~~~~~~~~~~~~~~~\n\nThe integration test case is an test case base class providing sane defaults\nand practical helpers for testing Plone addons with an ``FTWIntegrationTesting``\ntesting layer.\n\nYou may make your own base class in your package, setting the default testing\nlayer and extending the behavior and helpers for your needs.\n\n\n**Usage example:**\n\n.. code:: python\n\n # my/package/tests/test_case.py\n from ftw.testing import FTWIntegrationTestCase\n from my.package.testing import INTEGRATION_TESTING\n\n class IntegrationTestCase(FTWIntegrationTestCase):\n layer = INTEGRATION_TESTING\n\n\n\nMockTestCase\n------------\n\n``ftw.testing`` provides an advanced MockTestCase which provides bases on\nthe `plone.mocktestcase`_ ``MockTestCase``.\n\n.. code:: python\n\n from ftw.testing import MockTestCase\n\n\nThe following additional methods are available:\n\n``self.providing_mock(interfaces, *args, **kwargs)``\n Creates a mock which provides ``interfaces``.\n\n``self.mock_interface(interface, provides=None, *args, **kwargs)``\n Creates a mock object implementing ``interface``. The mock does not\n only provide ``interface``, but also use it as specification and\n asserts that the mocked methods do exist on the interface.\n\n``self.stub(*args, **kwargs)``\n Creates a stub. It acts like a mock but has no assertions.\n\n``self.providing_stub(interfaces, *args, **kwargs)``\n Creates a stub which provides ``interfaces``.\n\n``self.stub_interface(interface, provides=None, *args, **kwargs)``\n Does the same as ``mock_interface``, but disables counting of expected\n method calls and attribute access. See \"Mocking vs. stubbing\" below.\n\n``self.set_parent(context, parent_context)``\n Stubs the ``context`` so that its acquisition parent is ``parent_context``.\n Expects at least context to be a mock or a stub. Returns the ``context``.\n\n``self.stub_request(interfaces=[], stub_response=True, content_type='text/html', status=200)``\n Returns a request stub which can be used for rendering templates. With the\n ``stub_response`` option, you can define if the request should stub a\n response by itself. The other optional arguments:\n ``content_type``: Defines the expected output content type of the response.\n ``status``: Defines the expected status code of the response.\n\n``self.stub_response(request=None, content_type='text/html', status=200))``\n Returns a stub response with some headers and options. When a ``request``\n is given the response is also added to the given request.\n The other optional arguments:\n ``content_type``: Defines the expected output content type of the response.\n ``status``: Defines the expected status code of the response.\n\n``self.assertRaises(*args, **kwargs)``\n Uses ``unittest2`` implementation of assertRaises instead of\n ``unittest`` implementation.\n\nIt also fixes a problem in ``mock_tool``, where the ``getToolByName`` mock\nhad assertions which is not very useful in some cases.\n\n\nMocking vs. stubbing\n--------------------\n\nA **mock** is used for testing the communication between two objects. It\nasserts *method calls*. This is used when a test should not test if\na object has a specific state after doing something (e.g. it has it's\nattribute *xy* set to something), but if the object *does* something\nwith another object. If for example an object `Foo` sends an email\nwhen method `bar` is called, we could mock the sendmail object and\nassert on the send-email method call.\n\nOn the other hand we often have to test the state of an object (attribute\nvalues) after doing something. This can be done without mocks by just\ncalling the method and asserting the attribute values. But then we have\nto set up an integration test and install plone, which takes very long.\nFor testing an object with dependencies to other parts of plone in a\nunit test, we can use **stubs** for faking other (separately tested) parts\nof plone. Stubs work like mocks: you can \"expect\" a method call and\ndefine a result. The difference between **stubs** and **mocks** is that\nstubs do not assert the expectations, so there will be no errors if\nsomething expected does not happen. So when using stubs we can assert\nthe state without asserting the communcation between objects.\n\n\nComponent registry layer\n------------------------\n\nThe ``MockTestCase`` is able to mock components (adapters, utilities). It\ncleans up the component registry after every test.\n\nBut when we use a ZCML layer, loading the ZCML of the package it should use\nthe same component registry for all tests on the same layer. The\n``ComponentRegistryLayer`` is a layer superclass for sharing the component\nregistry and speeding up tests.\n\nUsage:\n\n.. code:: python\n\n from ftw.testing.layer import ComponentRegistryLayer\n\n class ZCMLLayer(ComponentRegistryLayer):\n\n def setUp(self):\n super(ZCMLLayer, self).setUp()\n\n import my.package\n self.load_zcml_file('configure.zcml', my.package)\n\n ZCML_LAYER = ZCMLLayer()\n\nBe aware that ``ComponentRegistryLayer`` is a base class for creating your\nown layer (by subclassing ``ComponentRegistryLayer``) and is not usable with\n``defaultBases`` directly. This allows us to use the functions\n``load_zcml_file`` and ``load_zcml_string``.\n\n\nMailing test helper\n-------------------\nThe Mailing helper object mocks the mailhost and captures sent emails.\nThe emails can then be easily used for assertions.\n\nUsage:\n\n.. code:: python\n\n from ftw.testing.mailing import Mailing\n import transaction\n\n class MyTest(TestCase):\n layer = MY_FUNCTIONAL_TESTING\n\n def setUp(self):\n Mailing(self.layer['portal']).set_up()\n transaction.commit()\n\n def tearDown(self):\n Mailing(self.layer['portal']).tear_down()\n\n def test_mail_stuff(self):\n portal = self.layer['portal']\n do_send_email()\n mail = Mailing(portal).pop()\n self.assertEquals('Subject: ...', mail)\n\n\nFreezing datetime.now()\n-----------------------\n\nWhen testing code which depends on the current time, it is necessary to set\nthe current time to a specific time. The ``freeze`` context manager makes that\nreally easy:\n\n.. code:: python\n\n from ftw.testing import freeze\n from datetime import datetime\n\n with freeze(datetime(2014, 5, 7, 12, 30)):\n # test code\n\nThe ``freeze`` context manager patches the `datetime` module, the `time` module\nand supports the Zope `DateTime` module. It removes the patches when exiting\nthe context manager.\n\n**Updating the freezed time**\n\n.. code:: python\n\n from ftw.testing import freeze\n from datetime import datetime\n\n with freeze(datetime(2014, 5, 7, 12, 30)) as clock:\n # its 2014, 5, 7, 12, 30\n clock.forward(days=2)\n # its 2014, 5, 9, 12, 30\n clock.backward(minutes=15)\n # its 2014, 5, 9, 12, 15\n\n\nIt is possible to ignore modules, so that all calls to date / time functions from\nthis module are responded with the real current values instead of the frozen ones:\n\n.. code:: python\n\n from ftw.testing import freeze\n from datetime import datetime\n\n with freeze(datetime(2014, 5, 7, 12, 30), ignore_modules=['my.package.realtime']):\n pass\n\nYou can use the\n`timedelta arguments`(https://docs.python.org/2/library/datetime.html#datetime.timedelta)_\nfor ``forward`` and ``backward``.\n\n\n\nStatic UUIDS\n------------\n\nWhen asserting UUIDs it can be annoying that they change at each test run.\nThe ``staticuid`` decorator helps to fix that by using static uuids which\nare prefixed and counted within a scope, usually a test case:\n\n.. code:: python\n\n from ftw.testing import staticuid\n from plone.app.testing import PLONE_INTEGRATION_TESTING\n from unittest2 import TestCase\n\n class MyTest(TestCase):\n layer = PLONE_INTEGRATION_TESTING\n\n @staticuid()\n def test_all_the_things(self):\n doc = self.portal.get(self.portal.invokeFactory('Document', 'the-document'))\n self.assertEquals('testallthethings0000000000000001', IUUID(doc))\n\n @staticuid('MyUIDS')\n def test_a_prefix_can_be_set(self):\n doc = self.portal.get(self.portal.invokeFactory('Document', 'the-document'))\n self.assertEquals('MyUIDS00000000000000000000000001', IUUID(doc))\n\n\n\nGeneric Setup uninstall test\n----------------------------\n\n``ftw.testing`` provides a test superclass for testing uninstall profiles.\nThe test makes a Generic Setup snapshot before installing the package, then\ninstalls and uninstalls the package, creates another snapshot and diffs it.\nThe package is installed without installing its dependencies, because it\nshould not include uninstalling dependencies in the uninstall profile.\n\nAppropriate testing layer setup is included and the test runs on a seperate\nlayer which should not interfere with other tests.\n\nSimple example:\n\n.. code:: python\n\n from ftw.testing.genericsetup import GenericSetupUninstallMixin\n from ftw.testing.genericsetup import apply_generic_setup_layer\n from unittest2 import TestCase\n\n\n @apply_generic_setup_layer\n class TestGenericSetupUninstall(TestCase, GenericSetupUninstallMixin):\n package = 'my.package'\n\n\nThe ``my.package`` is expected to have a Generic Setup profile\n``profile-my.package:default`` for installing the package and a\n``profile-my.package:uninstall`` for uninstalling the package.\nIt is expected to use ``z3c.autoinclude`` entry points for loading\nits ZCML.\n\nThe options are configured as class variables:\n\n**package**\n The dotted name of the package as string, which is used for things such\n as guessing the Generic Setup profile names. This is mandatory.\n\n**autoinclude** (``True``)\n This makes the testing fixture load ZCML using the ``z3c.autoinclude``\n entry points registered for the target ``plone``.\n\n**additional_zcml_packages** (``()``)\n Use this if needed ZCML is not loaded using the ``autoinclude`` option,\n e.g. when you need to load testing zcml. Pass in an iterable of\n dottednames of packages, which contain a ``configure.zcml``.\n\n**additional_products** (``()``)\n A list of additional Zope products to install.\n\n**install_profile_name** (``default``)\n The Generic Setup install profile name postfix.\n\n**skip_files** (``()``)\n An iterable of Generic Setup files (e.g. ``(\"viewlets.xml\",)``) to be\n ignored in the diff. This is sometimes necessary, because not all\n components can and should be uninstalled properly. For example viewlet\n orders cannot be removed using Generic Setup - but this is not a problem\n they do no longer take effect when the viewlets / viewlet managers are\n no longer registered.\n\n\nFull example:\n\n.. code:: python\n\n from ftw.testing.genericsetup import GenericSetupUninstallMixin\n from ftw.testing.genericsetup import apply_generic_setup_layer\n from unittest2 import TestCase\n\n\n @apply_generic_setup_layer\n class TestGenericSetupUninstall(TestCase, GenericSetupUninstallMixin):\n package = 'my.package'\n autoinclude = False\n additional_zcml_packages = ('my.package', 'my.package.tests')\n additional_products = ('another.package', )\n install_profile_name = 'default'\n skip_files = ('viewlets.xml', 'rolemap.xml')\n\n\nDisabling quickinstaller snapshots\n----------------------------------\n\nQuickinstaller normally makes a complete Generic Setup (GS) snapshot\nbefore and after installing each GS profile, in order to be able to\nuninstall the profile afterwards.\n\nIn tests we usually don't need this feature and want to disable it to\nspeed up tests.\n\nThe ``ftw.testing.quickinstaller`` module provides a patcher for\nreplacing the quickinstaller event handlers to skip creating snapshots.\nUsually we want to do this early (when loading ``testing.py``), so that\nall the tests are speeding up.\nHowever, some tests which involve quickinstaller rely on having the\nsnapshots made (see previous section about uninstall tests).\nTherefore the snapshot patcher object provides context managers for\ntemporarily enabling / disabling the snapshot feature.\n\nUsage:\n\nDisable snapshots early, so that everything is fast. Usually this is\ndone in the ``testing.py`` in module scope, so that it happens already\nwhen the testrunner imports the tests:\n\n.. code:: python\n\n from ftw.testing.quickinstaller import snapshots\n from plone.app.testing import PloneSandboxLayer\n\n snapshots.disable()\n\n class MyPackageLayer(PloneSandboxLayer):\n ...\n\nWhen testing quickinstaller snapshot related things, such as uninstalling,\nthe snapshots can be re-enabled for a context manager or in general:\n\n.. code:: python\n\n from ftw.testing.quickinstaller import snapshots\n\n snapshots.disable()\n # snapshotting is now disabled\n\n with snapshots.enabled():\n # snapshotting is enabled only within this block\n\n snapshots.enable()\n # snapshotting is now enabled\n\n with snapshots.disabled():\n # snapshotting is disabled only within this block\n\n\nTransaction interceptor\n-----------------------\n\nThe ``TransactionInterceptor`` patches Zope's transaction manager in\norder to prevent code from interacting with the transaction.\n\nThis can be used for example for making sure that no tests commit transactions\nwhen they are running on an integration testing layer.\n\nThe interceptor needs to be installed manually with ``install()`` and removed\nat the end with ``uninstall()``. It is the users responsibility to ensure\nproper uninstallation.\n\nWhen the interceptor is installed, it is not yet active and passes through all\ncalls.\nThe intercepting begins with ``intercept()`` and ends when ``clear()`` is\ncalled.\n\n.. code:: python\n\n from ftw.testing import TransactionInterceptor\n\n interceptor = TransactionInterceptor().install()\n try:\n interceptor.intercept(interceptor.BEGIN | interceptor.COMMIT\n | interceptor.ABORT)\n # ...\n interceptor.clear()\n transaction.abort()\n finally:\n interceptor.uninstall()\n\n\nTesting Layers\n--------------\n\nComponent registry isolation layer\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n``plone.app.testing``'s default testing layers (such as ``PLONE_FIXTURE``) do not\nisolate the component registry for each test.\n\n``ftw.testing``'s ``COMPONENT_REGISTRY_ISOLATION`` testing layer isolates the\ncomponent registry for each test, provides a stacked ZCML configuration context\nand provides the methods ``load_zcml_string`` and ``load_zcml_file`` for loading\nZCML.\n\nExample:\n\n.. code:: python\n\n # testing.py\n from ftw.testing.layer import COMPONENT_REGISTRY_ISOLATION\n from plone.app.testing import IntegrationTesting\n from plone.app.testing import PloneSandboxLayer\n from zope.configuration import xmlconfig\n\n\n class MyPackageLayer(PloneSandboxLayer):\n defaultBases = (COMPONENT_REGISTRY_ISOLATION,)\n\n def setUpZope(self, app, configurationContext):\n import my.package\n xmlconfig.file('configure.zcml', ftw.package,\n context=configurationContext)\n\n MY_PACKAGE_FIXTURE = MyPackageLayer()\n MY_PACKAGE_INTEGRATION = IntegrationTesting(\n bases=(MY_PACKAGE_FIXTURE,\n COMPONENT_REGISTRY_ISOLATION),\n name='my.package:integration')\n\n\n # ----------------------------\n # test_*.py\n from unittest2 import TestCase\n\n class TestSomething(TestCase):\n layer = MY_PACKAGE_INTEGRATION\n\n def test(self):\n self.layer['load_zcml_string']('...')\n\n\nTemp directory layer\n~~~~~~~~~~~~~~~~~~~~\n\nThe ``TEMP_DIRECTORY`` testing layer creates an empty temp directory for\neach test and removes it recursively on tear down.\n\nThe path to the directory can be accessed with the ``temp_directory`` key.\n\nUsage example:\n\n.. code:: python\n\n from unittest2 import TestCase\n from ftw.testing.layer import TEMP_DIRECTORY\n\n\n class TestSomething(TestCase):\n layer = TEMP_DIRECTORY\n\n def test(self):\n path = self.layer['temp_directory']\n\n\nConsole script testing layer\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe console script layer helps testing console scripts.\nOn layer setup it creates and executes an isolated buildout with the package under\ndevelopment, which creates all console scripts of this package.\nThis makes it easy to test console scripts by really executing them.\n\nUsage example:\n\n.. code:: python\n\n # testing.py\n from ftw.testing.layer import ConsoleScriptLayer\n\n CONSOLE_SCRIPT_TESTING = ConsoleScriptLayer('my.package')\n\n\n # test_*.py\n from my.package.testing import CONSOLE_SCRIPT_TESTING\n from unittest2 import TestCase\n\n\n class TestConsoleScripts(TestCase):\n layer = CONSOLE_SCRIPT_TESTING\n\n def test_executing_command(self):\n exitcode, output = self.layer['execute_script']('my-command args')\n self.assertEqual('something\\n', output)\n\nBe aware that the dependency ``zc.recipe.egg`` is required for building the\nconsole scripts. You may put the dependency into your ``tests`` extras require.\n\n\nCompatibility\n-------------\n\nRuns with `Plone `_ `4.3`.\n\n\nLinks\n-----\n\n- Github: https://github.com/4teamwork/ftw.testing\n- Issues: https://github.com/4teamwork/ftw.testing/issues\n- Pypi: http://pypi.python.org/pypi/ftw.testing\n- Continuous integration: https://jenkins.4teamwork.ch/search?q=ftw.testing\n\n\nCopyright\n---------\n\nThis package is copyright by `4teamwork `_.\n\n``ftw.testing`` is licensed under GNU General Public License, version 2.\n\n\n\n\n\n.. _plone.mocktestcase: http://pypi.python.org/pypi/plone.mocktestcase\n.. _Splinter: https://pypi.python.org/pypi/splinter\n\nChangelog\n=========\n\n\n1.20.1 (2019-04-04)\n-------------------\n\n- Optimize \"ignore_modules\" to avoid unneeded stack inspections. [Rotonen]\n\n\n1.20.0 (2019-01-25)\n-------------------\n\n- Add \"ignore_modules\" support to freezer. [jone]\n\n\n1.19.2 (2018-11-05)\n-------------------\n\n- Fix in timezone aware freezing for Zope DateTime. [njohner]\n\n\n1.19.1 (2018-10-23)\n-------------------\n\n- Fix invalid reST in README.rst [Nachtalb]\n\n\n1.19.0 (2018-10-15)\n-------------------\n\n- Drop support for plone 4.2. [jone]\n- Fix bug with getting a timezone aware \"now\". [njohner]\n\n\n1.18.0 (2018-07-12)\n-------------------\n\n- Extend ``staticuid`` to also be a context manager. [jone]\n- Also freeze ``datetime.utcnow()``. [Rotonen]\n\n\n1.17.0 (2017-10-02)\n-------------------\n\n- Add ``FTWIntegrationTesting`` and ``FTWIntegrationTestCase``. [jone]\n\n1.16.0 (2017-08-08)\n-------------------\n\n- Support Plone 5.1 for ConsoleScriptLayer. [jone]\n\n1.15.2 (2017-07-18)\n-------------------\n\n- Freezer: keep timezone info when moving clock forward / backward. [jone]\n- Freezer: Fix DST-bug in today() and time(). [jone]\n\n\n1.15.1 (2017-07-04)\n-------------------\n\n- Fix savepoint simulation to cleanup savepoints. [jone]\n\n\n1.15.0 (2017-07-03)\n-------------------\n\n- Add savepoint simulation to transaction interceptor. [jone]\n\n\n1.14.0 (2017-06-23)\n-------------------\n\n- Do not require \"Plone\" egg. [jone]\n\n\n1.13.0 (2017-06-20)\n-------------------\n\n- Add transaction interceptor. [jone]\n\n\n1.12.0 (2017-06-19)\n-------------------\n\n- Support Plone 5.1 [mathias.leimgruber, jone]\n- Remove splinter browser. Use ftw.testbrowser instead. [mathias.leimgruber, jone]\n- Drop Plone 4.1 support. [jone]\n\n\n1.11.0 (2016-03-31)\n-------------------\n\n- Freezer: reimplement \"now\" patching with forbiddenfruit.\n This fixes problems with pickling and comparison of frozen datetime objects.\n [jone]\n\n\n1.10.3 (2015-10-11)\n-------------------\n\n- Freezer: disable freezing while committing to database for preventing pickling errors.\n [jone]\n\n- Freezer bugfix: replace datetime instances when leaving freeze context manager.\n [jone]\n\n\n1.10.2 (2015-07-30)\n-------------------\n\n- Added timezone(`tz`) support for \"freeze\".\n [phgross]\n\n\n1.10.1 (2015-07-27)\n-------------------\n\n- Use \"now\" as default of \"freeze\".\n [jone]\n\n\n1.10.0 (2015-05-18)\n-------------------\n\n- Update the freezed time with ``forward`` and ``backward``.\n [jone]\n\n\n1.9.1 (2015-05-15)\n------------------\n\n- Fix site hook within ``staticuid`` decorated methods.\n [jone]\n\n\n1.9.0 (2015-05-15)\n------------------\n\n- Add ``staticuid`` decorator for having static uids.\n [jone]\n\n\n1.8.1 (2015-01-05)\n------------------\n\n- Declare missing dependency to p.a.testing\n required by the COMPONENT_REGISTRY_ISOLATION layer.\n [jone]\n\n\n1.8.0 (2014-12-31)\n------------------\n\n- Implement console script testing layer.\n [jone]\n\n- Implement TEMP_DIRECTORY testing layer.\n [jone]\n\n- Implement COMPONENT_REGISTRY_ISOLATION layer.\n [jone]\n\n\n1.7.0 (2014-09-30)\n------------------\n\n- Add patcher for disabling quickinstaller snappshotting in tests.\n [jone]\n\n\n1.6.4 (2014-05-01)\n------------------\n\n- Generic Setup uninstall test: Add a second test that uses Portal Setup for\n uninstallation. This makes sure that Portal Setup uninstallation behaves the same as\n quickinstaller uninstallation.\n [deif]\n\n\n1.6.3 (2014-04-30)\n------------------\n\n- Generic Setup uninstall test: Remove is_product option, since we\n require an uninstall external method which requires the package\n to be a product anyway.\n [jone]\n\n- Generic Setup uninstall test: test that there is an uninstall external method.\n Uninstall external methods are still necessary today for properly uninstalling\n a package.\n [jone]\n\n\n1.6.2 (2014-04-30)\n------------------\n\n- Generic Setup test: use quickinstaller for uninstalling.\n [jone]\n\n\n1.6.1 (2014-04-29)\n------------------\n\n- Also install profile dependencies before creating a snapshot.\n [deif]\n\n\n1.6.0 (2014-04-29)\n------------------\n\n- Implement Generic Setup uninstall base test.\n [jone]\n\n\n1.5.2 (2014-02-09)\n------------------\n\n- Fix ``isinstance`` calls of freezed time in ``freeze`` context manager.\n [jone]\n\n\n1.5.1 (2014-02-08)\n------------------\n\n- Implement ``freeze`` context manager for freezing the time.\n [jone]\n\n\n1.5.0 (2013-09-24)\n------------------\n\n- AT form page object: add schemata helper methods for testing visible\n schematas and fields.\n [jone]\n\n\n1.4 (2013-08-26)\n----------------\n\n- Add custom mailhost class, remembering the sender and recipient\n of each email separately.\n [deif]\n\n- Deprecate @javascript because Selenium with PhantomJS is too unstable.\n Removes tests and documentation, the @javascript decorator still works\n for now but needs to be imported from ftw.testing.browser.\n [jone]\n\n- Page objects: add a Plone.visit(obj) function.\n [jone]\n\n- Fix a rare bug where the MockMailHost message list has been replaced by\n another instance.\n [jone, deif]\n\n\n1.3.1 (2013-05-24)\n------------------\n\n- Move ``Mailing`` helper class to its own module ``mailing``.\n [deif]\n\n\n1.3 (2013-05-03)\n----------------\n\n- Drop official Plone 4.0 support.\n [jone]\n\n- Component registry layer: use isolated ZCML layers.\n When using the same layer instances it may conflict with integration or\n functional testing layers.\n [jone]\n\n- Add splinter integration and Plone page objects.\n [jone]\n\n- onegov.ch approved: add badge to readme.\n [jone]\n\n- MockTestCase: Support Products.PloneHotfix20121106 patch when mocking getToolByName.\n [jone]\n\n- MockTestCase: add checks that setUp is called correctly.\n [jone]\n\n\n1.2 (2012-05-22)\n----------------\n\n- Add ``stub_reponse`` method to ``MockTestCase`` and adjust the\n ``stub_request`` method accordant.\n [phgross]\n\n- Made providing interfaces configurable for the ``stub_request`` method.\n [phgross]\n\n- Let the stub_request method also stub the getStatus of the response.\n [phgross]\n\n- Add ``stub_request`` method to ``MockTestCase``.\n [jone]\n\n- No longer tear down the component registry in mock test case. Use the\n ComponentRegistryLayer.\n [jone]\n\n- Add ``ComponentRegistryLayer`` base class.\n [jone]\n\n- Add ``mock_interface`` and ``stub_interface`` methods to MockTestCase, creating\n a mock and using the interface as spec.\n [jone]\n\n- Accept also interfaces directly rather than lists of interfaces when\n creating mocks or stubs which provides the interfaces.\n [jone]\n\n\n1.1 (2011-11-16)\n----------------\n\n- Patch mock_tool: do not count, so that it can be used multiple times.\n [jone]\n\n\n1.0 (2011-10-12)\n----------------\n\n- Initial release",
"description_content_type": "",
"docs_url": null,
"download_url": "",
"downloads": {
"last_day": -1,
"last_month": -1,
"last_week": -1
},
"home_page": "https://github.com/4teamwork/ftw.testing",
"keywords": "ftw testing mocking testcase mock stub",
"license": "GPL2",
"maintainer": "Jonas Baumann",
"maintainer_email": "",
"name": "ftw.testing",
"package_url": "https://pypi.org/project/ftw.testing/",
"platform": "",
"project_url": "https://pypi.org/project/ftw.testing/",
"project_urls": {
"Homepage": "https://github.com/4teamwork/ftw.testing"
},
"release_url": "https://pypi.org/project/ftw.testing/1.20.1/",
"requires_dist": null,
"requires_python": "",
"summary": "Provides some testing helpers and an advanced MockTestCase.",
"version": "1.20.1"
},
"last_serial": 5823422,
"releases": {
"1.10.0": [
{
"comment_text": "",
"digests": {
"md5": "0c4f88e4037392733e01ab083516d67f",
"sha256": "57185270fbf41619ed4cdcbece958c2bbbb3b6fb0cb0e3a140fcfb145ed4b1fa"
},
"downloads": -1,
"filename": "ftw.testing-1.10.0.zip",
"has_sig": false,
"md5_digest": "0c4f88e4037392733e01ab083516d67f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 71278,
"upload_time": "2015-05-18T08:17:22",
"url": "https://files.pythonhosted.org/packages/b7/b3/9e3ae4b29d65956f4a32ff77449f03598ecfc4161b7f72f700ac193be230/ftw.testing-1.10.0.zip"
}
],
"1.10.1": [
{
"comment_text": "",
"digests": {
"md5": "06d2590e6d20aaa54a78ce09f9ade7d0",
"sha256": "fa5a181dd4243cac97e87a84171bea3cec1247767cdf23b3add7fb6f65721a51"
},
"downloads": -1,
"filename": "ftw.testing-1.10.1.tar.gz",
"has_sig": false,
"md5_digest": "06d2590e6d20aaa54a78ce09f9ade7d0",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 50180,
"upload_time": "2015-07-27T08:23:11",
"url": "https://files.pythonhosted.org/packages/68/46/1150908836843799031e74e8220fd4fbdb6d9cb016391d4d8bd856c2b984/ftw.testing-1.10.1.tar.gz"
}
],
"1.10.2": [
{
"comment_text": "",
"digests": {
"md5": "2a5d3a42ab5b8d2a426d6bcc42ea7435",
"sha256": "28995813c523d718685b7853b132d5394510aa8627527e79af8655d5588729b8"
},
"downloads": -1,
"filename": "ftw.testing-1.10.2.tar.gz",
"has_sig": false,
"md5_digest": "2a5d3a42ab5b8d2a426d6bcc42ea7435",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 50498,
"upload_time": "2015-07-30T12:44:00",
"url": "https://files.pythonhosted.org/packages/21/73/8e5ace623cc3311fd1838d9e971a7a3e25cc8a3112814cf57a112ac28da0/ftw.testing-1.10.2.tar.gz"
}
],
"1.10.3": [
{
"comment_text": "",
"digests": {
"md5": "fca74417f7df5375dd1ccbcda7e16fa9",
"sha256": "35bf2a2dd7a2f275e85f8cdd683dd24f06ce7936978867f1508a1a6fe6b51769"
},
"downloads": -1,
"filename": "ftw.testing-1.10.3.tar.gz",
"has_sig": false,
"md5_digest": "fca74417f7df5375dd1ccbcda7e16fa9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 51592,
"upload_time": "2015-10-11T14:18:49",
"url": "https://files.pythonhosted.org/packages/2b/e4/bd328e6e571b25fa4212ab45b4c13a3b8d98b8d222c079ac39de230a8542/ftw.testing-1.10.3.tar.gz"
}
],
"1.11.0": [
{
"comment_text": "",
"digests": {
"md5": "2ecef4abde4061d8d706f8209ecde781",
"sha256": "aeeaa18ed48acc69b4e93583b5fa4bb5759c3df18fcd1cab34b1757db19973da"
},
"downloads": -1,
"filename": "ftw.testing-1.11.0.tar.gz",
"has_sig": false,
"md5_digest": "2ecef4abde4061d8d706f8209ecde781",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 50876,
"upload_time": "2016-03-31T07:36:03",
"url": "https://files.pythonhosted.org/packages/ae/2b/e46fd4296c04624b51c1a7243f41218a3352424bf79f25269ca4c677aa2d/ftw.testing-1.11.0.tar.gz"
}
],
"1.12.0": [
{
"comment_text": "",
"digests": {
"md5": "d01b572add1d8278d4f05f8677e5f1f0",
"sha256": "6a541e622c068eec094d44dc1c3bf0037eb8265f88126860d5e614ba132e2435"
},
"downloads": -1,
"filename": "ftw.testing-1.12.0.tar.gz",
"has_sig": false,
"md5_digest": "d01b572add1d8278d4f05f8677e5f1f0",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 41167,
"upload_time": "2017-06-19T16:15:46",
"url": "https://files.pythonhosted.org/packages/0a/fb/3062f183b4b226e9edfb50438637d61c70a63096a1ba652982efe417f541/ftw.testing-1.12.0.tar.gz"
}
],
"1.13.0": [
{
"comment_text": "",
"digests": {
"md5": "1af4aab5299d6dfcb20a7893e95220c6",
"sha256": "94d3f8791cb0870372e8b9f62f749187bb749fb3a46e76420fb31ed379cc5be1"
},
"downloads": -1,
"filename": "ftw.testing-1.13.0.tar.gz",
"has_sig": false,
"md5_digest": "1af4aab5299d6dfcb20a7893e95220c6",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 43357,
"upload_time": "2017-06-20T06:51:57",
"url": "https://files.pythonhosted.org/packages/68/ce/cb30c0309c0027f42180cd8b4cfe69d8b0545d1bbe7636e4d3c8ffd75ee9/ftw.testing-1.13.0.tar.gz"
}
],
"1.14.0": [
{
"comment_text": "",
"digests": {
"md5": "84fe712ddbb2e218e3a318145ea81b6a",
"sha256": "7a081204c76db6b84d9a653e6482337257ac93d70734bb580d7bbdac856a8b13"
},
"downloads": -1,
"filename": "ftw.testing-1.14.0.tar.gz",
"has_sig": false,
"md5_digest": "84fe712ddbb2e218e3a318145ea81b6a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 43404,
"upload_time": "2017-06-23T12:57:24",
"url": "https://files.pythonhosted.org/packages/7c/a9/6230e27d24e6294ec1674d26427ab07c6280a2092783f9ffee2842836ab3/ftw.testing-1.14.0.tar.gz"
}
],
"1.15.0": [
{
"comment_text": "",
"digests": {
"md5": "1d5f0688eb39227c22fe1529c8c7a815",
"sha256": "e39806aed37eaab66f6c1cd8c461f5397914adf58e16b2d364cca38ef2da85f6"
},
"downloads": -1,
"filename": "ftw.testing-1.15.0.tar.gz",
"has_sig": false,
"md5_digest": "1d5f0688eb39227c22fe1529c8c7a815",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 44082,
"upload_time": "2017-07-03T14:45:11",
"url": "https://files.pythonhosted.org/packages/2c/12/41bdb30891f8cf690c866cae014814c049127ac27883d37c6a20b5b79456/ftw.testing-1.15.0.tar.gz"
}
],
"1.15.1": [
{
"comment_text": "",
"digests": {
"md5": "effb3ff48fb8a81d716d347617322ea5",
"sha256": "e750a44a85348a27f277a2b576e0ebd57a831ecc47052c583f74e113add33109"
},
"downloads": -1,
"filename": "ftw.testing-1.15.1.tar.gz",
"has_sig": false,
"md5_digest": "effb3ff48fb8a81d716d347617322ea5",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 44215,
"upload_time": "2017-07-04T07:32:03",
"url": "https://files.pythonhosted.org/packages/d4/a1/f01ab7ec68dd82eab190609e979dd9948aad4b30ab28a628122d8e764b6c/ftw.testing-1.15.1.tar.gz"
}
],
"1.15.2": [
{
"comment_text": "",
"digests": {
"md5": "b201c363fa3a9cb90d8233fb725f59f4",
"sha256": "7d91d506d2dc424957a8e22cc30dc07eb08616bcb82b4fb00fa36bea9fe3339c"
},
"downloads": -1,
"filename": "ftw.testing-1.15.2.tar.gz",
"has_sig": false,
"md5_digest": "b201c363fa3a9cb90d8233fb725f59f4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 44432,
"upload_time": "2017-07-18T13:43:49",
"url": "https://files.pythonhosted.org/packages/0d/15/3c7313749d19d2e53e5718177d48da7d477a9ab347369357c87e6a7a5022/ftw.testing-1.15.2.tar.gz"
}
],
"1.16.0": [
{
"comment_text": "",
"digests": {
"md5": "694366fe3925cef0a1168c732cf23cef",
"sha256": "7a05f0a8964aa886fa3f4c21cf879f58cee31245cfe06cd31b5dbc6138005d77"
},
"downloads": -1,
"filename": "ftw.testing-1.16.0.tar.gz",
"has_sig": false,
"md5_digest": "694366fe3925cef0a1168c732cf23cef",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 44514,
"upload_time": "2017-08-08T08:41:02",
"url": "https://files.pythonhosted.org/packages/db/f1/d5809119ac607ef7bfa09e4c002085a50210ce55cd5007b701ef8a6df9c9/ftw.testing-1.16.0.tar.gz"
}
],
"1.17.0": [
{
"comment_text": "",
"digests": {
"md5": "f777d84672e2629aa12a80f074b161d4",
"sha256": "3cf546f7646d753d847cd52e6d8b8bd415b3203335d29aed768213612b3bfc12"
},
"downloads": -1,
"filename": "ftw.testing-1.17.0.tar.gz",
"has_sig": false,
"md5_digest": "f777d84672e2629aa12a80f074b161d4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 48938,
"upload_time": "2017-10-02T07:51:20",
"url": "https://files.pythonhosted.org/packages/97/d6/479edee291a10794e256e1b986ef7132258dc018a673c88a897aef83269f/ftw.testing-1.17.0.tar.gz"
}
],
"1.18.0": [
{
"comment_text": "",
"digests": {
"md5": "57b59544d8e4b526865ebbab8ac4b46a",
"sha256": "c5a9e1a7baba3287ea5b63da0223864807eb7f427b00fdbd7b1b36715e07e0d0"
},
"downloads": -1,
"filename": "ftw.testing-1.18.0.tar.gz",
"has_sig": false,
"md5_digest": "57b59544d8e4b526865ebbab8ac4b46a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 49671,
"upload_time": "2018-07-12T06:39:00",
"url": "https://files.pythonhosted.org/packages/40/8c/3145d5bab93e45b6799c0a7f09836bd59315ff53c96a0b172831d4d99cd8/ftw.testing-1.18.0.tar.gz"
}
],
"1.19.0": [
{
"comment_text": "",
"digests": {
"md5": "4c6a7eba0c22abae8e194cbb9da6a154",
"sha256": "aa2216f777da53d4209d809c1ec3ab683e6f47546ab9b952933cb229bf6d09f5"
},
"downloads": -1,
"filename": "ftw.testing-1.19.0.tar.gz",
"has_sig": false,
"md5_digest": "4c6a7eba0c22abae8e194cbb9da6a154",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 49956,
"upload_time": "2018-10-15T08:38:23",
"url": "https://files.pythonhosted.org/packages/12/36/74f0889a87437d7eb7d142501c13028e14067665fbdfeefc229e37a67bb6/ftw.testing-1.19.0.tar.gz"
}
],
"1.19.1": [
{
"comment_text": "",
"digests": {
"md5": "4cf731bd772d5be8788b319dd76ccc23",
"sha256": "0f436bcbd18ceef1a0582e38ed67a45da38d9d7ced4af2946cdade078f11ae25"
},
"downloads": -1,
"filename": "ftw.testing-1.19.1.tar.gz",
"has_sig": false,
"md5_digest": "4cf731bd772d5be8788b319dd76ccc23",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 53676,
"upload_time": "2018-10-23T14:01:13",
"url": "https://files.pythonhosted.org/packages/22/ab/ae62f4dc032c33f1c7478f0914658045ede051e6b1ca5483fb15bbd519db/ftw.testing-1.19.1.tar.gz"
}
],
"1.19.2": [
{
"comment_text": "",
"digests": {
"md5": "e7b33032330fb23f6a2142b90e4851c3",
"sha256": "e05b0e60cf9e1b72609c95fcd244e04c2776eefd0ea9cfac27cb25143d65f143"
},
"downloads": -1,
"filename": "ftw.testing-1.19.2.tar.gz",
"has_sig": false,
"md5_digest": "e7b33032330fb23f6a2142b90e4851c3",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 50709,
"upload_time": "2018-11-05T14:26:36",
"url": "https://files.pythonhosted.org/packages/bb/2f/75b731f99b146986f47c13311ee7f21437b64867e075e7f0add3bbe32dfa/ftw.testing-1.19.2.tar.gz"
}
],
"1.2": [
{
"comment_text": "",
"digests": {
"md5": "2e1ff1dbcd375f9c1e4bc372f060bbf9",
"sha256": "245e990e2a3b49849aa77b3dee8c83f5cf2e1190a0e8a38878eb4142c6f308d3"
},
"downloads": -1,
"filename": "ftw.testing-1.2.tar.gz",
"has_sig": false,
"md5_digest": "2e1ff1dbcd375f9c1e4bc372f060bbf9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 15241,
"upload_time": "2012-05-22T14:01:33",
"url": "https://files.pythonhosted.org/packages/53/ee/7615721c11c28feb211a93a396b0c4bb21546afd1072e30e00b5a364e08a/ftw.testing-1.2.tar.gz"
}
],
"1.20.0": [
{
"comment_text": "",
"digests": {
"md5": "9be703e395339dee16e276fe47c90851",
"sha256": "8ce3343977f5fae25ca5ec01bfd85d562a3ad8064f615d924cf1c609794d8c5b"
},
"downloads": -1,
"filename": "ftw.testing-1.20.0.tar.gz",
"has_sig": false,
"md5_digest": "9be703e395339dee16e276fe47c90851",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 54787,
"upload_time": "2019-01-25T16:39:05",
"url": "https://files.pythonhosted.org/packages/b3/55/9bba4488179db2fbc39e00ac7a8158ee85f5359a1db21df1313f5a0e21a5/ftw.testing-1.20.0.tar.gz"
}
],
"1.20.1": [
{
"comment_text": "",
"digests": {
"md5": "ece03955b7a899e41aeca4ca3c3d9e5e",
"sha256": "832e9c5647604d93ae327fc41d82a464575d3457bad1b47fe904c23eb3b62979"
},
"downloads": -1,
"filename": "ftw.testing-1.20.1.tar.gz",
"has_sig": false,
"md5_digest": "ece03955b7a899e41aeca4ca3c3d9e5e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 55135,
"upload_time": "2019-04-04T10:26:30",
"url": "https://files.pythonhosted.org/packages/0b/8a/ad90f925bcf9d9ef3c429235eff790b3625893f6b24c172791d9dc6af8e0/ftw.testing-1.20.1.tar.gz"
}
],
"1.3": [
{
"comment_text": "",
"digests": {
"md5": "d31a3abdcdd60d243e45830d96824c11",
"sha256": "a73f9f4cb1557f6c6947f1a3c1471c567ec73f8bd58f2c1fa269f78d1a7a7bf3"
},
"downloads": -1,
"filename": "ftw.testing-1.3.zip",
"has_sig": false,
"md5_digest": "d31a3abdcdd60d243e45830d96824c11",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 44784,
"upload_time": "2013-05-03T11:46:37",
"url": "https://files.pythonhosted.org/packages/5f/e2/812c4edaa83aa9b31d9b3a0d54462a297cece48525e9e1af916d8ebd79ff/ftw.testing-1.3.zip"
}
],
"1.3.1": [
{
"comment_text": "",
"digests": {
"md5": "c30fff0fbf0a99a961bc605aca456f37",
"sha256": "3ac74307de609a6c54e9956112421c7b93db900e986e6ae8bed6bbcc487e8735"
},
"downloads": -1,
"filename": "ftw.testing-1.3.1.zip",
"has_sig": false,
"md5_digest": "c30fff0fbf0a99a961bc605aca456f37",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 45946,
"upload_time": "2013-05-24T14:37:55",
"url": "https://files.pythonhosted.org/packages/ae/1c/13628bfa97a76d54d10fd7900a433d2b32c2af01a38e3c05ee24b3c20b1e/ftw.testing-1.3.1.zip"
}
],
"1.4": [
{
"comment_text": "",
"digests": {
"md5": "78ff2525ba7f67ee2aae614575467520",
"sha256": "84e42cfcc018c45abbb5222a0662019397fa834ae6f28ea31d55d9cec0c57d60"
},
"downloads": -1,
"filename": "ftw.testing-1.4.zip",
"has_sig": false,
"md5_digest": "78ff2525ba7f67ee2aae614575467520",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 46010,
"upload_time": "2013-08-26T15:01:26",
"url": "https://files.pythonhosted.org/packages/49/f7/487813035c87b049a552fcfd5a81cda972d591919d0ee260ce5491cc9a2e/ftw.testing-1.4.zip"
}
],
"1.5.0": [
{
"comment_text": "",
"digests": {
"md5": "570ce6febf865576fd7d2b6bc123a67e",
"sha256": "a6e24f1dd80296f85708d2820459dc53e59985ac4fad1bc41e72d984afdfd8ee"
},
"downloads": -1,
"filename": "ftw.testing-1.5.0.zip",
"has_sig": false,
"md5_digest": "570ce6febf865576fd7d2b6bc123a67e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 47680,
"upload_time": "2013-09-24T10:20:37",
"url": "https://files.pythonhosted.org/packages/ee/3e/16736f43ce83890fd2b2461f80c889904e2487d1f3fa0d958935bee4161a/ftw.testing-1.5.0.zip"
}
],
"1.5.1": [
{
"comment_text": "",
"digests": {
"md5": "59aaf21e9aa2f06fcb17ea25e01a77c5",
"sha256": "7a016ece43753caafa81aef7fc9f2346aebefdb4a6a1d12477a4e08bd3f1cd62"
},
"downloads": -1,
"filename": "ftw.testing-1.5.1.zip",
"has_sig": false,
"md5_digest": "59aaf21e9aa2f06fcb17ea25e01a77c5",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 49822,
"upload_time": "2014-02-08T12:46:58",
"url": "https://files.pythonhosted.org/packages/00/ce/c1c5bd75d46bef32920b33eef80dcadac733d057cad30b75d1fb6f90b00e/ftw.testing-1.5.1.zip"
}
],
"1.5.2": [
{
"comment_text": "",
"digests": {
"md5": "b3598f19f818c2b8d2da5c8d5eff901b",
"sha256": "d7187c02cd86f04a816d1bcba4c0a60ff74aa7c4c3b31e51b91603ba60d617cb"
},
"downloads": -1,
"filename": "ftw.testing-1.5.2.zip",
"has_sig": false,
"md5_digest": "b3598f19f818c2b8d2da5c8d5eff901b",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 50088,
"upload_time": "2014-02-09T13:31:48",
"url": "https://files.pythonhosted.org/packages/e9/2d/6605aa58de98cc5578985ab20c197c421257d02ae1fee43de81bc2ab316b/ftw.testing-1.5.2.zip"
}
],
"1.6.0": [
{
"comment_text": "",
"digests": {
"md5": "84707196eddc5c1500c640ff3f1495f7",
"sha256": "f4d3bbf85a202b5960dab88bf46e2ecdc7ac2d3d2ad324d704d86e70e92d426c"
},
"downloads": -1,
"filename": "ftw.testing-1.6.0.zip",
"has_sig": false,
"md5_digest": "84707196eddc5c1500c640ff3f1495f7",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 56347,
"upload_time": "2014-04-29T09:41:32",
"url": "https://files.pythonhosted.org/packages/cd/81/8d1cd1346fe46e6454fcf60c5677eb16071d449d4462a552d43c4e3ea6df/ftw.testing-1.6.0.zip"
}
],
"1.6.1": [
{
"comment_text": "",
"digests": {
"md5": "5fd875311f36de13b0381b8fe9529ede",
"sha256": "4e163b7b00f0f473640f7466f5a7e915ae03857add76e54747ad7053c732752b"
},
"downloads": -1,
"filename": "ftw.testing-1.6.1.zip",
"has_sig": false,
"md5_digest": "5fd875311f36de13b0381b8fe9529ede",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 56510,
"upload_time": "2014-04-29T14:46:35",
"url": "https://files.pythonhosted.org/packages/ba/5d/d0b99077dbe2b32e666cb0aac8f0332746156612c09fa35b6183d5476198/ftw.testing-1.6.1.zip"
}
],
"1.6.2": [
{
"comment_text": "",
"digests": {
"md5": "e752ea4aafca8b0db1e70b97c53a0170",
"sha256": "f5610c300f25e04bfaee0abdc1ed066acc2e818e83bec79df1ab677a5a2a039e"
},
"downloads": -1,
"filename": "ftw.testing-1.6.2.zip",
"has_sig": false,
"md5_digest": "e752ea4aafca8b0db1e70b97c53a0170",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 56529,
"upload_time": "2014-04-30T11:55:08",
"url": "https://files.pythonhosted.org/packages/a5/64/7948005eb6092c2b4af18168b5f938f736e1f2464df5300cd45399b5b49c/ftw.testing-1.6.2.zip"
}
],
"1.6.3": [
{
"comment_text": "",
"digests": {
"md5": "c44bf656fa7bc00d6880aa40c360a795",
"sha256": "b2583fa3dffe4fb12c65273790e7f407996ea719ad12d451d81d5edb202d09e9"
},
"downloads": -1,
"filename": "ftw.testing-1.6.3.zip",
"has_sig": false,
"md5_digest": "c44bf656fa7bc00d6880aa40c360a795",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 57421,
"upload_time": "2014-04-30T13:03:23",
"url": "https://files.pythonhosted.org/packages/97/0f/5dfe45202eb3e861f39d376cf84bf8470ea1ccbba7b63359c59e54c30a5d/ftw.testing-1.6.3.zip"
}
],
"1.6.4": [
{
"comment_text": "",
"digests": {
"md5": "6102e694a53abd4d4b86202291ccedc7",
"sha256": "c79062cf4c9404282e7ab5a79fdf8ff5945b07a5647a71d0df9da3d4e9926821"
},
"downloads": -1,
"filename": "ftw.testing-1.6.4.zip",
"has_sig": false,
"md5_digest": "6102e694a53abd4d4b86202291ccedc7",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 58923,
"upload_time": "2014-05-01T14:03:28",
"url": "https://files.pythonhosted.org/packages/37/27/bddf3fb50888a72ff92eaca28d38f7445020b37d29b6e2c70c9caebdc57a/ftw.testing-1.6.4.zip"
}
],
"1.7.0": [
{
"comment_text": "",
"digests": {
"md5": "074da0d2fba589b7ff798a66a6d28545",
"sha256": "c2ecceac9d8e770ee6b43950e1fd8cb6f309944636e8d3672f7b40fd990bad8b"
},
"downloads": -1,
"filename": "ftw.testing-1.7.0.zip",
"has_sig": false,
"md5_digest": "074da0d2fba589b7ff798a66a6d28545",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 61755,
"upload_time": "2014-09-30T16:28:33",
"url": "https://files.pythonhosted.org/packages/00/c8/08426b418792173f5a81e8768f8c039b7e6a2e6896d6dd84883e9bf3fa98/ftw.testing-1.7.0.zip"
}
],
"1.8.0": [
{
"comment_text": "",
"digests": {
"md5": "4c86ecd3a3b6b757008d4420045b00bd",
"sha256": "637f03f7d5bd40976e74c522fc74df9861658c9daf15442cbd03ed16ff9457d6"
},
"downloads": -1,
"filename": "ftw.testing-1.8.0.zip",
"has_sig": false,
"md5_digest": "4c86ecd3a3b6b757008d4420045b00bd",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 68662,
"upload_time": "2014-12-31T11:41:56",
"url": "https://files.pythonhosted.org/packages/28/77/7e551be859376ddd3595fe12f77542f7c1f7c15f9efce666c97a677f177e/ftw.testing-1.8.0.zip"
}
],
"1.8.1": [
{
"comment_text": "",
"digests": {
"md5": "5c95e06c9fd96ef421f70e05bb6c8326",
"sha256": "c4e3042ac141025cdf082a5cd0352138f78a9a80b716d02665872c7c73e14bc4"
},
"downloads": -1,
"filename": "ftw.testing-1.8.1.zip",
"has_sig": false,
"md5_digest": "5c95e06c9fd96ef421f70e05bb6c8326",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 68784,
"upload_time": "2015-01-05T13:28:54",
"url": "https://files.pythonhosted.org/packages/ea/cf/8fbf8ae43d1dc6827d18405321f976c7fb39271674d721a7da078ea6cddb/ftw.testing-1.8.1.zip"
}
],
"1.9.0": [
{
"comment_text": "",
"digests": {
"md5": "464f1280bc5eb5936edc63757d7ea7cf",
"sha256": "e118876cfb6c7634aad62f27b6746f1d9a7e8c7855ed71d93a157393b8c0820f"
},
"downloads": -1,
"filename": "ftw.testing-1.9.0.zip",
"has_sig": false,
"md5_digest": "464f1280bc5eb5936edc63757d7ea7cf",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 70279,
"upload_time": "2015-05-15T12:04:14",
"url": "https://files.pythonhosted.org/packages/3e/e6/de6f060dc658df7fc9dd1812c8bbfbb3a00c6b213d951661003922ee94c4/ftw.testing-1.9.0.zip"
}
],
"1.9.1": [
{
"comment_text": "",
"digests": {
"md5": "507d828562e0eab41bf430ec4965bf4a",
"sha256": "2b466619e6198cceb38bbcae7126b78eb0a8d4f71c6921aecaca7039b28a5f5e"
},
"downloads": -1,
"filename": "ftw.testing-1.9.1.zip",
"has_sig": false,
"md5_digest": "507d828562e0eab41bf430ec4965bf4a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 70443,
"upload_time": "2015-05-15T12:20:46",
"url": "https://files.pythonhosted.org/packages/90/ed/2e39c0f0e0a26d418713a707443060501fa1b3bcf8f7259840fbc103cb21/ftw.testing-1.9.1.zip"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "ece03955b7a899e41aeca4ca3c3d9e5e",
"sha256": "832e9c5647604d93ae327fc41d82a464575d3457bad1b47fe904c23eb3b62979"
},
"downloads": -1,
"filename": "ftw.testing-1.20.1.tar.gz",
"has_sig": false,
"md5_digest": "ece03955b7a899e41aeca4ca3c3d9e5e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 55135,
"upload_time": "2019-04-04T10:26:30",
"url": "https://files.pythonhosted.org/packages/0b/8a/ad90f925bcf9d9ef3c429235eff790b3625893f6b24c172791d9dc6af8e0/ftw.testing-1.20.1.tar.gz"
}
]
}