Browse Source

add unit tests and minor fixes

Olivier Massot 2 years ago
parent
commit
685085c2e4

+ 4 - 4
services/data/apiRequestService.ts

@@ -4,9 +4,8 @@
  * It will send basic http requests and returns raw results
  */
 import {AssociativeArray} from "~/types/data";
-import {$Fetch} from "nitropack";
-import {FetchOptions} from "ohmyfetch";
 import {HTTP_METHOD} from "~/types/enum/data";
+import {$Fetch, FetchOptions} from "ohmyfetch";
 
 class ApiRequestService {
     private readonly fetch: $Fetch
@@ -85,9 +84,9 @@ class ApiRequestService {
      * @param body
      * @param params
      * @param query
-     * @private
+     * @protected
      */
-    private async request(
+    protected async request(
         method: HTTP_METHOD,
         url: string,
         body: string | null = null,
@@ -105,6 +104,7 @@ class ApiRequestService {
             config.body = body
         }
 
+        // @ts-ignore
         return this.fetch(url, config)
     }
 }

+ 2 - 3
services/data/entityManager.ts

@@ -1,8 +1,7 @@
 import ApiRequestService from "./apiRequestService";
 import {Repository, useRepo} from "pinia-orm";
 import UrlUtils from "~/services/utils/urlUtils";
-import ModelNormalizer from "./serializer/normalizer/modelNormalizer";
-import HydraDenormalizer from "./serializer/denormalizer/hydraDenormalizer";
+import HydraDenormalizer from "./normalizer/hydraDenormalizer";
 import ApiModel from "~/models/ApiModel";
 import ApiResource from "~/models/ApiResource";
 import {MyProfile} from "~/models/Access/MyProfile";
@@ -209,7 +208,7 @@ class EntityManager {
         let url = UrlUtils.join('api', model.entity)
         let response
 
-        const data = ModelNormalizer.normalize(entity)
+        const data: any = entity.$toJson()
 
         if (!entity.isNew()) {
             url = UrlUtils.join(url, String(entity.id))

+ 1 - 1
services/data/enumManager.ts

@@ -1,6 +1,6 @@
 import ApiRequestService from "./apiRequestService";
 import UrlUtils from "~/services/utils/urlUtils";
-import HydraDenormalizer from "~/services/data/serializer/denormalizer/hydraDenormalizer";
+import HydraDenormalizer from "~/services/data/normalizer/hydraDenormalizer";
 import {Enum} from "~/types/data.d";
 import {VueI18n} from "vue-i18n";
 

+ 1 - 0
services/data/serializer/normalizer/fileNormalizer.ts → services/data/normalizer/fileNormalizer.ts

@@ -11,6 +11,7 @@ class FileNormalizer {
    * @param file
    */
   public static normalize (data: any, file: string): any {
+    // TODO : intégrer au FileManager
     const fileData = new FormData();
     for(const key in data){
       fileData.set(key, data[key])

+ 7 - 6
services/data/serializer/denormalizer/hydraDenormalizer.ts → services/data/normalizer/hydraDenormalizer.ts

@@ -3,19 +3,20 @@ import UrlUtils from '~/services/utils/urlUtils'
 import {METADATA_TYPE} from '~/types/enum/data'
 
 /**
- * Classe permettant d'assurer la dénormalization d'un objet Hydra en JSON
+ * Normalisation et dé-normalisation ddu format de données Hydra
  */
 class HydraDenormalizer {
+
   /**
-   * Parse une réponse Hydra pour retourner son équivalent en Json
+   * Parse une réponse Hydra et retourne un objet ApiResponse
    *
-   * @param {AnyJson} hydraData
+   * @param {AnyJson} data
    * @return {AnyJson} réponse parsée
    */
-  public static denormalize(hydraData: AnyJson): ApiResponse {
+  public static denormalize(data: AnyJson): ApiResponse {
     return {
-      data: HydraDenormalizer.getData(hydraData),
-      metadata: HydraDenormalizer.getMetadata(hydraData)
+      data: HydraDenormalizer.getData(data),
+      metadata: HydraDenormalizer.getMetadata(data)
     }
   }
 

+ 0 - 21
services/data/serializer/denormalizer/yamlDenormalizer.ts

@@ -1,21 +0,0 @@
-import { read } from 'yaml-import'
-import {dump, load} from 'js-yaml';
-import {AnyJson} from "~/types/data";
-
-
-/**
- * Classe permettant d'assurer la dénormalization d'un fichier JSON en JSON
- */
-class YamlDenormalizer {
-  /**
-   * Parse un fichier Yaml pour en retourner son équivalent en Json
-   *
-   * @param {AnyJson} data
-   * @return {AnyJson}
-   */
-  public static denormalize (data: AnyJson): AnyJson {
-      return load(dump(read(data.path))) as AnyJson
-  }
-}
-
-export default YamlDenormalizer

+ 0 - 17
services/data/serializer/normalizer/modelNormalizer.ts

@@ -1,17 +0,0 @@
-import ApiModel from "~/models/ApiModel";
-
-/**
- * Classe assurant la normalization d'un Model vers un fichier JSON
- */
-class ModelNormalizer {
-  /**
-   * Récupération de l'Item souhaité puis transformation en JSON
-   *
-   * @return {any} réponse
-   * @param subject
-   */
-  public static normalize (subject: ApiModel): any {
-    return subject.$toJson()
-  }
-}
-export default ModelNormalizer

+ 34 - 0
services/encoder/yamlEncoder.ts

@@ -0,0 +1,34 @@
+import {dump, load} from 'js-yaml';
+import {AnyJson} from "~/types/data";
+import {Encoder} from "~/types/interfaces";
+
+/**
+ * Encodage / décodage de données au format Yaml
+ */
+class YamlEncoder implements Encoder {
+  /**
+   * Convertit l'objet suivant au format Yaml
+   *
+   * @param {AnyJson} data
+   * @return {AnyJson}
+   */
+  public encode (data: AnyJson): string {
+      return dump(data)
+  }
+
+  /**
+   * Parse une chaine de caractères au format Yaml et
+   * retourne son équivalent sous forme d'objet
+   *
+   * @param {AnyJson} data
+   * @return {AnyJson}
+   */
+  public decode (data: string): AnyJson | null {
+      if (!data) {
+          return null
+      }
+      return load(data) as AnyJson
+  }
+}
+
+export default new YamlEncoder()

+ 0 - 0
services/rights/abilityUtils.ts


+ 2 - 5
tests/units/services/data/serializer/denormalizer/hydraDenormalizer.spec.ts → tests/units/services/data/normalizer/hydraDenormalizer.test.ts

@@ -1,7 +1,6 @@
-import { describe, test, it, expect, afterEach, vi } from 'vitest'
+import { describe, test, it, expect } from 'vitest'
 import {AnyJson, ApiResponse, HydraMetadata} from "~/types/data";
-import HydraDenormalizer from "~/services/data/serializer/denormalizer/hydraDenormalizer";
-import UrlUtils from "~/services/utils/urlUtils";
+import HydraDenormalizer from "~/services/data/normalizer/hydraDenormalizer";
 import {METADATA_TYPE} from "~/types/enum/data";
 
 class TestableHydraDenormalizer extends HydraDenormalizer {
@@ -10,8 +9,6 @@ class TestableHydraDenormalizer extends HydraDenormalizer {
     public static getMetadata(data: AnyJson): HydraMetadata { return super.getMetadata(data) }
 }
 
-
-
 describe('denormalize', () => {
 
     test('should parse a API Item response and return a JSON Object', () => {

+ 16 - 0
tests/units/services/encoder/yamlDenormalizer.test.ts

@@ -0,0 +1,16 @@
+import {describe, test, expect} from "vitest";
+import YamlEncoder from "~/services/encoder/yamlEncoder";
+import {load} from "js-yaml";
+
+
+describe('decode', () => {
+    test('with empty data', () => {
+        const result = YamlEncoder.decode("")
+
+        expect(result).toBeNull()
+    })
+    test('with data', () => {
+        const result = YamlEncoder.decode(`title:\n a: 1\n b: 2\n c: [foo, bar]`)
+        expect(result).toEqual({title: {a: 1, b: 2, c: ['foo', 'bar']}})
+    })
+})

+ 2 - 1
tsconfig.json

@@ -9,7 +9,8 @@
     "types": [
       "@nuxtjs/date-fns",
       "@nuxt/types",
-      "@nuxtjs/i18n"
+      "@nuxtjs/i18n",
+      "vitest/globals"
     ],
     "exclude": [
       "node_modules",

+ 3 - 6
types/interfaces.d.ts

@@ -61,13 +61,10 @@ interface Processor {
   process(data: AnyJson): Promise<any>
 }
 
-interface Normalizer {
-  normalize(args: DataPersisterArgs): any
+interface Encoder {
+  encode(data: AnyJson): string
+  decode(input: string): AnyJson
 }
-interface Denormalizer {
-  denormalize(data: any): any
-}
-
 interface Historical {
   future: boolean
   past: boolean

+ 1 - 1
vitest.config.ts

@@ -11,5 +11,5 @@ export default defineConfig({
     },
     resolve: {
         alias,
-    },
+    }
 })