From d15e7ec0b2b97bb08a471b9d944eedbaf62206ac Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C3=ABl=20Bitard?= <bitard.michael@gmail.com>
Date: Tue, 10 May 2022 17:08:51 +0200
Subject: [PATCH] =?UTF-8?q?refactor(tests):=20lance=20les=20tests=20d'inte?=
 =?UTF-8?q?gration=20en=20parall=C3=A8le=20des=20tests=20unitaires=20(#55)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .github/workflows/api-ci.yml                  |  89 +++++-----
 .github/workflows/common.yml                  |   6 +-
 .github/workflows/ui-ci.yml                   |   6 +-
 .gitignore                                    |   1 +
 Dockerfile.api                                |  12 +-
 package-lock.json                             | 117 +------------
 packages/api/jest.config.integration.ts       |   7 +
 packages/api/jest.config.ts                   | 158 +-----------------
 packages/api/package.json                     |  12 +-
 .../administration.test.integration.ts}       |   4 +-
 ...permissions-demarches.test.integration.ts} |   4 +-
 ...ns-permissions-etapes.test.integration.ts} |  15 +-
 ...ns-permissions-titres.test.integration.ts} |   4 +-
 .../graphql/documents.test.integration.ts}    |  18 +-
 .../graphql/entreprises.test.integration.ts}  |  32 ++--
 .../api/graphql/metas.test.integration.ts}    |   4 +-
 .../resolvers/_titre-etape-email.test.ts      |  10 +-
 .../graphql/resolvers/_titre-etape-email.ts   |  11 +-
 .../titres-demarches.test.integration.ts}     |  10 +-
 .../titres-etapes-creer.test.integration.ts}  |  28 ++--
 ...itres-etapes-modifier.test.integration.ts} |  24 +--
 .../api/graphql/titres.test.integration.ts}   |  16 +-
 .../api/graphql/token.test.integration.ts}    |  20 ++-
 .../graphql/utilisateurs.test.integration.ts} |  17 +-
 ...s.snap => titres.test.integration.ts.snap} |   0
 ...res.test.ts => titres.test.integration.ts} |   3 +-
 .../api/rest/upload.test.integration.ts}      |   4 +-
 ...nistrations-gestionnaires-update-titres.ts |   8 +-
 ...s-administrations-locales-update-etapes.ts |   2 +-
 .../processes/entreprises-update.test.ts      |  10 +-
 .../titres-activites-props-update.test.ts     |   8 +-
 .../titres-activites-relance-send.test.ts     |   6 +-
 ...titres-activites-statut-ids-update.test.ts |   4 +-
 .../processes/titres-activites-update.test.ts |  16 +-
 ...ministrations-gestionnaires-update.test.ts |  12 +-
 .../titres-contenus-etapes-ids-update.test.ts |   9 +-
 .../titres-coordonnees-update.test.ts         |   5 +-
 .../processes/titres-dates-update.test.ts     |  10 +-
 .../titres-demarches-depot-create.test.ts     |   3 +-
 .../titres-demarches-ordre-update.test.ts     |   4 +-
 .../titres-demarches-public-update.test.ts    |   4 +-
 ...titres-demarches-statut-ids-update.test.ts |   4 +-
 ...pes-administrations-locales-update.test.ts |  10 +-
 .../titres-etapes-areas-update.test.ts        |  10 +-
 .../titres-etapes-ordre-update.test.ts        |   4 +-
 .../processes/titres-phases-update.test.ts    |   3 +-
 .../titres-points-references-create.test.ts   |   4 +-
 .../titres-props-etapes-ids-update.test.ts    |   5 +-
 .../processes/titres-public-update.test.ts    |   3 +-
 .../processes/titres-slugs-update.test.ts     |   6 +-
 .../titres-statut-ids-update.test.ts          |   3 +-
 .../business/rules-demarches/_utils.test.ts   |   8 +-
 .../rules/titre-activites-build.test.ts       |   3 +-
 ...-demarche-annulation-date-fin-find.test.ts |   3 +
 .../contenu-element-file-process.test.ts      |   7 +-
 .../utils/titre-activite-valide-check.test.ts |   4 +-
 .../utils/titre-coordonnees-find.test.ts      |   4 +-
 .../titre-etape-heritage-contenu-find.test.ts |   4 +-
 ...-and-relations-update.test.integration.ts} |   0
 .../business/utils/titre-valide-check.test.ts |   6 +-
 ...tre-etape-type-and-status-validate.test.ts |   3 +-
 ...ts => administrations.test.integration.ts} |   5 +-
 .../queries/permissions/administrations.ts    |   2 +-
 ....test.ts => documents.test.integration.ts} |   3 +-
 ...est.ts => entreprises.test.integration.ts} |   0
 ...etas.test.ts => metas.test.integration.ts} |  13 +-
 ...s => titres-demarches.test.integration.ts} |   0
 ...t.ts => titres-etapes.test.integration.ts} |   0
 ...res.test.ts => titres.test.integration.ts} |  11 +-
 ...st.ts => utilisateurs.test.integration.ts} |   0
 ...s => titres-activites.test.integration.ts} |   0
 ...s => titres-demarches.test.integration.ts} |   4 +-
 ...res.test.ts => titres.test.integration.ts} |   0
 packages/api/tests/_utils/index.ts            |   4 +-
 packages/api/tests/db-manager.ts              |  15 +-
 packages/api/tsconfig.json                    |   2 +-
 packages/common/.gitignore                    |   3 +-
 packages/common/package.json                  |   3 +-
 packages/ui/package.json                      |  11 +-
 79 files changed, 347 insertions(+), 556 deletions(-)
 create mode 100644 packages/api/jest.config.integration.ts
 rename packages/api/{tests/administration.test.ts => src/api/graphql/administration.test.integration.ts} (98%)
 rename packages/api/{tests/administrations-permissions-demarches.test.ts => src/api/graphql/administrations-permissions-demarches.test.integration.ts} (98%)
 rename packages/api/{tests/administrations-permissions-etapes.test.ts => src/api/graphql/administrations-permissions-etapes.test.integration.ts} (94%)
 rename packages/api/{tests/administrations-permissions-titres.test.ts => src/api/graphql/administrations-permissions-titres.test.integration.ts} (98%)
 rename packages/api/{tests/documents.test.ts => src/api/graphql/documents.test.integration.ts} (87%)
 rename packages/api/{tests/entreprises.test.ts => src/api/graphql/entreprises.test.integration.ts} (90%)
 rename packages/api/{tests/metas.test.ts => src/api/graphql/metas.test.integration.ts} (93%)
 rename packages/api/{tests/titres-demarches.test.ts => src/api/graphql/titres-demarches.test.integration.ts} (96%)
 rename packages/api/{tests/titres-etapes-creer.test.ts => src/api/graphql/titres-etapes-creer.test.integration.ts} (91%)
 rename packages/api/{tests/titres-etapes-modifier.test.ts => src/api/graphql/titres-etapes-modifier.test.integration.ts} (90%)
 rename packages/api/{tests/titres.test.ts => src/api/graphql/titres.test.integration.ts} (96%)
 rename packages/api/{tests/token.test.ts => src/api/graphql/token.test.integration.ts} (80%)
 rename packages/api/{tests/utilisateurs.test.ts => src/api/graphql/utilisateurs.test.integration.ts} (96%)
 rename packages/api/src/api/rest/__snapshots__/{titres.test.ts.snap => titres.test.integration.ts.snap} (100%)
 rename packages/api/src/api/rest/{titres.test.ts => titres.test.integration.ts} (98%)
 rename packages/api/{tests/upload.test.ts => src/api/rest/upload.test.integration.ts} (87%)
 rename packages/api/src/business/utils/{titre-slug-and-relations-update.test.ts => titre-slug-and-relations-update.test.integration.ts} (100%)
 rename packages/api/src/database/queries/permissions/{administrations.test.ts => administrations.test.integration.ts} (98%)
 rename packages/api/src/database/queries/permissions/{documents.test.ts => documents.test.integration.ts} (99%)
 rename packages/api/src/database/queries/permissions/{entreprises.test.ts => entreprises.test.integration.ts} (100%)
 rename packages/api/src/database/queries/permissions/{metas.test.ts => metas.test.integration.ts} (91%)
 rename packages/api/src/database/queries/permissions/{titres-demarches.test.ts => titres-demarches.test.integration.ts} (100%)
 rename packages/api/src/database/queries/permissions/{titres-etapes.test.ts => titres-etapes.test.integration.ts} (100%)
 rename packages/api/src/database/queries/permissions/{titres.test.ts => titres.test.integration.ts} (98%)
 rename packages/api/src/database/queries/permissions/{utilisateurs.test.ts => utilisateurs.test.integration.ts} (100%)
 rename packages/api/src/database/queries/{titres-activites.test.ts => titres-activites.test.integration.ts} (100%)
 rename packages/api/src/database/queries/{titres-demarches.test.ts => titres-demarches.test.integration.ts} (93%)
 rename packages/api/src/database/queries/{titres.test.ts => titres.test.integration.ts} (100%)

diff --git a/.github/workflows/api-ci.yml b/.github/workflows/api-ci.yml
index 55b124332..59fd80a79 100644
--- a/.github/workflows/api-ci.yml
+++ b/.github/workflows/api-ci.yml
@@ -5,25 +5,8 @@ concurrency:
   group: api-ci-${{ github.ref }}
   cancel-in-progress: true
 jobs:
-  test:
+  unit-test:
     runs-on: ubuntu-latest
-    services:
-      postgres:
-        image: postgis/postgis:12-3.2
-        env:
-          POSTGRES_USER: postgres
-          POSTGRES_PASSWORD: password
-          POSTGRES_DB: camino_tests
-          PGUSER: postgres
-          PGPASSWORD: password
-        options: >-
-          --health-cmd pg_isready
-          --health-interval 10s
-          --health-timeout 5s
-          --health-retries 5
-        ports:
-          # Maps tcp port 5432 on service container to the host
-          - 5432:5432
     steps:
       - name: Checkout
         uses: actions/checkout@v3
@@ -36,31 +19,61 @@ jobs:
         run: |
           npm set-script prepare ""
           npm ci
-          npm run ci:lint --workspace=packages/api
         env:
           CI: true
       - name: Unit tests
         run: npm run ci:test-unit --workspace=packages/api
-        env:
-          PGHOST: localhost
-          PGPORT: 5432
-          PGUSER: postgres
-          PGPASSWORD: password
-      - name: Code coverage
-        run: npm run codecov --workspace=packages/api
-        env:
-          CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
-      - name: Integration tests
-        #Installation d’une version de knex-db-manager qui seed la bdd séquentiellement
-        run: npm run ci:test-integration --workspace=packages/api
-        env:
-          PGHOST: localhost
-          PGPORT: 5432
-          PGUSER: postgres
-          PGPASSWORD: password
+      - uses: codecov/codecov-action@v2
+        with:
+          token: ${{ secrets.CODECOV_TOKEN }}
+          flags: api-unit, api
+  integration-test:
+      runs-on: ubuntu-latest
+      services:
+        postgres:
+          image: postgis/postgis:12-3.2
+          env:
+            POSTGRES_USER: postgres
+            POSTGRES_PASSWORD: password
+            POSTGRES_DB: camino_tests
+            PGUSER: postgres
+            PGPASSWORD: password
+          options: >-
+            --health-cmd pg_isready
+            --health-interval 10s
+            --health-timeout 5s
+            --health-retries 5
+          ports:
+            # Maps tcp port 5432 on service container to the host
+            - 5432:5432
+      steps:
+        - name: Checkout
+          uses: actions/checkout@v3
+        - name: Use Node.js
+          uses: actions/setup-node@v3
+          with:
+            node-version: '17.8'
+            cache: 'npm'
+        - name: Npm install
+          run: |
+            npm set-script prepare ""
+            npm ci
+          env:
+            CI: true
+        - name: Integration tests
+          run: npm run ci:test-integration --workspace=packages/api
+          env:
+            PGHOST: localhost
+            PGPORT: 5432
+            PGUSER: postgres
+            PGPASSWORD: password
+        - uses: codecov/codecov-action@v2
+          with:
+            token: ${{ secrets.CODECOV_TOKEN }}
+            flags: api-integration, api
 
   build:
-    needs: test
+    needs: [unit-test, integration-test]
     runs-on: ubuntu-latest
 
     steps:
@@ -78,7 +91,7 @@ jobs:
         run: docker push caminofr/camino-api:${GITHUB_SHA}
 
   doc:
-    needs: test
+    needs: [unit-test, integration-test]
     runs-on: ubuntu-latest
     steps:
       - name: Checkout
diff --git a/.github/workflows/common.yml b/.github/workflows/common.yml
index d701abddf..3864b5b5d 100644
--- a/.github/workflows/common.yml
+++ b/.github/workflows/common.yml
@@ -23,4 +23,8 @@ jobs:
         env:
           CI: true
       - name: Unit tests
-        run: npm run test --workspace=packages/common
+        run: npm run ci:test --workspace=packages/common
+      - uses: codecov/codecov-action@v2
+        with:
+          token: ${{ secrets.CODECOV_TOKEN }}
+          flags: common
diff --git a/.github/workflows/ui-ci.yml b/.github/workflows/ui-ci.yml
index 1228b0ecf..46a9a4e7e 100644
--- a/.github/workflows/ui-ci.yml
+++ b/.github/workflows/ui-ci.yml
@@ -21,10 +21,12 @@ jobs:
           npm ci
           npm run lint:check --workspace=packages/ui
           npm test --workspace=packages/ui
-          npm run codecov --workspace=packages/ui
         env:
