浏览代码

test compression algorithm

tripeur 4 年之前
父节点
当前提交
e19e3a9724
共有 5 个文件被更改,包括 1548 次插入2 次删除
  1. 7 0
      jest.config.js
  2. 5 1
      package.json
  3. 43 0
      src/utils/Compression.ts
  4. 1491 0
      src/utils/__tests__/Compressions.test.ts
  5. 2 1
      tsconfig.json

+ 7 - 0
jest.config.js

@@ -0,0 +1,7 @@
+module.exports = {
+  rootDir: "src",
+  testMatch: ["**/__tests__/**/*.+(ts|tsx|js)", "**/?(*.)+(spec|test).+(ts|tsx|js)"],
+  transform: {
+    "^.+\\.(ts|tsx)$": "ts-jest",
+  },
+};

+ 5 - 1
package.json

@@ -8,6 +8,7 @@
     "build": "vue-cli-service build",
     "lint": "vue-cli-service lint"
   },
+  "test": "jest",
   "dependencies": {
     "dayjs": "^1.10.4",
     "fuse.js": "^6.4.6",
@@ -27,6 +28,7 @@
     "vuex": "^4.0.0"
   },
   "devDependencies": {
+    "@types/jest": "^26.0.24",
     "@types/lodash": "^4.14.168",
     "@types/lodash-es": "^4.17.4",
     "@types/marked": "^2.0.3",
@@ -47,13 +49,15 @@
     "eslint": "^6.7.2",
     "eslint-plugin-prettier": "^3.3.1",
     "eslint-plugin-vue": "^7.0.0",
+    "jest": "^27.0.6",
     "node-sass": "^6.0.1",
     "postcss": "^8.3.0",
     "prettier": "^2.2.1",
     "sass": "^1.32.8",
     "sass-loader": "^10.1.1",
+    "ts-jest": "^27.0.4",
     "tslib": "^2.2.0",
-    "typescript": "~4.1.5",
+    "typescript": "^4.1.6",
     "webpack-bundle-analyzer": "^4.4.1"
   },
   "eslintConfig": {

+ 43 - 0
src/utils/Compression.ts

@@ -107,3 +107,46 @@ export function zipEncode(str: string): string {
 export function decodeUnzip(str: string): string {
   return ungzip(base64ToBytes(str), { to: "string" });
 }
+
+export type CompressedArray<T> = {
+  k: Array<keyof T>;
+  v: Array<Array<T[keyof T]>>;
+};
+
+export function compressArray<T>(arr: Array<T>): CompressedArray<T> {
+  if (arr.length == 0) {
+    return { k: [], v: [] };
+  }
+  const elt = arr[0];
+  const keys = Object.keys(elt) as Array<keyof T>;
+
+  return { k: keys, v: arr.map((o) => keys.map((k) => o[k])) };
+}
+
+export function restoreArray<T>(obj: CompressedArray<T>): Array<T> {
+  return obj.v.map((a) => {
+    const o: Partial<T> = {};
+    obj.k.forEach((k, i) => (o[k] = a[i]));
+    return o as T;
+  });
+}
+
+export function compressArrayZipEncode<T>(obj: T): string {
+  const temp: Partial<T> = {};
+  Object.entries(obj).forEach((kv) => {
+    const v = kv[1];
+    temp[kv[0] as keyof T] = Array.isArray(v) ? compressArray(v) : v;
+  });
+  return zipEncode(JSON.stringify(temp));
+}
+
+export function decodeUnzipRestoreArray<T>(str: string): T {
+  const obj = JSON.parse(decodeUnzip(str));
+  Object.keys(obj).forEach((k) => {
+    const v = obj[k];
+    if (typeof v == "object" && v && "k" in v && "v" in v) {
+      obj[k] = restoreArray(v);
+    }
+  });
+  return obj as T;
+}

+ 1491 - 0
src/utils/__tests__/Compressions.test.ts

@@ -0,0 +1,1491 @@
+import { BenevoleJSON } from "@/models/Benevole";
+import { ICompetence } from "@/models/Competence";
+import { CreneauJSON } from "@/models/Creneau";
+import { EvenementStateJSON } from "@/store/State";
+import { RessourceJSON } from "jc-timeline";
+import {
+  compressArray,
+  compressArrayZipEncode,
+  decodeUnzip,
+  decodeUnzipRestoreArray,
+  restoreArray,
+  zipEncode,
+} from "../Compression";
+
+const o: EvenementStateJSON = {
+  evenement: {
+    name: "BDLG 2021 azezere",
+    uuid: "9ac8c653-1cf3-4bef-b669-363c906a68e2",
+    start: "2021-09-10T14:00:00.000Z",
+    end: "2021-09-12T15:59:59.999Z",
+  },
+  competences: [
+    {
+      id: 1,
+      name: "Bar",
+      description:
+        "Afin d'abreuver le public nous avons besoin d'une équipe d'une dizaine de personne qui savent se servir de tireuse, ont la fibre commercial et rendent la monnaie efficacement.",
+      isPreference: true,
+      isTeachable: true,
+    },
+    {
+      id: 2,
+      name: "Bouffe",
+      description:
+        "Afin de préparer le repas pour les 100 bénévoles et musiciens on a besoin de toi.\nSi tu aimes faire à manger n'hésite pas à rejoindre notre équipe.",
+      isPreference: true,
+      isTeachable: true,
+    },
+    {
+      id: 3,
+      name: "Gros bras",
+      description:
+        "Pour la manutention des décors et des équipements de la logistique on a besoin de personne qui n'ont pas peur de mettre leur corps d'athlète révélé pendant le confinement à contribution.",
+      isPreference: true,
+      isTeachable: true,
+    },
+    {
+      id: 4,
+      name: "Permis de conduire",
+      description:
+        "Afin de conduire les camions qui servent à transporter le matériel et la nourriture nous avons besoin de personne disposant d'un permis de conduire B.",
+      isPreference: false,
+      isTeachable: false,
+    },
+    {
+      id: 5,
+      name: "Lève tôt",
+      description:
+        "On a besoin de toi dès le matin, alors est tu près à te sortir du lit dès 9h pour lancer le départ du week-end",
+      isPreference: true,
+      isTeachable: false,
+    },
+    {
+      id: 6,
+      name: "Couche tard",
+      description:
+        "Afin de préparer au mieux la salle pour le réveille de tes camarades tu es prés à passer une soirée de folie puis à donner un coup de main pour ranger et passer un coup de balai vers 4-5h. \nPromis on ne fera appel à toi que pour une des deux soirées pour que tu puisse encore plus profiter.",
+      isPreference: true,
+      isTeachable: false,
+    },
+    {
+      id: 7,
+      name: "Fanfaron",
+      description: "Joues tu d'un instrument dans une fanfare?",
+      isPreference: false,
+      isTeachable: false,
+    },
+    {
+      id: 8,
+      name: "Parité Homme",
+      description:
+        "Certaines tâches doivent être réalisées en pair de sexe opposé. comme par exemple le nettoyage des sanitaires.",
+      isPreference: false,
+      isTeachable: false,
+    },
+    {
+      id: 9,
+      name: "Parité Femme",
+      description:
+        "Certaines tâches doivent être réalisées en pair de sexe opposé. comme par exemple le nettoyage des sanitaires.",
+      isPreference: false,
+      isTeachable: false,
+    },
+    {
+      id: 10,
+      name: "Dodo Durante Vendredi soir",
+      description: "",
+      isPreference: false,
+      isTeachable: false,
+    },
+    {
+      id: 11,
+      name: "Dodo durante Samedi",
+      description: "",
+      isPreference: false,
+      isTeachable: false,
+    },
+    {
+      id: 12,
+      name: "Animateur",
+      description:
+        "Tu aime animer des ateliers d’éveil avec les enfants. alors ce rôle est fait pour toi",
+      isPreference: false,
+      isTeachable: false,
+    },
+    {
+      id: 13,
+      name: "Fanfare Dead Paquito",
+      description: "",
+      isPreference: false,
+      isTeachable: false,
+    },
+    {
+      id: 14,
+      name: "Fanfare Mécanique des cuivres",
+      description: "",
+      isPreference: false,
+      isTeachable: false,
+    },
+    {
+      id: 15,
+      name: "Fanfare Trous balourds",
+      description: "",
+      isPreference: false,
+      isTeachable: false,
+    },
+    {
+      id: 16,
+      name: "Fanfare Gimmick 5 Syndicate",
+      description: "",
+      isPreference: false,
+      isTeachable: false,
+    },
+    {
+      id: 18,
+      name: "Montage lumière et éléctrique",
+      description:
+        "Afin de ne pas jouer dans le noir, nous comptons sur toi qui s'est y faire avec les câbles électriques et les conversions de Watt en lumen.",
+      isPreference: true,
+      isTeachable: false,
+    },
+  ],
+  benevoles: [
+    {
+      id: 1,
+      name: "Benevole Deuxième",
+      surname: "H",
+      phone: "",
+      email: "",
+      comment: "",
+      isFixed: false,
+      competenceIdList: [1, 3, 8],
+    },
+    {
+      id: 2,
+      name: "Benevole Premier",
+      surname: "H",
+      phone: "",
+      email: "",
+      comment: "",
+      isFixed: false,
+      competenceIdList: [1, 8],
+    },
+    {
+      id: 3,
+      name: "Troisième Bénévole",
+      surname: "F",
+      phone: "",
+      email: "",
+      comment: "",
+      isFixed: false,
+      competenceIdList: [2, 9],
+    },
+    {
+      id: 4,
+      name: "Quatrième",
+      surname: "Bénévole F",
+      phone: "",
+      email: "",
+      comment: "",
+      isFixed: false,
+      competenceIdList: [9],
+    },
+    {
+      id: 5,
+      name: "Benevole 5",
+      surname: "F",
+      phone: "",
+      email: "",
+      comment: "",
+      isFixed: false,
+      competenceIdList: [9],
+    },
+    {
+      id: 6,
+      name: "Benevole 6 nuit",
+      surname: "F",
+      phone: "",
+      email: "",
+      comment: "",
+      isFixed: false,
+      competenceIdList: [9, 10],
+    },
+    {
+      id: 7,
+      name: "Benevole 7 nuit",
+      surname: "F",
+      phone: "",
+      email: "",
+      comment: "",
+      isFixed: false,
+      competenceIdList: [10],
+    },
+    {
+      id: 8,
+      name: "Benevole 8 nuit",
+      surname: "H",
+      phone: "",
+      email: "",
+      comment: "",
+      isFixed: false,
+      competenceIdList: [8, 10],
+    },
+    {
+      id: 9,
+      name: "Benevole 9 nuit",
+      surname: "H",
+      phone: "",
+      email: "",
+      comment: "",
+      isFixed: false,
+      competenceIdList: [8, 10],
+    },
+    {
+      id: 10,
+      name: "Benevole 10 nuit",
+      surname: "H",
+      phone: "",
+      email: "",
+      comment: "",
+      isFixed: false,
+      competenceIdList: [8, 10],
+    },
+    {
+      id: 11,
+      name: "Benevole 11",
+      surname: " nuit",
+      phone: "",
+      email: "",
+      comment: "",
+      isFixed: false,
+      competenceIdList: [10],
+    },
+    {
+      id: 12,
+      name: "Benevole 12",
+      surname: "nuit",
+      phone: "",
+      email: "",
+      comment: "",
+      isFixed: false,
+      competenceIdList: [10],
+    },
+    {
+      id: 13,
+      name: "Benevole 13",
+      surname: "nuit",
+      phone: "",
+      email: "",
+      comment: "",
+      isFixed: false,
+      competenceIdList: [10],
+    },
+    {
+      id: 14,
+      name: "Benevole 2",
+      surname: "Deap P",
+      phone: "",
+      email: "",
+      comment: "",
+      isFixed: false,
+      competenceIdList: [13],
+    },
+    {
+      id: 15,
+      name: "Benevole 1",
+      surname: "Deap P",
+      phone: "",
+      email: "",
+      comment: "",
+      isFixed: false,
+      competenceIdList: [13],
+    },
+    {
+      id: 16,
+      name: "Clovis",
+      surname: "JAQUIN",
+      phone: "",
+      email: "",
+      comment: "",
+      isFixed: false,
+      competenceIdList: [8],
+    },
+    {
+      id: 17,
+      name: "a",
+      surname: "b",
+      phone: "4",
+      email: "c@free.fr",
+      comment: "Question 2 : undefined",
+      isFixed: false,
+      competenceIdList: [16, 8],
+    },
+    {
+      id: 18,
+      name: "a",
+      surname: "a",
+      phone: "o",
+      email: "a@gt",
+      comment: "Question 2 : undefined",
+      isFixed: false,
+      competenceIdList: [15, 9],
+    },
+    {
+      id: 19,
+      name: "qsd",
+      surname: "sd",
+      phone: "q",
+      email: "qsd",
+      comment: "Question 2 : ",
+      isFixed: false,
+      competenceIdList: [15, 9],
+    },
+    {
+      id: 20,
+      name: "d",
+      surname: "dfh",
+      phone: "dfh",
+      email: "dfg",
+      comment: "Question 2 : ",
+      isFixed: false,
+      competenceIdList: [13, 8],
+    },
+  ],
+  creneaux: [
+    {
+      event: {
+        id: "d5a2ac5f-2e01-422b-8943-0f37c7dec943",
+        start: "2021-09-10T22:00:00.000Z",
+        end: "2021-09-11T03:00:00.000Z",
+        title: "Respo bénévole",
+        ressourceId: "a0e3d3f6-5606-435d-a40f-b5b3c8c31ce6",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 1,
+      maxAttendee: 1,
+      benevoleIdList: [16],
+      competencesIdList: [],
+      description: "",
+      isMeal: false,
+      fixedAttendee: true,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "89404a6d-498b-4a7f-a064-15ddf50a5962",
+        start: "2021-09-10T19:00:00.000Z",
+        end: "2021-09-10T20:00:00.000Z",
+        title: "Dead Paquito",
+        ressourceId: "b3aae647-fdc5-4104-8325-4dc231254423",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 1,
+      maxAttendee: 1,
+      benevoleIdList: [14, 14, 15],
+      competencesIdList: [13],
+      description: "",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "34e3c23a-dc75-487a-8764-79269adf1501",
+        start: "2021-09-10T20:00:00.000Z",
+        end: "2021-09-10T20:30:00.000Z",
+        title: "Bar ephémère",
+        ressourceId: "b0d505a2-6896-4b28-98eb-c80b34f8b8bf",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 2,
+      maxAttendee: 1,
+      benevoleIdList: [10, 15],
+      competencesIdList: [],
+      description:
+        "Les pirates ont besoins de boire pour survivre en mer. Tu sera en charge de sortir les plus merveilleuses bouteilles afin de ravir tes compatriotes. Attention ça ne dure que 30 minutes.",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "1b7a2dde-2c91-4cf7-b885-799fee89fb47",
+        start: "2021-09-10T21:30:00.000Z",
+        end: "2021-09-10T22:00:00.000Z",
+        title: "Bar ephémère 2",
+        ressourceId: "b0d505a2-6896-4b28-98eb-c80b34f8b8bf",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 2,
+      maxAttendee: 1,
+      benevoleIdList: [9, 12],
+      competencesIdList: [],
+      description:
+        "Les pirates ont besoins de boire pour survivre en mer. Tu sera en charge de sortir les plus merveilleuses bouteilles afin de ravir tes compatriotes. Attention ça ne dure que 30 minutes.",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "09fb2e35-6968-4e41-9603-0eb6f5a96ba3",
+        start: "2021-09-10T22:30:00.000Z",
+        end: "2021-09-10T23:00:00.000Z",
+        title: "Bar ephémère 3",
+        ressourceId: "b0d505a2-6896-4b28-98eb-c80b34f8b8bf",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 2,
+      maxAttendee: 1,
+      benevoleIdList: [15, 16],
+      competencesIdList: [],
+      description:
+        "Les pirates ont besoins de boire pour survivre en mer. Tu sera en charge de sortir les plus merveilleuses bouteilles afin de ravir tes compatriotes. Attention ça ne dure que 30 minutes.",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "481f7e6a-d836-4543-b86a-6371d551661e",
+        start: "2021-09-10T16:30:00.000Z",
+        end: "2021-09-10T23:30:00.000Z",
+        title: "Respo durante vendredi",
+        ressourceId: "b353cfcb-381b-4241-95ba-ccc60e75f147",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 1,
+      maxAttendee: 1,
+      benevoleIdList: [8],
+      competencesIdList: [],
+      description: "Est en charge de supervisé tout les activités de la soirée du vendredi",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "8dec2d15-7ce3-49cb-8dff-db5b83634c04",
+        start: "2021-09-10T15:00:00.000Z",
+        end: "2021-09-10T17:00:00.000Z",
+        title: "Installation",
+        ressourceId: "5da4540e-87b4-4907-9327-7fb150bd0ffc",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 2,
+      maxAttendee: 3,
+      benevoleIdList: [2, 1],
+      competencesIdList: [],
+      description:
+        "Votre rôle sera d’accueillir les invitées et les bénévoles. de leur données leur précieux vers et de leur expliqué quelques éléments de fonctionnement de la soirée",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "fd149bda-f285-40ed-b3e4-5f65eab77c96",
+        start: "2021-09-10T22:00:00.000Z",
+        end: "2021-09-10T23:00:00.000Z",
+        title: "Bar durante",
+        ressourceId: "267bf058-83a4-4f3d-a0b8-3854b91ef24c",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 2,
+      maxAttendee: 2,
+      benevoleIdList: [3, 4],
+      competencesIdList: [],
+      description:
+        "Il faut s'assurer que les fûts ne sont pas vide et ravitailler le bar quand des bouteilles sont vides",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "b6f060fb-58d4-4835-a5b3-5930611d7342",
+        start: "2021-09-10T19:00:00.000Z",
+        end: "2021-09-10T20:00:00.000Z",
+        title: "Accueil durante",
+        ressourceId: "5da4540e-87b4-4907-9327-7fb150bd0ffc",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 2,
+      maxAttendee: 2,
+      benevoleIdList: [3, 13],
+      competencesIdList: [],
+      description:
+        "Votre rôle sera d’accueillir les invitées et les bénévoles. de leur données leur précieux vers et de leur expliqué quelques éléments de fonctionnement de la soirée",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "42d04d78-01f6-4e43-bff4-83a0d965bd2a",
+        start: "2021-09-10T18:00:00.000Z",
+        end: "2021-09-10T19:00:00.000Z",
+        title: "Accueil durante",
+        ressourceId: "5da4540e-87b4-4907-9327-7fb150bd0ffc",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 2,
+      maxAttendee: 2,
+      benevoleIdList: [3, 11],
+      competencesIdList: [],
+      description:
+        "Votre rôle sera d’accueillir les invitées et les bénévoles. de leur données leur précieux vers et de leur expliqué quelques éléments de fonctionnement de la soirée",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "a5f66ca9-5dfc-4b70-a29a-9ff84cf3f101",
+        start: "2021-09-10T20:00:00.000Z",
+        end: "2021-09-10T21:00:00.000Z",
+        title: "Install Gymnase",
+        ressourceId: "5da4540e-87b4-4907-9327-7fb150bd0ffc",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 2,
+      maxAttendee: 6,
+      benevoleIdList: [12, 4, 7, 1, 13, 11],
+      competencesIdList: [],
+      description:
+        "Afin que nos hôtes puissent dormir dans les meilleurs conditions tu iras préparer le lieu de repos.\nDu gonflage de matelas en perspective mais ne t'inquiète pas des gonfleurs seront mis à ta disposition pour que tu garde ton souffle pour la musique",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "4dc264ce-3d55-4ccd-9c01-2d243a9790fd",
+        start: "2021-09-10T22:00:00.000Z",
+        end: "2021-09-10T23:00:00.000Z",
+        title: "Navette Gymnase",
+        ressourceId: "5da4540e-87b4-4907-9327-7fb150bd0ffc",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 2,
+      maxAttendee: 2,
+      benevoleIdList: [11, 7],
+      competencesIdList: [10],
+      description:
+        "Afin de ne pas perdre nos invités tu les accompagneras sur le chemin entre la salle de la Durante et le gymnase",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "ab39cb81-df89-4abe-8342-c52db917ddcf",
+        start: "2021-09-10T23:00:00.000Z",
+        end: "2021-09-11T00:00:00.000Z",
+        title: "Navette Gymnase",
+        ressourceId: "5da4540e-87b4-4907-9327-7fb150bd0ffc",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 2,
+      maxAttendee: 2,
+      benevoleIdList: [9, 13],
+      competencesIdList: [10],
+      description:
+        "Afin de ne pas perdre nos invités tu les accompagneras sur le chemin entre la salle de la Durante et le gymnase",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "161b13fb-b27b-457b-a36e-642a8acc830a",
+        start: "2021-09-11T00:00:00.000Z",
+        end: "2021-09-11T01:00:00.000Z",
+        title: " Gymnase",
+        ressourceId: "5da4540e-87b4-4907-9327-7fb150bd0ffc",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 2,
+      maxAttendee: 2,
+      benevoleIdList: [7, 9],
+      competencesIdList: [10],
+      description:
+        "Afin de ne pas perdre nos invités tu les accompagneras sur le chemin entre la salle de la Durante et le gymnase",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "87104804-92d9-4cd3-8f47-d7ae23b9a66e",
+        start: "2021-09-10T17:00:00.000Z",
+        end: "2021-09-10T18:00:00.000Z",
+        title: "Accueil durante",
+        ressourceId: "5da4540e-87b4-4907-9327-7fb150bd0ffc",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 2,
+      maxAttendee: 2,
+      benevoleIdList: [14, 4],
+      competencesIdList: [],
+      description:
+        "Votre rôle sera d’accueillir les invitées et les bénévoles. de leur données leur précieux vers et de leur expliqué quelques éléments de fonctionnement de la soirée",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "6eac6fa2-6abc-463f-8e75-c66b75bf23dc",
+        start: "2021-09-10T20:00:00.000Z",
+        end: "2021-09-10T21:00:00.000Z",
+        title: " Bar durante",
+        ressourceId: "267bf058-83a4-4f3d-a0b8-3854b91ef24c",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 2,
+      maxAttendee: 2,
+      benevoleIdList: [5, 9],
+      competencesIdList: [],
+      description:
+        "Il faut s'assurer que les fûts ne sont pas vide et ravitailler le bar quand des bouteilles sont vides",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "accd392b-9a67-4aa8-ab3c-21b35d067981",
+        start: "2021-09-10T17:00:00.000Z",
+        end: "2021-09-10T18:00:00.000Z",
+        title: "Bar durante",
+        ressourceId: "267bf058-83a4-4f3d-a0b8-3854b91ef24c",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 2,
+      maxAttendee: 2,
+      benevoleIdList: [5, 15],
+      competencesIdList: [],
+      description:
+        "Il faut s'assurer que les fûts ne sont pas vide et ravitailler le bar quand des bouteilles sont vides",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "8bc9fb8c-037c-4db6-8992-f499b3f1e901",
+        start: "2021-09-10T21:00:00.000Z",
+        end: "2021-09-10T22:00:00.000Z",
+        title: "Bar durante",
+        ressourceId: "267bf058-83a4-4f3d-a0b8-3854b91ef24c",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 2,
+      maxAttendee: 2,
+      benevoleIdList: [10, 15],
+      competencesIdList: [],
+      description:
+        "Il faut s'assurer que les fûts ne sont pas vide et ravitailler le bar quand des bouteilles sont vides",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "6388f6e9-bea7-419c-ad7d-74c4cafee793",
+        start: "2021-09-10T19:00:00.000Z",
+        end: "2021-09-10T20:00:00.000Z",
+        title: "Bar durante",
+        ressourceId: "267bf058-83a4-4f3d-a0b8-3854b91ef24c",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 2,
+      maxAttendee: 2,
+      benevoleIdList: [6, 1],
+      competencesIdList: [],
+      description:
+        "Il faut s'assurer que les fûts ne sont pas vide et ravitailler le bar quand des bouteilles sont vides",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "33c6c6db-6c74-4f61-9d6c-369860b72445",
+        start: "2021-09-10T18:00:00.000Z",
+        end: "2021-09-10T19:00:00.000Z",
+        title: "Bar durante",
+        ressourceId: "267bf058-83a4-4f3d-a0b8-3854b91ef24c",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 2,
+      maxAttendee: 2,
+      benevoleIdList: [10, 7],
+      competencesIdList: [],
+      description:
+        "Il faut s'assurer que les fûts ne sont pas vide et ravitailler le bar quand des bouteilles sont vides",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "44677032-bc1a-417e-9853-9a9c49298487",
+        start: "2021-09-10T23:00:00.000Z",
+        end: "2021-09-11T00:00:00.000Z",
+        title: "Bar durante",
+        ressourceId: "267bf058-83a4-4f3d-a0b8-3854b91ef24c",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 2,
+      maxAttendee: 2,
+      benevoleIdList: [12, 8],
+      competencesIdList: [10],
+      description:
+        "Il faut s'assurer que les fûts ne sont pas vide et ravitailler le bar quand des bouteilles sont vides",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "7cd1ff8d-9cd6-45df-96d9-b790f7ce1cb2",
+        start: "2021-09-11T00:00:00.000Z",
+        end: "2021-09-11T01:00:00.000Z",
+        title: "Bar durante",
+        ressourceId: "267bf058-83a4-4f3d-a0b8-3854b91ef24c",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 2,
+      maxAttendee: 2,
+      benevoleIdList: [13, 11],
+      competencesIdList: [10],
+      description:
+        "Il faut s'assurer que les fûts ne sont pas vide et ravitailler le bar quand des bouteilles sont vides",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "818a6204-1e3f-492c-b1c2-89dd2238c063",
+        start: "2021-09-10T18:00:00.000Z",
+        end: "2021-09-10T19:00:00.000Z",
+        title: "Vaisselle 1",
+        ressourceId: "fc1d5b7b-104a-4b6e-a021-6ad793a1ac2c",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 2,
+      maxAttendee: 2,
+      benevoleIdList: [1, 12],
+      competencesIdList: [],
+      description:
+        "Tu t'assureras que chacun effectueras la vaisselle de son assiette et ses couverts et tu remplacera l'eau si besoin",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "1fa908e8-d7d3-4c07-9b8d-85fe81cc6e3b",
+        start: "2021-09-10T19:00:00.000Z",
+        end: "2021-09-10T20:00:00.000Z",
+        title: "Vaisselle 2",
+        ressourceId: "fc1d5b7b-104a-4b6e-a021-6ad793a1ac2c",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 2,
+      maxAttendee: 2,
+      benevoleIdList: [2, 4],
+      competencesIdList: [],
+      description:
+        "Tu t'assureras que chacun effectueras la vaisselle de son assiette et ses couverts et tu remplacera l'eau si besoin",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "0356733c-4371-4fc2-ba95-60d14fc0df1f",
+        start: "2021-09-10T20:00:00.000Z",
+        end: "2021-09-10T21:00:00.000Z",
+        title: "Vaisselle 3",
+        ressourceId: "fc1d5b7b-104a-4b6e-a021-6ad793a1ac2c",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 2,
+      maxAttendee: 2,
+      benevoleIdList: [6, 14],
+      competencesIdList: [],
+      description:
+        "Tu t'assureras que chacun effectueras la vaisselle de son assiette et ses couverts et tu remplacera l'eau si besoin",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "b62f9124-c570-4396-837f-f008b8557374",
+        start: "2021-09-10T21:00:00.000Z",
+        end: "2021-09-10T22:00:00.000Z",
+        title: "Rangement bouff3",
+        ressourceId: "fc1d5b7b-104a-4b6e-a021-6ad793a1ac2c",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 2,
+      maxAttendee: 2,
+      benevoleIdList: [13, 14],
+      competencesIdList: [],
+      description:
+        "Les gens ayant fini de manger il faut ranger les produits périssable des les frigos et plus si affinités.",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "9a21ac0f-d49f-425d-b8d7-f7720d0014ec",
+        start: "2021-09-10T19:00:00.000Z",
+        end: "2021-09-10T20:00:00.000Z",
+        title: "Hygièniste du petit coin",
+        ressourceId: "d3af29b1-de86-4d47-8071-42bb53b33744",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 1,
+      maxAttendee: 1,
+      benevoleIdList: [5],
+      competencesIdList: [9],
+      description:
+        "Ton rôle est d'assurer que les toilettes reste dans un état descend pendant toute la soirée. Si le besoin se fait sentir un coup de serpillière sera sera nécessaire. ",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "dd7a4172-1385-4834-a24c-24d5e9da35f7",
+        start: "2021-09-10T19:00:00.000Z",
+        end: "2021-09-10T20:00:00.000Z",
+        title: "Hygièniste du petit coin",
+        ressourceId: "d3af29b1-de86-4d47-8071-42bb53b33744",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 1,
+      maxAttendee: 1,
+      benevoleIdList: [9],
+      competencesIdList: [8],
+      description:
+        "Ton rôle est d'assurer que les toilettes reste dans un état descend pendant toute la soirée. Si le besoin se fait sentir un coup de serpillière sera sera nécessaire. ",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "422539fc-7f1b-42d2-a4d6-673142dedd29",
+        start: "2021-09-10T20:00:00.000Z",
+        end: "2021-09-10T21:00:00.000Z",
+        title: "Hygièniste du petit coin",
+        ressourceId: "d3af29b1-de86-4d47-8071-42bb53b33744",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 1,
+      maxAttendee: 1,
+      benevoleIdList: [2],
+      competencesIdList: [8],
+      description:
+        "Ton rôle est d'assurer que les toilettes reste dans un état descend pendant toute la soirée. Si le besoin se fait sentir un coup de serpillière sera sera nécessaire. ",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "6d1bdf9a-d325-4e08-a251-8cd9d659703b",
+        start: "2021-09-10T20:00:00.000Z",
+        end: "2021-09-10T21:00:00.000Z",
+        title: "Hygièniste du petit coin",
+        ressourceId: "d3af29b1-de86-4d47-8071-42bb53b33744",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 1,
+      maxAttendee: 1,
+      benevoleIdList: [3],
+      competencesIdList: [9],
+      description:
+        "Ton rôle est d'assurer que les toilettes reste dans un état descend pendant toute la soirée. Si le besoin se fait sentir un coup de serpillière sera sera nécessaire. ",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "d55e08d9-6344-4663-a2be-685bf4d9195c",
+        start: "2021-09-10T21:00:00.000Z",
+        end: "2021-09-10T22:00:00.000Z",
+        title: "Hygièniste du petit coin",
+        ressourceId: "d3af29b1-de86-4d47-8071-42bb53b33744",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 1,
+      maxAttendee: 1,
+      benevoleIdList: [6],
+      competencesIdList: [9],
+      description:
+        "Ton rôle est d'assurer que les toilettes reste dans un état descend pendant toute la soirée. Si le besoin se fait sentir un coup de serpillière sera sera nécessaire. ",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "b3c08662-8e54-4128-90d1-a3270c711758",
+        start: "2021-09-10T21:00:00.000Z",
+        end: "2021-09-10T22:00:00.000Z",
+        title: "Hygièniste du petit coin",
+        ressourceId: "d3af29b1-de86-4d47-8071-42bb53b33744",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 1,
+      maxAttendee: 1,
+      benevoleIdList: [2],
+      competencesIdList: [8],
+      description:
+        "Ton rôle est d'assurer que les toilettes reste dans un état descend pendant toute la soirée. Si le besoin se fait sentir un coup de serpillière sera sera nécessaire. ",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "c6fa8075-88ec-45a8-bf6c-6ebf4e13c03e",
+        start: "2021-09-10T22:00:00.000Z",
+        end: "2021-09-10T23:00:00.000Z",
+        title: "Hygièniste du petit coin",
+        ressourceId: "d3af29b1-de86-4d47-8071-42bb53b33744",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 1,
+      maxAttendee: 1,
+      benevoleIdList: [1],
+      competencesIdList: [8],
+      description:
+        "Ton rôle est d'assurer que les toilettes reste dans un état descend pendant toute la soirée. Si le besoin se fait sentir un coup de serpillière sera sera nécessaire. ",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "b6d48d2d-f2b1-45e1-b817-78c143652208",
+        start: "2021-09-10T22:00:00.000Z",
+        end: "2021-09-10T23:00:00.000Z",
+        title: "Hygièniste du petit coin",
+        ressourceId: "d3af29b1-de86-4d47-8071-42bb53b33744",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 1,
+      maxAttendee: 1,
+      benevoleIdList: [5],
+      competencesIdList: [9],
+      description:
+        "Ton rôle est d'assurer que les toilettes reste dans un état descend pendant toute la soirée. Si le besoin se fait sentir un coup de serpillière sera sera nécessaire. ",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "d5cea78f-2ae8-4ed1-9754-1228683a9058",
+        start: "2021-09-10T23:00:00.000Z",
+        end: "2021-09-11T00:00:00.000Z",
+        title: "Hygièniste du petit coin",
+        ressourceId: "d3af29b1-de86-4d47-8071-42bb53b33744",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 1,
+      maxAttendee: 1,
+      benevoleIdList: [6],
+      competencesIdList: [9, 10],
+      description:
+        "Ton rôle est d'assurer que les toilettes reste dans un état descend pendant toute la soirée. Si le besoin se fait sentir un coup de serpillière sera sera nécessaire. ",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "de2291a3-32c9-44e9-9e1b-cdf8f64d3dfe",
+        start: "2021-09-10T23:00:00.000Z",
+        end: "2021-09-11T00:00:00.000Z",
+        title: "Hygièniste du petit coin",
+        ressourceId: "d3af29b1-de86-4d47-8071-42bb53b33744",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 1,
+      maxAttendee: 1,
+      benevoleIdList: [10],
+      competencesIdList: [8, 10],
+      description:
+        "Ton rôle est d'assurer que les toilettes reste dans un état descend pendant toute la soirée. Si le besoin se fait sentir un coup de serpillière sera sera nécessaire. ",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "5512c158-70df-462b-9292-538dcf65ec25",
+        start: "2021-09-11T00:00:00.000Z",
+        end: "2021-09-11T01:00:00.000Z",
+        title: "Hygièniste du petit coin",
+        ressourceId: "d3af29b1-de86-4d47-8071-42bb53b33744",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 1,
+      maxAttendee: 1,
+      benevoleIdList: [8],
+      competencesIdList: [8, 10],
+      description:
+        "Ton rôle est d'assurer que les toilettes reste dans un état descend pendant toute la soirée. Si le besoin se fait sentir un coup de serpillière sera sera nécessaire. ",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "950e0902-378b-4437-9233-162b0e2df3e6",
+        start: "2021-09-11T00:00:00.000Z",
+        end: "2021-09-11T01:00:00.000Z",
+        title: "Hygièniste du petit coin",
+        ressourceId: "d3af29b1-de86-4d47-8071-42bb53b33744",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 1,
+      maxAttendee: 1,
+      benevoleIdList: [6],
+      competencesIdList: [9, 10],
+      description:
+        "Ton rôle est d'assurer que les toilettes reste dans un état descend pendant toute la soirée. Si le besoin se fait sentir un coup de serpillière sera sera nécessaire. ",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "5c41a9b8-b2c2-418d-abd3-59150b599ae9",
+        start: "2021-09-11T02:00:00.000Z",
+        end: "2021-09-11T03:00:00.000Z",
+        title: "Rangement durante",
+        ressourceId: "d3af29b1-de86-4d47-8071-42bb53b33744",
+        editable: null,
+        ressourceEditable: null,
+      },
+      penibility: 12,
+      minAttendee: 8,
+      maxAttendee: 8,
+      benevoleIdList: [11, 12, 13, 10, 8, 7, 6, 9],
+      competencesIdList: [10],
+      description:
+        "Bon ce n'est pas tout de faire la fête mais il faudrait ranger maintenant. Avant d'aller te couché un grand rangement s'impose pour que tes camarades puissent attaquer la journée du bon pied demain. \nUn premier coup de balai sera aussi nécessaire.",
+      isMeal: false,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+    {
+      event: {
+        id: "8211ed41-7b4b-4a24-a9d2-19234215ea51",
+        start: "2021-09-11T12:00:00.000Z",
+        end: "2021-09-11T13:00:00.000Z",
+        title: "Repas",
+        ressourceId: "b0d505a2-6896-4b28-98eb-c80b34f8b8bf",
+        editable: null,
+        ressourceEditable: null,
+        bgColor: "gray",
+      },
+      penibility: 12,
+      minAttendee: 1,
+      maxAttendee: 20,
+      benevoleIdList: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
+      competencesIdList: [],
+      description: "",
+      isMeal: true,
+      fixedAttendee: false,
+      location: "",
+      responsableId: -1,
+    },
+  ],
+  creneauGroups: [
+    {
+      id: "a0e3d3f6-5606-435d-a40f-b5b3c8c31ce6",
+      title: "Respo Bénévole",
+      collapseChildren: false,
+      parentId: "",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "e7b556dc-be58-4ed4-9d7f-1b5d6ebaf20a",
+      title: "Bénévolant",
+      collapseChildren: false,
+      parentId: "a0e3d3f6-5606-435d-a40f-b5b3c8c31ce6",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "5459518c-a111-48de-81f8-384a3dba1d94",
+      title: "Respo Bar",
+      collapseChildren: false,
+      parentId: "",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "0fd72ddc-0a74-47cb-8e55-7a39feb2e349",
+      title: "Vaisselle écocups",
+      collapseChildren: false,
+      parentId: "5459518c-a111-48de-81f8-384a3dba1d94",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "2dec935d-268a-481e-ae3e-487582f979cf",
+      title: "Bar 3",
+      collapseChildren: false,
+      parentId: "5459518c-a111-48de-81f8-384a3dba1d94",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "f9d38681-839a-4813-af6d-45a2b9e1791c",
+      title: "Bar 2",
+      collapseChildren: false,
+      parentId: "5459518c-a111-48de-81f8-384a3dba1d94",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "505bae05-c0de-4e63-a16f-0f3cb3e74461",
+      title: "Bar 1",
+      collapseChildren: false,
+      parentId: "5459518c-a111-48de-81f8-384a3dba1d94",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "b3aae647-fdc5-4104-8325-4dc231254423",
+      title: "Fanfare",
+      collapseChildren: false,
+      parentId: "",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "979b6c52-934e-4b2e-a483-8ceb741b0ebf",
+      title: "Poisson Pilote",
+      collapseChildren: false,
+      parentId: "b3aae647-fdc5-4104-8325-4dc231254423",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "b0d505a2-6896-4b28-98eb-c80b34f8b8bf",
+      title: "Respo Bouffe",
+      collapseChildren: false,
+      parentId: "",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "ace45426-addf-4818-a3ba-d3439bab1c15",
+      title: "Vaisselle",
+      collapseChildren: false,
+      parentId: "b0d505a2-6896-4b28-98eb-c80b34f8b8bf",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "cc467fd6-e684-4a60-9124-c1e4565d1506",
+      title: "Fil rouge",
+      collapseChildren: false,
+      parentId: "",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "2301878e-c525-48d7-8fe6-9c10e0176179",
+      title: "Chasse au trésor",
+      collapseChildren: false,
+      parentId: "cc467fd6-e684-4a60-9124-c1e4565d1506",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "b353cfcb-381b-4241-95ba-ccc60e75f147",
+      title: "Respo Durante",
+      collapseChildren: false,
+      parentId: "",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "5da4540e-87b4-4907-9327-7fb150bd0ffc",
+      title: "Installation / Accueil",
+      collapseChildren: false,
+      parentId: "b353cfcb-381b-4241-95ba-ccc60e75f147",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "267bf058-83a4-4f3d-a0b8-3854b91ef24c",
+      title: "Bar ",
+      collapseChildren: false,
+      parentId: "b353cfcb-381b-4241-95ba-ccc60e75f147",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "fc1d5b7b-104a-4b6e-a021-6ad793a1ac2c",
+      title: "Vaisselle / Bouffe",
+      collapseChildren: false,
+      parentId: "b353cfcb-381b-4241-95ba-ccc60e75f147",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "d3af29b1-de86-4d47-8071-42bb53b33744",
+      title: "Nettoyage",
+      collapseChildren: false,
+      parentId: "b353cfcb-381b-4241-95ba-ccc60e75f147",
+      height: 64,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "4e43b00e-5750-43bf-8062-c7c26bbf3007",
+      title: "Jardin des plantes",
+      collapseChildren: false,
+      parentId: "",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "45547345-ec39-498d-b460-7c7001b62719",
+      title: "Respo Deco",
+      collapseChildren: false,
+      parentId: "4e43b00e-5750-43bf-8062-c7c26bbf3007",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "e3579827-cb50-4384-b785-ae59277d667b",
+      title: "Petite main",
+      collapseChildren: false,
+      parentId: "45547345-ec39-498d-b460-7c7001b62719",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "b82eb7eb-e8aa-4f1b-ae55-4c5c4f4cda03",
+      title: "Gros bras",
+      collapseChildren: false,
+      parentId: "45547345-ec39-498d-b460-7c7001b62719",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "3fae4919-376b-499b-8ce5-75a9b9f67265",
+      title: "Respo Logistique",
+      collapseChildren: false,
+      parentId: "4e43b00e-5750-43bf-8062-c7c26bbf3007",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "9777f60c-015c-4222-8185-d5543dbf2bf4",
+      title: "Divers",
+      collapseChildren: false,
+      parentId: "4e43b00e-5750-43bf-8062-c7c26bbf3007",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+    {
+      id: "bc4dc406-b311-49fa-8b0a-279d4a6e5c63",
+      title: "Camion",
+      collapseChildren: false,
+      parentId: "3fae4919-376b-499b-8ce5-75a9b9f67265",
+      height: 32,
+      eventEditable: true,
+      eventRessourceEditable: true,
+    },
+  ],
+};
+
+test("Array compression", () => {
+  Object.values(o).forEach((v) => {
+    if (Array.isArray(v)) {
+      const raw = JSON.stringify(v);
+      const compress = compressArray<ICompetence | BenevoleJSON | CreneauJSON | RessourceJSON>(v);
+      const restore = JSON.stringify(restoreArray(compress));
+      expect(restore).toBe(raw);
+      expect(JSON.stringify(compress).length).toBeLessThan(raw.length);
+    }
+  });
+});
+
+test("Zip b64 compression", () => {
+  const raw = JSON.stringify(o);
+  const compressed = zipEncode(raw);
+  const processed = decodeUnzip(compressed);
+  expect(raw).toBe(processed);
+  expect(raw.length).toBeGreaterThan(compressed.length);
+});
+test("Zip b64 + array compression", () => {
+  const raw = JSON.stringify(o);
+  const zipOnlycompressed = zipEncode(raw);
+  const compressed = compressArrayZipEncode(o);
+  const processed = decodeUnzipRestoreArray(compressed);
+
+  expect(raw).toBe(JSON.stringify(processed));
+  expect(raw.length).toBeGreaterThan(compressed.length);
+  expect(zipOnlycompressed.length).toBeGreaterThan(compressed.length);
+});

+ 2 - 1
tsconfig.json

@@ -13,7 +13,8 @@
     "sourceMap": true,
     "baseUrl": ".",
     "types": [
-      "webpack-env"
+      "webpack-env",
+      "jest"
     ],
     "paths": {
       "@/*": [