312 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			312 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Python
		
	
	
	
import py
 | 
						|
 | 
						|
from py._test.session import Collection, gettopdir
 | 
						|
 | 
						|
class TestCollection:
 | 
						|
    def test_parsearg(self, testdir):
 | 
						|
        p = testdir.makepyfile("def test_func(): pass")
 | 
						|
        subdir = testdir.mkdir("sub")
 | 
						|
        subdir.ensure("__init__.py")
 | 
						|
        target = subdir.join(p.basename)
 | 
						|
        p.move(target)
 | 
						|
        testdir.chdir()
 | 
						|
        subdir.chdir()
 | 
						|
        config = testdir.parseconfig(p.basename)
 | 
						|
        rcol = Collection(config=config)
 | 
						|
        assert rcol.topdir == testdir.tmpdir
 | 
						|
        parts = rcol._parsearg(p.basename)
 | 
						|
        assert parts[0] ==  "sub"
 | 
						|
        assert parts[1] ==  p.basename
 | 
						|
        assert len(parts) == 2
 | 
						|
        parts = rcol._parsearg(p.basename + "::test_func")
 | 
						|
        assert parts[0] ==  "sub"
 | 
						|
        assert parts[1] ==  p.basename
 | 
						|
        assert parts[2] ==  "test_func"
 | 
						|
        assert len(parts) == 3
 | 
						|
 | 
						|
    def test_collect_topdir(self, testdir):
 | 
						|
        p = testdir.makepyfile("def test_func(): pass")
 | 
						|
        id = "::".join([p.basename, "test_func"])
 | 
						|
        config = testdir.parseconfig(id)
 | 
						|
        topdir = testdir.tmpdir
 | 
						|
        rcol = Collection(config)
 | 
						|
        assert topdir == rcol.topdir
 | 
						|
        hookrec = testdir.getreportrecorder(config)
 | 
						|
        items = rcol.perform_collect()
 | 
						|
        assert len(items) == 1
 | 
						|
        root = items[0].listchain()[0]
 | 
						|
        root_id = rcol.getid(root)
 | 
						|
        root2 = rcol.getbyid(root_id)[0]
 | 
						|
        assert root2.fspath == root.fspath
 | 
						|
 | 
						|
    def test_collect_protocol_single_function(self, testdir):
 | 
						|
        p = testdir.makepyfile("def test_func(): pass")
 | 
						|
        id = "::".join([p.basename, "test_func"])
 | 
						|
        config = testdir.parseconfig(id)
 | 
						|
        topdir = testdir.tmpdir
 | 
						|
        rcol = Collection(config)
 | 
						|
        assert topdir == rcol.topdir
 | 
						|
        hookrec = testdir.getreportrecorder(config)
 | 
						|
        items = rcol.perform_collect()
 | 
						|
        assert len(items) == 1
 | 
						|
        item = items[0]
 | 
						|
        assert item.name == "test_func"
 | 
						|
        newid = rcol.getid(item)
 | 
						|
        assert newid == id
 | 
						|
        py.std.pprint.pprint(hookrec.hookrecorder.calls)
 | 
						|
        hookrec.hookrecorder.contains([
 | 
						|
            ("pytest_collectstart", "collector.fspath == topdir"),
 | 
						|
            ("pytest_make_collect_report", "collector.fspath == topdir"),
 | 
						|
            ("pytest_collectstart", "collector.fspath == p"),
 | 
						|
            ("pytest_make_collect_report", "collector.fspath == p"),
 | 
						|
            ("pytest_pycollect_makeitem", "name == 'test_func'"),
 | 
						|
            ("pytest_collectreport", "report.fspath == p"),
 | 
						|
            ("pytest_collectreport", "report.fspath == topdir")
 | 
						|
        ])
 | 
						|
 | 
						|
    def test_collect_protocol_method(self, testdir):
 | 
						|
        p = testdir.makepyfile("""
 | 
						|
            class TestClass:
 | 
						|
                def test_method(self):
 | 
						|
                    pass
 | 
						|
        """)
 | 
						|
        normid = p.basename + "::TestClass::test_method"
 | 
						|
        for id in [p.basename,
 | 
						|
                   p.basename + "::TestClass",
 | 
						|
                   p.basename + "::TestClass::()",
 | 
						|
                   p.basename + "::TestClass::()::test_method",
 | 
						|
                   normid,
 | 
						|
                   ]:
 | 
						|
            config = testdir.parseconfig(id)
 | 
						|
            rcol = Collection(config=config)
 | 
						|
            nodes = rcol.perform_collect()
 | 
						|
            assert len(nodes) == 1
 | 
						|
            assert nodes[0].name == "test_method"
 | 
						|
            newid = rcol.getid(nodes[0])
 | 
						|
            assert newid == normid
 | 
						|
 | 
						|
    def test_collect_custom_nodes_multi_id(self, testdir):
 | 
						|
        p = testdir.makepyfile("def test_func(): pass")
 | 
						|
        testdir.makeconftest("""
 | 
						|
            import py
 | 
						|
            class SpecialItem(py.test.collect.Item):
 | 
						|
                def runtest(self):
 | 
						|
                    return # ok
 | 
						|
            class SpecialFile(py.test.collect.File):
 | 
						|
                def collect(self):
 | 
						|
                    return [SpecialItem(name="check", parent=self)]
 | 
						|
            def pytest_collect_file(path, parent):
 | 
						|
                if path.basename == %r:
 | 
						|
                    return SpecialFile(fspath=path, parent=parent)
 | 
						|
        """ % p.basename)
 | 
						|
        id = p.basename
 | 
						|
 | 
						|
        config = testdir.parseconfig(id)
 | 
						|
        rcol = Collection(config)
 | 
						|
        hookrec = testdir.getreportrecorder(config)
 | 
						|
        items = rcol.perform_collect()
 | 
						|
        py.std.pprint.pprint(hookrec.hookrecorder.calls)
 | 
						|
        assert len(items) == 2
 | 
						|
        hookrec.hookrecorder.contains([
 | 
						|
            ("pytest_collectstart",
 | 
						|
                "collector.fspath == collector.collection.topdir"),
 | 
						|
            ("pytest_collectstart",
 | 
						|
                "collector.__class__.__name__ == 'SpecialFile'"),
 | 
						|
            ("pytest_collectstart",
 | 
						|
                "collector.__class__.__name__ == 'Module'"),
 | 
						|
            ("pytest_pycollect_makeitem", "name == 'test_func'"),
 | 
						|
            ("pytest_collectreport", "report.fspath == p"),
 | 
						|
            ("pytest_collectreport",
 | 
						|
                "report.fspath == %r" % str(rcol.topdir)),
 | 
						|
        ])
 | 
						|
 | 
						|
    def test_collect_subdir_event_ordering(self, testdir):
 | 
						|
        p = testdir.makepyfile("def test_func(): pass")
 | 
						|
        aaa = testdir.mkpydir("aaa")
 | 
						|
        test_aaa = aaa.join("test_aaa.py")
 | 
						|
        p.move(test_aaa)
 | 
						|
        config = testdir.parseconfig()
 | 
						|
        rcol = Collection(config)
 | 
						|
        hookrec = testdir.getreportrecorder(config)
 | 
						|
        items = rcol.perform_collect()
 | 
						|
        assert len(items) == 1
 | 
						|
        py.std.pprint.pprint(hookrec.hookrecorder.calls)
 | 
						|
        hookrec.hookrecorder.contains([
 | 
						|
            ("pytest_collectstart", "collector.fspath == aaa"),
 | 
						|
            ("pytest_collectstart", "collector.fspath == test_aaa"),
 | 
						|
            ("pytest_pycollect_makeitem", "name == 'test_func'"),
 | 
						|
            ("pytest_collectreport", "report.fspath == test_aaa"),
 | 
						|
            ("pytest_collectreport", "report.fspath == aaa"),
 | 
						|
        ])
 | 
						|
 | 
						|
    def test_collect_two_commandline_args(self, testdir):
 | 
						|
        p = testdir.makepyfile("def test_func(): pass")
 | 
						|
        aaa = testdir.mkpydir("aaa")
 | 
						|
        bbb = testdir.mkpydir("bbb")
 | 
						|
        p.copy(aaa.join("test_aaa.py"))
 | 
						|
        p.move(bbb.join("test_bbb.py"))
 | 
						|
 | 
						|
        id = "."
 | 
						|
        config = testdir.parseconfig(id)
 | 
						|
        rcol = Collection(config)
 | 
						|
        hookrec = testdir.getreportrecorder(config)
 | 
						|
        items = rcol.perform_collect()
 | 
						|
        assert len(items) == 2
 | 
						|
        py.std.pprint.pprint(hookrec.hookrecorder.calls)
 | 
						|
        hookrec.hookrecorder.contains([
 | 
						|
            ("pytest_collectstart", "collector.fspath == aaa"),
 | 
						|
            ("pytest_pycollect_makeitem", "name == 'test_func'"),
 | 
						|
            ("pytest_collectreport", "report.fspath == aaa"),
 | 
						|
            ("pytest_collectstart", "collector.fspath == bbb"),
 | 
						|
            ("pytest_pycollect_makeitem", "name == 'test_func'"),
 | 
						|
            ("pytest_collectreport", "report.fspath == bbb"),
 | 
						|
        ])
 | 
						|
 | 
						|
    def test_serialization_byid(self, testdir):
 | 
						|
        p = testdir.makepyfile("def test_func(): pass")
 | 
						|
        config = testdir.parseconfig()
 | 
						|
        rcol = Collection(config)
 | 
						|
        items = rcol.perform_collect()
 | 
						|
        assert len(items) == 1
 | 
						|
        item, = items
 | 
						|
        id = rcol.getid(item)
 | 
						|
        newcol = Collection(config)
 | 
						|
        item2, = newcol.getbyid(id)
 | 
						|
        assert item2.name == item.name
 | 
						|
        assert item2.fspath == item.fspath
 | 
						|
        item2b, = newcol.getbyid(id)
 | 
						|
        assert item2b is item2
 | 
						|
 | 
						|
