Vincent GUFFON 3 лет назад
Родитель
Сommit
eb21224db9

+ 2 - 3
components/Ui/Form.vue

@@ -106,8 +106,7 @@ export default defineComponent({
   },
   setup(props) {
     const {$dataPersister, store, app: {router, i18n}} = useContext()
-    const {markAsDirty, markAsNotDirty, readonly} = useForm(store)
-    const nextStepFactory = new UseNextStepFactory()
+    const {markAsDirty, markAsNotDirty, readonly, nextStepFactory} = useForm(store)
     const {id, query}: ToRefs = toRefs(props)
     const page = new Page(store)
     const form:Ref<any> = ref(null)
@@ -158,7 +157,7 @@ export default defineComponent({
 
     const nextStep = (next: string|null, response: AnyJson) =>{
       if(next === null) return
-      nextStepFactory.invoke(props.submitActions[next], response)[next]()
+      nextStepFactory(props.submitActions[next], response, router)[next]()
     }
 
     const showDialog: ComputedRef<boolean> = computed(() => {

+ 39 - 1
composables/form/useForm.ts

@@ -1,5 +1,7 @@
-import { AnyStore } from '~/types/interfaces'
+import {AnyJson, AnyStore} from '~/types/interfaces'
 import {computed, ComputedRef} from "@nuxtjs/composition-api";
+import {Route} from "vue-router";
+import {FORM_STATUS, SUBMIT_TYPE} from "~/types/enums";
 
 /**
  * @category composables/form
@@ -34,9 +36,45 @@ export function useForm(store: AnyStore){
     }
   }
 
+  /**
+   * Action Sauvegarder qui redirige vers la page d'edit si on est en mode create
+   * @param route
+   * @param id
+   * @param router
+   */
+  function save(route: Route, id: number, router: any){
+    if(store.state.form.formStatus === FORM_STATUS.CREATE){
+      route.path += id
+      router.push(route)
+    }
+  }
+
+  /**
+   * Action sauvegarder et route suivante qui redirige vers une route
+   * @param route
+   * @param router
+   */
+  function saveAndGoTo(route: Route, router: any){
+    router.push(route)
+  }
+
+  /**
+   * Factory des fonction permettant d'assurer l'étape suivant à la soumission d'un formulaire
+   * @param args
+   * @param response
+   * @param router
+   */
+  function nextStepFactory(args: any, response: AnyJson, router: any){
+    const factory: AnyJson = {}
+    factory[SUBMIT_TYPE.SAVE] = () => save(args, response.id, router)
+    factory[SUBMIT_TYPE.SAVE_AND_BACK] = () => saveAndGoTo(args, router)
+    return factory
+  }
+
   return {
     markAsDirty,
     markAsNotDirty,
+    nextStepFactory,
     readonly
   }
 }

+ 0 - 51
composables/form/useNextStepFactory.ts

@@ -1,51 +0,0 @@
-import {FORM_STATUS, SUBMIT_TYPE} from "~/types/enums";
-import {useContext} from "@nuxtjs/composition-api";
-import {Store} from "vuex";
-import {AnyJson} from "~/types/interfaces";
-import {Route} from "vue-router";
-
-/**
- * @category composables/form
- * @class UseNextStepFactory
- * Use Classe pour gérer actions post submit
- */
-export default class UseNextStepFactory{
-  private store: Store<any>
-  private router: any
-
-  constructor() {
-    const {store, app: {router}} = useContext()
-
-    this.store = store
-    this.router = router
-  }
-
-
-  invoke(args: any, response: AnyJson){
-    const factory: AnyJson = {}
-    factory[SUBMIT_TYPE.SAVE] = () => this.save(args, response.id)
-    factory[SUBMIT_TYPE.SAVE_AND_BACK] = () => this.saveAndGoTo(args)
-
-    return factory
-  }
-
-  /**
-   * Action Sauvegarder qui redirige vers la page d'edit si on est en mode create
-   * @param route
-   * @param id
-   */
-  save(route: Route, id: number){
-    if(this.store.state.form.formStatus === FORM_STATUS.CREATE){
-      route.path += id
-      this.router.push(route)
-    }
-  }
-
-  /**
-   * Action sauvegarder et route suivante qui redirige vers une route
-   * @param route
-   */
-  saveAndGoTo(route: Route){
-    this.router.push(route)
-  }
-}

+ 11 - 9
composables/form/useValidator.ts

@@ -1,27 +1,28 @@
 import { ref, Ref } from '@nuxtjs/composition-api'
 import VueI18n from 'vue-i18n'
 import { QUERY_TYPE } from '~/types/enums'
-import { DataManager } from '~/types/interfaces'
+import DataProvider from "~/services/data/dataProvider";
 
 /**
  * @category composables/form
- * @class UseValidator
- * Use Classe pour des utils de verifications
+ * Composable pour des utils de verifications
  */
-class UseValidator {
+export function useValidator($dataProvider: DataProvider, i18n: VueI18n) {
+
   /**
    * Use méthode fournissant une fonction pour tester la validité d'un Siret ainsi que la gestion du message d'erreur
    */
-  public static useHandleSiret (i18n: VueI18n, $dataManager: DataManager) {
+  function useHandleSiret() {
     const siretError: Ref<boolean> = ref(false)
     const siretErrorMessage: Ref<string> = ref('')
 
     const checkSiret = async (siret: string) => {
-      const response = await $dataManager.invoke({
+      const response = await $dataProvider.invoke({
         type: QUERY_TYPE.DEFAULT,
         url: '/api/siret-checking',
         id: siret
       })
+
       if (typeof response !== 'undefined') {
         siretError.value = !response.isCorrect
         siretErrorMessage.value = response.isCorrect ? '' : i18n.t('siret_error') as string
@@ -30,13 +31,14 @@ class UseValidator {
         siretErrorMessage.value = ''
       }
     }
-
     return {
       siretError,
       siretErrorMessage,
       checkSiret
     }
   }
-}
 
-export default UseValidator
+  return {
+    useHandleSiret
+  }
+}

+ 2 - 3
pages/organization/index.vue

@@ -454,7 +454,7 @@ import { OrganizationAddressPostal } from '~/models/Organization/OrganizationAdd
 import { ContactPoint } from '~/models/Core/ContactPoint'
 import { BankAccount } from '~/models/Core/BankAccount'
 import { repositoryHelper } from '~/services/store/repository'
-import UseValidator from '~/composables/form/useValidator'
+import {useValidator} from "~/composables/form/useValidator";
 import {useNavigationHelpers} from '~/composables/form/useNavigationHelpers'
 import I18N from '~/services/utils/i18n'
 import {Country} from "~/models/Core/Country";
@@ -469,12 +469,11 @@ export default defineComponent({
     const { store, app: { i18n }, $dataProvider, route } = useContext()
     const {typeOfPractices, fetchState:typeOfPracticesFetchingState} = useTypeOfPracticeProvider($dataProvider)
     const { panel } = useNavigationHelpers(route)
+    const { siretError, siretErrorMessage, checkSiret } = useValidator($dataProvider, i18n).useHandleSiret()
 
     const organizationProfile = reactive($organizationProfile(store))
     const id: number = store.state.profile.organization.id
 
-    const { siretError, siretErrorMessage, checkSiret } = UseValidator.useHandleSiret(i18n, $dataProvider)
-
     const checkSiretHook = async (siret: string, field: string, updateRepository: any) => {
       await checkSiret(siret)
       if (!siretError.value) { updateRepository(siret, field) }

+ 3 - 3
tests/unit/composables/data/useAccessesProvider.spec.ts

@@ -1,12 +1,12 @@
 import DataProvider from "~/services/data/dataProvider";
 import {useAccessesProvider} from "~/composables/data/useAccessesProvider";
+jest.mock('~/services/data/dataProvider')
 
 let useMyAccessesProviderMount:any
 const dataproviderMock = DataProvider as jest.Mocked<typeof DataProvider>
-const dataproviderMockInstance = new dataproviderMock()
 
 beforeAll(() => {
-  useMyAccessesProviderMount = useAccessesProvider(dataproviderMockInstance)
+  useMyAccessesProviderMount = useAccessesProvider(dataproviderMock.prototype)
 })
 
 describe('getPhysicalByFullName()', () => {
@@ -16,7 +16,7 @@ describe('getPhysicalByFullName()', () => {
   })
 
   it('should return an array of results if there is research param', async () => {
-    dataproviderMockInstance.invoke = jest.fn().mockReturnValue({data:['foo bar']})
+    dataproviderMock.prototype.invoke = jest.fn().mockReturnValue({data:['foo bar']})
     const result = await useMyAccessesProviderMount.getPhysicalByFullName('foo bar')
     expect(result).toStrictEqual(['foo bar'])
   })

+ 4 - 5
tests/unit/composables/data/useAddressPostalUtils.spec.ts

@@ -1,13 +1,12 @@
 import DataProvider from "~/services/data/dataProvider";
 import {useAddressPostalUtils} from "~/composables/data/useAddressPostalUtils";
+jest.mock('~/services/data/dataProvider')
 
 let useAddressPostalUtilsMount:any
 const dataproviderMock = DataProvider as jest.Mocked<typeof DataProvider>
-const dataproviderMockInstance = new dataproviderMock()
-
 
 beforeAll(() => {
-  useAddressPostalUtilsMount = useAddressPostalUtils(dataproviderMockInstance)
+  useAddressPostalUtilsMount = useAddressPostalUtils(dataproviderMock.prototype)
 })
 
 describe('searchFunction()', () => {
@@ -34,7 +33,7 @@ describe('searchFunction()', () => {
   })
 
   it('should return response with default postcode value', async () => {
-    dataproviderMockInstance.invoke = jest.fn().mockReturnValue(apiResponse)
+    dataproviderMock.prototype.invoke = jest.fn().mockReturnValue(apiResponse)
     const result = await useAddressPostalUtilsMount.searchFunction('foo', 'postalCode')
     expect(result).toStrictEqual([
       {id: 0, postcode: 'foo', city: null},
@@ -44,7 +43,7 @@ describe('searchFunction()', () => {
   })
 
   it('should return response with default city value', async () => {
-    dataproviderMockInstance.invoke = jest.fn().mockReturnValue(apiResponse)
+    dataproviderMock.prototype.invoke = jest.fn().mockReturnValue(apiResponse)
     const resultCity = await useAddressPostalUtilsMount.searchFunction('foo', 'addressPostal.addressCity')
     expect(resultCity).toStrictEqual([
       {id: 0, postcode: null, city: 'foo'},

+ 3 - 3
tests/unit/composables/data/useDataUtils.spec.ts

@@ -3,14 +3,14 @@ import {useDataUtils} from "~/composables/data/useDataUtils";
 import {Organization} from "~/models/Organization/Organization";
 import {Ref, ref} from "@nuxtjs/composition-api";
 import {mountComposition} from "~/tests/unit/Helpers";
+jest.mock('~/services/data/dataProvider')
+
 
 let useDataUtilsMount:any
 const dataproviderMock = DataProvider as jest.Mocked<typeof DataProvider>
-const dataproviderMockInstance = new dataproviderMock()
-
 
 beforeAll(() => {
-  useDataUtilsMount = useDataUtils(dataproviderMockInstance)
+  useDataUtilsMount = useDataUtils(dataproviderMock.prototype)
 })
 
 describe('getItemToEdit()', () => {

+ 4 - 1
tests/unit/composables/data/useMyProfile.spec.ts

@@ -6,9 +6,12 @@ import { repositoryHelper } from '~/services/store/repository'
 import {$accessProfile} from "~/services/profile/accessProfile";
 import {_exportedForTesting} from "~/composables/data/useMyProfile"
 import DataPersister from "~/services/data/dataPersister";
+jest.mock('~/services/data/dataPersister')
+
 let store:AnyStore
 let useMyProfileMount:any
 let repositoryHelperMock = repositoryHelper as jest.Mocked<typeof repositoryHelper>
+const DataPersisterMock = DataPersister as jest.Mocked<typeof DataPersister>
 
 beforeAll(() => {
   store = createStore()
@@ -21,7 +24,7 @@ beforeAll(() => {
   $accessProfileMock.getCurrentAccessId = jest.fn().mockReturnValue(1)
   repositoryHelperMock.findItemFromModel = jest.fn()
 
-  useMyProfileMount = useMyProfile(new DataPersister(), store)
+  useMyProfileMount = useMyProfile(DataPersisterMock.prototype, store)
 })
 
 describe('setActivityYear()', () => {

+ 34 - 0
tests/unit/composables/form/useForm.spec.ts

@@ -2,6 +2,8 @@ import {createStore, initLocalVue, mountComposition} from '~/tests/unit/Helpers'
 import { form } from '~/tests/unit/fixture/state/profile'
 import {useForm} from "~/composables/form/useForm";
 import { AnyStore } from '~/types/interfaces'
+import {FORM_STATUS, SUBMIT_TYPE} from "~/types/enums";
+import {Route} from "vue-router";
 
 let store: AnyStore
 let useFormMount:any
@@ -29,3 +31,35 @@ describe('markAsNotDirty()', () => {
     expect(store.state.form.dirty).toBeFalsy()
   })
 })
+
+describe('nextStepFactory()', () => {
+  const route: Route = {
+    path: 'ma_route',
+    hash: 'hash',
+    query: {},
+    params: {},
+    fullPath: 'ma_route',
+    matched: []
+  }
+
+  it('should push the new route when the action is save and back', async () => {
+    const router: any = []
+    useFormMount.nextStepFactory(route, {}, router)[SUBMIT_TYPE.SAVE_AND_BACK]()
+    expect(router).toHaveLength(1)
+  })
+
+  it('should dont push the new route when the action is save and the form is EDIT', async () => {
+    store.commit('form/setFormStatus', FORM_STATUS.EDIT)
+    const router: any = []
+    useFormMount.nextStepFactory(route, {}, router)[SUBMIT_TYPE.SAVE]()
+    expect(router).toHaveLength(0)
+  })
+
+  it('should push the new route when the action is save and the form is CREATE', async () => {
+    store.commit('form/setFormStatus', FORM_STATUS.CREATE)
+    const router: any = []
+    useFormMount.nextStepFactory(route, {}, router)[SUBMIT_TYPE.SAVE]()
+    expect(router).toHaveLength(1)
+  })
+})
+

+ 11 - 6
tests/unit/composables/form/useValidator.spec.ts

@@ -1,11 +1,16 @@
 import VueI18n from 'vue-i18n'
-import UseValidator from '~/composables/form/useValidator'
+import {useValidator} from '~/composables/form/useValidator'
 import DataProvider from '~/services/data/dataProvider'
-
 jest.mock('~/services/data/dataProvider')
+
+let useValidatorMount:any
 const DataProviderMock = DataProvider as jest.MockedClass<typeof DataProvider>
 const VueI18nMock = VueI18n as jest.MockedClass<typeof VueI18n>
 
+beforeAll(() => {
+  useValidatorMount = useValidator(DataProviderMock.prototype, VueI18nMock.prototype)
+})
+
 describe('useHandleSiret()', () => {
   beforeEach(() => {
     // Efface toutes les instances et les appels au constructeur et à toutes les méthodes :
@@ -13,14 +18,14 @@ describe('useHandleSiret()', () => {
   })
 
   it('should init 3 parameters correctly', async () => {
-    const siretResponse = UseValidator.useHandleSiret(VueI18nMock.prototype, DataProviderMock.prototype)
+    const siretResponse = useValidatorMount.useHandleSiret()
     expect(siretResponse.siretErrorMessage.value).toEqual('')
     expect(siretResponse.siretError.value).toBeFalsy()
     expect(siretResponse.checkSiret).toBeDefined()
   })
 
   it('should update parameters if Siret is correct', async () => {
-    const siretResponse = UseValidator.useHandleSiret(VueI18nMock.prototype, DataProviderMock.prototype)
+    const siretResponse = useValidatorMount.useHandleSiret()
     DataProviderMock.prototype.invoke.mockImplementation(async () => {
       return { isCorrect: true }
     })
@@ -30,7 +35,7 @@ describe('useHandleSiret()', () => {
   })
 
   it('should update parameters if Siret is not correct', async () => {
-    const siretResponse = UseValidator.useHandleSiret(VueI18nMock.prototype, DataProviderMock.prototype)
+    const siretResponse = useValidatorMount.useHandleSiret()
     DataProviderMock.prototype.invoke.mockImplementation(async () => {
       return { isCorrect: false }
     })
@@ -41,7 +46,7 @@ describe('useHandleSiret()', () => {
   })
 
   it('should update parameters if there is no response during the check siret', async () => {
-    const siretResponse = UseValidator.useHandleSiret(VueI18nMock.prototype, DataProviderMock.prototype)
+    const siretResponse = useValidatorMount.useHandleSiret()
     DataProviderMock.prototype.invoke.mockImplementation(jest.fn())
     await siretResponse.checkSiret('123456')
     expect(siretResponse.siretErrorMessage.value).toEqual('')