diff --git a/knex/seeds/03-metas.js b/knex/seeds/03-metas.js
index 47c24b4dc34c11dd6d1989193c8d4771fb9bf324..55d2cbfb65f7c63eaad9993167334e5a9d614fc2 100644
--- a/knex/seeds/03-metas.js
+++ b/knex/seeds/03-metas.js
@@ -3,7 +3,6 @@ const seeding = require('../seeding')
 const definitions = require('../../sources/definitions.json')
 const domaines = require('../../sources/domaines.json')
 const titresTypesTypes = require('../../sources/titres-types-types.json')
-// eslint-disable-next-line camelcase
 const titresTypes = require('../../sources/titres-types.json')
 const titresStatuts = require('../../sources/titres-statuts.json')
 // eslint-disable-next-line camelcase
diff --git a/src/types.ts b/src/types.ts
index d6c1a7ea98e229758f7d6f50fe4d157f0315bd06..75d76928e390d8b02610d0651336350d282e6e68 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -129,7 +129,7 @@ interface IAdministration {
   departementId?: string | null
   regionId?: string | null
   abreviation?: string | null
-  titresTypes?: ITitreType[] | null
+  titresTypes?: (ITitreType & IAdministrationTitreType)[] | null
   titresTypesTitresStatuts?: IAdministrationTitreTypeTitreStatut[] | null
   titresTypesEtapesTypes?: IAdministrationTitreTypeEtapeType[] | null
   activitesTypes?: IActiviteType[] | null
diff --git a/tests/_utils/administrations-permissions.ts b/tests/_utils/administrations-permissions.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d23edd54b6febc8dce770b2409b0bc29b20cf951
--- /dev/null
+++ b/tests/_utils/administrations-permissions.ts
@@ -0,0 +1,431 @@
+import { IAdministration, ITitre } from '../../src/types'
+// import { departementsGet } from '../../src/database/queries/territoires'
+
+// const titresBuild = async () => {
+//   const departements = await departementsGet()
+
+//   const titres = departements.map(d => ({
+//     id: `titre-id-${d.id}`,
+//     demarches: [
+//       {
+//         id: `demarche-id-${d.id}`,
+//         typeId: 'oct',
+//         etapes: [
+//           {
+//             id: `etape-id-${d.id}`,
+//             typeId: 'dpu',
+//             communes: [
+//               {
+//                 id: `commune-id-${d.id}`,
+//                 departementId: d.id,
+//                 departement: d,
+//                 regionId: d.regionId
+//               }
+//             ]
+//           }
+//         ]
+//       }
+//     ]
+//   }))
+// }
+
+type IAction = 'rien' | 'voir' | 'modifier' | 'creer'
+
+interface IAdministrationTitreTypeTest {
+  titreId: string
+  administrationId: string
+  pouvoir: boolean
+  action: IAction
+  cible: string
+  titreTypeId: string
+  domaineId?: string
+  etapeTypeId?: string
+  gestionnaire?: boolean | null | undefined
+  titreStatutId?: string
+}
+
+type IAdministrationTitreTypeTestFormatted = [
+  string,
+  IAdministration,
+  ITitre,
+  ITitre
+]
+
+const testAdministrationTitreTypeBuild = (
+  administration: IAdministration,
+  titreTypeId: string
+) => {
+  const administrationTitreTypeTests = [] as IAdministrationTitreTypeTest[]
+  let uniqueId = 0
+  // Visibilité des titres
+  //   |T|D|E|
+  //  V|X| | |
+  //  C| | | |
+  //  M| | | |
+
+  administrationTitreTypeTests.push({
+    titreId: `titre-${titreTypeId}-${administration.id}-${uniqueId++}`,
+    administrationId: administration.id,
+    pouvoir: true,
+    action: 'voir',
+    cible: 'titre',
+    titreTypeId
+  })
+
+  // Visibilité des démarches
+  //   |T|D|E|
+  //  V| |X| |
+  //  C| | | |
+  //  M| | | |
+  administrationTitreTypeTests.push({
+    titreId: `titre-${titreTypeId}-${administration.id}-${uniqueId++}`,
+    administrationId: administration.id,
+    pouvoir: true,
+    action: 'voir',
+    cible: 'demarche',
+    titreTypeId
+  })
+
+  // Visibilité des étapes
+  //   |T|D|E|
+  //  V| | |X|
+  //  C| | | |
+  //  M| | | |
+
+  // s'il y a restriction de visibilité `lectureInterdit`
+  // dans titresTypesEtapesTypes
+  if (administration.titresTypesEtapesTypes?.length) {
+    administrationTitreTypeTests.push(
+      ...administration.titresTypesEtapesTypes
+        .filter(ttet => ttet.titreTypeId === titreTypeId)
+        .map(restriction => ({
+          titreId: `titre-${titreTypeId}-${administration.id}-${uniqueId++}`,
+          administrationId: restriction.administrationId,
+          pouvoir: !restriction.lectureInterdit,
+          action: 'voir' as IAction,
+          cible: 'etape',
+          titreTypeId,
+          etapeTypeId: restriction.etapeTypeId
+        }))
+    )
+  }
+
+  // TODO : création T, D, E
+
+  //   |T|D|E|
+  //  V| | | |
+  //  C| | | |
+  //  M|X| | |
+
+  // s'il y a restriction d'édition `titresModificationInterdit`
+  // dans  titresTypesTitresStatuts
+  if (administration.titresTypesTitresStatuts?.length) {
+    administrationTitreTypeTests.push(
+      ...administration.titresTypesTitresStatuts
+        .filter(ttts => ttts.titreTypeId === titreTypeId)
+        .map(restriction => ({
+          titreId: `titre-${titreTypeId}-${administration.id}-${uniqueId++}`,
+          administrationId: administration.id,
+          gestionnaire: restriction.titreType!.gestionnaire,
+          pouvoir:
+            (restriction.titreType!.gestionnaire &&
+              !restriction.titresModificationInterdit) ||
+            false,
+          action: 'modifier' as IAction,
+          cible: 'titre',
+          titreTypeId,
+          titreStatutId: restriction.titreStatutId
+        }))
+    )
+  }
+
+  // Modification des démarches
+  //   |T|D|E|
+  //  V| | | |
+  //  C| | | |
+  //  M| |X| |
+
+  // s'il y a restriction d'édition `demarchesModificationInterdit`
+  // dans  titresTypesTitresStatuts
+  if (administration.titresTypesTitresStatuts?.length) {
+    administrationTitreTypeTests.push(
+      ...administration.titresTypesTitresStatuts
+        .filter(ttts => ttts.titreTypeId === titreTypeId)
+        .map(restriction => ({
+          titreId: `titre-${titreTypeId}-${administration.id}-${uniqueId++}`,
+          administrationId: administration.id,
+          gestionnaire: restriction.titreType!.gestionnaire,
+          pouvoir:
+            (restriction.titreType!.gestionnaire &&
+              !restriction.demarchesModificationInterdit) ||
+            false,
+          action: 'modifier' as IAction,
+          cible: 'demarche',
+          titreTypeId,
+          titreStatutId: restriction.titreStatutId
+        }))
+    )
+  }
+
+  // Modification des étapes
+  //   |T|D|E|
+  //  V| | | |
+  //  C| | | |
+  //  M| | |X|
+
+  // s'il y a restriction d'édition `etapesModificationInterdit`
+  // dans titresTypesTitresStatuts
+  if (administration.titresTypesTitresStatuts?.length) {
+    administrationTitreTypeTests.push(
+      ...administration.titresTypesTitresStatuts
+        .filter(ttts => ttts.titreTypeId === titreTypeId)
+        .map(restriction => ({
+          titreId: `titre-${titreTypeId}-${administration.id}-${uniqueId++}`,
+          administrationId: administration.id,
+          gestionnaire: restriction.titreType!.gestionnaire,
+          pouvoir:
+            (restriction.titreType!.gestionnaire &&
+              !restriction.etapesModificationInterdit) ||
+            false,
+          action: 'modifier' as IAction,
+          cible: 'etape',
+          titreTypeId,
+          titreStatutId: restriction.titreStatutId
+        }))
+    )
+  }
+
+  // s'il y a restriction de modification d'étapes
+  // if (administration.titresTypesEtapesTypes?.length) {
+  //   administrationTitreTypeTests.push(
+  //     ...administration.titresTypesEtapesTypes
+  //       .filter(ttet => ttet.titreTypeId === titreTypeId)
+  //       .map(restriction => {
+  //         return {
+  //           titreId: `titre-${titreTypeId}-${administration.id}-${uniqueId++}`,
+  //           administrationId: administration.id,
+  //           gestionnaire: restriction.titreType.gestionnaire,
+  //           pouvoir:
+  //             restriction.titreType.gestionnaire &&
+  //             !restriction.modificationInterdit,
+  //           action: restriction.lectureInterdit ? 'modifier(voir)' : 'modifier',
+  //           cible: 'etape',
+  //           titreTypeId,
+  //           etapeTypeId: restriction.etapeTypeId
+  //         }
+  //       })
+  //   )
+  // }
+
+  return administrationTitreTypeTests
+}
+
+const administrationTestsBuild = (administration: IAdministration) =>
+  administration.titresTypes!.flatMap(titreType =>
+    testAdministrationTitreTypeBuild(administration, titreType.id)
+  )
+
+const administrationsTestsBuild = (administrations: IAdministration[]) =>
+  administrations.flatMap(administration =>
+    administrationTestsBuild(administration)
+  )
+
+const messageBuild = (scenario: IAdministrationTitreTypeTest) => {
+  let message = ''
+  if (scenario.cible! === 'titre') {
+    message = 'un titre '
+  } else if (scenario.cible! === 'demarche') {
+    message = "les démarches d'un titre "
+  } else if (scenario.cible! === 'etape') {
+    if (scenario.etapeTypeId!) {
+      message = `une étape ${scenario.etapeTypeId} d'un titre `
+    } else {
+      message = `les étapes d'un titre `
+    }
+  }
+  message += scenario.titreTypeId
+  message += scenario.titreStatutId!
+    ? ` dont le statut est ${scenario.titreStatutId}`
+    : ''
+
+  return `${scenario.administrationId}: ${
+    scenario.pouvoir ? 'peut' : 'ne peut pas'
+  } ${scenario.action} ${message}`
+}
+
+const titreBuild = (
+  {
+    titreId,
+    titreTypeId,
+    titreStatutId,
+    etapeTypeId
+  }: IAdministrationTitreTypeTest,
+  administration: IAdministration
+) => {
+  const titre = {
+    id: titreId,
+    nom: 'nom titre',
+    demarches: [
+      {
+        id: `${titreId}-demarche-id`,
+        titreId: titreId,
+        typeId: 'oct',
+        etapes: [
+          {
+            id: `${titreId}-demarche-id-etape-id`,
+            typeId: 'mfr',
+            ordre: 0,
+            titreDemarcheId: `${titreId}-demarche-id`,
+            statutId: 'enc',
+            date: '2020-01-01'
+          }
+        ]
+      }
+    ],
+    publicLecture: false
+  } as ITitre
+
+  titre.typeId = titreTypeId
+  titre.domaineId = titre.typeId.slice(-1)
+  titre.administrationsGestionnaires = []
+
+  const administrationTitreType = administration.titresTypes?.find(
+    att => att.id === titreTypeId
+  )
+
+  if (administrationTitreType?.gestionnaire) {
+    titre.administrationsGestionnaires.push(administration)
+  }
+  // titre.administrationsLocales = []
+
+  if (titreStatutId) {
+    titre.statutId = titreStatutId
+  }
+
+  if (etapeTypeId) {
+    titre.demarches![0]!.etapes![0]!.id = `${titreId}-demarche-id-${etapeTypeId}`
+    titre.demarches![0]!.etapes![0]!.typeId = etapeTypeId
+  }
+
+  return titre
+}
+
+const resultBuild = (scenario: IAdministrationTitreTypeTest) => {
+  const titre = {
+    id: scenario.titreId,
+    modification: true,
+    demarches: [
+      {
+        id: `${scenario.titreId}-demarche-id`,
+        modification: true,
+        etapes: [
+          {
+            id: `${scenario.titreId}-demarche-id-etape-id`,
+            modification: true
+          }
+        ]
+      }
+    ]
+  } as ITitre
+
+  if (scenario.cible! === 'titre') {
+    // on retire les démarches
+    delete titre.demarches
+
+    if (scenario.pouvoir) {
+      if (scenario.action === 'voir') {
+        // on teste juste la visibilité, on retire la 'modification'
+        delete titre.modification
+      } else if (scenario.action === 'modifier') {
+        // on garde l'id et la modification à true
+      } else {
+        // todo : gérer la création
+      }
+    } else {
+      if (scenario.action === 'voir') {
+        // tout le titre est null
+        return null
+      } else if (scenario.action === 'modifier') {
+        titre.modification = null
+      } else {
+        // todo : gérer la création
+      }
+    }
+  } else if (scenario.cible! === 'demarche') {
+    // on retire la modification sur le titre
+    delete titre.modification
+    // on retire les étapes
+    delete titre.demarches![0]!.etapes
+    if (scenario.pouvoir) {
+      if (scenario.action === 'voir') {
+        // on teste juste la visibilité, on retire la 'modification'
+        delete titre.demarches![0]!.modification
+      } else if (scenario.action === 'modifier') {
+        // on garde l'id et la modification à true
+      } else {
+        // todo : gérer la création
+      }
+    } else {
+      if (scenario.action === 'voir') {
+        // les démarches sont vides
+        titre.demarches = []
+      } else if (scenario.action === 'modifier') {
+        titre.demarches![0]!.modification = null
+      } else {
+        // todo : gérer la création
+      }
+    }
+  } else if (scenario.cible! === 'etape') {
+    // on retire la modification sur le titre
+    delete titre.modification
+    // on retire la modification sur les démarches
+    delete titre.demarches![0]!.modification
+    // l'id de l'étape contient le type d"étape s'il est indiqué
+    if (scenario.etapeTypeId!) {
+      titre!.demarches![0]!.etapes![0]!.id = `${scenario.titreId}-demarche-id-${scenario.etapeTypeId}`
+    }
+
+    if (scenario.pouvoir) {
+      if (scenario.action === 'voir') {
+        // on teste juste la visibilité, on retire la 'modification'
+        delete titre.demarches![0]!.etapes![0]!.modification
+      } else if (scenario.action === 'modifier') {
+        // on garde l'id et la modification à true
+      } else {
+        // todo : gérer la création
+      }
+    } else {
+      if (scenario.action === 'voir') {
+        // les étapes sont vides
+        titre.demarches![0]!.etapes = []
+      } else if (scenario.action === 'modifier') {
+        titre.demarches![0]!.etapes![0]!.modification = null
+      } else if (scenario.action === 'rien') {
+        titre.demarches![0]!.etapes = []
+      } else {
+        // todo : gérer la création
+      }
+    }
+  }
+
+  return titre
+}
+
+const scenariosBuild = (administrations: IAdministration[]) => {
+  const administrationsTests = administrationsTestsBuild(administrations)
+
+  return administrationsTests.map(t => {
+    const administration = administrations.find(
+      a => a.id === t.administrationId
+    ) as IAdministration
+
+    return [
+      messageBuild(t),
+      administration,
+      titreBuild(t, administration),
+      resultBuild(t)
+    ]
+  }) as IAdministrationTitreTypeTestFormatted[]
+}
+
+export { scenariosBuild }
diff --git a/tests/_utils/administrations.ts b/tests/_utils/administrations.ts
new file mode 100644
index 0000000000000000000000000000000000000000..af0cb3b61585f80e40eefa9c2df88eeaa49cd572
--- /dev/null
+++ b/tests/_utils/administrations.ts
@@ -0,0 +1,148 @@
+/* eslint-disable camelcase */
+import {
+  IAdministration,
+  IAdministrationTitreType,
+  IAdministrationTitreTypeEtapeType,
+  IAdministrationTitreTypeTitreStatut,
+  IEtapeType,
+  ITitreStatut,
+  ITitreType
+} from '../../src/types'
+
+import { readFileSync } from 'fs'
+import { join } from 'path'
+
+interface ISources {
+  administrations: {
+    path: string
+    data: IAdministration[]
+  }
+  titresTypes: {
+    path: string
+    data: ITitreType[]
+  }
+  titresStatuts: { path: string; data: ITitreStatut[] }
+  administrations__titresTypes: {
+    path: string
+    data: IAdministrationTitreType[]
+  }
+  administrations__titresTypes__titresStatuts: {
+    path: string
+    data: IAdministrationTitreTypeTitreStatut[]
+  }
+  administrations__titresTypes__etapesTypes: {
+    path: string
+    data: IAdministrationTitreTypeEtapeType[]
+  }
+  etapesTypes: { path: string; data: IEtapeType[] }
+}
+
+const sources = {
+  administrations: { path: '../../sources/administrations.json', data: [] },
+  titresTypes: { path: '../../sources/titres-types.json', data: [] },
+  titresStatuts: { path: '../../sources/titres-statuts.json', data: [] },
+  administrations__titresTypes: {
+    path: '../../sources/administrations--titres-types.json',
+    data: []
+  },
+  administrations__titresTypes__titresStatuts: {
+    path: '../../sources/administrations--titres-types--titres-statuts.json',
+    data: []
+  },
+  administrations__titresTypes__etapesTypes: {
+    path: '../../sources/administrations--titres-types--etapes-types.json',
+    data: []
+  },
+  etapesTypes: { path: '../../sources/etapes-types.json', data: [] }
+} as ISources
+
+const readFile = (filePath: string) =>
+  JSON.parse(readFileSync(join(__dirname, filePath)).toString())
+
+type ITruc = IObject | IObject[] | any
+
+interface IObject {
+  [key: string]: ITruc
+}
+
+// convertit les clés en camel-case
+const jsonKeysCaseChange = (val: ITruc): ITruc => {
+  if (typeof val !== 'object') {
+    return val
+  }
+
+  if (Array.isArray(val)) {
+    return val.map(jsonKeysCaseChange)
+  }
+
+  return objectKeysCaseChange(val)
+}
+
+const objectKeysCaseChange = (obj: IObject) =>
+  Object.fromEntries(
+    Object.entries(obj).map(([key, val]) => [
+      key.replace(/_(.)/g, g => g[1].toUpperCase()),
+      jsonKeysCaseChange(val)
+    ])
+  )
+
+Object.keys(sources).forEach(name => {
+  const element = sources[name as keyof ISources]
+
+  element.data = jsonKeysCaseChange(readFile(element.path))
+})
+
+const administrationsWithRelations = sources.administrations.data.map(
+  (a: IAdministration) => {
+    a.titresTypes = sources.administrations__titresTypes.data
+      .filter(att => att.administrationId === a.id)
+      .map(att => {
+        const titreType = sources.titresTypes.data.find(
+          tt => att.titreTypeId === tt.id
+        )! as ITitreType & IAdministrationTitreType
+
+        titreType.administrationId = att.administrationId
+        titreType.titreTypeId = att.titreTypeId
+
+        if (att.associee) {
+          titreType.associee = true
+        }
+
+        if (att.gestionnaire) {
+          titreType.gestionnaire = true
+        }
+
+        return titreType
+      })
+
+    a.titresTypesTitresStatuts = sources.administrations__titresTypes__titresStatuts.data
+      .filter(attts => attts.administrationId === a.id)
+      .map(attts => {
+        attts.titreType = sources.titresTypes.data.find(
+          tt => tt.id === attts.titreTypeId
+        )
+        attts.titreStatut = sources.titresStatuts.data.find(
+          ts => ts.id === attts.titreStatutId
+        )
+
+        return attts
+      })
+
+    a.titresTypesEtapesTypes = sources.administrations__titresTypes__etapesTypes.data
+      .filter(attet => attet.administrationId === a.id)
+      .map(attet => {
+        attet.titreType = sources.titresTypes.data.find(
+          tt => tt.id === attet.titreTypeId
+        )
+        attet.etapeType = sources.etapesTypes.data.find(
+          te => te.id === attet.etapeTypeId
+        )
+
+        return attet
+      })
+
+    return a
+  }
+)
+
+export { administrationsWithRelations }
diff --git a/tests/_utils.ts b/tests/_utils/index.ts
similarity index 90%
rename from tests/_utils.ts
rename to tests/_utils/index.ts
index fed875e15709f11e8d25cb1b7c28d329ad1d95fd..3d2c085cbe15a80dfbd87919033fdd46f2d8a84f 100644
--- a/tests/_utils.ts
+++ b/tests/_utils/index.ts
@@ -7,17 +7,17 @@ import {
   Index,
   IPermissionId,
   IUtilisateur
-} from '../src/types'
+} from '../../src/types'
 import * as request from 'supertest'