class Test_gettopdir:
 | 
						|
    def test_gettopdir(self, testdir):
 | 
						|
        tmp = testdir.tmpdir
 | 
						|
        assert gettopdir([tmp]) == tmp
 | 
						|
        topdir = gettopdir([tmp.join("hello"), tmp.join("world")])
 | 
						|
        assert topdir == tmp
 | 
						|
        somefile = tmp.ensure("somefile.py")
 | 
						|
        assert gettopdir([somefile]) == tmp
 | 
						|
 | 
						|
    def test_gettopdir_pypkg(self, testdir):
 | 
						|
        tmp = testdir.tmpdir
 | 
						|
        a = tmp.ensure('a', dir=1)
 | 
						|
        b = tmp.ensure('a', 'b', '__init__.py')
 | 
						|
        c = tmp.ensure('a', 'b', 'c.py')
 | 
						|
        Z = tmp.ensure('Z', dir=1)
 | 
						|
        assert gettopdir([c]) == a
 | 
						|
        assert gettopdir([c, Z]) == tmp
 | 
						|
        assert gettopdir(["%s::xyc" % c]) == a
 | 
						|
        assert gettopdir(["%s::xyc::abc" % c]) == a
 | 
						|
        assert gettopdir(["%s::xyc" % c, "%s::abc" % Z]) == tmp
 | 
						|
 | 
						|
def getargnode(collection, arg):
 | 
						|
    return collection.getbyid(collection._normalizearg(str(arg)))[0]
 | 
						|
 | 
						|
class Test_getinitialnodes:
 | 
						|
    def test_onedir(self, testdir):
 | 
						|
        config = testdir.reparseconfig([testdir.tmpdir])
 | 
						|
        c = Collection(config)
 | 
						|
        col = getargnode(c, testdir.tmpdir)
 | 
						|
        assert isinstance(col, py.test.collect.Directory)
 | 
						|
        for col in col.listchain():
 | 
						|
            assert col.config is config
 | 
						|
        t2 = getargnode(c, testdir.tmpdir)
 | 
						|
        assert col == t2
 | 
						|
 | 
						|
    def test_curdir_and_subdir(self, testdir, tmpdir):
 | 
						|
        a = tmpdir.ensure("a", dir=1)
 | 
						|
        config = testdir.reparseconfig([tmpdir, a])
 | 
						|
        c = Collection(config)
 | 
						|
        
 | 
						|
        col1 = getargnode(c, tmpdir)
 | 
						|
        col2 = getargnode(c, a)
 | 
						|
        assert col1.name == tmpdir.basename
 | 
						|
        assert col2.name == 'a'
 | 
						|
        for col in (col1, col2):
 | 
						|
            for subcol in col.listchain():
 | 
						|
                assert col.config is config
 | 
						|
 | 
						|
    def test_global_file(self, testdir, tmpdir):
 | 
						|
        x = tmpdir.ensure("x.py")
 | 
						|
        config = testdir.reparseconfig([x])
 | 
						|
        col = getargnode(Collection(config), x)
 | 
						|
        assert isinstance(col, py.test.collect.Module)
 | 
						|
        assert col.name == 'x.py'
 | 
						|
        assert col.parent.name == tmpdir.basename
 | 
						|
        assert col.parent.parent is None
 | 
						|
        for col in col.listchain():
 | 
						|
            assert col.config is config
 | 
						|
 | 
						|
    def test_global_dir(self, testdir, tmpdir):
 | 
						|
        x = tmpdir.ensure("a", dir=1)
 | 
						|
        config = testdir.reparseconfig([x])
 | 
						|
        col = getargnode(Collection(config), x)
 | 
						|
        assert isinstance(col, py.test.collect.Directory)
 | 
						|
        print(col.listchain())
 | 
						|
        assert col.name == 'a'
 | 
						|
        assert col.parent is None
 | 
						|
        assert col.config is config
 | 
						|
 | 
						|
    def test_pkgfile(self, testdir, tmpdir):
 | 
						|
        tmpdir = tmpdir.join("subdir")
 | 
						|
        x = tmpdir.ensure("x.py")
 | 
						|
        tmpdir.ensure("__init__.py")
 | 
						|
        config = testdir.reparseconfig([x])
 | 
						|
        col = getargnode(Collection(config), x)
 | 
						|
        assert isinstance(col, py.test.collect.Module)
 | 
						|
        assert col.name == 'x.py'
 | 
						|
        assert col.parent.name == x.dirpath().basename
 | 
						|
        assert col.parent.parent.parent is None
 | 
						|
        for col in col.listchain():
 | 
						|
            assert col.config is config
 | 
						|
 | 
						|
