def test_fatal_if_no_storage_and_no_sqlite_file(tmpdir, use_option): from devpi_server.init import init from devpi_server.main import _main, get_pluginmanager class Plugin: @hookimpl def devpiserver_cmdline_run(self, xom): return 1 pm = get_pluginmanager() pm.register(Plugin()) if use_option: _main(argv=["devpi-server", "--init", "--serverdir", str(tmpdir)], pluginmanager=pm) else: init(argv=["devpi-init", "--serverdir", str(tmpdir)], pluginmanager=pm) _main(argv=["devpi-server", "--serverdir", str(tmpdir)], pluginmanager=pm) tmpdir.join('.sqlite').remove() with pytest.raises(Fatal) as excinfo: _main(argv=["devpi-server", "--serverdir", str(tmpdir)], pluginmanager=pm) assert "you first need to run devpi-init or devpi-import" in str( excinfo.value)
def test_root_passwd_hash_option(gentmp, makexom, storage_info): from devpi_server.init import init # by default the password is empty serverdir = gentmp() argv = ["devpi-init", "--serverdir", serverdir] if storage_info["name"] != "sqlite": argv.append("--storage=%s" % storage_info["name"]) init(argv=argv) xom = makexom(opts=("--serverdir", serverdir)) with xom.keyfs.transaction(write=False): user = xom.model.get_user('root') assert user.validate("") assert not user.validate("foobar") # the password hash can be directly set from the command line serverdir = gentmp() argv = [ "devpi-init", "--serverdir", serverdir, "--root-passwd-hash", "$argon2i$v=19$m=102400,t=2,p=8$j9G6V8o5B0Co9f4fQ6gVIg$WzcG2C5Bv0LwtzPWeBcz0g" ] if storage_info["name"] != "sqlite": argv.append("--storage=%s" % storage_info["name"]) init(argv=argv) xom = makexom(opts=("--serverdir", serverdir)) # we allow writes, because the hash might be upgraded # this happend after passlib 1.7.2 made argon2id the default with xom.keyfs.transaction(write=True): user = xom.model.get_user('root') assert not user.validate("") assert user.validate("foobar")
def test_no_root_pypi_option(gentmp, makexom, storage_info): from devpi_server.init import init serverdir = gentmp() argv = ["devpi-init", "--serverdir", serverdir, "--no-root-pypi"] if storage_info["name"] != "sqlite": argv.append("--storage=%s" % storage_info["name"]) init(argv=argv) xom = makexom(opts=("--serverdir", serverdir)) with xom.keyfs.transaction(write=False): stage = xom.model.getstage('root/pypi') assert stage is None
def test_run_commands_called(tmpdir, use_option): from devpi_server.init import init from devpi_server.main import _main, get_pluginmanager l = [] class Plugin: @hookimpl def devpiserver_cmdline_run(self, xom): l.append(xom) return 1 pm = get_pluginmanager() pm.register(Plugin()) if use_option: result = _main( argv=["devpi-server", "--init", "--serverdir", str(tmpdir)], pluginmanager=pm) else: result = init(argv=["devpi-init", "--serverdir", str(tmpdir)], pluginmanager=pm) result = _main(argv=["devpi-server", "--serverdir", str(tmpdir)], pluginmanager=pm) assert result == 1 assert len(l) == 1 assert isinstance(l[0], XOM)
def test_export_import(tmpdir, capfd, monkeypatch, use_option): from devpi_server.importexport import import_ from devpi_server.init import init from devpi_server.main import main monkeypatch.setattr("devpi_server.main.configure_logging", lambda a: None) clean = tmpdir.join("clean").ensure(dir=True) if use_option: ret = main( argv=["devpi-server", "--init", "--serverdir", clean.strpath]) else: ret = init(argv=["devpi-init", "--serverdir", clean.strpath]) assert ret == 0 export = tmpdir.join("export") ret = main([ "devpi-server", "--serverdir", clean.strpath, "--export", export.strpath ]) assert ret == 0 import_dir = tmpdir.join("import") if use_option: ret = main(argv=[ "devpi-server", "--serverdir", import_dir.strpath, "--no-events", "--import", export.strpath ]) else: ret = import_(argv=[ "devpi-import", "--serverdir", import_dir.strpath, "--no-events", export.strpath ]) assert ret == 0 out, err = capfd.readouterr() assert os.listdir(clean.strpath) == os.listdir(import_dir.strpath) assert 'import_all: importing finished' in out assert err == ''
def test_main_starts_server_if_run_commands_returns_none(tmpdir): from devpi_server.init import init from devpi_server.main import _main, get_pluginmanager l = [] class Plugin: @hookimpl def devpiserver_cmdline_run(self, xom): l.append(xom) pm = get_pluginmanager() pm.register(Plugin()) init(argv=["devpi-init", "--serverdir", str(tmpdir)], pluginmanager=pm) with pytest.raises(ZeroDivisionError): _main(argv=["devpi-server", "--serverdir", str(tmpdir)], pluginmanager=pm) assert len(l) == 1 assert isinstance(l[0], XOM)
def test_root_passwd_option(gentmp, makexom, storage_info): from devpi_server.init import init # by default the password is empty serverdir = gentmp() argv = ["devpi-init", "--serverdir", serverdir] if storage_info["name"] != "sqlite": argv.append("--storage=%s" % storage_info["name"]) init(argv=argv) xom = makexom(opts=("--serverdir", serverdir)) with xom.keyfs.transaction(write=False): user = xom.model.get_user('root') assert user.validate("") assert not user.validate("foobar") # the password can be set from the command line serverdir = gentmp() argv = ["devpi-init", "--serverdir", serverdir, "--root-passwd", "foobar"] if storage_info["name"] != "sqlite": argv.append("--storage=%s" % storage_info["name"]) init(argv=argv) xom = makexom(opts=("--serverdir", serverdir)) with xom.keyfs.transaction(write=False): user = xom.model.get_user('root') assert not user.validate("") assert user.validate("foobar")
def test_export_import_no_root_pypi(tmpdir, capfd, monkeypatch): from devpi_server.importexport import export from devpi_server.importexport import import_ from devpi_server.init import init monkeypatch.setattr("devpi_server.main.configure_logging", lambda a: None) clean = tmpdir.join("clean").ensure(dir=True) ret = init( argv=["devpi-init", "--serverdir", clean.strpath, "--no-root-pypi"]) assert ret == 0 export_dir = tmpdir.join("export") ret = export(argv=[ "devpi-server", "--serverdir", clean.strpath, export_dir.strpath ]) assert ret == 0 # first we test regular import import_dir = tmpdir.join("import") ret = import_(argv=[ "devpi-import", "--serverdir", import_dir.strpath, "--no-events", export_dir.strpath ]) assert ret == 0 out, err = capfd.readouterr() assert os.listdir(clean.strpath) == os.listdir(import_dir.strpath) assert 'import_all: importing finished' in out assert err == '' # now we add --no-root-pypi import_dir.remove() ret = import_(argv=[ "devpi-import", "--serverdir", import_dir.strpath, "--no-events", "--no-root-pypi", export_dir.strpath ]) assert ret == 0 out, err = capfd.readouterr() assert os.listdir(clean.strpath) == os.listdir(import_dir.strpath) assert 'import_all: importing finished' in out assert err == ''