-          CODECOV_TOKEN:  ${{ secrets.CODECOV_TOKEN }}
           CI: true
+      - uses: codecov/codecov-action@v2
+        with:
+          token: ${{ secrets.CODECOV_TOKEN }}
+          flags: ui
 
   build:
     needs: test
diff --git a/.gitignore b/.gitignore
index 326b754e0..371003c29 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@ node_modules
 .idea
 .eslintcache
 .env
+/.cache
diff --git a/Dockerfile.api b/Dockerfile.api
index bb1a78e26..cf41ec3df 100644
--- a/Dockerfile.api
+++ b/Dockerfile.api
@@ -6,11 +6,17 @@ COPY packages/common/package.json /app/packages/common/package.json
 COPY packages/api/package.json /app/packages/api/package.json
 
 # On désactive husky
-RUN npm set-script prepare ""
-RUN npm ci --only=prod
+RUN npm set-script prepare "" && \
+    npm ci
 
 COPY ./ /app/
-RUN npm run build -w packages/api
+RUN npm run build -w packages/api && \
+    rm -rf /app/node_modules/ && \
+    rm -rf /app/packages/api/node_modules/ && \
+    rm -rf /app/packages/ui/node_modules/ && \
+    rm -rf /app/packages/common/node_modules/ && \
+    npm set-script prepare "" && \
+    npm ci --only=prod
 
 FROM node:17.8-alpine as production-stage
 
diff --git a/package-lock.json b/package-lock.json
index e9e426308..dfc808eee 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12449,13 +12449,6 @@
         "sprintf-js": "~1.0.2"
       }
     },
-    "node_modules/argv": {
-      "version": "0.0.2",
-      "dev": true,
-      "engines": {
-        "node": ">=0.6.10"
-      }
-    },
     "node_modules/argv-formatter": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz",
@@ -14643,25 +14636,6 @@
         "node": ">= 0.12.0"
       }
     },
-    "node_modules/codecov": {
-      "version": "3.8.3",
-      "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.8.3.tgz",
-      "integrity": "sha512-Y8Hw+V3HgR7V71xWH2vQ9lyS358CbGCldWlJFR0JirqoGtOoas3R3/OclRTvgUYFK29mmJICDPauVKmpqbwhOA==",
-      "dev": true,
-      "dependencies": {
-        "argv": "0.0.2",
-        "ignore-walk": "3.0.4",
-        "js-yaml": "3.14.1",
-        "teeny-request": "7.1.1",
-        "urlgrey": "1.0.0"
-      },
-      "bin": {
-        "codecov": "bin/codecov"
-      },
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
     "node_modules/codepage": {
       "version": "1.15.0",
       "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz",
@@ -20087,21 +20061,6 @@
       "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz",
       "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig=="
     },
-    "node_modules/fast-url-parser": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz",
-      "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=",
-      "dev": true,
-      "dependencies": {
-        "punycode": "^1.3.2"
-      }
-    },
-    "node_modules/fast-url-parser/node_modules/punycode": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-      "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
-      "dev": true
-    },
     "node_modules/fast-xml-parser": {
       "version": "3.19.0",
       "license": "MIT",
@@ -22597,15 +22556,6 @@
       "dev": true,
       "license": "ISC"
     },
-    "node_modules/ignore-walk": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz",
-      "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==",
-      "dev": true,
-      "dependencies": {
-        "minimatch": "^3.0.4"
-      }
-    },
     "node_modules/immediate": {
       "version": "3.0.6",
       "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
@@ -40066,15 +40016,6 @@
       "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
       "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
     },
-    "node_modules/urlgrey": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-1.0.0.tgz",
-      "integrity": "sha512-hJfIzMPJmI9IlLkby8QrsCykQ+SXDeO2W5Q9QTW3QpqZVTx4a/K7p8/5q+/isD8vsbVaFgql/gvAoQCRQ2Cb5w==",
-      "dev": true,
-      "dependencies": {
-        "fast-url-parser": "^1.1.3"
-      }
-    },
     "node_modules/use": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
@@ -41868,7 +41809,6 @@
         "@types/supertest": "^2.0.11",
         "@typescript-eslint/eslint-plugin": "^5.15.0",
         "@typescript-eslint/parser": "^5.15.0",
-        "codecov": "^3.8.3",
         "commitizen": "^4.2.4",
         "cz-conventional-changelog": "^3.3.0",
         "eslint": "^8.11.0",
@@ -41949,7 +41889,6 @@
         "babel-preset-vite": "^1.0.4",
         "chalk": "^5.0.1",
         "chart.js": "^3.7.1",
-        "codecov": "^3.8.3",
         "commitizen": "^4.2.4",
         "core-js": "^3.21.1",
         "cross-env": "^7.0.3",
@@ -52009,10 +51948,6 @@
         "sprintf-js": "~1.0.2"
       }
     },
-    "argv": {
-      "version": "0.0.2",
-      "dev": true
-    },
     "argv-formatter": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz",
@@ -53211,7 +53146,6 @@
         "camelcase": "^6.3.0",
         "cerbere": "^0.2.3",
         "chalk": "^4.1.2",
-        "codecov": "^3.8.3",
         "commitizen": "^4.2.4",
         "compression": "^1.7.4",
         "cookie-parser": "^1.4.6",
@@ -53236,7 +53170,7 @@
         "express": "^4.17.3",
         "express-graphql": "^0.12.0",
         "express-jwt": "^6.1.1",
-        "express-rate-limit": "*",
+        "express-rate-limit": "^6.4.0",
         "geojson-rewind": "^0.3.1",
         "graphql": "^16.3.0",
         "graphql-fields": "^2.0.3",
@@ -53322,7 +53256,6 @@
         "babel-preset-vite": "^1.0.4",
         "chalk": "^5.0.1",
         "chart.js": "^3.7.1",
-        "codecov": "^3.8.3",
         "commitizen": "^4.2.4",
         "compression": "^1.7.4",
         "connect-history-api-fallback": "^1.6.0",
@@ -54042,19 +53975,6 @@
       "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
       "dev": true
     },
-    "codecov": {
-      "version": "3.8.3",
-      "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.8.3.tgz",
-      "integrity": "sha512-Y8Hw+V3HgR7V71xWH2vQ9lyS358CbGCldWlJFR0JirqoGtOoas3R3/OclRTvgUYFK29mmJICDPauVKmpqbwhOA==",
-      "dev": true,
-      "requires": {
-        "argv": "0.0.2",
-        "ignore-walk": "3.0.4",
-        "js-yaml": "3.14.1",
-        "teeny-request": "7.1.1",
-        "urlgrey": "1.0.0"
-      }
-    },
     "codepage": {
       "version": "1.15.0",
       "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz",
@@ -57927,23 +57847,6 @@
       "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz",
       "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig=="
     },
-    "fast-url-parser": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz",
-      "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=",
-      "dev": true,
-      "requires": {
-        "punycode": "^1.3.2"
-      },
-      "dependencies": {
-        "punycode": {
-          "version": "1.4.1",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
-          "dev": true
-        }
-      }
-    },
     "fast-xml-parser": {
       "version": "3.19.0"
     },
@@ -59733,15 +59636,6 @@
       "version": "1.0.1",
       "dev": true
     },
-    "ignore-walk": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz",
-      "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==",
-      "dev": true,
-      "requires": {
-        "minimatch": "^3.0.4"
-      }
-    },
     "immediate": {
       "version": "3.0.6",
       "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
@@ -72641,15 +72535,6 @@
         "prepend-http": "^2.0.0"
       }
     },
-    "urlgrey": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-1.0.0.tgz",
-      "integrity": "sha512-hJfIzMPJmI9IlLkby8QrsCykQ+SXDeO2W5Q9QTW3QpqZVTx4a/K7p8/5q+/isD8vsbVaFgql/gvAoQCRQ2Cb5w==",
-      "dev": true,
-      "requires": {
-        "fast-url-parser": "^1.1.3"
-      }
-    },
     "use": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
diff --git a/packages/api/jest.config.integration.ts b/packages/api/jest.config.integration.ts
new file mode 100644
index 000000000..642a9c879
--- /dev/null
+++ b/packages/api/jest.config.integration.ts
@@ -0,0 +1,7 @@
+import config from './jest.config'
+config.testRegex = 'test.integration.ts$'
+config.maxWorkers = 1
+config.testTimeout = 20000
+
+console.log('RUNNING INTEGRATION TESTS')
+export default config
diff --git a/packages/api/jest.config.ts b/packages/api/jest.config.ts
index 9671089da..8975d5452 100644
--- a/packages/api/jest.config.ts
+++ b/packages/api/jest.config.ts
@@ -3,178 +3,32 @@
 import type { Config } from '@jest/types'
 
 const config: Config.InitialOptions = {
-  // All imported modules in your tests should be mocked automatically
-  // automock: false,
-
-  // Stop running tests after the first failure
-  // bail: false,
-
-  // Respect "browser" field in package.json when resolving modules
-  // browser: false,
-
-  // The directory where Jest should store its cached dependency information
-  // cacheDirectory: "/var/folders/k1/qn_ccxjn65lgnjx5d1xh31dm0000gn/T/jest_dx",
-
-  // Automatically clear mock calls and instances between every test
   clearMocks: true,
-
-  // Indicates whether the coverage information should be collected while executing the test
-  collectCoverage: true,
-
-  // An array of glob patterns indicating a set of files for which coverage information should be collected
-  // collectCoverageFrom: null,
-
-  // The directory where Jest should output its coverage files
+  collectCoverage: false,
   coverageDirectory: './coverage',
-
-  // An array of regexp pattern strings used to skip coverage collection
-  coveragePathIgnorePatterns: ['tests'],
-
-  // A list of reporter names that Jest uses when writing coverage reports
-  // coverageReporters: [
-  //   "json",
-  //   "text",
-  //   "lcov",
-  //   "clover"
-  // ],
-
-  // An object that configures minimum threshold enforcement for coverage results
-  // coverageThreshold: null,
-
-  // Make calling deprecated APIs throw helpful error messages
-  // errorOnDeprecated: false,
-
-  // Force coverage collection from ignored files usin a array of glob patterns
-  // forceCoverageMatch: [],
-
-  // A path to a module which exports an async function that is triggered once before all test suites
   globalSetup: './tests/setup.ts',
-
-  // A path to a module which exports an async function that is triggered once after all test suites
-  // globalTeardown: './tests/teardown.ts',
-
-  // A set of global variables that need to be available in all test environments
   globals: {
     'ts-jest': {
       isolatedModules: true,
       diagnostics: false
     }
   },
-  // extensionsToTreatAsEsm: ['.ts'],
-  // An array of directory names to be searched recursively up from the requiring module's location
-  // moduleDirectories: [
-  //   "node_modules"
-  // ],
-
-  // An array of file extensions your modules use
-  // moduleFileExtensions: ['ts', 'tsx', 'js', 'json', 'jsx', 'node'],
-
-  // A map from regular expressions to module names that allow to stub out resources with a single module
-  // moduleNameMapper: {},
-
-  // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader
-  // modulePathIgnorePatterns: [],
-
-  // Activates notifications for test results
-  // notify: false,
-
-  // An enum that specifies notification mode. Requires { notify: true }
-  // notifyMode: "always",
-
-  // A preset that is used as a base for Jest's configuration
   preset: 'ts-jest',
-
-  // Run tests from one or more projects
-  // projects: null,
-
-  // Use this configuration option to add custom reporters to Jest
-  // reporters: undefined,
-
-  // Automatically reset mock state between every test
-  // resetMocks: false,
-
-  // Reset the module registry before running each individual test
-  // resetModules: false,
-
-  // A path to a custom resolver
-  // resolver: null,
-
-  // Automatically restore mock state between every test
-  // restoreMocks: false,
-
-  // The root directory that Jest should scan for tests and modules within
   rootDir: './',
 
-  // A list of paths to directories that Jest should use to search for files in
-  roots: ['<rootDir>/src', '<rootDir>/tests'],
-
-  // Allows you to use a custom runner instead of Jest's default test runner
-  // runner: "jest-runner",
+  roots: ['<rootDir>/src'],
 
-  // The paths to modules that run some code to configure or set up the testing environment before each test
-  // setupFiles: [],
-
-  // The path to a module that runs some code to configure or set up the testing framework before each test
   setupFilesAfterEnv: ['./tests/jest-setup.ts'],
 
-  // A list of paths to snapshot serializer modules Jest should use for snapshot testing
-  // snapshotSerializers: [],
-
-  // The test environment that will be used for testing
   testEnvironment: 'node',
-
-  // Options that will be passed to the testEnvironment
-  // testEnvironmentOptions: {},
-
-  // Adds a location field to test results
-  // testLocationInResults: false,
-
-  // The glob patterns Jest uses to detect test files
-  // testMatch: [
-  //   "**/__tests__/**/*.js?(x)",
-  //   "**/?(*.)+(spec|test).js?(x)"
-  // ],
-
-  // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped
-  // testPathIgnorePatterns: [
-  //   '/node_modules/'
-  // ]
-
-  // The regexp pattern Jest uses to detect test files
-  // testRegex: "",
-
-  // This option allows the use of a custom results processor
-  // testResultsProcessor: null,
-
-  // This option allows use of a custom test runner
-  // testRunner: "jasmine2",
-
-  // This option sets the URL for the jsdom environment. It is reflected in properties such as location.href
-  // testURL: "http://localhost",
-
-  // Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout"
-  // timers: "real",
-
-  // A map from regular expressions to paths to transformers
+  testRegex: '.*test\\.ts$',
   transform: {
     '^.+\\.ts?$': 'ts-jest'
   },
-  maxWorkers: 1,
-
-  // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation
   transformIgnorePatterns: ['/node_modules/'],
-
-  // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them
-  // unmockedModulePathPatterns: undefined,
-
-  // Indicates whether each individual test should be reported during the run
-  verbose: true
-
-  // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode
-  // watchPathIgnorePatterns: [],
-
-  // Whether to use watchman for file crawling
-  // watchman: true,
+  verbose: true,
+  detectOpenHandles: true,
+  forceExit: true
 }
 
 export default config
