implement request object as per docs
--HG-- branch : trunk
This commit is contained in:
		
							parent
							
								
									70840f605e
								
							
						
					
					
						commit
						de4c2dc98d
					
				| 
						 | 
					@ -415,15 +415,30 @@ class Function(FunctionMixin, py.test.collect.Item):
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class FuncargRequest:
 | 
					class FuncargRequest:
 | 
				
			||||||
 | 
					    class Error(LookupError):
 | 
				
			||||||
 | 
					        """ error on performing funcarg request. """ 
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
    def __init__(self, pyfuncitem, argname):
 | 
					    def __init__(self, pyfuncitem, argname):
 | 
				
			||||||
        self.pyfuncitem = pyfuncitem
 | 
					        self.pyfuncitem = pyfuncitem
 | 
				
			||||||
        self.argname = argname 
 | 
					        self.argname = argname 
 | 
				
			||||||
        funcargname = "pytest_funcarg__" + str(argname) 
 | 
					        self.function = pyfuncitem.obj
 | 
				
			||||||
        pm = self.pyfuncitem.config.pluginmanager 
 | 
					        self.config = pyfuncitem.config
 | 
				
			||||||
        extra = []
 | 
					        extra = []
 | 
				
			||||||
        current = pyfuncitem
 | 
					        current = pyfuncitem
 | 
				
			||||||
        while not isinstance(current, Module):
 | 
					        while not isinstance(current, Module):
 | 
				
			||||||
            current = current.parent
 | 
					            current = current.parent
 | 
				
			||||||
            if isinstance(current, (Instance, Module)):
 | 
					            if isinstance(current, (Instance, Module)):
 | 
				
			||||||
                extra.insert(0, current.obj)
 | 
					                extra.insert(0, current.obj)
 | 
				
			||||||
        self._methods = pm.listattr(funcargname, extra=extra)
 | 
					        self._methods = self.pyfuncitem.config.pluginmanager.listattr(
 | 
				
			||||||
 | 
					            "pytest_funcarg__" + str(argname), 
 | 
				
			||||||
 | 
					            extra=extra,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def call_next_provider(self):
 | 
				
			||||||
 | 
					        if not self._methods:
 | 
				
			||||||
 | 
					            raise self.Error("no provider methods left")
 | 
				
			||||||
 | 
					        nextmethod = self._methods.pop()
 | 
				
			||||||
 | 
					        return nextmethod(request=self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def addfinalizer(self, finalizer):
 | 
				
			||||||
 | 
					        self.pyfuncitem.addfinalizer(finalizer)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -84,6 +84,16 @@ class TestFuncargs:
 | 
				
			||||||
        assert not modcol.config.pluginmanager.isregistered(modcol.obj)
 | 
					        assert not modcol.config.pluginmanager.isregistered(modcol.obj)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestRequest:
 | 
					class TestRequest:
 | 
				
			||||||
 | 
					    def test_request_attributes(self, testdir):
 | 
				
			||||||
 | 
					        item = testdir.getitem("""
 | 
				
			||||||
 | 
					            def pytest_funcarg__something(request): pass
 | 
				
			||||||
 | 
					            def test_func(something): pass
 | 
				
			||||||
 | 
					        """)
 | 
				
			||||||
 | 
					        req = item.getrequest("other")
 | 
				
			||||||
 | 
					        assert req.argname == "other"
 | 
				
			||||||
 | 
					        assert req.function == item.obj 
 | 
				
			||||||
 | 
					        assert req.config == item.config 
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
    def test_request_contains_funcargs_methods(self, testdir):
 | 
					    def test_request_contains_funcargs_methods(self, testdir):
 | 
				
			||||||
        modcol = testdir.getmodulecol("""
 | 
					        modcol = testdir.getmodulecol("""
 | 
				
			||||||
            def pytest_funcarg__something(request):
 | 
					            def pytest_funcarg__something(request):
 | 
				
			||||||
| 
						 | 
					@ -101,3 +111,23 @@ class TestRequest:
 | 
				
			||||||
        method1, method2 = methods 
 | 
					        method1, method2 = methods 
 | 
				
			||||||
        assert not hasattr(method1, 'im_self')
 | 
					        assert not hasattr(method1, 'im_self')
 | 
				
			||||||
        assert method2.im_self is not None
 | 
					        assert method2.im_self is not None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_request_call_next_provider(self, testdir):
 | 
				
			||||||
 | 
					        item = testdir.getitem("""
 | 
				
			||||||
 | 
					            def pytest_funcarg__something(request): pass
 | 
				
			||||||
 | 
					            def test_func(something): pass
 | 
				
			||||||
 | 
					        """)
 | 
				
			||||||
 | 
					        req = item.getrequest("something")
 | 
				
			||||||
 | 
					        val = req.call_next_provider()
 | 
				
			||||||
 | 
					        assert val is None
 | 
				
			||||||
 | 
					        py.test.raises(req.Error, "req.call_next_provider()")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_request_addfinalizer(self, testdir):
 | 
				
			||||||
 | 
					        item = testdir.getitem("""
 | 
				
			||||||
 | 
					            def pytest_funcarg__something(request): pass
 | 
				
			||||||
 | 
					            def test_func(something): pass
 | 
				
			||||||
 | 
					        """)
 | 
				
			||||||
 | 
					        req = item.getrequest("something")
 | 
				
			||||||
 | 
					        l = [1]
 | 
				
			||||||
 | 
					        req.addfinalizer(l.pop)
 | 
				
			||||||
 | 
					        item.teardown()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue