def get_dir_from_zipfile(zip_file, fallback=None):
    """Return the name of the root folder in a zip file.

    :param zip_file: a :class:`zipfile.ZipFile` instance.
    :param fallback: if `None`, the name of the zip file is used. This is
        returned if the zip file contains more than one top-level directory,
        or none at all.
    """
    fallback = fallback or zip_file.filename
    directories = [name for name in zip_file.namelist() if name.endswith("/")
                   and len(PurePath(name).parts) == 1]
    return fallback if len(directories) > 1 else directories[0]
def test_parse_sections():
    simple_mariofile_sections = dict(mariofile.parse_sections(SIMPLE_MARIOFILE.splitlines(True)))
    assert len(simple_mariofile_sections) == 3
    complex_mariofile_sections = dict(mariofile.parse_sections(COMPLEX_MARIOFILE.splitlines(True)))
    assert len(complex_mariofile_sections) == 2
    assert sorted(complex_mariofile_sections.keys()) == ['DEFAULT', 'section']
    assert complex_mariofile_sections['DEFAULT'] == ['default text\n', '\n']
    with pytest.raises(mariofile.ConfigurationFileError):
        dict(mariofile.parse_sections(GARBAGE_MARIOFILE.splitlines(True)))
    with pytest.raises(mariofile.ConfigurationFileError):
        dict(mariofile.parse_sections(INVALID_SECTION_MARIOFILE.splitlines(True)))
    more_complex_mariofile_sections = dict(
            mariofile.parse_sections(MORE_COMPLEX_MARIOFILE.splitlines(True))
    )
    more_complex_mariofile_sections_keys = ['DEFAULT', 'section_one', 'section_two', 'three']
    assert sorted(more_complex_mariofile_sections.keys()) == more_complex_mariofile_sections_keys
    assert more_complex_mariofile_sections['three'] == []