diff --git a/packages/api/package.json b/packages/api/package.json
index dcf329231..2d959f6a1 100644
--- a/packages/api/package.json
+++ b/packages/api/package.json
@@ -31,13 +31,12 @@
     "documents:check": "node ./dist/src/scripts/documents-check.js",
     "lint": "prettier --write . && eslint --fix .",
     "start": "node ./dist/src/index.js",
-    "test": "cross-env JWT_SECRET=secret-tests JWT_SECRET_REFRESH=refresh-secret jest --testPathIgnorePatterns=tests --runInBand --detectOpenHandles --forceExit",
-    "test:unit": "cross-env jest JWT_SECRET=secret-tests JWT_SECRET_REFRESH=refresh-secret --testPathIgnorePatterns=tests --runInBand --detectOpenHandles --watch",
-    "test:integration": "cross-env JWT_SECRET=secret-tests JWT_SECRET_REFRESH=refresh-secret jest --testPathIgnorePatterns=src --runInBand --detectOpenHandles --watch --testTimeout=20000",
+    "test": "npm run test:unit && npm run test:integration",
+    "test:unit": "jest -c jest.config.ts",
+    "test:integration": "JWT_SECRET=secret-tests JWT_SECRET_REFRESH=refresh-secret jest -c jest.config.integration.ts --runInBand",
     "ci:lint": "prettier --check . && eslint .",
-    "ci:test-unit": "cross-env JWT_SECRET=secret-tests JWT_SECRET_REFRESH=refresh-secret jest --testPathIgnorePatterns=tests --ci --runInBand --detectOpenHandles --forceExit --testTimeout=20000",
-    "ci:test-integration": "cross-env JWT_SECRET=secret-tests JWT_SECRET_REFRESH=refresh-secret jest --testPathIgnorePatterns=src --runInBand --detectOpenHandles --ci --forceExit --testTimeout=20000",
-    "codecov": "codecov"
+    "ci:test-unit": "jest -c jest.config.ts --ci --collect-coverage",
+    "ci:test-integration": "JWT_SECRET=secret-tests JWT_SECRET_REFRESH=refresh-secret jest -c jest.config.integration.ts --runInBand --ci --collect-coverage"
   },
   "@comment dependencies": {
     "modules esm": "crypto-random-string, p-queue, @sindresorhus/slugify, email-regex, decamelize, dateformat, node-fetch à ne pas updater tant que on ne compile pas pour es2020: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c. Pas simple de migrer ts-node.",
@@ -124,7 +123,6 @@
     "@types/supertest": "^2.0.11",
     "@typescript-eslint/eslint-plugin": "^5.15.0",
     "@typescript-eslint/parser": "^5.15.0",
-    "codecov": "^3.8.3",
     "commitizen": "^4.2.4",
     "cz-conventional-changelog": "^3.3.0",
     "eslint": "^8.11.0",
diff --git a/packages/api/tests/administration.test.ts b/packages/api/src/api/graphql/administration.test.integration.ts
similarity index 98%
rename from packages/api/tests/administration.test.ts
rename to packages/api/src/api/graphql/administration.test.integration.ts
index e60c5a513..688cb6841 100644
--- a/packages/api/tests/administration.test.ts
+++ b/packages/api/src/api/graphql/administration.test.integration.ts
@@ -1,6 +1,6 @@
-import { graphQLCall, queryImport } from './_utils/index'
+import { graphQLCall, queryImport } from '../../../tests/_utils/index'
 
-import { dbManager } from './db-manager'
+import { dbManager } from '../../../tests/db-manager'
 import { ADMINISTRATION_IDS } from 'camino-common/src/administrations'
 
 console.info = jest.fn()
diff --git a/packages/api/tests/administrations-permissions-demarches.test.ts b/packages/api/src/api/graphql/administrations-permissions-demarches.test.integration.ts
similarity index 98%
rename from packages/api/tests/administrations-permissions-demarches.test.ts
rename to packages/api/src/api/graphql/administrations-permissions-demarches.test.integration.ts
index 18676909c..2b37a7eda 100644
--- a/packages/api/tests/administrations-permissions-demarches.test.ts
+++ b/packages/api/src/api/graphql/administrations-permissions-demarches.test.integration.ts
@@ -1,9 +1,9 @@
-import { dbManager } from './db-manager'
+import { dbManager } from '../../../tests/db-manager'
 import {
   visibleCheck,
   creationCheck,
   modificationCheck
-} from './_utils/administrations-permissions'
+} from '../../../tests/_utils/administrations-permissions'
 
 console.info = jest.fn()
 console.error = jest.fn()
diff --git a/packages/api/tests/administrations-permissions-etapes.test.ts b/packages/api/src/api/graphql/administrations-permissions-etapes.test.integration.ts
similarity index 94%
rename from packages/api/tests/administrations-permissions-etapes.test.ts
rename to packages/api/src/api/graphql/administrations-permissions-etapes.test.integration.ts
index 782ec9d92..bce6512bb 100644
--- a/packages/api/tests/administrations-permissions-etapes.test.ts
+++ b/packages/api/src/api/graphql/administrations-permissions-etapes.test.integration.ts
@@ -1,21 +1,22 @@
-import { dbManager } from './db-manager'
+import { dbManager } from '../../../tests/db-manager'
 import {
   creationCheck,
   modificationCheck,
   visibleCheck
-} from './_utils/administrations-permissions'
-import TitresTypesDemarchesTypesEtapesTypesJustificatifsTypes from '../src/database/models/titres-types--demarches-types-etapes-types-justificatifs-types'
-import TitresTypesDemarchesTypesEtapesTypesDocumentsTypes from '../src/database/models/titres-types--demarches-types-etapes-types-documents-types'
+} from '../../../tests/_utils/administrations-permissions'
+import TitresTypesDemarchesTypesEtapesTypesJustificatifsTypes from '../../database/models/titres-types--demarches-types-etapes-types-justificatifs-types'
+import TitresTypesDemarchesTypesEtapesTypesDocumentsTypes from '../../database/models/titres-types--demarches-types-etapes-types-documents-types'
 
-jest.mock('../src/tools/dir-create', () => ({
+jest.mock('../../tools/dir-create', () => ({
   __esModule: true,
   default: jest.fn()
 }))
-jest.mock('../src/tools/file-stream-create', () => ({
+
+jest.mock('../../tools/file-stream-create', () => ({
   __esModule: true,
   default: jest.fn()
 }))
-jest.mock('../src/tools/file-delete', () => ({
+jest.mock('../../tools/file-delete', () => ({
   __esModule: true,
   default: jest.fn()
 }))
diff --git a/packages/api/tests/administrations-permissions-titres.test.ts b/packages/api/src/api/graphql/administrations-permissions-titres.test.integration.ts
similarity index 98%
rename from packages/api/tests/administrations-permissions-titres.test.ts
rename to packages/api/src/api/graphql/administrations-permissions-titres.test.integration.ts
index d66c626a6..26501f388 100644
--- a/packages/api/tests/administrations-permissions-titres.test.ts
+++ b/packages/api/src/api/graphql/administrations-permissions-titres.test.integration.ts
@@ -1,9 +1,9 @@
-import { dbManager } from './db-manager'
+import { dbManager } from '../../../tests/db-manager'
 import {
   visibleCheck,
   creationCheck,
   modificationCheck
-} from './_utils/administrations-permissions'
+} from '../../../tests/_utils/administrations-permissions'
 
 console.info = jest.fn()
 console.error = jest.fn()
diff --git a/packages/api/tests/documents.test.ts b/packages/api/src/api/graphql/documents.test.integration.ts
similarity index 87%
rename from packages/api/tests/documents.test.ts
rename to packages/api/src/api/graphql/documents.test.integration.ts
index 9899fddb6..c207116d7 100644
--- a/packages/api/tests/documents.test.ts
+++ b/packages/api/src/api/graphql/documents.test.integration.ts
@@ -1,15 +1,15 @@
-import { graphQLCall, queryImport } from './_utils/index'
-import { ITitreEtapeJustificatif } from '../src/types'
-import { documentCreate, documentGet } from '../src/database/queries/documents'
-import { entrepriseUpsert } from '../src/database/queries/entreprises'
-import { titreCreate } from '../src/database/queries/titres'
+import { graphQLCall, queryImport } from '../../../tests/_utils/index'
+import { ITitreEtapeJustificatif } from '../../types'
+import { documentCreate, documentGet } from '../../database/queries/documents'
+import { entrepriseUpsert } from '../../database/queries/entreprises'
+import { titreCreate } from '../../database/queries/titres'
 import {
   titreEtapeCreate,
   titresEtapesJustificatifsUpsert
-} from '../src/database/queries/titres-etapes'
-import { userSuper } from '../src/database/user-super'
-import { dbManager } from './db-manager'
-import { titreDemarcheCreate } from '../src/database/queries/titres-demarches'
+} from '../../database/queries/titres-etapes'
+import { userSuper } from '../../database/user-super'
+import { dbManager } from '../../../tests/db-manager'
+import { titreDemarcheCreate } from '../../database/queries/titres-demarches'
 
 console.info = jest.fn()
 console.error = jest.fn()
diff --git a/packages/api/tests/entreprises.test.ts b/packages/api/src/api/graphql/entreprises.test.integration.ts
similarity index 90%
rename from packages/api/tests/entreprises.test.ts
rename to packages/api/src/api/graphql/entreprises.test.integration.ts
index 8701e30a7..b7f00427c 100644
--- a/packages/api/tests/entreprises.test.ts
+++ b/packages/api/src/api/graphql/entreprises.test.integration.ts
@@ -1,40 +1,38 @@
-import { mocked } from 'jest-mock'
-
-import { ITitreEtapeJustificatif } from '../src/types'
-import { dbManager } from './db-manager'
-import { graphQLCall, queryImport } from './_utils/index'
+import { ITitreEtapeJustificatif } from '../../types'
+import { dbManager } from '../../../tests/db-manager'
+import { graphQLCall, queryImport } from '../../../tests/_utils/index'
 import {
   entreprisesEtablissementsFetch,
   entreprisesFetch,
   tokenInitialize
-} from '../src/tools/api-insee/fetch'
+} from '../../tools/api-insee/fetch'
 import {
   entreprise,
   entrepriseAndEtablissements
-} from './__mocks__/fetch-insee-api'
-import { entrepriseUpsert } from '../src/database/queries/entreprises'
-import { titreCreate } from '../src/database/queries/titres'
-import { documentCreate } from '../src/database/queries/documents'
+} from '../../../tests/__mocks__/fetch-insee-api'
+import { entrepriseUpsert } from '../../database/queries/entreprises'
+import { titreCreate } from '../../database/queries/titres'
+import { documentCreate } from '../../database/queries/documents'
 import {
   titreEtapeCreate,
   titresEtapesJustificatifsUpsert
-} from '../src/database/queries/titres-etapes'
-import { titreDemarcheCreate } from '../src/database/queries/titres-demarches'
-import { userSuper } from '../src/database/user-super'
+} from '../../database/queries/titres-etapes'
+import { titreDemarcheCreate } from '../../database/queries/titres-demarches'
+import { userSuper } from '../../database/user-super'
 
 console.info = jest.fn()
 console.error = jest.fn()
 
-jest.mock('../src/tools/api-insee/fetch', () => ({
+jest.mock('../../tools/api-insee/fetch', () => ({
   __esModule: true,
   tokenInitialize: jest.fn(),
   entreprisesFetch: jest.fn(),
   entreprisesEtablissementsFetch: jest.fn()
 }))
 
-const tokenInitializeMock = mocked(tokenInitialize, true)
-const entrepriseFetchMock = mocked(entreprisesFetch, true)
-const entreprisesEtablissementsFetchMock = mocked(
+const tokenInitializeMock = jest.mocked(tokenInitialize, true)
+const entrepriseFetchMock = jest.mocked(entreprisesFetch, true)
+const entreprisesEtablissementsFetchMock = jest.mocked(
   entreprisesEtablissementsFetch,
   true
 )
diff --git a/packages/api/tests/metas.test.ts b/packages/api/src/api/graphql/metas.test.integration.ts
similarity index 93%
rename from packages/api/tests/metas.test.ts
rename to packages/api/src/api/graphql/metas.test.integration.ts
index a8ae23ddc..929b57306 100644
--- a/packages/api/tests/metas.test.ts
+++ b/packages/api/src/api/graphql/metas.test.integration.ts
@@ -1,5 +1,5 @@
-import { dbManager } from './db-manager'
-import { graphQLCall, queryImport } from './_utils/index'
+import { dbManager } from '../../../tests/db-manager'
+import { graphQLCall, queryImport } from '../../../tests/_utils/index'
 
 console.info = jest.fn()
 console.error = jest.fn()
diff --git a/packages/api/src/api/graphql/resolvers/_titre-etape-email.test.ts b/packages/api/src/api/graphql/resolvers/_titre-etape-email.test.ts
index f7fe396e6..be8b91d98 100644
--- a/packages/api/src/api/graphql/resolvers/_titre-etape-email.test.ts
+++ b/packages/api/src/api/graphql/resolvers/_titre-etape-email.test.ts
@@ -1,5 +1,6 @@
 import { emailsForAdministrationsGet } from './_titre-etape-email'
 import { ITitreEtape, IUtilisateur } from '../../../types'
+import { userSuper } from '../../../database/user-super'
 
 test('envoie un email sur une étape non existante', () => {
   const actual = emailsForAdministrationsGet(
@@ -8,7 +9,7 @@ test('envoie un email sur une étape non existante', () => {
     '',
     '',
     '',
-    undefined,
+    userSuper,
     undefined
   )
 
@@ -48,7 +49,12 @@ const etape: ITitreEtape = {
     publicLecture: true,
     entreprisesLecture: true
   },
-  statut: { id: 'fai', nom: 'fait', description: null, couleur: 'success' },
+  statut: {
+    id: 'fai',
+    nom: 'fait',
+    description: undefined,
+    couleur: 'success'
+  },
   justificatifs: [],
   substances: [],
   documents: [],
diff --git a/packages/api/src/api/graphql/resolvers/_titre-etape-email.ts b/packages/api/src/api/graphql/resolvers/_titre-etape-email.ts
index a99d6a71d..0eec48427 100644
--- a/packages/api/src/api/graphql/resolvers/_titre-etape-email.ts
+++ b/packages/api/src/api/graphql/resolvers/_titre-etape-email.ts
@@ -39,14 +39,17 @@ const etapeStatusUpdated = (
 
 // VisibleForTesting
 export const emailsForAdministrationsGet = (
-  etape: ITitreEtape,
-  etapeType: IEtapeType,
+  etape: ITitreEtape | undefined,
+  etapeType: IEtapeType | undefined,
   demarcheTypeId: string,
   titreId: string,
   titreTypeId: string,
   user: IUtilisateur,
   oldEtape?: ITitreEtape
 ): { subject: string; content: string; emails: string[] } | null => {
+  if (!etape) {
+    return null
+  }
   const emails = [] as string[]
   let title = ''
 
@@ -86,10 +89,10 @@ export const emailsForAdministrationsGet = (
     return null
   }
 
-  const subject = `${etapeType.nom} | ${title}`
+  const subject = `${etapeType?.nom} | ${title}`
   const content = emailForAdministrationContentFormat(
     titreTypeId,
-    etapeType.nom,
+    etapeType?.nom ?? '',
     titreId,
     user
   )
diff --git a/packages/api/tests/titres-demarches.test.ts b/packages/api/src/api/graphql/titres-demarches.test.integration.ts
similarity index 96%
rename from packages/api/tests/titres-demarches.test.ts
rename to packages/api/src/api/graphql/titres-demarches.test.integration.ts
index 376fe1a6c..701368d18 100644
--- a/packages/api/tests/titres-demarches.test.ts
+++ b/packages/api/src/api/graphql/titres-demarches.test.integration.ts
@@ -1,8 +1,8 @@
-import { dbManager } from './db-manager'
-import { graphQLCall, queryImport } from './_utils/index'
-import { titreCreate } from '../src/database/queries/titres'
-import { titreEtapeUpsert } from '../src/database/queries/titres-etapes'
-import { userSuper } from '../src/database/user-super'
+import { dbManager } from '../../../tests/db-manager'
+import { graphQLCall, queryImport } from '../../../tests/_utils/index'
+import { titreCreate } from '../../database/queries/titres'
+import { titreEtapeUpsert } from '../../database/queries/titres-etapes'
+import { userSuper } from '../../database/user-super'
 import {
   ADMINISTRATION_IDS,
   Administrations
diff --git a/packages/api/tests/titres-etapes-creer.test.ts b/packages/api/src/api/graphql/titres-etapes-creer.test.integration.ts
similarity index 91%
rename from packages/api/tests/titres-etapes-creer.test.ts
rename to packages/api/src/api/graphql/titres-etapes-creer.test.integration.ts
index 21b029e61..4ae89ce79 100644
--- a/packages/api/tests/titres-etapes-creer.test.ts
+++ b/packages/api/src/api/graphql/titres-etapes-creer.test.integration.ts
@@ -1,28 +1,28 @@
-import { dbManager } from './db-manager'
-import { graphQLCall, queryImport } from './_utils/index'
-import { titreDemarcheCreate } from '../src/database/queries/titres-demarches'
-import { titreCreate } from '../src/database/queries/titres'
-import { IPermissionId } from '../src/types'
-import { titreEtapePropsIds } from '../src/business/utils/titre-etape-heritage-props-find'
-import Titres from '../src/database/models/titres'
-import TitresTypesDemarchesTypesEtapesTypes from '../src/database/models/titres-types--demarches-types-etapes-types'
-import TitresTypesDemarchesTypesEtapesTypesJustificatifsTypes from '../src/database/models/titres-types--demarches-types-etapes-types-justificatifs-types'
-import TitresTypesDemarchesTypesEtapesTypesDocumentsTypes from '../src/database/models/titres-types--demarches-types-etapes-types-documents-types'
-import { documentCreate } from '../src/database/queries/documents'
+import { dbManager } from '../../../tests/db-manager'
+import { graphQLCall, queryImport } from '../../../tests/_utils/index'
+import { titreDemarcheCreate } from '../../database/queries/titres-demarches'
+import { titreCreate } from '../../database/queries/titres'
+import { IPermissionId } from '../../types'
+import { titreEtapePropsIds } from '../../business/utils/titre-etape-heritage-props-find'
+import Titres from '../../database/models/titres'
+import TitresTypesDemarchesTypesEtapesTypes from '../../database/models/titres-types--demarches-types-etapes-types'
+import TitresTypesDemarchesTypesEtapesTypesJustificatifsTypes from '../../database/models/titres-types--demarches-types-etapes-types-justificatifs-types'
+import TitresTypesDemarchesTypesEtapesTypesDocumentsTypes from '../../database/models/titres-types--demarches-types-etapes-types-documents-types'
+import { documentCreate } from '../../database/queries/documents'
 import {
   ADMINISTRATION_IDS,
   Administrations
 } from 'camino-common/src/administrations'
 
-jest.mock('../src/tools/dir-create', () => ({
+jest.mock('../../tools/dir-create', () => ({
   __esModule: true,
   default: jest.fn()
 }))
-jest.mock('../src/tools/file-stream-create', () => ({
+jest.mock('../../tools/file-stream-create', () => ({
   __esModule: true,
   default: jest.fn()
 }))
-jest.mock('../src/tools/file-delete', () => ({
+jest.mock('../../tools/file-delete', () => ({
   __esModule: true,
   default: jest.fn()
 }))
diff --git a/packages/api/tests/titres-etapes-modifier.test.ts b/packages/api/src/api/graphql/titres-etapes-modifier.test.integration.ts
similarity index 90%
rename from packages/api/tests/titres-etapes-modifier.test.ts
rename to packages/api/src/api/graphql/titres-etapes-modifier.test.integration.ts
index 3851d07da..48addfe92 100644
--- a/packages/api/tests/titres-etapes-modifier.test.ts
+++ b/packages/api/src/api/graphql/titres-etapes-modifier.test.integration.ts
@@ -1,28 +1,28 @@
-import { IPermissionId } from '../src/types'
-import { dbManager } from './db-manager'
-import { graphQLCall, queryImport } from './_utils/index'
-import { titreDemarcheCreate } from '../src/database/queries/titres-demarches'
-import { titreCreate } from '../src/database/queries/titres'
-import { titreEtapeCreate } from '../src/database/queries/titres-etapes'
-import { titreEtapePropsIds } from '../src/business/utils/titre-etape-heritage-props-find'
-import Titres from '../src/database/models/titres'
-import { userSuper } from '../src/database/user-super'
+import { IPermissionId } from '../../types'
+import { dbManager } from '../../../tests/db-manager'
+import { graphQLCall, queryImport } from '../../../tests/_utils/index'
+import { titreDemarcheCreate } from '../../database/queries/titres-demarches'
+import { titreCreate } from '../../database/queries/titres'
+import { titreEtapeCreate } from '../../database/queries/titres-etapes'
+import { titreEtapePropsIds } from '../../business/utils/titre-etape-heritage-props-find'
+import Titres from '../../database/models/titres'
+import { userSuper } from '../../database/user-super'
 import {
   ADMINISTRATION_IDS,
   Administrations
 } from 'camino-common/src/administrations'
 
-jest.mock('../src/tools/dir-create', () => ({
+jest.mock('../../tools/dir-create', () => ({
   __esModule: true,
   default: jest.fn()
 }))
 
-jest.mock('../src/tools/file-stream-create', () => ({
+jest.mock('../../tools/file-stream-create', () => ({
   __esModule: true,
   default: jest.fn()
 }))
 
-jest.mock('../src/tools/file-delete', () => ({
+jest.mock('../../tools/file-delete', () => ({
   __esModule: true,
   default: jest.fn()
 }))
diff --git a/packages/api/tests/titres.test.ts b/packages/api/src/api/graphql/titres.test.integration.ts
similarity index 96%
rename from packages/api/tests/titres.test.ts
rename to packages/api/src/api/graphql/titres.test.integration.ts
index 174ececb7..14a6e98fb 100644
--- a/packages/api/tests/titres.test.ts
+++ b/packages/api/src/api/graphql/titres.test.integration.ts
@@ -1,5 +1,5 @@
-import { dbManager } from './db-manager'
-import { graphQLCall, queryImport } from './_utils/index'
+import { dbManager } from '../../../tests/db-manager'
+import { graphQLCall, queryImport } from '../../../tests/_utils/index'
 import {
   titreWithActiviteGrp,
   titrePublicLecture,
@@ -7,8 +7,8 @@ import {
   titreEtapesPubliques,
   titreDemarchesPubliques,
   titreActivites
-} from './__mocks__/titres'
-import { titreCreate } from '../src/database/queries/titres'
+} from '../../../tests/__mocks__/titres'
+import { titreCreate } from '../../database/queries/titres'
 import {
   ADMINISTRATION_IDS,
   Administrations
@@ -109,7 +109,9 @@ describe('titre', () => {
     expect(res.body.errors).toBeUndefined()
     expect(res.body.data.titre.demarches[0].etapes).toHaveLength(8)
     expect(
-      res.body.data.titre.demarches[0].etapes.map(({ id }) => ({ id }))
+      res.body.data.titre.demarches[0].etapes.map(({ id }: { id: string }) => ({
+        id
+      }))
     ).toEqual(
       expect.arrayContaining([
         { id: 'titre-id-demarche-id-aof' },
@@ -136,7 +138,9 @@ describe('titre', () => {
     expect(res.body.errors).toBeUndefined()
     expect(res.body.data.titre.demarches[0].etapes.length).toEqual(9)
     expect(
-      res.body.data.titre.demarches[0].etapes.map(({ id }) => ({ id }))
+      res.body.data.titre.demarches[0].etapes.map(({ id }: { id: string }) => ({
+        id
+      }))
     ).toEqual(
       expect.arrayContaining([
         { id: 'titre-id-demarche-id-aof' },
diff --git a/packages/api/tests/token.test.ts b/packages/api/src/api/graphql/token.test.integration.ts
similarity index 80%
rename from packages/api/tests/token.test.ts
rename to packages/api/src/api/graphql/token.test.integration.ts
index 66fc9ccf7..247b918b6 100644
--- a/packages/api/tests/token.test.ts
+++ b/packages/api/src/api/graphql/token.test.integration.ts
@@ -1,6 +1,6 @@
-import { dbManager } from './db-manager'
-import { graphQLCall, queryImport } from './_utils/index'
-import Utilisateurs from '../src/database/models/utilisateurs'
+import { dbManager } from '../../../tests/db-manager'
+import { graphQLCall, queryImport } from '../../../tests/_utils/index'
+import Utilisateurs from '../../database/models/utilisateurs'
 
 console.info = jest.fn()
 console.error = jest.fn()
@@ -69,15 +69,19 @@ describe('utilisateurConnecter', () => {
 
     expect(res.body.errors).toBeUndefined()
     const setCookies = res.get('Set-Cookie')
-    expect(setCookies.find(c => c.startsWith('accessToken'))).toBeDefined()
-    expect(setCookies.find(c => c.startsWith('refreshToken'))).toBeDefined()
+    expect(
+      setCookies.find((c: string) => c.startsWith('accessToken'))
+    ).toBeDefined()
+    expect(
+      setCookies.find((c: string) => c.startsWith('refreshToken'))
+    ).toBeDefined()
 
     const userInDB = await Utilisateurs.query()
       .findById(res.body.data.utilisateurConnecter.id)
       .execute()
 
-    expect(setCookies.find(c => c.startsWith('refreshToken'))).toContain(
-      userInDB!.refreshToken
-    )
+    expect(
+      setCookies.find((c: string) => c.startsWith('refreshToken'))
+    ).toContain(userInDB!.refreshToken)
   })
 })
diff --git a/packages/api/tests/utilisateurs.test.ts b/packages/api/src/api/graphql/utilisateurs.test.integration.ts
similarity index 96%
rename from packages/api/tests/utilisateurs.test.ts
rename to packages/api/src/api/graphql/utilisateurs.test.integration.ts
index 6e2c49280..1ed245b24 100644
--- a/packages/api/tests/utilisateurs.test.ts
+++ b/packages/api/src/api/graphql/utilisateurs.test.integration.ts
@@ -1,15 +1,20 @@
-import { app } from './app'
-import { graphQLCall, queryImport, tokenCreate } from './_utils/index'
-import { userAdd } from '../src/knex/user-add'
+import { app } from '../../../tests/app'
+import {
+  graphQLCall,
+  queryImport,
+  tokenCreate
+} from '../../../tests/_utils/index'
+import { userAdd } from '../../knex/user-add'
 import request from 'supertest'
 import jwt from 'jsonwebtoken'
-import { dbManager } from './db-manager'
-import { IUtilisateur } from '../src/types'
+import { dbManager } from '../../../tests/db-manager'
+import { IUtilisateur } from '../../types'
 import { Administrations } from 'camino-common/src/administrations'
+import { Knex } from 'knex'
 
 console.info = jest.fn()
 console.error = jest.fn()
-let knex
+let knex: Knex<any, unknown[]>
 beforeAll(async () => {
   knex = await dbManager.populateDb()
 })
diff --git a/packages/api/src/api/rest/__snapshots__/titres.test.ts.snap b/packages/api/src/api/rest/__snapshots__/titres.test.integration.ts.snap
similarity index 100%
rename from packages/api/src/api/rest/__snapshots__/titres.test.ts.snap
rename to packages/api/src/api/rest/__snapshots__/titres.test.integration.ts.snap
diff --git a/packages/api/src/api/rest/titres.test.ts b/packages/api/src/api/rest/titres.test.integration.ts
similarity index 98%
rename from packages/api/src/api/rest/titres.test.ts
rename to packages/api/src/api/rest/titres.test.integration.ts
index c30816018..a1a8cb705 100644
--- a/packages/api/src/api/rest/titres.test.ts
+++ b/packages/api/src/api/rest/titres.test.integration.ts
@@ -10,7 +10,8 @@ import {
 } from 'camino-common/src/administrations'
 import { ITitreDemarche, ITitreEtape } from '../../types'
 import { entreprisesUpsert } from '../../database/queries/entreprises'
-let knex
+import { Knex } from 'knex'
+let knex: Knex<any, unknown[]>
 beforeAll(async () => {
   knex = await dbManager.populateDb()
 })
diff --git a/packages/api/tests/upload.test.ts b/packages/api/src/api/rest/upload.test.integration.ts
similarity index 87%
rename from packages/api/tests/upload.test.ts
rename to packages/api/src/api/rest/upload.test.integration.ts
index 6a5d5db3c..8c9b2890e 100644
--- a/packages/api/tests/upload.test.ts
+++ b/packages/api/src/api/rest/upload.test.integration.ts
@@ -1,5 +1,5 @@
-import { restUploadCall } from './_utils'
-import { dbManager } from './db-manager'
+import { restUploadCall } from '../../../tests/_utils'
+import { dbManager } from '../../../tests/db-manager'
 
 jest.mock('tus-node-server')
 
diff --git a/packages/api/src/business/processes/__mocks__/titres-administrations-gestionnaires-update-titres.ts b/packages/api/src/business/processes/__mocks__/titres-administrations-gestionnaires-update-titres.ts
index 9eb0dc2c1..2ec14706d 100644
--- a/packages/api/src/business/processes/__mocks__/titres-administrations-gestionnaires-update-titres.ts
+++ b/packages/api/src/business/processes/__mocks__/titres-administrations-gestionnaires-update-titres.ts
@@ -1,11 +1,11 @@
-import Administrations from '../../../database/models/administrations'
 import Titres from '../../../database/models/titres'
+import Administrations from '../../../database/models/administrations'
 
 const administrations = [
   { id: 'dgec' },
   { id: 'dgaln' },
   { id: 'ptmg' }
-] as Administrations[]
+] as unknown as Administrations[]
 
 const titresAdministrationGestionnaireVide = [
   { id: 'titre-id', domaineId: 'm' }
@@ -16,14 +16,14 @@ const titresAdministrationGestionnaireInexistante = [
     id: 'titre-id',
     administrationsGestionnaires: [{ id: 'inexistante' }]
   }
-] as Titres[]
+] as unknown as Titres[]
 
 const titresAdministrationGestionnaireExistante = [
   {
     id: 'titre-id',
     administrationsGestionnaires: [{ id: 'dgec' }]
   }
-] as Titres[]
+] as unknown as Titres[]
 
 export {
   administrations,
diff --git a/packages/api/src/business/processes/__mocks__/titres-etapes-administrations-locales-update-etapes.ts b/packages/api/src/business/processes/__mocks__/titres-etapes-administrations-locales-update-etapes.ts
index a6bbd177e..21b8dd4e0 100644
--- a/packages/api/src/business/processes/__mocks__/titres-etapes-administrations-locales-update-etapes.ts
+++ b/packages/api/src/business/processes/__mocks__/titres-etapes-administrations-locales-update-etapes.ts
@@ -140,7 +140,7 @@ const titresEtapesAdministrationLocalesExistante = [
       }
     ]
   }
-] as Titres[]
+] as unknown as Titres[]
 
 const titresArm = [
   {
diff --git a/packages/api/src/business/processes/entreprises-update.test.ts b/packages/api/src/business/processes/entreprises-update.test.ts
index 0384de1af..33ba5976d 100644
--- a/packages/api/src/business/processes/entreprises-update.test.ts
+++ b/packages/api/src/business/processes/entreprises-update.test.ts
@@ -1,5 +1,3 @@
-import { mocked } from 'jest-mock'
-
 import { entreprisesUpdate } from './entreprises-update'
 import { entreprisesGet } from '../../database/queries/entreprises'
 import { entreprisesEtablissementsGet } from '../../database/queries/entreprises-etablissements'
@@ -52,13 +50,13 @@ jest.mock('../../tools/api-insee/index', () => ({
   apiInseeEntreprisesEtablissementsGet: jest.fn()
 }))
 
-const entreprisesGetMock = mocked(entreprisesGet, true)
-const entreprisesEtablissementsGetMock = mocked(
+const entreprisesGetMock = jest.mocked(entreprisesGet, true)
+const entreprisesEtablissementsGetMock = jest.mocked(
   entreprisesEtablissementsGet,
   true
 )
-const apiInseeEntreprisesGetMock = mocked(apiInseeEntreprisesGet, true)
-const apiInseeEntreprisesEtablissementsGetMock = mocked(
+const apiInseeEntreprisesGetMock = jest.mocked(apiInseeEntreprisesGet, true)
+const apiInseeEntreprisesEtablissementsGetMock = jest.mocked(
   apiInseeEntreprisesEtablissementsGet,
   true
 )
diff --git a/packages/api/src/business/processes/titres-activites-props-update.test.ts b/packages/api/src/business/processes/titres-activites-props-update.test.ts
index 92c07027a..cda9e8248 100644
--- a/packages/api/src/business/processes/titres-activites-props-update.test.ts
+++ b/packages/api/src/business/processes/titres-activites-props-update.test.ts
@@ -1,5 +1,3 @@
-import { mocked } from 'jest-mock'
-
 import { titresActivitesPropsUpdate } from './titres-activites-props-update'
 import { titresActivitesUpsert } from '../../database/queries/titres-activites'
 import { titresGet } from '../../database/queries/titres'
@@ -22,9 +20,9 @@ jest.mock('../utils/titre-valide-check', () => ({
   titreValideCheck: jest.fn()
 }))
 
-const titresActivitesUpsertMock = mocked(titresActivitesUpsert, true)
-const titresGetMock = mocked(titresGet, true)
-const titreValideCheckMock = mocked(titreValideCheck, true)
+const titresActivitesUpsertMock = jest.mocked(titresActivitesUpsert, true)
+const titresGetMock = jest.mocked(titresGet, true)
+const titreValideCheckMock = jest.mocked(titreValideCheck, true)
 
 console.info = jest.fn()
 
diff --git a/packages/api/src/business/processes/titres-activites-relance-send.test.ts b/packages/api/src/business/processes/titres-activites-relance-send.test.ts
index 4a9326119..1f9953fd9 100644
--- a/packages/api/src/business/processes/titres-activites-relance-send.test.ts
+++ b/packages/api/src/business/processes/titres-activites-relance-send.test.ts
@@ -1,5 +1,3 @@
-import { mocked } from 'ts-jest/utils'
-
 import { titresActivitesGet } from '../../database/queries/titres-activites'
 
 import TitresActivites from '../../database/models/titres-activites'
@@ -21,8 +19,8 @@ jest.mock('../../tools/api-mailjet/emails', () => ({
   emailsWithTemplateSend: jest.fn().mockImplementation(a => a)
 }))
 
-const titresActivitesGetMock = mocked(titresActivitesGet, true)
-const emailsWithTemplateSendMock = mocked(emailsWithTemplateSend, true)
+const titresActivitesGetMock = jest.mocked(titresActivitesGet, true)
+const emailsWithTemplateSendMock = jest.mocked(emailsWithTemplateSend, true)
 
 console.info = jest.fn()
 
diff --git a/packages/api/src/business/processes/titres-activites-statut-ids-update.test.ts b/packages/api/src/business/processes/titres-activites-statut-ids-update.test.ts
index 4dae21ae2..0024ee496 100644
--- a/packages/api/src/business/processes/titres-activites-statut-ids-update.test.ts
+++ b/packages/api/src/business/processes/titres-activites-statut-ids-update.test.ts
@@ -1,5 +1,3 @@
-import { mocked } from 'jest-mock'
-
 import { titresActivitesStatutIdsUpdate } from './titres-activites-statut-ids-update'
 import { titresActivitesGet } from '../../database/queries/titres-activites'
 
@@ -13,7 +11,7 @@ jest.mock('../../database/queries/titres-activites', () => ({
   titresActivitesGet: jest.fn()
 }))
 
-const titresActivitesGetMock = mocked(titresActivitesGet, true)
+const titresActivitesGetMock = jest.mocked(titresActivitesGet, true)
 
 console.info = jest.fn()
 
diff --git a/packages/api/src/business/processes/titres-activites-update.test.ts b/packages/api/src/business/processes/titres-activites-update.test.ts
index c941ae8e1..41fc9e290 100644
--- a/packages/api/src/business/processes/titres-activites-update.test.ts
+++ b/packages/api/src/business/processes/titres-activites-update.test.ts
@@ -1,5 +1,3 @@
-import { mocked } from 'jest-mock'
-
 import { ITitreActivite } from '../../types'
 
 import { titresActivitesUpdate } from './titres-activites-update'
@@ -55,13 +53,13 @@ jest.mock('../../tools/api-mailjet/emails', () => ({
   emailsWithTemplateSend: jest.fn().mockImplementation(a => a)
 }))
 
-const titresGetMock = mocked(titresGet, true)
-const activitesTypesGetMock = mocked(activitesTypesGet, true)
-const titreActiviteTypeCheckMock = mocked(titreActiviteTypeCheck, true)
-const anneesBuildMock = mocked(anneesBuild, true)
-const titreActivitesBuildMock = mocked(titreActivitesBuild, true)
-const emailsSendMock = mocked(emailsSend, true)
-const emailsWithTemplateSendMock = mocked(emailsWithTemplateSend, true)
+const titresGetMock = jest.mocked(titresGet, true)
+const activitesTypesGetMock = jest.mocked(activitesTypesGet, true)
+const titreActiviteTypeCheckMock = jest.mocked(titreActiviteTypeCheck, true)
+const anneesBuildMock = jest.mocked(anneesBuild, true)
+const titreActivitesBuildMock = jest.mocked(titreActivitesBuild, true)
+const emailsSendMock = jest.mocked(emailsSend, true)
+const emailsWithTemplateSendMock = jest.mocked(emailsWithTemplateSend, true)
 
 console.info = jest.fn()
 
diff --git a/packages/api/src/business/processes/titres-administrations-gestionnaires-update.test.ts b/packages/api/src/business/processes/titres-administrations-gestionnaires-update.test.ts
index b93bd4b2a..7b7d87d09 100644
--- a/packages/api/src/business/processes/titres-administrations-gestionnaires-update.test.ts
+++ b/packages/api/src/business/processes/titres-administrations-gestionnaires-update.test.ts
@@ -1,5 +1,3 @@
-import { mocked } from 'jest-mock'
-
 import { ITitreAdministrationGestionnaire } from '../../types'
 
 import { titresAdministrationsGestionnairesUpdate } from './titres-administrations-gestionnaires-update'
@@ -36,17 +34,17 @@ jest.mock('../rules/titre-administrations-gestionnaires-build', () => ({
   default: jest.fn()
 }))
 
-const titresGetMock = mocked(titresGet, true)
-const administrationsGetMock = mocked(administrationsGet, true)
-const titreAdministrationsGestionnairesBuildMock = mocked(
+const titresGetMock = jest.mocked(titresGet, true)
+const administrationsGetMock = jest.mocked(administrationsGet, true)
+const titreAdministrationsGestionnairesBuildMock = jest.mocked(
   titreAdministrationsGestionnairesBuild,
   true
 )
-const titresAdministrationsGestionnairesCreateMock = mocked(
+const titresAdministrationsGestionnairesCreateMock = jest.mocked(
   titresAdministrationsGestionnairesCreate,
   true
 )
-const titreAdministrationGestionnaireDeleteMock = mocked(
+const titreAdministrationGestionnaireDeleteMock = jest.mocked(
   titreAdministrationGestionnaireDelete,
   true
 )
diff --git a/packages/api/src/business/processes/titres-contenus-etapes-ids-update.test.ts b/packages/api/src/business/processes/titres-contenus-etapes-ids-update.test.ts
index 800c30dfb..b33550fb3 100644
--- a/packages/api/src/business/processes/titres-contenus-etapes-ids-update.test.ts
+++ b/packages/api/src/business/processes/titres-contenus-etapes-ids-update.test.ts
@@ -1,5 +1,3 @@
-import { mocked } from 'jest-mock'
-
 import { ITitreEtape } from '../../types'
 
 import { titresContenusEtapesIdsUpdate } from './titres-contenus-etapes-ids-update'
@@ -16,8 +14,11 @@ jest.mock('../rules/titre-prop-etape-find', () => ({
   titreContenuTitreEtapeFind: jest.fn()
 }))
 
-const titresGetMock = mocked(titresGet, true)
-const titreContenuTitreEtapeFindMock = mocked(titreContenuTitreEtapeFind, true)
+const titresGetMock = jest.mocked(titresGet, true)
+const titreContenuTitreEtapeFindMock = jest.mocked(
+  titreContenuTitreEtapeFind,
+  true
+)
 
 console.info = jest.fn()
 
diff --git a/packages/api/src/business/processes/titres-coordonnees-update.test.ts b/packages/api/src/business/processes/titres-coordonnees-update.test.ts
index 8134abf76..4280874e4 100644
--- a/packages/api/src/business/processes/titres-coordonnees-update.test.ts
+++ b/packages/api/src/business/processes/titres-coordonnees-update.test.ts
@@ -1,4 +1,3 @@
-import { mocked } from 'jest-mock'
 import { titreCoordonneesFind } from '../utils/titre-coordonnees-find'
 import { titresGet } from '../../database/queries/titres'
 import Titres from '../../database/models/titres'
@@ -13,8 +12,8 @@ jest.mock('../utils/titre-coordonnees-find', () => ({
   titreCoordonneesFind: jest.fn()
 }))
 
-const titresGetMock = mocked(titresGet, true)
-const titreCoordonneesFindMock = mocked(titreCoordonneesFind, true)
+const titresGetMock = jest.mocked(titresGet, true)
+const titreCoordonneesFindMock = jest.mocked(titreCoordonneesFind, true)
 
 console.info = jest.fn()
 
diff --git a/packages/api/src/business/processes/titres-dates-update.test.ts b/packages/api/src/business/processes/titres-dates-update.test.ts
index dd59554b6..50df88704 100644
--- a/packages/api/src/business/processes/titres-dates-update.test.ts
+++ b/packages/api/src/business/processes/titres-dates-update.test.ts
@@ -1,5 +1,3 @@
-import { mocked } from 'jest-mock'
-
 import { titresDatesUpdate } from './titres-dates-update'
 import { titreDateFinFind } from '../rules/titre-date-fin-find'
 import { titreDateDebutFind } from '../rules/titre-date-debut-find'
@@ -24,10 +22,10 @@ jest.mock('../rules/titre-date-demande-find', () => ({
   titreDateDemandeFind: jest.fn()
 }))
 
-const titresGetMock = mocked(titresGet, true)
-const titreDateFinFindMock = mocked(titreDateFinFind, true)
-const titreDateDebutFindMock = mocked(titreDateDebutFind, true)
-const titreDateDemandeFindMock = mocked(titreDateDemandeFind, true)
+const titresGetMock = jest.mocked(titresGet, true)
+const titreDateFinFindMock = jest.mocked(titreDateFinFind, true)
+const titreDateDebutFindMock = jest.mocked(titreDateDebutFind, true)
+const titreDateDemandeFindMock = jest.mocked(titreDateDemandeFind, true)
 
 console.info = jest.fn()
 
diff --git a/packages/api/src/business/processes/titres-demarches-depot-create.test.ts b/packages/api/src/business/processes/titres-demarches-depot-create.test.ts
index 7500d61fc..e20665d5e 100644
--- a/packages/api/src/business/processes/titres-demarches-depot-create.test.ts
+++ b/packages/api/src/business/processes/titres-demarches-depot-create.test.ts
@@ -3,7 +3,6 @@ import { titreDemarcheGet } from '../../database/queries/titres-demarches'
 import TitresDemarches from '../../database/models/titres-demarches'
 import { titresEtapesDepotCreate } from './titres-demarches-depot-create'
 import * as titresDemarchesDepotCreateMethods from './titres-demarches-depot-create'
-import { mocked } from 'jest-mock'
 
 jest.mock('../../database/queries/titres-demarches', () => ({
   titreDemarcheGet: jest.fn()
@@ -15,7 +14,7 @@ const titreEtapeDepotCreateMock = jest.spyOn(
 )
 titreEtapeDepotCreateMock.mockImplementation(() => Promise.resolve())
 
-const titreDemarcheGetMock = mocked(titreDemarcheGet, true)
+const titreDemarcheGetMock = jest.mocked(titreDemarcheGet, true)
 
 console.info = jest.fn()
 
diff --git a/packages/api/src/business/processes/titres-demarches-ordre-update.test.ts b/packages/api/src/business/processes/titres-demarches-ordre-update.test.ts
index fdcb48acb..3c10eda13 100644
--- a/packages/api/src/business/processes/titres-demarches-ordre-update.test.ts
+++ b/packages/api/src/business/processes/titres-demarches-ordre-update.test.ts
@@ -1,5 +1,3 @@
-import { mocked } from 'jest-mock'
-
 import { titresDemarchesOrdreUpdate } from './titres-demarches-ordre-update'
 import { titresGet } from '../../database/queries/titres'
 
@@ -16,7 +14,7 @@ jest.mock('../../database/queries/titres-demarches', () => ({
   titreDemarcheUpdate: jest.fn().mockResolvedValue(true)
 }))
 
-const titresGetMock = mocked(titresGet, true)
+const titresGetMock = jest.mocked(titresGet, true)
 
 console.info = jest.fn()
 
diff --git a/packages/api/src/business/processes/titres-demarches-public-update.test.ts b/packages/api/src/business/processes/titres-demarches-public-update.test.ts
index ac674ecbd..72e418a7e 100644
--- a/packages/api/src/business/processes/titres-demarches-public-update.test.ts
+++ b/packages/api/src/business/processes/titres-demarches-public-update.test.ts
@@ -1,5 +1,3 @@
-import { mocked } from 'jest-mock'
-
 import { titresDemarchesPublicUpdate } from './titres-demarches-public-update'
 import { titresGet } from '../../database/queries/titres'
 
@@ -16,7 +14,7 @@ jest.mock('../../database/queries/titres-demarches', () => ({
   titreDemarcheUpdate: jest.fn().mockResolvedValue(true)
 }))
 
-const titresGetMock = mocked(titresGet, true)
+const titresGetMock = jest.mocked(titresGet, true)
 
 console.info = jest.fn()
 
diff --git a/packages/api/src/business/processes/titres-demarches-statut-ids-update.test.ts b/packages/api/src/business/processes/titres-demarches-statut-ids-update.test.ts
index c32a83799..ea33efb47 100644
--- a/packages/api/src/business/processes/titres-demarches-statut-ids-update.test.ts
+++ b/packages/api/src/business/processes/titres-demarches-statut-ids-update.test.ts
@@ -1,5 +1,3 @@
-import { mocked } from 'jest-mock'
-
 import { titresDemarchesStatutIdUpdate } from './titres-demarches-statut-ids-update'
 import { titresGet } from '../../database/queries/titres'
 
@@ -18,7 +16,7 @@ jest.mock('../../database/queries/titres', () => ({
   titresGet: jest.fn()
 }))
 
-const titresGetMock = mocked(titresGet, true)
+const titresGetMock = jest.mocked(titresGet, true)
 
 console.info = jest.fn()
 
diff --git a/packages/api/src/business/processes/titres-etapes-administrations-locales-update.test.ts b/packages/api/src/business/processes/titres-etapes-administrations-locales-update.test.ts
index f92a8141b..5370df59e 100644
--- a/packages/api/src/business/processes/titres-etapes-administrations-locales-update.test.ts
+++ b/packages/api/src/business/processes/titres-etapes-administrations-locales-update.test.ts
@@ -1,5 +1,3 @@
-import { mocked } from 'jest-mock'
-
 import { titresEtapesAdministrationsLocalesUpdate } from './titres-etapes-administrations-locales-update'
 import {
   titresEtapesAdministrationsCreate,
@@ -32,9 +30,9 @@ jest.mock('../../database/queries/administrations', () => ({
   administrationsGet: jest.fn()
 }))
 
-const titresGetMock = mocked(titresGet, true)
+const titresGetMock = jest.mocked(titresGet, true)
 
-const administrationsGetMock = mocked(administrationsGet, true)
+const administrationsGetMock = jest.mocked(administrationsGet, true)
 
 console.info = jest.fn()
 
@@ -97,7 +95,9 @@ describe("administrations d'une étape", () => {
     titresGetMock.mockResolvedValue(
       titresEtapesAdministrationLocalesInexistante
     )
-    administrationsGetMock.mockResolvedValue([{ id: '0' }] as Administrations[])
+    administrationsGetMock.mockResolvedValue([
+      { id: '0' }
+    ] as unknown as Administrations[])
     const {
       titresEtapesAdministrationsLocalesCreated,
       titresEtapesAdministrationsLocalesDeleted
diff --git a/packages/api/src/business/processes/titres-etapes-areas-update.test.ts b/packages/api/src/business/processes/titres-etapes-areas-update.test.ts
index f37e48841..e0b4f28ac 100644
--- a/packages/api/src/business/processes/titres-etapes-areas-update.test.ts
+++ b/packages/api/src/business/processes/titres-etapes-areas-update.test.ts
@@ -1,5 +1,3 @@
-import { mocked } from 'jest-mock'
-
 import { IGeometry } from '../../types'
 
 import { titresEtapesAreasUpdate } from './titres-etapes-areas-update'
@@ -56,10 +54,10 @@ jest.mock('../../tools/api-geo/index', () => ({
 console.info = jest.fn()
 console.error = jest.fn()
 
-const titresEtapesGetMock = mocked(titresEtapesGet, true)
-const foretsGetMock = mocked(foretsGet, true)
-const communesGetMock = mocked(communesGet, true)
-const geoAreaGeojsonGetMock = mocked(apiGeoGet, true)
+const titresEtapesGetMock = jest.mocked(titresEtapesGet, true)
+const foretsGetMock = jest.mocked(foretsGet, true)
+const communesGetMock = jest.mocked(communesGet, true)
+const geoAreaGeojsonGetMock = jest.mocked(apiGeoGet, true)
 
 describe('mise à jour de toutes les territoires des étapes', () => {
   test('ajoute 2 communes et 1 forêt dans une étape et dans la liste de communes et des forêts', async () => {
diff --git a/packages/api/src/business/processes/titres-etapes-ordre-update.test.ts b/packages/api/src/business/processes/titres-etapes-ordre-update.test.ts
index 63bee02de..28e39a3d9 100644
--- a/packages/api/src/business/processes/titres-etapes-ordre-update.test.ts
+++ b/packages/api/src/business/processes/titres-etapes-ordre-update.test.ts
@@ -1,5 +1,3 @@
-import { mocked } from 'jest-mock'
-
 import { titresEtapesOrdreUpdate } from './titres-etapes-ordre-update'
 import { titreEtapeUpdate } from '../../database/queries/titres-etapes'
 import { titresDemarchesGet } from '../../database/queries/titres-demarches'
@@ -19,7 +17,7 @@ jest.mock('../../database/queries/titres-demarches', () => ({
   titresDemarchesGet: jest.fn()
 }))
 
-const titresDemarchesGetMock = mocked(titresDemarchesGet, true)
+const titresDemarchesGetMock = jest.mocked(titresDemarchesGet, true)
 
 console.info = jest.fn()
 
diff --git a/packages/api/src/business/processes/titres-phases-update.test.ts b/packages/api/src/business/processes/titres-phases-update.test.ts
index 10fd0227a..24cf3c4d0 100644
--- a/packages/api/src/business/processes/titres-phases-update.test.ts
+++ b/packages/api/src/business/processes/titres-phases-update.test.ts
@@ -1,4 +1,3 @@
-import { mocked } from 'jest-mock'
 import { titresPhasesUpdate } from './titres-phases-update'
 import {
   titrePhasesUpsert,
@@ -24,7 +23,7 @@ jest.mock('../../database/queries/titres', () => ({
   titresGet: jest.fn()
 }))
 
-const titresGetMock = mocked(titresGet, true)
+const titresGetMock = jest.mocked(titresGet, true)
 
 console.info = jest.fn()
 
diff --git a/packages/api/src/business/processes/titres-points-references-create.test.ts b/packages/api/src/business/processes/titres-points-references-create.test.ts
index 7d88578d6..d65fb160e 100644
--- a/packages/api/src/business/processes/titres-points-references-create.test.ts
+++ b/packages/api/src/business/processes/titres-points-references-create.test.ts
@@ -1,5 +1,3 @@
-import { mocked } from 'jest-mock'
-
 import { titresPointsReferencesCreate } from './titres-points-references-create'
 import {
   titresPointsGet,
@@ -12,7 +10,7 @@ jest.mock('../../database/queries/titres-points', () => ({
   titresPointsGet: jest.fn()
 }))
 
-const titresPointsGetMock = mocked(titresPointsGet, true)
+const titresPointsGetMock = jest.mocked(titresPointsGet, true)
 
 console.info = jest.fn()
 
diff --git a/packages/api/src/business/processes/titres-props-etapes-ids-update.test.ts b/packages/api/src/business/processes/titres-props-etapes-ids-update.test.ts
index ff0c4655b..0ceb1999e 100644
--- a/packages/api/src/business/processes/titres-props-etapes-ids-update.test.ts
+++ b/packages/api/src/business/processes/titres-props-etapes-ids-update.test.ts
@@ -1,5 +1,4 @@
 import { ITitreEtape } from '../../types'
-import { mocked } from 'jest-mock'
 
 import { titresPropsEtapesIdsUpdate } from './titres-props-etapes-ids-update'
 import { titrePropTitreEtapeFind } from '../rules/titre-prop-etape-find'
@@ -15,8 +14,8 @@ jest.mock('../rules/titre-prop-etape-find', () => ({
   titrePropTitreEtapeFind: jest.fn()
 }))
 
-const titresGetMock = mocked(titresGet, true)
-const titrePropTitreEtapeFindMock = mocked(titrePropTitreEtapeFind, true)
+const titresGetMock = jest.mocked(titresGet, true)
+const titrePropTitreEtapeFindMock = jest.mocked(titrePropTitreEtapeFind, true)
 
 console.info = jest.fn()
 
diff --git a/packages/api/src/business/processes/titres-public-update.test.ts b/packages/api/src/business/processes/titres-public-update.test.ts
index 083a4c15a..37b85537b 100644
--- a/packages/api/src/business/processes/titres-public-update.test.ts
+++ b/packages/api/src/business/processes/titres-public-update.test.ts
@@ -1,4 +1,3 @@
-import { mocked } from 'jest-mock'
 import { titresPublicUpdate } from './titres-public-update'
 import { titresGet } from '../../database/queries/titres'
 
@@ -13,7 +12,7 @@ jest.mock('../../database/queries/titres', () => ({
   titresGet: jest.fn()
 }))
 
-const titresGetMock = mocked(titresGet, true)
+const titresGetMock = jest.mocked(titresGet, true)
 
 console.info = jest.fn()
 
diff --git a/packages/api/src/business/processes/titres-slugs-update.test.ts b/packages/api/src/business/processes/titres-slugs-update.test.ts
index 3c65bc724..2e3a95410 100644
--- a/packages/api/src/business/processes/titres-slugs-update.test.ts
+++ b/packages/api/src/business/processes/titres-slugs-update.test.ts
@@ -1,5 +1,3 @@
-import { mocked } from 'jest-mock'
-
 import Titres from '../../database/models/titres'
 import { titresSlugsUpdate } from './titres-slugs-update'
 
@@ -18,8 +16,8 @@ jest.mock('../../database/queries/titres', () => ({
   titresGet: jest.fn().mockResolvedValue(true)
 }))
 
-const titresGetMock = mocked(titresGet, true)
-const titreSlugAndRelationsUpdateMock = mocked(
+const titresGetMock = jest.mocked(titresGet, true)
+const titreSlugAndRelationsUpdateMock = jest.mocked(
   titreSlugAndRelationsUpdate,
   true
 )
diff --git a/packages/api/src/business/processes/titres-statut-ids-update.test.ts b/packages/api/src/business/processes/titres-statut-ids-update.test.ts
index ff21f2454..78bb830ef 100644
--- a/packages/api/src/business/processes/titres-statut-ids-update.test.ts
+++ b/packages/api/src/business/processes/titres-statut-ids-update.test.ts
@@ -1,4 +1,3 @@
-import { mocked } from 'jest-mock'
 import { titresStatutIdsUpdate } from './titres-statut-ids-update'
 import { titresGet } from '../../database/queries/titres'
 
@@ -13,7 +12,7 @@ jest.mock('../../database/queries/titres', () => ({
   titresGet: jest.fn()
 }))
 
-const titresGetMock = mocked(titresGet, true)
+const titresGetMock = jest.mocked(titresGet, true)
 
 console.info = jest.fn()
 
diff --git a/packages/api/src/business/rules-demarches/_utils.test.ts b/packages/api/src/business/rules-demarches/_utils.test.ts
index ad69f2f3f..09c5a9404 100644
--- a/packages/api/src/business/rules-demarches/_utils.test.ts
+++ b/packages/api/src/business/rules-demarches/_utils.test.ts
@@ -1,7 +1,6 @@
 import fs from 'fs'
 import decamelize from 'decamelize'
 import camelcase from 'camelcase'
-import { mocked } from 'jest-mock'
 
 import {
   IDemarcheType,
@@ -36,8 +35,11 @@ jest.mock('../utils/props-titre-etapes-ids-find', () => ({
   contenusTitreEtapesIdsFind: jest.fn()
 }))
 
-const titreContenuFormatMock = mocked(titreContenuFormat, true)
-const contenusTitreEtapesIdsFindMock = mocked(contenusTitreEtapesIdsFind, true)
+const titreContenuFormatMock = jest.mocked(titreContenuFormat, true)
+const contenusTitreEtapesIdsFindMock = jest.mocked(
+  contenusTitreEtapesIdsFind,
+  true
+)
 
 const elementsGet = <T>(fileName: string): T[] => {
   fileName = decamelize(fileName, { separator: '-' })
diff --git a/packages/api/src/business/rules/titre-activites-build.test.ts b/packages/api/src/business/rules/titre-activites-build.test.ts
index b6139223e..9f789bbff 100644
--- a/packages/api/src/business/rules/titre-activites-build.test.ts
+++ b/packages/api/src/business/rules/titre-activites-build.test.ts
@@ -1,4 +1,3 @@
-import { mocked } from 'jest-mock'
 import {
   IActiviteType,
   ITitreActivite,
@@ -19,7 +18,7 @@ import {
 
 jest.mock('../../database/cache/metas', () => ({ metasGet: jest.fn() }))
 
-const metasGetMock = mocked(metasGet, true)
+const metasGetMock = jest.mocked(metasGet, true)
 
 describe("construction des activités d'un titre", () => {
   const aujourdhui = '2021-01-01'
diff --git a/packages/api/src/business/rules/titre-demarche-annulation-date-fin-find.test.ts b/packages/api/src/business/rules/titre-demarche-annulation-date-fin-find.test.ts
index 02a9f3a43..dee766c73 100644
--- a/packages/api/src/business/rules/titre-demarche-annulation-date-fin-find.test.ts
+++ b/packages/api/src/business/rules/titre-demarche-annulation-date-fin-find.test.ts
@@ -42,6 +42,7 @@ describe("date de fin d'une démarche d'annulation", () => {
   )
 
   test("retourne null si l'étape n'a ni date, ni date de fin", () => {
+    // TODO 2022-05-10, c'est étrange, on va à l'encontre de typescript ici. Soit le typage est faux, soit le test ne sert à rien
     const titreDemarcheAnnulationEtapesSansDate: ITitreEtape[] = [
       {
         id: 'h-cx-courdemanges-1988-ret01-dex01',
@@ -49,6 +50,8 @@ describe("date de fin d'une démarche d'annulation", () => {
         typeId: 'dex',
         statutId: 'acc',
         ordre: 1,
+        // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+        // @ts-ignore
         date: null
       }
     ]
diff --git a/packages/api/src/business/utils/contenu-element-file-process.test.ts b/packages/api/src/business/utils/contenu-element-file-process.test.ts
index 9517b45f1..86b279a19 100644
--- a/packages/api/src/business/utils/contenu-element-file-process.test.ts
+++ b/packages/api/src/business/utils/contenu-element-file-process.test.ts
@@ -1,6 +1,5 @@
 import { FileUpload } from 'graphql-upload'
 import { ReadStream } from 'fs'
-import { mocked } from 'jest-mock'
 
 import { IContenu, IContenuElement, ISection, ITitreEtape } from '../../types'
 
@@ -19,19 +18,19 @@ jest.mock('../../tools/dir-create', () => ({
   __esModule: true,
   default: jest.fn()
 }))
-const dirCreateMock = mocked(dirCreate, true)
+const dirCreateMock = jest.mocked(dirCreate, true)
 
 jest.mock('../../tools/file-stream-create', () => ({
   __esModule: true,
   default: jest.fn()
 }))
-const fileStreamCreateMock = mocked(fileStreamCreate, true)
+const fileStreamCreateMock = jest.mocked(fileStreamCreate, true)
 
 jest.mock('../../tools/file-delete', () => ({
   __esModule: true,
   default: jest.fn()
 }))
-const fileDeleteMock = mocked(fileDelete, true)
+const fileDeleteMock = jest.mocked(fileDelete, true)
 
 jest.mock('crypto-random-string', () => () => 'prefix')
 
diff --git a/packages/api/src/business/utils/titre-activite-valide-check.test.ts b/packages/api/src/business/utils/titre-activite-valide-check.test.ts
index 70588f841..2206a3622 100644
--- a/packages/api/src/business/utils/titre-activite-valide-check.test.ts
+++ b/packages/api/src/business/utils/titre-activite-valide-check.test.ts
@@ -1,5 +1,3 @@
-import { mocked } from 'jest-mock'
-
 import { ITitreDemarche } from '../../types'
 
 import { titreActiviteValideCheck } from './titre-activite-valide-check'
@@ -10,7 +8,7 @@ jest.mock('./titre-valide-check', () => ({
   titreValideCheck: jest.fn()
 }))
 
-const titreValideCheckMock = mocked(titreValideCheck, true)
+const titreValideCheckMock = jest.mocked(titreValideCheck, true)
 
 describe('validité des activités', () => {
   test("retourne faux si la date de l'activité est après aujourd'hui", () => {
diff --git a/packages/api/src/business/utils/titre-coordonnees-find.test.ts b/packages/api/src/business/utils/titre-coordonnees-find.test.ts
index 34efe832b..8bbdda4d5 100644
--- a/packages/api/src/business/utils/titre-coordonnees-find.test.ts
+++ b/packages/api/src/business/utils/titre-coordonnees-find.test.ts
@@ -1,5 +1,3 @@
-import { mocked } from 'jest-mock'
-
 import { titreCoordonneesFind } from './titre-coordonnees-find'
 import { geojsonCenter } from '../../tools/geojson'
 
@@ -9,7 +7,7 @@ jest.mock('../../tools/geojson', () => ({
   geojsonCenter: jest.fn()
 }))
 
-const geojsonCenterMock = mocked(geojsonCenter, true)
+const geojsonCenterMock = jest.mocked(geojsonCenter, true)
 
 describe("coordonnées d'un titre", () => {
   test("retourne les coordonnées d'un titre", () => {
diff --git a/packages/api/src/business/utils/titre-etape-heritage-contenu-find.test.ts b/packages/api/src/business/utils/titre-etape-heritage-contenu-find.test.ts
index 8ef9e937f..38272ce04 100644
--- a/packages/api/src/business/utils/titre-etape-heritage-contenu-find.test.ts
+++ b/packages/api/src/business/utils/titre-etape-heritage-contenu-find.test.ts
@@ -1,5 +1,3 @@
-import { mocked } from 'jest-mock'
-
 import {
   IContenu,
   IEtapeType,
@@ -348,7 +346,7 @@ describe('retourne le contenu de l’étape en fonction de son héritage', () =>
 })
 
 describe('construit le dictionnaire les sections', () => {
-  const etapeTypeSectionsFormatMock = mocked(etapeTypeSectionsFormat, true)
+  const etapeTypeSectionsFormatMock = jest.mocked(etapeTypeSectionsFormat, true)
 
   test('retourne un dictionnaire vide', () => {
     const dictionary = etapeSectionsDictionaryBuild([])
diff --git a/packages/api/src/business/utils/titre-slug-and-relations-update.test.ts b/packages/api/src/business/utils/titre-slug-and-relations-update.test.integration.ts
similarity index 100%
rename from packages/api/src/business/utils/titre-slug-and-relations-update.test.ts
rename to packages/api/src/business/utils/titre-slug-and-relations-update.test.integration.ts
diff --git a/packages/api/src/business/utils/titre-valide-check.test.ts b/packages/api/src/business/utils/titre-valide-check.test.ts
index e66fc506e..9b2c946ec 100644
--- a/packages/api/src/business/utils/titre-valide-check.test.ts
+++ b/packages/api/src/business/utils/titre-valide-check.test.ts
@@ -1,5 +1,3 @@
-import { mocked } from 'jest-mock'
-
 import { ITitreDemarche } from '../../types'
 
 import { titreValideCheck } from './titre-valide-check'
@@ -18,9 +16,9 @@ jest.mock('./titre-demarches-etapes-rebuild', () => ({
   titreDemarchesEtapesRebuild: jest.fn()
 }))
 
-const titreStatutIdFindMock = mocked(titreStatutIdFind, true)
+const titreStatutIdFindMock = jest.mocked(titreStatutIdFind, true)
 
-const titreDemarchesEtapesRebuildMock = mocked(
+const titreDemarchesEtapesRebuildMock = jest.mocked(
   titreDemarchesEtapesRebuild,
   true
 )
diff --git a/packages/api/src/business/validations/titre-etape-type-and-status-validate.test.ts b/packages/api/src/business/validations/titre-etape-type-and-status-validate.test.ts
index 24118d169..53a88a15e 100644
--- a/packages/api/src/business/validations/titre-etape-type-and-status-validate.test.ts
+++ b/packages/api/src/business/validations/titre-etape-type-and-status-validate.test.ts
@@ -1,4 +1,3 @@
-import { mocked } from 'jest-mock'
 import { IEtapeType } from '../../types'
 
 import { titreEtapeTypeAndStatusValidate } from './titre-etape-type-and-status-validate'
@@ -8,7 +7,7 @@ jest.mock('../utils/titre-etape-demarche-etape-type-find', () => ({
   titreEtapeDemarcheEtapeTypeFind: jest.fn()
 }))
 
-const titreEtapeDemarcheEtapeTypeFindMock = mocked(
+const titreEtapeDemarcheEtapeTypeFindMock = jest.mocked(
   titreEtapeDemarcheEtapeTypeFind,
   true
 )
diff --git a/packages/api/src/database/queries/permissions/administrations.test.ts b/packages/api/src/database/queries/permissions/administrations.test.integration.ts
similarity index 98%
rename from packages/api/src/database/queries/permissions/administrations.test.ts
rename to packages/api/src/database/queries/permissions/administrations.test.integration.ts
index 7ddcb3743..c9d29615f 100644
--- a/packages/api/src/database/queries/permissions/administrations.test.ts
+++ b/packages/api/src/database/queries/permissions/administrations.test.integration.ts
@@ -184,11 +184,12 @@ describe('administrationsQueryModify', () => {
     let q = administrationsQueryModify(Administrations.query(), mockUser)
 
     let res = await q.findById(prefectureDordogne)
-    expect(res.emailsModification).toBe(true)
+    expect(res).not.toBeUndefined()
+    expect(res?.emailsModification).toBe(true)
 
     q = administrationsQueryModify(Administrations.query(), mockUser)
     res = await q.findById(prefectureCorseDuSud)
-    expect(res.emailsModification).toBe(null)
+    expect(res?.emailsModification).toBe(null)
   })
 
   test.each`
diff --git a/packages/api/src/database/queries/permissions/administrations.ts b/packages/api/src/database/queries/permissions/administrations.ts
index 5d99d3ad8..52f732447 100644
--- a/packages/api/src/database/queries/permissions/administrations.ts
+++ b/packages/api/src/database/queries/permissions/administrations.ts
@@ -61,7 +61,7 @@ const emailsLectureQuery = (
 const administrationsQueryModify = (
   q: QueryBuilder<Administrations, Administrations | Administrations[]>,
   user: IUtilisateur | null | undefined
-) => {
+): QueryBuilder<Administrations, Administrations | Administrations[]> => {
   q.select('administrations.*')
 
   const administrationsIds = user?.administrations?.map(a => a.id) || []
diff --git a/packages/api/src/database/queries/permissions/documents.test.ts b/packages/api/src/database/queries/permissions/documents.test.integration.ts
similarity index 99%
rename from packages/api/src/database/queries/permissions/documents.test.ts
rename to packages/api/src/database/queries/permissions/documents.test.integration.ts
index 9c55fab52..a238a4cc0 100644
--- a/packages/api/src/database/queries/permissions/documents.test.ts
+++ b/packages/api/src/database/queries/permissions/documents.test.integration.ts
@@ -10,10 +10,11 @@ import Document from '../../models/documents'
 
 import { documentCreate, documentGet } from '../documents'
 import { etapeTypeDocumentTypeUsedCheck } from './documents'
+import { Knex } from 'knex'
 
 console.info = jest.fn()
 console.error = jest.fn()
-let knex
+let knex: Knex<any, unknown[]>
 beforeAll(async () => {
   knex = await dbManager.populateDb()
 })
diff --git a/packages/api/src/database/queries/permissions/entreprises.test.ts b/packages/api/src/database/queries/permissions/entreprises.test.integration.ts
similarity index 100%
rename from packages/api/src/database/queries/permissions/entreprises.test.ts
rename to packages/api/src/database/queries/permissions/entreprises.test.integration.ts
diff --git a/packages/api/src/database/queries/permissions/metas.test.ts b/packages/api/src/database/queries/permissions/metas.test.integration.ts
similarity index 91%
rename from packages/api/src/database/queries/permissions/metas.test.ts
rename to packages/api/src/database/queries/permissions/metas.test.integration.ts
index 87e0c63f3..cd173e547 100644
--- a/packages/api/src/database/queries/permissions/metas.test.ts
+++ b/packages/api/src/database/queries/permissions/metas.test.integration.ts
@@ -6,7 +6,10 @@ import Titres from '../../models/titres'
 import { IDemarcheType, IUtilisateur } from '../../../types'
 import AdministrationsTitresTypes from '../../models/administrations-titres-types'
 import AdministrationsTitresTypesTitresStatuts from '../../models/administrations-titres-types-titres-statuts'
-import { Administrations } from 'camino-common/src/administrations'
+import {
+  AdministrationId,
+  Administrations
+} from 'camino-common/src/administrations'
 
 console.info = jest.fn()
 console.error = jest.fn()
@@ -29,7 +32,13 @@ describe('metas permissions queries', () => {
       ${'ope-ptmg-973-01'}      | ${false}
     `(
       'l’administration $administrationId peut créer des travaux',
-      async ({ administrationId, travauxCreation }) => {
+      async ({
+        administrationId,
+        travauxCreation
+      }: {
+        administrationId: AdministrationId
+        travauxCreation: boolean
+      }) => {
         const titreId = idGenerate()
 
         await Titres.query().insert({
diff --git a/packages/api/src/database/queries/permissions/titres-demarches.test.ts b/packages/api/src/database/queries/permissions/titres-demarches.test.integration.ts
similarity index 100%
rename from packages/api/src/database/queries/permissions/titres-demarches.test.ts
rename to packages/api/src/database/queries/permissions/titres-demarches.test.integration.ts
diff --git a/packages/api/src/database/queries/permissions/titres-etapes.test.ts b/packages/api/src/database/queries/permissions/titres-etapes.test.integration.ts
similarity index 100%
rename from packages/api/src/database/queries/permissions/titres-etapes.test.ts
rename to packages/api/src/database/queries/permissions/titres-etapes.test.integration.ts
diff --git a/packages/api/src/database/queries/permissions/titres.test.ts b/packages/api/src/database/queries/permissions/titres.test.integration.ts
similarity index 98%
rename from packages/api/src/database/queries/permissions/titres.test.ts
rename to packages/api/src/database/queries/permissions/titres.test.integration.ts
index 436deff88..16535627a 100644
--- a/packages/api/src/database/queries/permissions/titres.test.ts
+++ b/packages/api/src/database/queries/permissions/titres.test.integration.ts
@@ -25,6 +25,7 @@ import Administrations from '../../models/administrations'
 import { userSuper } from '../../user-super'
 import {
   ADMINISTRATION_IDS,
+  AdministrationId,
   Administrations as CommonAdministrations
 } from 'camino-common/src/administrations'
 
@@ -279,7 +280,15 @@ describe('titresQueryModify', () => {
       ${'ope-ptmg-973-01'}                       | ${true}      | ${false}
     `(
       'Vérifie si le $administrationId, gestionnaire $gestionnaire peut créer des travaux ($travauxCreation)',
-      async ({ administrationId, gestionnaire, travauxCreation }) => {
+      async ({
+        administrationId,
+        gestionnaire,
+        travauxCreation
+      }: {
+        administrationId: AdministrationId
+        gestionnaire: boolean
+        travauxCreation: boolean
+      }) => {
         const titreId = idGenerate()
 
         await Titres.query().insert({
diff --git a/packages/api/src/database/queries/permissions/utilisateurs.test.ts b/packages/api/src/database/queries/permissions/utilisateurs.test.integration.ts
similarity index 100%
rename from packages/api/src/database/queries/permissions/utilisateurs.test.ts
rename to packages/api/src/database/queries/permissions/utilisateurs.test.integration.ts
diff --git a/packages/api/src/database/queries/titres-activites.test.ts b/packages/api/src/database/queries/titres-activites.test.integration.ts
similarity index 100%
rename from packages/api/src/database/queries/titres-activites.test.ts
rename to packages/api/src/database/queries/titres-activites.test.integration.ts
diff --git a/packages/api/src/database/queries/titres-demarches.test.ts b/packages/api/src/database/queries/titres-demarches.test.integration.ts
similarity index 93%
rename from packages/api/src/database/queries/titres-demarches.test.ts
rename to packages/api/src/database/queries/titres-demarches.test.integration.ts
index ee2ea3dd0..94e6d8168 100644
--- a/packages/api/src/database/queries/titres-demarches.test.ts
+++ b/packages/api/src/database/queries/titres-demarches.test.integration.ts
@@ -52,8 +52,8 @@ describe('teste les requêtes sur les démarches', () => {
       expect(archiveDemarche?.archive).toBe(true)
       expect(archiveDemarche?.etapes).toHaveLength(3)
 
-      for (const etape of archiveDemarche!.etapes) {
-        expect(etape.archive).toBe(true)
+      for (const etape of archiveDemarche?.etapes ?? []) {
+        expect((etape as TitresEtapes).archive).toBe(true)
       }
     })
   })
diff --git a/packages/api/src/database/queries/titres.test.ts b/packages/api/src/database/queries/titres.test.integration.ts
similarity index 100%
rename from packages/api/src/database/queries/titres.test.ts
rename to packages/api/src/database/queries/titres.test.integration.ts
diff --git a/packages/api/tests/_utils/index.ts b/packages/api/tests/_utils/index.ts
index 14b410ce8..061edb353 100644
--- a/packages/api/tests/_utils/index.ts
+++ b/packages/api/tests/_utils/index.ts
@@ -45,7 +45,7 @@ export const restCall = async (
   path: string,
   permissionId: IPermissionId,
   administrationId?: AdministrationId
-): request.Test => {
+): Promise<request.Test> => {
   const req = request(app).get(path)
 
   return cookiesSet(req, permissionId, administrationId)
@@ -55,7 +55,7 @@ const cookiesSet = async (
   req: request.Test,
   permissionId?: IPermissionId,
   administrationId?: string
-) => {
+): Promise<request.Test> => {
   let token
   if (permissionId) {
     token = await userTokenGenerate(permissionId, administrationId)
diff --git a/packages/api/tests/db-manager.ts b/packages/api/tests/db-manager.ts
index fb44f9a62..7e1d2068e 100644
--- a/packages/api/tests/db-manager.ts
+++ b/packages/api/tests/db-manager.ts
@@ -8,7 +8,7 @@ import { knexSnakeCaseMappers, Model } from 'objection'
 
 class DbManager {
   private readonly dbName: string
-  private knexInstance = null
+  private knexInstance: null | Knex<any, unknown[]> = null
 
   public constructor() {
     this.dbName = `a${idGenerate().toLowerCase()}`
@@ -62,10 +62,20 @@ class DbManager {
     return knex(knexConfig)
   }
 
+  private static checkKnexInstance(
+    knex: null | Knex<any, unknown[]>
+  ): asserts knex is Knex<any, unknown[]> {
+    if (knex === null) {
+      throw new Error('populateDb should be called first')
+    }
+  }
+
   public async populateDb(): Promise<Knex<any, unknown>> {
     await this.init()
     await this.injectSeed()
 
+    DbManager.checkKnexInstance(this.knexInstance)
+
     return this.knexInstance
   }
 
@@ -75,6 +85,7 @@ class DbManager {
   }
 
   public async closeKnex(): Promise<void> {
+    DbManager.checkKnexInstance(this.knexInstance)
     await this.knexInstance.destroy()
     await this.end()
   }
@@ -88,10 +99,12 @@ class DbManager {
   }
 
   private async injectSeed() {
+    DbManager.checkKnexInstance(this.knexInstance)
     await this.knexInstance.transaction(async trx => trx.seed.run())
   }
 
   private async truncateSchema() {
+    DbManager.checkKnexInstance(this.knexInstance)
     const tables =
       (await this.knexInstance('pg_tables')
         .select('tablename')
diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json
index 344fbb1b7..d1a4beea3 100644
--- a/packages/api/tsconfig.json
+++ b/packages/api/tsconfig.json
@@ -29,7 +29,7 @@
       "tus-node-server": ["./src/@types/tus-node-server"]
     }
   },
-  "exclude": ["node_modules", "**/*.test.ts", "**/__mocks__/*"],
+  "exclude": ["node_modules", "**/__mocks__/*"],
   "include": ["src/**/*", "sources/**/*"],
   "typedocOptions": {
     "out": "docs",
diff --git a/packages/common/.gitignore b/packages/common/.gitignore
index 42a45895c..c1a125b6e 100644
--- a/packages/common/.gitignore
+++ b/packages/common/.gitignore
@@ -1,2 +1,3 @@
 src/*.js
-src/*.js.map
\ No newline at end of file
+src/*.js.map
+/coverage
diff --git a/packages/common/package.json b/packages/common/package.json
index b98ae5c51..7aad0a5aa 100644
--- a/packages/common/package.json
+++ b/packages/common/package.json
@@ -6,7 +6,8 @@
   "scripts": {
     "test": "jest",
     "format": "prettier --write src",
-    "lint": "eslint --fix"
+    "lint": "eslint --fix",
+    "ci:test": "jest --coverage"
   },
   "devDependencies": {
     "@types/jest": "^27.4.1",
diff --git a/packages/ui/package.json b/packages/ui/package.json
index 3f931872e..24bcc57a0 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -8,7 +8,6 @@
     "dev": "vite",
     "dev:update": "npm-check-updates && npm install && npm audit fix",
     "start": "node ./index.js",
-    "codecov": "codecov",
     "test": "cross-env NODE_ENV=test && jest --verbose",
     "test:watch": "cross-env NODE_ENV=test jest --watch --verbose",
     "lint": "prettier --write src && eslint --fix --ext .js,.ts,.vue src",
@@ -60,7 +59,6 @@
     "babel-preset-vite": "^1.0.4",
     "chalk": "^5.0.1",
     "chart.js": "^3.7.1",
-    "codecov": "^3.8.3",
     "commitizen": "^4.2.4",
     "core-js": "^3.21.1",
     "cross-env": "^7.0.3",
@@ -140,8 +138,13 @@
     "rules": {
       "vue/no-mutating-props": 0,
       "vue/valid-v-bind-sync": 0,
-      "vue/no-multiple-template-root": ["warn"],
-      "vue/attribute-hyphenation": ["error", "never"],
+      "vue/no-multiple-template-root": [
+        "warn"
+      ],
+      "vue/attribute-hyphenation": [
+        "error",
+        "never"
+      ],
       "no-unused-vars": 0
     },
     "parserOptions": {
-- 
GitLab