async def METHOD_NAME(self, fn, expected_exception, max_retries=20, retry_delay=3):
    """polling helper for live tests because some operations take an unpredictable amount of time to complete"""
    for _ in range(max_retries):
        try:
            await fn()
            if self.is_live:
                await asyncio.sleep(retry_delay)
        except expected_exception:
            return
    raise AssertionError(f"expected exception {expected_exception} was not raised")