Repository: fractal-analytics-platform/fractal-client (language: python)

Issue:
Align with new server (with user.cache_dir)
- [x] Update common submodule
- [x] Update fractal-server in poetry
- [x] In user create/edit, expose cache_dir (in the same way as slurm_user)
- [x] Tests..
- [x] Remove project_dir


Discussion / hints:
Ref:
* https://github.com/fractal-analytics-platform/fractal-server/pull/601

Fix patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 808892271..385842e76 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,8 +1,11 @@
 **Note**: Numbers like (\#123) point to closed Pull Requests on the fractal repository.
 
+# 1.2.0
+* Align with [fractal-server 1.2.0](https://fractal-analytics-platform.github.io/fractal-server/changelog/#120) (\#472).
+
 # 1.1.0
 
-* Align with fractal-server 1.1.0 (\#446).
+* Align with [fractal-server 1.1.0](https://fractal-analytics-platform.github.io/fractal-server/changelog/#110) (\#446).
 * Improve validation of API request payloads (\#447).
 * Drop support for python 3.8 (\#438).
 * Update `_TaskBase` schema from `fractal-common` (\#431).
diff --git a/fractal/cmd/_project.py b/fractal/cmd/_project.py
index 84c6eac04..2d18a97b2 100644
--- a/fractal/cmd/_project.py
+++ b/fractal/cmd/_project.py
@@ -22,13 +22,12 @@
 async def project_create(
     client: AuthClient,
     name: str,
-    path: str,
     dataset: Optional[str] = None,
     batch: bool = False,
     **kwargs,
 ) -> BaseInterface:
     # Prepare a ProjectCreate request body
-    project_dict = dict(name=name, project_dir=path)
+    project_dict = dict(name=name)
     if dataset:
         project_dict["default_dataset_name"] = dataset
     project = ProjectCreate(**project_dict)
@@ -78,7 +77,6 @@ async def project_list(client: AuthClient, **kwargs) -> RichConsoleInterface:
         table.add_row(
             str(p.id),
             p.name,
-            p.project_dir,
             str(p_dataset_list),
             read_only_icon,
         )
@@ -144,7 +142,6 @@ async def project_edit(
     client: AuthClient,
     project_id: int,
     new_name: Optional[str] = None,
-    new_project_dir: Optional[str] = None,
     make_read_only: bool = False,
     remove_read_only: bool = False,
     **kwargs,
@@ -152,8 +149,6 @@ async def project_edit(
     update = {}
     if new_name:
         update["name"] = new_name
-    if new_project_dir:
-        update["project_dir"] = new_project_dir
     if make_read_only:
         update["read_only"] = True
     if remove_read_only:
diff --git a/fractal/cmd/_user.py b/fractal/cmd/_user.py
index 69552e369..f8c875ca8 100644
--- a/fractal/cmd/_user.py
+++ b/fractal/cmd/_user.py
@@ -16,6 +16,7 @@ async def user_register(
     new_email: str,
     new_password: Optional[str] = None,
     slurm_user: Optional[str] = None,
+    cache_dir: Optional[str] = None,
     superuser: bool = False,
     batch: bool = False,
     **kwargs,
@@ -27,6 +28,8 @@ async def user_register(
     )
     if slurm_user:
         user_dict["slurm_user"] = slurm_user
+    if cache_dir:
+        user_dict["cache_dir"] = cache_dir
     new_user = UserCreate(**user_dict)
 
     from getpass import getpass
@@ -86,16 +89,20 @@ async def user_edit(
     new_email: Optional[str] = None,
     new_password: Optional[str] = None,
     new_slurm_user: Optional[str] = None,
+    new_cache_dir: Optional[str] = None,
     make_superuser: bool = False,
     remove_superuser: bool = False,
     **kwargs,
 ) -> Union[RichJsonInterface, PrintInterface]:
-
-    user_update = UserUpdate(
+    user_dict = dict(
         email=new_email,
         password=new_password,
-        slurm_user=new_slurm_user,
     )
+    if new_cache_dir is not None:
+        user_dict["cache_dir"] = new_cache_dir
+    if new_slurm_user is not None:
+        user_dict["slurm_user"] = new_slurm_user
+    user_update = UserUpdate(**user_dict)
 
     if make_superuser:
         user_update.is_superuser = True
diff --git a/fractal/common b/fractal/common
index db7d5d3ce..6b78f3d71 160000
--- a/fractal/common
+++ b/fractal/common
@@ -1,1 +1,1 @@
-Subproject commit db7d5d3ce6a74c2a582e56734635154836992203
+Subproject commit 6b78f3d71c55deacba2be0c0b9fc6a7ab9feaccb
diff --git a/fractal/parser.py b/fractal/parser.py
index 3564af128..f692538c1 100644
--- a/fractal/parser.py
+++ b/fractal/parser.py
@@ -66,13 +66,6 @@
     allow_abbrev=False,
 )
 project_new_parser.add_argument("name", help="Name of new project", type=str)
-project_new_parser.add_argument(
-    "path",
-    help=(
-        "Project directory of new project. "
-        "New datasets will be written here."
-    ),
-)
 project_new_parser.add_argument(
     "-d",
     "--dataset",
@@ -138,9 +131,6 @@
 project_edit_parser.add_argument(
     "--new-name", help="New project name", type=str, required=False
 )
-project_edit_parser.add_argument(
-    "--new-project-dir", help="New project directory", type=str, required=False
-)
 project_edit_parser_read_only = (
     project_edit_parser.add_mutually_exclusive_group()
 )
@@ -720,6 +710,14 @@
 user_register_parser.add_argument(
     "new_password", help="Password for the new user"
 )
+user_register_parser.add_argument(
+    "--cache-dir",
+    help=(
+        "User's cache directory "
+        "(necessary for workflow execution when using the SLURM backend)."
+    ),
+    required=False,
+)
 user_register_parser.add_argument(
     "--slurm-user",
     help="Username to login into SLURM cluster",
@@ -760,6 +758,15 @@
 user_edit_parser.add_argument(
     "--new-password", help="New password", type=str, required=False
 )
+user_edit_parser.add_argument(
+    "--new-cache-dir",
+    help=(
+        "New user's cache directory "
+        "(necessary for workflow execution when using the SLURM backend)."
+    ),
+    type=str,
+    required=False,
+)
 user_edit_parser.add_argument(
     "--new-slurm-user", help="New SLURM username", type=str, required=False
 )
diff --git a/poetry.lock b/poetry.lock
index 8fbbfa409..5eeb1f949 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -29,14 +29,14 @@ files = [
 
 [[package]]
 name = "alembic"
-version = "1.10.1"
+version = "1.10.3"
 description = "A database migration tool for SQLAlchemy."
 category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
-    {file = "alembic-1.10.1-py3-none-any.whl", hash = "sha256:367370c74ccf4979e658c8404d8c9fac00907313dc8e9225b71eb9b2db77a3ec"},
-    {file = "alembic-1.10.1.tar.gz", hash = "sha256:afd5a30dca731aa92808c081272d05787195b42e04df687e81e8c5a950c68c7f"},
+    {file = "alembic-1.10.3-py3-none-any.whl", hash = "sha256:b2e0a6cfd3a8ce936a1168320bcbe94aefa3f4463cd773a968a55071beb3cd37"},
+    {file = "alembic-1.10.3.tar.gz", hash = "sha256:32a69b13a613aeb7e8093f242da60eff9daed13c0df02fff279c1b06c32965d2"},
 ]
 
 [package.dependencies]
@@ -456,35 +456,31 @@ toml = ["tomli"]
 
 [[package]]
 name = "cryptography"
-version = "39.0.2"
+version = "40.0.1"
 description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
 category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
-    {file = "cryptography-39.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:2725672bb53bb92dc7b4150d233cd4b8c59615cd8288d495eaa86db00d4e5c06"},
-    {file = "cryptography-39.0.2-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:23df8ca3f24699167daf3e23e51f7ba7334d504af63a94af468f468b975b7dd7"},
-    {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:eb40fe69cfc6f5cdab9a5ebd022131ba21453cf7b8a7fd3631f45bbf52bed612"},
-    {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc0521cce2c1d541634b19f3ac661d7a64f9555135e9d8af3980965be717fd4a"},
-    {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffd394c7896ed7821a6d13b24657c6a34b6e2650bd84ae063cf11ccffa4f1a97"},
-    {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:e8a0772016feeb106efd28d4a328e77dc2edae84dfbac06061319fdb669ff828"},
-    {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:8f35c17bd4faed2bc7797d2a66cbb4f986242ce2e30340ab832e5d99ae60e011"},
-    {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b49a88ff802e1993b7f749b1eeb31134f03c8d5c956e3c125c75558955cda536"},
-    {file = "cryptography-39.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5f8c682e736513db7d04349b4f6693690170f95aac449c56f97415c6980edef5"},
-    {file = "cryptography-39.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:d7d84a512a59f4412ca8549b01f94be4161c94efc598bf09d027d67826beddc0"},
-    {file = "cryptography-39.0.2-cp36-abi3-win32.whl", hash = "sha256:c43ac224aabcbf83a947eeb8b17eaf1547bce3767ee2d70093b461f31729a480"},
-    {file = "cryptography-39.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:788b3921d763ee35dfdb04248d0e3de11e3ca8eb22e2e48fef880c42e1f3c8f9"},
-    {file = "cryptography-39.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d15809e0dbdad486f4ad0979753518f47980020b7a34e9fc56e8be4f60702fac"},
-    {file = "cryptography-39.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:50cadb9b2f961757e712a9737ef33d89b8190c3ea34d0fb6675e00edbe35d074"},
-    {file = "cryptography-39.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:103e8f7155f3ce2ffa0049fe60169878d47a4364b277906386f8de21c9234aa1"},
-    {file = "cryptography-39.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6236a9610c912b129610eb1a274bdc1350b5df834d124fa84729ebeaf7da42c3"},
-    {file = "cryptography-39.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e944fe07b6f229f4c1a06a7ef906a19652bdd9fd54c761b0ff87e83ae7a30354"},
-    {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:35d658536b0a4117c885728d1a7032bdc9a5974722ae298d6c533755a6ee3915"},
-    {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:30b1d1bfd00f6fc80d11300a29f1d8ab2b8d9febb6ed4a38a76880ec564fae84"},
-    {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e029b844c21116564b8b61216befabca4b500e6816fa9f0ba49527653cae2108"},
-    {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fa507318e427169ade4e9eccef39e9011cdc19534f55ca2f36ec3f388c1f70f3"},
-    {file = "cryptography-39.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8bc0008ef798231fac03fe7d26e82d601d15bd16f3afaad1c6113771566570f3"},
-    {file = "cryptography-39.0.2.tar.gz", hash = "sha256:bc5b871e977c8ee5a1bbc42fa8d19bcc08baf0c51cbf1586b0e87a2694dde42f"},
+    {file = "cryptography-40.0.1-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:918cb89086c7d98b1b86b9fdb70c712e5a9325ba6f7d7cfb509e784e0cfc6917"},
+    {file = "cryptography-40.0.1-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:9618a87212cb5200500e304e43691111570e1f10ec3f35569fdfcd17e28fd797"},
+    {file = "cryptography-40.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a4805a4ca729d65570a1b7cac84eac1e431085d40387b7d3bbaa47e39890b88"},
+    {file = "cryptography-40.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63dac2d25c47f12a7b8aa60e528bfb3c51c5a6c5a9f7c86987909c6c79765554"},
+    {file = "cryptography-40.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0a4e3406cfed6b1f6d6e87ed243363652b2586b2d917b0609ca4f97072994405"},
+    {file = "cryptography-40.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1e0af458515d5e4028aad75f3bb3fe7a31e46ad920648cd59b64d3da842e4356"},
+    {file = "cryptography-40.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d8aa3609d337ad85e4eb9bb0f8bcf6e4409bfb86e706efa9a027912169e89122"},
+    {file = "cryptography-40.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cf91e428c51ef692b82ce786583e214f58392399cf65c341bc7301d096fa3ba2"},
+    {file = "cryptography-40.0.1-cp36-abi3-win32.whl", hash = "sha256:650883cc064297ef3676b1db1b7b1df6081794c4ada96fa457253c4cc40f97db"},
+    {file = "cryptography-40.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:a805a7bce4a77d51696410005b3e85ae2839bad9aa38894afc0aa99d8e0c3160"},
+    {file = "cryptography-40.0.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd033d74067d8928ef00a6b1327c8ea0452523967ca4463666eeba65ca350d4c"},
+    {file = "cryptography-40.0.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d36bbeb99704aabefdca5aee4eba04455d7a27ceabd16f3b3ba9bdcc31da86c4"},
+    {file = "cryptography-40.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:32057d3d0ab7d4453778367ca43e99ddb711770477c4f072a51b3ca69602780a"},
+    {file = "cryptography-40.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f5d7b79fa56bc29580faafc2ff736ce05ba31feaa9d4735048b0de7d9ceb2b94"},
+    {file = "cryptography-40.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7c872413353c70e0263a9368c4993710070e70ab3e5318d85510cc91cce77e7c"},
+    {file = "cryptography-40.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:28d63d75bf7ae4045b10de5413fb1d6338616e79015999ad9cf6fc538f772d41"},
+    {file = "cryptography-40.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6f2bbd72f717ce33100e6467572abaedc61f1acb87b8d546001328d7f466b778"},
+    {file = "cryptography-40.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cc3a621076d824d75ab1e1e530e66e7e8564e357dd723f2533225d40fe35c60c"},
+    {file = "cryptography-40.0.1.tar.gz", hash = "sha256:2803f2f8b1e95f614419926c7e6f55d828afc614ca5ed61543877ae668cc3472"},
 ]
 
 [package.dependencies]
@@ -493,10 +489,10 @@ cffi = ">=1.12"
 [package.extras]
 docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"]
 docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"]
-pep8test = ["black", "check-manifest", "mypy", "ruff", "types-pytz", "types-requests"]
+pep8test = ["black", "check-manifest", "mypy", "ruff"]
 sdist = ["setuptools-rust (>=0.11.4)"]
 ssh = ["bcrypt (>=3.1.5)"]
-test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist", "pytz"]
+test = ["iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist"]
 test-randomorder = ["pytest-randomly"]
 tox = ["tox"]
 
@@ -570,14 +566,14 @@ idna = ">=2.0.0"
 
 [[package]]
 name = "exceptiongroup"
-version = "1.1.0"
+version = "1.1.1"
 description = "Backport of PEP 654 (exception groups)"
 category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
-    {file = "exceptiongroup-1.1.0-py3-none-any.whl", hash = "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e"},
-    {file = "exceptiongroup-1.1.0.tar.gz", hash = "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23"},
+    {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"},
+    {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"},
 ]
 
 [package.extras]
@@ -692,7 +688,7 @@ slurm = ["clusterfutures (>=0.5,<0.6)"]
 type = "git"
 url = "https://github.com/fractal-analytics-platform/fractal-server.git"
 reference = "main"
-resolved_reference = "87afde5198a18e725784941c9f1e50f4f509b4ff"
+resolved_reference = "8a91816e8ff07235718a38f6e5b7df3c137e65ff"
 
 [[package]]
 name = "greenlet"
@@ -828,14 +824,14 @@ socks = ["socksio (>=1.0.0,<2.0.0)"]
 
 [[package]]
 name = "httpx-oauth"
-version = "0.11.0"
+version = "0.11.2"
 description = "Async OAuth client using HTTPX"
 category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
-    {file = "httpx_oauth-0.11.0-py3-none-any.whl", hash = "sha256:c7601bd1a7a485c8579244f4a6a698d9b22efc4a02b8fb426b2af490836481d5"},
-    {file = "httpx_oauth-0.11.0.tar.gz", hash = "sha256:12ce9d58a9bc5d0d4dbba22afaf033695d79078d08eaf949d71e1db97a830cb6"},
+    {file = "httpx_oauth-0.11.2-py3-none-any.whl", hash = "sha256:11a2c79111e61a7bd70624606ad6a3013b6756ce4817dd5d5b44f70bacb45940"},
+    {file = "httpx_oauth-0.11.2.tar.gz", hash = "sha256:690e4d0a03b1974b9e600436a6d7a8c064e0707a3d86a41a12153cc797244ac6"},
 ]
 
 [package.dependencies]
@@ -867,14 +863,14 @@ files = [
 
 [[package]]
 name = "importlib-metadata"
-version = "6.0.0"
+version = "6.1.0"
 description = "Read metadata from Python packages"
 category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
-    {file = "importlib_metadata-6.0.0-py3-none-any.whl", hash = "sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad"},
-    {file = "importlib_metadata-6.0.0.tar.gz", hash = "sha256:e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d"},
+    {file = "importlib_metadata-6.1.0-py3-none-any.whl", hash = "sha256:ff80f3b5394912eb1b108fcfd444dc78b7f1f3e16b16188054bd01cb9cb86f09"},
+    {file = "importlib_metadata-6.1.0.tar.gz", hash = "sha256:43ce9281e097583d758c2c708c4376371261a02c34682491a8e98352365aad20"},
 ]
 
 [package.dependencies]
@@ -1181,48 +1177,48 @@ files = [
 
 [[package]]
 name = "pydantic"
-version = "1.10.5"
+version = "1.10.7"
 description = "Data validation and settings management using python type hints"
 category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
-    {file = "pydantic-1.10.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5920824fe1e21cbb3e38cf0f3dd24857c8959801d1031ce1fac1d50857a03bfb"},
-    {file = "pydantic-1.10.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3bb99cf9655b377db1a9e47fa4479e3330ea96f4123c6c8200e482704bf1eda2"},
-    {file = "pydantic-1.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2185a3b3d98ab4506a3f6707569802d2d92c3a7ba3a9a35683a7709ea6c2aaa2"},
-    {file = "pydantic-1.10.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f582cac9d11c227c652d3ce8ee223d94eb06f4228b52a8adaafa9fa62e73d5c9"},
-    {file = "pydantic-1.10.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c9e5b778b6842f135902e2d82624008c6a79710207e28e86966cd136c621bfee"},
-    {file = "pydantic-1.10.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:72ef3783be8cbdef6bca034606a5de3862be6b72415dc5cb1fb8ddbac110049a"},
-    {file = "pydantic-1.10.5-cp310-cp310-win_amd64.whl", hash = "sha256:45edea10b75d3da43cfda12f3792833a3fa70b6eee4db1ed6aed528cef17c74e"},
-    {file = "pydantic-1.10.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:63200cd8af1af2c07964546b7bc8f217e8bda9d0a2ef0ee0c797b36353914984"},
-    {file = "pydantic-1.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:305d0376c516b0dfa1dbefeae8c21042b57b496892d721905a6ec6b79494a66d"},
-    {file = "pydantic-1.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fd326aff5d6c36f05735c7c9b3d5b0e933b4ca52ad0b6e4b38038d82703d35b"},
-    {file = "pydantic-1.10.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bb0452d7b8516178c969d305d9630a3c9b8cf16fcf4713261c9ebd465af0d73"},
-    {file = "pydantic-1.10.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9a9d9155e2a9f38b2eb9374c88f02fd4d6851ae17b65ee786a87d032f87008f8"},
-    {file = "pydantic-1.10.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f836444b4c5ece128b23ec36a446c9ab7f9b0f7981d0d27e13a7c366ee163f8a"},
-    {file = "pydantic-1.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:8481dca324e1c7b715ce091a698b181054d22072e848b6fc7895cd86f79b4449"},
-    {file = "pydantic-1.10.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:87f831e81ea0589cd18257f84386bf30154c5f4bed373b7b75e5cb0b5d53ea87"},
-    {file = "pydantic-1.10.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ce1612e98c6326f10888df951a26ec1a577d8df49ddcaea87773bfbe23ba5cc"},
-    {file = "pydantic-1.10.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58e41dd1e977531ac6073b11baac8c013f3cd8706a01d3dc74e86955be8b2c0c"},
-    {file = "pydantic-1.10.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6a4b0aab29061262065bbdede617ef99cc5914d1bf0ddc8bcd8e3d7928d85bd6"},
-    {file = "pydantic-1.10.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:36e44a4de37b8aecffa81c081dbfe42c4d2bf9f6dff34d03dce157ec65eb0f15"},
-    {file = "pydantic-1.10.5-cp37-cp37m-win_amd64.whl", hash = "sha256:261f357f0aecda005934e413dfd7aa4077004a174dafe414a8325e6098a8e419"},
-    {file = "pydantic-1.10.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b429f7c457aebb7fbe7cd69c418d1cd7c6fdc4d3c8697f45af78b8d5a7955760"},
-    {file = "pydantic-1.10.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:663d2dd78596c5fa3eb996bc3f34b8c2a592648ad10008f98d1348be7ae212fb"},
-    {file = "pydantic-1.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51782fd81f09edcf265823c3bf43ff36d00db246eca39ee765ef58dc8421a642"},
-    {file = "pydantic-1.10.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c428c0f64a86661fb4873495c4fac430ec7a7cef2b8c1c28f3d1a7277f9ea5ab"},
-    {file = "pydantic-1.10.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:76c930ad0746c70f0368c4596020b736ab65b473c1f9b3872310a835d852eb19"},
-    {file = "pydantic-1.10.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3257bd714de9db2102b742570a56bf7978e90441193acac109b1f500290f5718"},
-    {file = "pydantic-1.10.5-cp38-cp38-win_amd64.whl", hash = "sha256:f5bee6c523d13944a1fdc6f0525bc86dbbd94372f17b83fa6331aabacc8fd08e"},
-    {file = "pydantic-1.10.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:532e97c35719f137ee5405bd3eeddc5c06eb91a032bc755a44e34a712420daf3"},
-    {file = "pydantic-1.10.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ca9075ab3de9e48b75fa8ccb897c34ccc1519177ad8841d99f7fd74cf43be5bf"},
-    {file = "pydantic-1.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd46a0e6296346c477e59a954da57beaf9c538da37b9df482e50f836e4a7d4bb"},
-    {file = "pydantic-1.10.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3353072625ea2a9a6c81ad01b91e5c07fa70deb06368c71307529abf70d23325"},
-    {file = "pydantic-1.10.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3f9d9b2be177c3cb6027cd67fbf323586417868c06c3c85d0d101703136e6b31"},
-    {file = "pydantic-1.10.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b473d00ccd5c2061fd896ac127b7755baad233f8d996ea288af14ae09f8e0d1e"},
-    {file = "pydantic-1.10.5-cp39-cp39-win_amd64.whl", hash = "sha256:5f3bc8f103b56a8c88021d481410874b1f13edf6e838da607dcb57ecff9b4594"},
-    {file = "pydantic-1.10.5-py3-none-any.whl", hash = "sha256:7c5b94d598c90f2f46b3a983ffb46ab806a67099d118ae0da7ef21a2a4033b28"},
-    {file = "pydantic-1.10.5.tar.gz", hash = "sha256:9e337ac83686645a46db0e825acceea8e02fca4062483f40e9ae178e8bd1103a"},
+    {file = "pydantic-1.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e79e999e539872e903767c417c897e729e015872040e56b96e67968c3b918b2d"},
+    {file = "pydantic-1.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:01aea3a42c13f2602b7ecbbea484a98169fb568ebd9e247593ea05f01b884b2e"},
+    {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:516f1ed9bc2406a0467dd777afc636c7091d71f214d5e413d64fef45174cfc7a"},
+    {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae150a63564929c675d7f2303008d88426a0add46efd76c3fc797cd71cb1b46f"},
+    {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ecbbc51391248116c0a055899e6c3e7ffbb11fb5e2a4cd6f2d0b93272118a209"},
+    {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f4a2b50e2b03d5776e7f21af73e2070e1b5c0d0df255a827e7c632962f8315af"},
+    {file = "pydantic-1.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:a7cd2251439988b413cb0a985c4ed82b6c6aac382dbaff53ae03c4b23a70e80a"},
+    {file = "pydantic-1.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:68792151e174a4aa9e9fc1b4e653e65a354a2fa0fed169f7b3d09902ad2cb6f1"},
+    {file = "pydantic-1.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe2507b8ef209da71b6fb5f4e597b50c5a34b78d7e857c4f8f3115effaef5fe"},
+    {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a86d8c8db68086f1e30a530f7d5f83eb0685e632e411dbbcf2d5c0150e8dcd"},
+    {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75ae19d2a3dbb146b6f324031c24f8a3f52ff5d6a9f22f0683694b3afcb16fb"},
+    {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:464855a7ff7f2cc2cf537ecc421291b9132aa9c79aef44e917ad711b4a93163b"},
+    {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:193924c563fae6ddcb71d3f06fa153866423ac1b793a47936656e806b64e24ca"},
+    {file = "pydantic-1.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:b4a849d10f211389502059c33332e91327bc154acc1845f375a99eca3afa802d"},
+    {file = "pydantic-1.10.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cc1dde4e50a5fc1336ee0581c1612215bc64ed6d28d2c7c6f25d2fe3e7c3e918"},
+    {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0cfe895a504c060e5d36b287ee696e2fdad02d89e0d895f83037245218a87fe"},
+    {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:670bb4683ad1e48b0ecb06f0cfe2178dcf74ff27921cdf1606e527d2617a81ee"},
+    {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:950ce33857841f9a337ce07ddf46bc84e1c4946d2a3bba18f8280297157a3fd1"},
+    {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c15582f9055fbc1bfe50266a19771bbbef33dd28c45e78afbe1996fd70966c2a"},
+    {file = "pydantic-1.10.7-cp37-cp37m-win_amd64.whl", hash = "sha256:82dffb306dd20bd5268fd6379bc4bfe75242a9c2b79fec58e1041fbbdb1f7914"},
+    {file = "pydantic-1.10.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c7f51861d73e8b9ddcb9916ae7ac39fb52761d9ea0df41128e81e2ba42886cd"},
+    {file = "pydantic-1.10.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6434b49c0b03a51021ade5c4daa7d70c98f7a79e95b551201fff682fc1661245"},
+    {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d34ab766fa056df49013bb6e79921a0265204c071984e75a09cbceacbbdd5d"},
+    {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:701daea9ffe9d26f97b52f1d157e0d4121644f0fcf80b443248434958fd03dc3"},
+    {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf135c46099ff3f919d2150a948ce94b9ce545598ef2c6c7bf55dca98a304b52"},
+    {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0f85904f73161817b80781cc150f8b906d521fa11e3cdabae19a581c3606209"},
+    {file = "pydantic-1.10.7-cp38-cp38-win_amd64.whl", hash = "sha256:9f6f0fd68d73257ad6685419478c5aece46432f4bdd8d32c7345f1986496171e"},
+    {file = "pydantic-1.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c230c0d8a322276d6e7b88c3f7ce885f9ed16e0910354510e0bae84d54991143"},
+    {file = "pydantic-1.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:976cae77ba6a49d80f461fd8bba183ff7ba79f44aa5cfa82f1346b5626542f8e"},
+    {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d45fc99d64af9aaf7e308054a0067fdcd87ffe974f2442312372dfa66e1001d"},
+    {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2a5ebb48958754d386195fe9e9c5106f11275867051bf017a8059410e9abf1f"},
+    {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:abfb7d4a7cd5cc4e1d1887c43503a7c5dd608eadf8bc615413fc498d3e4645cd"},
+    {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:80b1fab4deb08a8292d15e43a6edccdffa5377a36a4597bb545b93e79c5ff0a5"},
+    {file = "pydantic-1.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:d71e69699498b020ea198468e2480a2f1e7433e32a3a99760058c6520e2bea7e"},
+    {file = "pydantic-1.10.7-py3-none-any.whl", hash = "sha256:0cd181f1d0b1d00e2b705f1bf1ac7799a2d938cce3376b8007df62b29be3c2c6"},
+    {file = "pydantic-1.10.7.tar.gz", hash = "sha256:cfc83c0678b6ba51b0532bea66860617c4cd4251ecf76e9846fa5a9f3454e97e"},
 ]
 
 [package.dependencies]
@@ -1312,14 +1308,14 @@ testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy
 
 [[package]]
 name = "pytest-pretty"
-version = "1.1.0"
+version = "1.2.0"
 description = "pytest plugin for printing summary data as I want it"
 category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
-    {file = "pytest_pretty-1.1.0-py3-none-any.whl", hash = "sha256:e7e63e0437694e5a7c557d99c81d6e29e0dcaab3b6b9dcb3ba23ddf3eebb5b42"},
-    {file = "pytest_pretty-1.1.0.tar.gz", hash = "sha256:425e116c1ed10ce67eeb688f22d1bcb91ca58a97986026bf42c0717da80740b3"},
+    {file = "pytest_pretty-1.2.0-py3-none-any.whl", hash = "sha256:6f79122bf53864ae2951b6c9e94d7a06a87ef753476acd4588aeac018f062036"},
+    {file = "pytest_pretty-1.2.0.tar.gz", hash = "sha256:105a355f128e392860ad2c478ae173ff96d2f03044692f9818ff3d49205d3a60"},
 ]
 
 [package.dependencies]
@@ -1467,14 +1463,14 @@ jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"]
 
 [[package]]
 name = "setuptools"
-version = "67.5.1"
+version = "67.6.1"
 description = "Easily download, build, install, upgrade, and uninstall Python packages"
 category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
-    {file = "setuptools-67.5.1-py3-none-any.whl", hash = "sha256:1c39d42bda4cb89f7fdcad52b6762e3c309ec8f8715b27c684176b7d71283242"},
-    {file = "setuptools-67.5.1.tar.gz", hash = "sha256:15136a251127da2d2e77ac7a1bc231eb504654f7e3346d93613a13f2e2787535"},
+    {file = "setuptools-67.6.1-py3-none-any.whl", hash = "sha256:e728ca814a823bf7bf60162daf9db95b93d532948c4c0bea762ce62f60189078"},
+    {file = "setuptools-67.6.1.tar.gz", hash = "sha256:257de92a9d50a60b8e22abfcbb771571fde0dbf3ec234463212027a4eeecbe9a"},
 ]
 
 [package.extras]
@@ -1642,18 +1638,18 @@ test = ["html5lib", "pytest"]
 
 [[package]]
 name = "sphinxcontrib-jquery"
-version = "2.0.0"
+version = "4.1"
 description = "Extension to include jQuery on newer Sphinx releases"
 category = "dev"
 optional = false
 python-versions = ">=2.7"
 files = [
-    {file = "sphinxcontrib-jquery-2.0.0.tar.gz", hash = "sha256:8fb65f6dba84bf7bcd1aea1f02ab3955ac34611d838bcc95d4983b805b234daa"},
-    {file = "sphinxcontrib_jquery-2.0.0-py3-none-any.whl", hash = "sha256:ed47fa425c338ffebe3c37e1cdb56e30eb806116b85f01055b158c7057fdb995"},
+    {file = "sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a"},
+    {file = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae"},
 ]
 
 [package.dependencies]
-setuptools = "*"
+Sphinx = ">=1.8"
 
 [[package]]
 name = "sphinxcontrib-jsmath"
@@ -1803,14 +1799,14 @@ url = ["furl (>=0.4.1)"]
 
 [[package]]
 name = "sqlalchemy2-stubs"
-version = "0.0.2a32"
+version = "0.0.2a33"
 description = "Typing Stubs for SQLAlchemy 1.4"
 category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
-    {file = "sqlalchemy2-stubs-0.0.2a32.tar.gz", hash = "sha256:2a2cfab71d35ac63bf21ad841d8610cd93a3bd4c6562848c538fa975585c2739"},
-    {file = "sqlalchemy2_stubs-0.0.2a32-py3-none-any.whl", hash = "sha256:7f5fb30b0cf7c6b74c50c1d94df77ff32007afee8d80499752eb3fedffdbdfb8"},
+    {file = "sqlalchemy2-stubs-0.0.2a33.tar.gz", hash = "sha256:5a35a096964dfd985651662b7f175fe1ddcbf5ed4f2d0203e637cec38bed64b4"},
+    {file = "sqlalchemy2_stubs-0.0.2a33-py3-none-any.whl", hash = "sha256:9809e7d8ea72cd92ac35aca4b43f588ae24b20376c55a0ef0112a08a6b537180"},
 ]
 
 [package.dependencies]
@@ -1890,14 +1886,14 @@ files = [
 
 [[package]]
 name = "urllib3"
-version = "1.26.14"
+version = "1.26.15"
 description = "HTTP library with thread-safe connection pooling, file post, and more."
 category = "dev"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
 files = [
-    {file = "urllib3-1.26.14-py2.py3-none-any.whl", hash = "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1"},
-    {file = "urllib3-1.26.14.tar.gz", hash = "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72"},
+    {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"},
+    {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"},
 ]
 
 [package.extras]


Test patch:
diff --git a/tests/fixtures_testserver.py b/tests/fixtures_testserver.py
index d7c71f007..dc12caefb 100644
--- a/tests/fixtures_testserver.py
+++ b/tests/fixtures_testserver.py
@@ -116,7 +116,7 @@ async def project_factory(db):
     from fractal_server.app.models.project import Project
 
     async def _project_factory(user_id=None, **project_args_override):
-        project_args = dict(name="name", project_dir="project/dir")
+        project_args = dict(name="name")
         project_args.update(project_args_override)
         p = Project(**project_args)
         if user_id:
diff --git a/tests/test_dataset.py b/tests/test_dataset.py
index d53747bcb..ed6e7fb62 100644
--- a/tests/test_dataset.py
+++ b/tests/test_dataset.py
@@ -3,11 +3,10 @@
 import pytest
 
 
-async def test_add_resource(register_user, invoke, tmp_path):
+async def test_add_resource(register_user, invoke):
 
     # Create a project with its default dataset
-    project_dir = str(tmp_path)
-    res = await invoke(f"project new prj0 {project_dir}")
+    res = await invoke("project new prj0")
     project_id = res.data["id"]
     dataset_id = res.data["dataset_list"][0]["id"]
     assert res.data["dataset_list"][0]["resource_list"] == []
@@ -23,9 +22,8 @@ async def test_add_resource(register_user, invoke, tmp_path):
     assert res.data["dataset_id"] == dataset_id
 
 
-async def test_add_resource_relative_path(register_user, invoke, tmp_path):
-    project_dir = str(tmp_path)
-    res = await invoke(f"project new prj0 {project_dir}")
+async def test_add_resource_relative_path(register_user, invoke):
+    res = await invoke("project new prj0")
     project_id = res.data["id"]
     dataset_id = res.data["dataset_list"][0]["id"]
     assert res.data["dataset_list"][0]["resource_list"] == []
@@ -44,8 +42,7 @@ async def test_add_resource_relative_path(register_user, invoke, tmp_path):
 
 
 async def test_edit_dataset(register_user, invoke, tmp_path):
-    project_dir = str(tmp_path)
-    res = await invoke(f"project new prj0 {project_dir}")
+    res = await invoke("project new prj0")
     project_id = res.data["id"]
     dataset_id = res.data["dataset_list"][0]["id"]
 
@@ -106,10 +103,9 @@ async def test_edit_dataset(register_user, invoke, tmp_path):
         )
 
 
-async def test_delete_dataset(register_user, invoke, tmp_path):
+async def test_delete_dataset(register_user, invoke):
     # Create a project with its default dataset
-    project_dir = str(tmp_path)
-    res = await invoke(f"project new prj0 {project_dir}")
+    res = await invoke("project new prj0")
     project_id = res.data["id"]
     dataset_id = res.data["dataset_list"][0]["id"]
 
@@ -121,10 +117,9 @@ async def test_delete_dataset(register_user, invoke, tmp_path):
         res = await invoke(f"dataset show {project_id} {dataset_id}")
 
 
-async def test_show_dataset(register_user, invoke, tmp_path):
+async def test_show_dataset(register_user, invoke):
     # Create a project with its default dataset
-    project_dir = str(tmp_path)
-    res = await invoke(f"project new prj0 {project_dir}")
+    res = await invoke("project new prj0")
     project_id = res.data["id"]
     dataset_id = res.data["dataset_list"][0]["id"]
 
@@ -133,10 +128,9 @@ async def test_show_dataset(register_user, invoke, tmp_path):
     assert res.retcode == 0
 
 
-async def test_delete_resource(register_user, invoke, tmp_path):
+async def test_delete_resource(register_user, invoke):
     # Create a project with its default dataset
-    project_dir = str(tmp_path)
-    res = await invoke(f"project new prj0 {project_dir}")
+    res = await invoke("project new prj0")
     project_id = res.data["id"]
     dataset_id = res.data["dataset_list"][0]["id"]
     assert res.data["dataset_list"][0]["resource_list"] == []
diff --git a/tests/test_job.py b/tests/test_job.py
index 346defc6e..69c253b22 100644
--- a/tests/test_job.py
+++ b/tests/test_job.py
@@ -82,8 +82,7 @@ async def test_job_list(
     """
 
     # Create mock Project/Workflow/ApplyWorkflow objects
-    project_dir = str(tmp_path)
-    res = await invoke(f"project new prj0 {project_dir}")
+    res = await invoke("project new prj0")
     project_id = res.data["id"]
     wf_1 = await workflow_factory(project_id=project_id)
     wf_2 = await workflow_factory(project_id=project_id)
@@ -135,8 +134,7 @@ async def test_job_download_logs(
     """
 
     # Create mock Workflow/ApplyWorkflow objects
-    project_dir = str(tmp_path)
-    res = await invoke(f"project new prj0 {project_dir}")
+    res = await invoke("project new prj0")
     project_id = res.data["id"]
     wf = await workflow_factory(project_id=project_id)
     wd = tmp_path / f"workflow_{wf.id}"
diff --git a/tests/test_project.py b/tests/test_project.py
index 746d43ba8..e7c2b1640 100644
--- a/tests/test_project.py
+++ b/tests/test_project.py
@@ -2,20 +2,17 @@
 from devtools import debug
 
 
-async def test_project_create(register_user, invoke, tmp_path):
+async def test_project_create(register_user, invoke):
     PROJECT_NAME = "project_name"
-    PROJECT_PATH = str(tmp_path)
-    res = await invoke(f"project new {PROJECT_NAME} {PROJECT_PATH}")
+    res = await invoke(f"project new {PROJECT_NAME}")
     debug(res)
     assert res.data["name"] == PROJECT_NAME
-    assert res.data["project_dir"] == PROJECT_PATH
 
 
-async def test_project_delete(register_user, invoke, tmp_path):
+async def test_project_delete(register_user, invoke):
 
     # Create project
-    project_dir = str(tmp_path)
-    res = await invoke(f"project new MyProj1 {project_dir}")
+    res = await invoke("project new MyProj1")
     res.show()
     project_id_1 = res.data["id"]
 
@@ -32,9 +29,8 @@ async def test_project_delete(register_user, invoke, tmp_path):
         res = await invoke(f"project show {project_id_1}")
 
 
-async def test_project_create_batch(register_user, invoke, tmp_path):
-    project_dir = str(tmp_path)
-    res = await invoke(f"--batch project new MyProj1 {project_dir}")
+async def test_project_create_batch(register_user, invoke):
+    res = await invoke("--batch project new MyProj1")
     debug(res)
     debug(res.data)
     project_id, dataset_id = map(int, res.data.split())
@@ -42,7 +38,7 @@ async def test_project_create_batch(register_user, invoke, tmp_path):
     assert dataset_id == 1
 
 
-async def test_project_list(register_user, invoke, tmp_path):
+async def test_project_list(register_user, invoke):
     res = await invoke("project list")
     debug(res)
     debug(vars(res.data))
@@ -50,9 +46,8 @@ async def test_project_list(register_user, invoke, tmp_path):
 
     res.show()
 
-    project_dir = str(tmp_path)
-    res = await invoke(f"--batch project new proj0 {project_dir}")
-    res = await invoke(f"--batch project new proj1 {project_dir}")
+    res = await invoke("--batch project new proj0")
+    res = await invoke("--batch project new proj1")
 
     res = await invoke("project list")
     debug(res)
@@ -61,11 +56,10 @@ async def test_project_list(register_user, invoke, tmp_path):
     assert len(res.data.rows) == 2
 
 
-async def test_add_dataset(register_user, invoke, tmp_path):
+async def test_add_dataset(register_user, invoke):
     DATASET_NAME = "new_ds_name"
 
-    project_dir = str(tmp_path)
-    res = await invoke(f"--batch project new proj0 {project_dir}")
+    res = await invoke("--batch project new proj0")
     assert res.retcode == 0
     debug(res.data)
     project_id, dataset_id = map(int, res.data.split())
@@ -77,27 +71,22 @@ async def test_add_dataset(register_user, invoke, tmp_path):
 
 
 @pytest.mark.parametrize("new_name", ["new_name", None])
-@pytest.mark.parametrize("new_project_dir", ["/tmp", None])
 @pytest.mark.parametrize("read_only", [True, False, None])
 async def test_edit_project(
     register_user,
     invoke,
     new_name,
-    new_project_dir,
     read_only,
     tmp_path,
 ):
     name = "name"
-    project_dir = str(tmp_path)
-    res = await invoke(f"project new {name} {project_dir}")
+    res = await invoke(f"project new {name}")
     project = res.data
     project_id = project["id"]
 
     cmd = f"project edit {project_id}"
     if new_name:
         cmd += f" --new-name {new_name}"
-    if new_project_dir:
-        cmd += f" --new-project-dir {new_project_dir}"
     if read_only is True:
         cmd += " --make-read-only"
     elif read_only is False:
@@ -106,7 +95,7 @@ async def test_edit_project(
     res = await invoke(cmd)
     debug(res)
 
-    if (not new_name) and (not new_project_dir) and (read_only is None):
+    if (not new_name) and (read_only is None):
         assert res.retcode == 1
     else:
         assert res.retcode == 0
@@ -115,10 +104,6 @@ async def test_edit_project(
             assert new_project["name"] == new_name
         else:
             assert new_project["name"] == name
-        if new_project_dir:
-            assert new_project["project_dir"] == new_project_dir
-        else:
-            assert new_project["project_dir"] == project_dir
         if read_only is True:
             assert new_project["read_only"] is True
         if read_only is False:
diff --git a/tests/test_user.py b/tests/test_user.py
index f3a829e12..fc9c998cf 100644
--- a/tests/test_user.py
+++ b/tests/test_user.py
@@ -2,7 +2,7 @@
 
 import pytest
 from devtools import debug
-
+from pydantic.error_wrappers import ValidationError
 
 EMAIL_USER = "test@testmail.com"
 PWD_USER = "testpassword"
@@ -26,7 +26,8 @@ async def test_register_as_superuser(invoke_as_superuser, is_superuser: bool):
         assert res.data["is_superuser"]
     else:
         res = await invoke_as_superuser(
-            f"user register {EMAIL_USER} {PWD_USER} --slurm-user SOMETHING"
+            f"user register {EMAIL_USER} {PWD_USER} "
+            "--slurm-user SOMETHING --cache-dir /absolute"
         )
         debug(res.data)
         assert res.retcode == 0
@@ -111,12 +112,14 @@ async def test_edit_as_superuser(invoke_as_superuser, new_is_superuser):
     user_id = res.data["id"]
     # Call fractal user edit
     NEW_EMAIL = "asd@asd.new"
+    NEW_CACHE_DIR = "/tmp/xxx"
     NEW_SLURM_USER = "new_slurm"
     cmd = (
         f"user edit {user_id} "
         f"--new-email {NEW_EMAIL} "
         f"--new-password SOMETHING "
         f"--new-slurm-user {NEW_SLURM_USER} "
+        f"--new-cache-dir {NEW_CACHE_DIR}"
     )
     if new_is_superuser:
         cmd = f"{cmd} --make-superuser"
@@ -125,9 +128,15 @@ async def test_edit_as_superuser(invoke_as_superuser, new_is_superuser):
     debug(res.data)
     assert res.retcode == 0
     assert res.data["email"] == NEW_EMAIL
+    assert res.data["cache_dir"] == NEW_CACHE_DIR
     assert res.data["slurm_user"] == NEW_SLURM_USER
     assert res.data["is_superuser"] == new_is_superuser
 
+    BAD_CACHE_DIR = "not_absolute"
+    with pytest.raises(ValidationError):
+        cmd = f"user edit {user_id} --new-cache-dir {BAD_CACHE_DIR}"
+        await invoke_as_superuser(cmd)
+
     # If the user was made a superuser, check that we can go back to normal
     # user
     if new_is_superuser:
diff --git a/tests/test_workflow.py b/tests/test_workflow.py
index 5a1d84876..91c51d3ec 100644
--- a/tests/test_workflow.py
+++ b/tests/test_workflow.py
@@ -10,13 +10,11 @@
 TIMEOUT = 15.0
 
 
-async def test_workflow_new(register_user, invoke, tmp_path):
+async def test_workflow_new(register_user, invoke):
     PROJECT_NAME = "project_name"
-    PROJECT_PATH = str(tmp_path)
     WORKFLOW_NAME = "mywf"
-    res_pj = await invoke(f"project new {PROJECT_NAME} {PROJECT_PATH}")
+    res_pj = await invoke(f"project new {PROJECT_NAME}")
     assert res_pj.data["name"] == PROJECT_NAME
-    assert res_pj.data["project_dir"] == PROJECT_PATH
 
     res_wf = await invoke(f"workflow new {WORKFLOW_NAME} {res_pj.data['id']}")
     res_wf.show()
@@ -25,10 +23,9 @@ async def test_workflow_new(register_user, invoke, tmp_path):
     assert res_wf.data["project_id"] == res_pj.data["id"]
 
 
-async def test_workflow_delete(register_user, invoke, tmp_path):
+async def test_workflow_delete(register_user, invoke):
     # Create project
-    project_dir = str(tmp_path)
-    res_pj = await invoke(f"project new project_name {project_dir}")
+    res_pj = await invoke("project new project_name")
     assert res_pj.retcode == 0
     project_id = res_pj.data["id"]
 
@@ -54,10 +51,9 @@ async def test_workflow_delete(register_user, invoke, tmp_path):
     assert len(res_list.data) == 0
 
 
-async def test_workflow_edit(register_user, invoke, tmp_path):
+async def test_workflow_edit(register_user, invoke):
     # Create a project
-    project_dir = str(tmp_path)
-    res_pj = await invoke(f"project new project_name_1 {project_dir}")
+    res_pj = await invoke("project new project_name_1")
     assert res_pj.retcode == 0
     project_id = res_pj.data["id"]
 
@@ -81,10 +77,9 @@ async def test_workflow_edit(register_user, invoke, tmp_path):
     assert res.data["name"] == NAME
 
 
-async def test_workflow_list(register_user, invoke, tmp_path):
+async def test_workflow_list(register_user, invoke):
     PROJECT_NAME = "project_name"
-    PROJECT_PATH = str(tmp_path)
-    res_pj = await invoke(f"project new {PROJECT_NAME} {PROJECT_PATH}")
+    res_pj = await invoke(f"project new {PROJECT_NAME}")
     project_id = res_pj.data["id"]
     debug(project_id)
 
@@ -103,12 +98,9 @@ async def test_workflow_list(register_user, invoke, tmp_path):
     assert len(res_list.data) == 2
 
 
-async def test_workflow_list_when_two_projects_exist(
-    register_user, invoke, tmp_path: Path
-):
-    project_dir = str(tmp_path)
-    res_pj1 = await invoke(f"project new PRJ1 {project_dir}")
-    res_pj2 = await invoke(f"project new PRJ2 {project_dir}")
+async def test_workflow_list_when_two_projects_exist(register_user, invoke):
+    res_pj1 = await invoke("project new PRJ1")
+    res_pj2 = await invoke("project new PRJ2")
     project_id_1 = res_pj1.data["id"]
     project_id_2 = res_pj2.data["id"]
 
@@ -379,8 +371,7 @@ async def test_workflow_apply(
         await asyncio.sleep(1)
         assert time.perf_counter() - starting_time < TIMEOUT
 
-    project_dir = str(tmp_path)
-    res = await invoke(f"project new testproject {project_dir}")
+    res = await invoke("project new testproject")
     debug(res)
     assert res.retcode == 0
 
@@ -529,8 +520,7 @@ async def test_workflow_import(
 
     # create project
     PROJECT_NAME = "project_name"
-    PROJECT_PATH = str(tmp_path)
-    res_pj = await invoke(f"project new {PROJECT_NAME} {PROJECT_PATH}")
+    res_pj = await invoke(f"project new {PROJECT_NAME}")
     assert res_pj.retcode == 0
     project_id = res_pj.data["id"]