-import { app } from './init'
+import { app } from '../init'
 import {
   utilisateurCreate,
   utilisateurGet
-} from '../src/database/queries/utilisateurs'
+} from '../../src/database/queries/utilisateurs'
 
 const queryImport = (nom: string) =>
   fs
-    .readFileSync(path.join(__dirname, `./queries/${nom}.graphql`))
+    .readFileSync(path.join(__dirname, `../queries/${nom}.graphql`))
     // important pour transformer le buffer en string
     .toString()
 
diff --git a/tests/administration.test.ts b/tests/administration.test.ts
index d3252074b929237d3791c73623509f7b06f17e14..4dc2a40b10d739a28dad250f74f224867948816e 100644
--- a/tests/administration.test.ts
+++ b/tests/administration.test.ts
@@ -1,7 +1,7 @@
 import 'dotenv/config'
 
 import { dbManager } from './init'
-import { graphQLCall, queryImport } from './_utils'
+import { graphQLCall, queryImport } from './_utils/index'
 
 import { administrationsUpsert } from '../src/database/queries/administrations'
 
diff --git a/tests/administrations-permissions.test.ts b/tests/administrations-permissions.test.ts
new file mode 100644
index 0000000000000000000000000000000000000000..41f0ef308cc16f4d184d9bc825814279bc8c58ab
--- /dev/null
+++ b/tests/administrations-permissions.test.ts
@@ -0,0 +1,40 @@
+import 'dotenv/config'
+
+import { dbManager } from './init'
+import { graphQLCall, queryImport } from './_utils/index'
+import { scenariosBuild } from './_utils/administrations-permissions'
+import { administrationsWithRelations } from './_utils/administrations'
+import { titreCreate } from '../src/database/queries/titres'
+
+console.info = jest.fn()
+console.error = jest.fn()
+
+beforeAll(async () => {
+  await dbManager.populateDb()
+})
+
+afterAll(async () => {
+  await dbManager.truncateDb()
+  dbManager.closeKnex()
+})
+
+describe('permissions des administrations', () => {
+  const scenarios = scenariosBuild(
+    administrationsWithRelations.filter(a => a.id === 'ope-onf-973-01')
+  )
+  const titreQuery = queryImport('titre')
+
+  test.each(scenarios)('%s', async (message, administration, titre, result) => {
+    await titreCreate(titre, {}, 'super')
+
+    const res = await graphQLCall(
+      titreQuery,
+      { id: titre.id },
+      'admin',
+      administration
+    )
+
+    expect(res.body.data.titre).toMatchObject(result)
+    expect(res.body.errors).toBeUndefined()
+  })
+})
diff --git a/tests/documents.test.ts b/tests/documents.test.ts
index 6ebb8a49bb5261eb7a6347a409d9e509f3a5eccc..9608d94fe34c2addc7adc77a31db42e21d70c5d1 100644
--- a/tests/documents.test.ts
+++ b/tests/documents.test.ts
@@ -1,7 +1,7 @@
 import 'dotenv/config'
 
 import { dbManager } from './init'
-import { graphQLCall, queryImport } from './_utils'
+import { graphQLCall, queryImport } from './_utils/index'
 import { IPermissionId, ITitreEtapeJustificatif } from '../src/types'
 import { documentCreate, documentGet } from '../src/database/queries/documents'
 import { entrepriseUpsert } from '../src/database/queries/entreprises'
diff --git a/tests/entreprises.test.ts b/tests/entreprises.test.ts
index 98a30536b9d412c22565c1267103e4b2941c12dd..9a2ee74f7e1e3f1844c55e1784e8861853929a5e 100644
--- a/tests/entreprises.test.ts
+++ b/tests/entreprises.test.ts
@@ -1,7 +1,7 @@
 import 'dotenv/config'
 
 import { dbManager } from './init'
-import { graphQLCall, queryImport } from './_utils'
+import { graphQLCall, queryImport } from './_utils/index'
 import { mocked } from 'ts-jest/utils'
 import {
   entreprisesEtablissementsFetch,
diff --git a/tests/metas.test.ts b/tests/metas.test.ts
index 97d161fa9bb390a1b8f5038fd072a72c1846e99f..24506834eb75ee1633893520ca4787195d2869fd 100644
--- a/tests/metas.test.ts
+++ b/tests/metas.test.ts
@@ -1,7 +1,7 @@
 import 'dotenv/config'
 
 import { dbManager } from './init'
-import { graphQLCall, queryImport } from './_utils'
+import { graphQLCall, queryImport } from './_utils/index'
 
 console.info = jest.fn()
 console.error = jest.fn()
diff --git a/tests/queries/titre.graphql b/tests/queries/titre.graphql
index 76933ec146e629b07390083ab9c78979c8a77571..e15ed868fd9acd33c0c4f63115995978414bbda8 100644
--- a/tests/queries/titre.graphql
+++ b/tests/queries/titre.graphql
@@ -72,6 +72,7 @@ fragment titre on Titre {
   activites {
     ...activite
   }
+  modification
 }
 
 fragment activite on Activite {
@@ -118,6 +119,7 @@ fragment demarche on Demarche {
   etapes {
     ...etape
   }
+  modification
 }
 
 fragment etape on Etape {
@@ -159,6 +161,7 @@ fragment etape on Etape {
   documents {
     ...document
   }
+  modification
 }
 
 fragment administration on Administration {
diff --git a/tests/titres-demarches.test.ts b/tests/titres-demarches.test.ts
index eef79850aa202e7b53d4b0900d4a5a0b8cfbaf2c..cfe08da175d6927ecd39129911e18987277915e0 100644
--- a/tests/titres-demarches.test.ts
+++ b/tests/titres-demarches.test.ts
@@ -1,7 +1,7 @@
 import 'dotenv/config'
 
 import { dbManager } from './init'
-import { graphQLCall, queryImport } from './_utils'
+import { graphQLCall, queryImport } from './_utils/index'
 import { titreCreate } from '../src/database/queries/titres'
 import { administrations } from './__mocks__/administrations'
 import { titreEtapeUpsert } from '../src/database/queries/titres-etapes'
diff --git a/tests/titres-etapes-creer.test.ts b/tests/titres-etapes-creer.test.ts
index 2960f0f4f5b41ef414cd7b7b90544b54f1db55d7..452e5031531784507ae390c38771924b6b2db10f 100644
--- a/tests/titres-etapes-creer.test.ts
+++ b/tests/titres-etapes-creer.test.ts
@@ -1,7 +1,7 @@
 import 'dotenv/config'
 
 import { dbManager } from './init'
-import { graphQLCall, queryImport } from './_utils'
+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'
diff --git a/tests/titres-etapes-modifier.test.ts b/tests/titres-etapes-modifier.test.ts
index 76bdbc74acbb3b429923f5e7f12b4d0067c45528..69a99ea7cce0ef96121f0b1f8788d2788656e50c 100644
--- a/tests/titres-etapes-modifier.test.ts
+++ b/tests/titres-etapes-modifier.test.ts
@@ -1,7 +1,7 @@
 import 'dotenv/config'
 
 import { dbManager } from './init'
-import { graphQLCall, queryImport } from './_utils'
+import { graphQLCall, queryImport } from './_utils/index'
 import { administrations } from './__mocks__/administrations'
 import { titreDemarcheCreate } from '../src/database/queries/titres-demarches'
 import { titreCreate } from '../src/database/queries/titres'
diff --git a/tests/titres.test.ts b/tests/titres.test.ts
index 0e5d6cc7aaaf48c8d0df561138d3115b8579cf5c..a6376e5ea208f29ddfd3fb80e9f3307b31a964c3 100644
--- a/tests/titres.test.ts
+++ b/tests/titres.test.ts
@@ -1,7 +1,7 @@
 import 'dotenv/config'
 
 import { dbManager } from './init'
-import { graphQLCall, queryImport } from './_utils'
+import { graphQLCall, queryImport } from './_utils/index'
 import { administrations } from './__mocks__/administrations'
 import {
   titreWithActiviteGrp,
diff --git a/tests/token.test.ts b/tests/token.test.ts
index 0f51047ec8987d9a5ad329f42e64314bcaaada68..c7ae3f3c3ca22aac4ed7d80b9600d4f9e28f104a 100644
--- a/tests/token.test.ts
+++ b/tests/token.test.ts
@@ -1,7 +1,7 @@
 import 'dotenv/config'
 
 import { dbManager } from './init'
-import { graphQLCall, queryImport } from './_utils'
+import { graphQLCall, queryImport } from './_utils/index'
 import Utilisateurs from '../src/database/models/utilisateurs'
 import * as jwt from 'jsonwebtoken'
 
diff --git a/tests/utilisateurs.test.ts b/tests/utilisateurs.test.ts
index bcd39fe6ed88118a75feb51795ff7199ef62f7df..8c76c59623b5b96d2bdb622be6f137868e867d81 100644
--- a/tests/utilisateurs.test.ts
+++ b/tests/utilisateurs.test.ts
@@ -1,7 +1,7 @@
 import 'dotenv/config'
 
 import { knex, dbManager, app } from './init'
-import { graphQLCall, queryImport, tokenCreate } from './_utils'
+import { graphQLCall, queryImport, tokenCreate } from './_utils/index'
 import * as userAdd from '../knex/user-add'
 import * as request from 'supertest'
 import * as jwt from 'jsonwebtoken'
diff --git a/tsconfig.json b/tsconfig.json
index a18a74f24f4f1dd4d098c3d79df84fd15887c659..e294aa165febd490c75d43b522963cfe2ac4d2d9 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -18,7 +18,7 @@
     "target": "ES2017",
     "types": ["node", "jest"]
   },
-  "exclude": ["node_modules", "**/*.spec.ts", "**/*.test.ts", "**/__mocks__/*"],
+  "exclude": ["node_modules", "**/*.test.ts", "**/__mocks__/*"],
   "include": ["src/**/*"],
   "typedocOptions": {
     "mode": "modules",