class Test_genitems:
 | 
						|
    def test_check_collect_hashes(self, testdir):
 | 
						|
        p = testdir.makepyfile("""
 | 
						|
            def test_1():
 | 
						|
                pass
 | 
						|
 | 
						|
            def test_2():
 | 
						|
                pass
 | 
						|
        """)
 | 
						|
        p.copy(p.dirpath(p.purebasename + "2" + ".py"))
 | 
						|
        items, reprec = testdir.inline_genitems(p.dirpath())
 | 
						|
        assert len(items) == 4
 | 
						|
        for numi, i in enumerate(items):
 | 
						|
            for numj, j in enumerate(items):
 | 
						|
                if numj != numi:
 | 
						|
                    assert hash(i) != hash(j)
 | 
						|
                    assert i != j
 | 
						|
 | 
						|
    def test_root_conftest_syntax_error(self, testdir):
 | 
						|
        # do we want to unify behaviour with
 | 
						|
        # test_subdir_conftest_error?
 | 
						|
        p = testdir.makepyfile(conftest="raise SyntaxError\n")
 | 
						|
        py.test.raises(SyntaxError, testdir.inline_genitems, p.dirpath())
 | 
						|
 | 
						|
    def test_example_items1(self, testdir):
 | 
						|
        p = testdir.makepyfile('''
 | 
						|
            def testone():
 | 
						|
                pass
 | 
						|
 | 
						|
            class TestX:
 | 
						|
                def testmethod_one(self):
 | 
						|
                    pass
 | 
						|
 | 
						|
            class TestY(TestX):
 | 
						|
                pass
 | 
						|
        ''')
 | 
						|
        items, reprec = testdir.inline_genitems(p)
 | 
						|
        assert len(items) == 3
 | 
						|
        assert items[0].name == 'testone'
 | 
						|
        assert items[1].name == 'testmethod_one'
 | 
						|
        assert items[2].name == 'testmethod_one'
 | 
						|
 | 
						|
        # let's also test getmodpath here
 | 
						|
        assert items[0].getmodpath() == "testone"
 | 
						|
        assert items[1].getmodpath() == "TestX.testmethod_one"
 | 
						|
        assert items[2].getmodpath() == "TestY.testmethod_one"
 | 
						|
 | 
						|
        s = items[0].getmodpath(stopatmodule=False)
 | 
						|
        assert s.endswith("test_example_items1.testone")
 | 
						|
        print(s)
 |