From 1f7a5a32e5584135b196feb9a347dc1a6df77112 Mon Sep 17 00:00:00 2001
From: Bastien DUMONT <bdumont@grandlyon.com>
Date: Tue, 8 Oct 2024 14:49:09 +0000
Subject: [PATCH] chore(lint): enable more rules & fix exhaustive switch cases

---
 .eslintrc.js                                  |  6 +++++
 src/components/FluidChart/FluidChart.tsx      |  2 ++
 src/components/Loader/Loader.tsx              | 25 +++++++++++--------
 .../PartnerIssue/PartnerIssueModal.tsx        | 16 +++---------
 src/migrations/migration.ts                   |  2 ++
 src/services/queryRunner.service.ts           |  2 ++
 src/services/quiz.service.ts                  |  4 +++
 src/utils/utils.spec.ts                       | 16 ++++++++++++
 src/utils/utils.ts                            | 13 ++++++++++
 9 files changed, 64 insertions(+), 22 deletions(-)

diff --git a/.eslintrc.js b/.eslintrc.js
index e4f98e3f8..de9c35b0a 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -31,6 +31,12 @@ module.exports = {
         '@typescript-eslint/no-var-requires': 'off',
         '@typescript-eslint/no-unnecessary-type-assertion': 'error',
 
+        '@typescript-eslint/default-param-last': 'error',
+        '@typescript-eslint/prefer-for-of': 'warn',
+        '@typescript-eslint/prefer-includes': 'error',
+        '@typescript-eslint/prefer-string-starts-ends-with': 'error',
+        '@typescript-eslint/switch-exhaustiveness-check': 'error',
+
         // causes a build error and has a lot of effects on components
         '@typescript-eslint/prefer-nullish-coalescing': 'off',
 
diff --git a/src/components/FluidChart/FluidChart.tsx b/src/components/FluidChart/FluidChart.tsx
index 1f8002966..50da25f22 100644
--- a/src/components/FluidChart/FluidChart.tsx
+++ b/src/components/FluidChart/FluidChart.tsx
@@ -112,6 +112,8 @@ const FluidChart = ({ fluidType }: { fluidType: FluidType }) => {
       case FluidType.WATER:
         dispatch(setShowOfflineData(false))
         break
+      default:
+        throw new Error('Unexpected fluid type')
     }
   }
 
diff --git a/src/components/Loader/Loader.tsx b/src/components/Loader/Loader.tsx
index 2b9a41a68..b39445ec6 100644
--- a/src/components/Loader/Loader.tsx
+++ b/src/components/Loader/Loader.tsx
@@ -18,16 +18,21 @@ const Loader = ({ color = 'gold', fluidType, text }: LoaderProps) => {
   const { t } = useI18n()
   let variant = color
 
-  switch (fluidType) {
-    case FluidType.ELECTRICITY:
-      variant = 'elec'
-      break
-    case FluidType.GAS:
-      variant = 'gaz'
-      break
-    case FluidType.WATER:
-      variant = 'water'
-      break
+  if (fluidType !== undefined) {
+    switch (fluidType) {
+      case FluidType.ELECTRICITY:
+        variant = 'elec'
+        break
+      case FluidType.GAS:
+        variant = 'gaz'
+        break
+      case FluidType.WATER:
+        variant = 'water'
+        break
+      case FluidType.MULTIFLUID:
+        variant = 'gold'
+        break
+    }
   }
 
   return (
diff --git a/src/components/PartnerIssue/PartnerIssueModal.tsx b/src/components/PartnerIssue/PartnerIssueModal.tsx
index 3d8540225..1e295b293 100644
--- a/src/components/PartnerIssue/PartnerIssueModal.tsx
+++ b/src/components/PartnerIssue/PartnerIssueModal.tsx
@@ -7,6 +7,7 @@ import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
 import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType } from 'enums'
 import React from 'react'
+import { getFluidLabel } from 'utils/utils'
 import './partnerIssueModal.scss'
 
 interface PartnerIssueModalProps {
@@ -22,17 +23,6 @@ const PartnerIssueModal = ({
 }: PartnerIssueModalProps) => {
   const { t } = useI18n()
 
-  const getFluidTypeLabel = () => {
-    switch (issuedFluid) {
-      case FluidType.ELECTRICITY:
-        return 'elec'
-      case FluidType.WATER:
-        return 'water'
-      case FluidType.GAS:
-        return 'gaz'
-    }
-  }
-
   return (
     <Dialog
       open={open}
@@ -66,7 +56,9 @@ const PartnerIssueModal = ({
           className="partner-issue-content text-16-normal"
           dangerouslySetInnerHTML={{
             __html: t(
-              `consumption.partner_issue_modal.error_connect_${getFluidTypeLabel()}`
+              `consumption.partner_issue_modal.error_connect_${getFluidLabel(
+                issuedFluid
+              )}`
             ),
           }}
         />
diff --git a/src/migrations/migration.ts b/src/migrations/migration.ts
index e79d15e30..0e0dea00c 100644
--- a/src/migrations/migration.ts
+++ b/src/migrations/migration.ts
@@ -167,6 +167,8 @@ export async function migrate(
       }
 
       switch (result.type) {
+        case MIGRATION_RESULT_FAILED:
+          throw new Error('Migration failed')
         case MIGRATION_RESULT_NOOP:
         case MIGRATION_RESULT_COMPLETE:
           await updateSchemaVersion(_client, migration.targetSchemaVersion)
diff --git a/src/services/queryRunner.service.ts b/src/services/queryRunner.service.ts
index 441f4a27a..efd0abdeb 100644
--- a/src/services/queryRunner.service.ts
+++ b/src/services/queryRunner.service.ts
@@ -250,6 +250,8 @@ export default class QueryRunner {
           },
         }
         break
+      case TimeStep.HOUR:
+        throw new Error('Unexpected time step')
     }
     return predicate
   }
diff --git a/src/services/quiz.service.ts b/src/services/quiz.service.ts
index 6dac376e5..cde3563d4 100644
--- a/src/services/quiz.service.ts
+++ b/src/services/quiz.service.ts
@@ -347,6 +347,10 @@ export default class QuizService {
     let endTime = today
     const isPeriod = Object.keys(period).length !== 0
     switch (interval) {
+      case TimeStep.HALF_AN_HOUR:
+      case TimeStep.HOUR:
+      case TimeStep.DAY:
+        throw new Error('Unexpected time step')
       case TimeStep.WEEK:
         startTime = isPeriod
           ? DateTime.fromObject(period).startOf('week')
diff --git a/src/utils/utils.spec.ts b/src/utils/utils.spec.ts
index 64a349dda..6bd4fe0f0 100644
--- a/src/utils/utils.spec.ts
+++ b/src/utils/utils.spec.ts
@@ -13,6 +13,7 @@ import {
   formatOffPeakHours,
   formatTwoDigits,
   getChallengeTitleWithLineReturn,
+  getFluidLabel,
   getFluidName,
   getFluidTypeTranslation,
   getFluidUnit,
@@ -262,6 +263,21 @@ describe('utils test', () => {
     })
   })
 
+  describe('getFluidLabel', () => {
+    it('should return elec', () => {
+      expect(getFluidLabel(FluidType.ELECTRICITY)).toBe('elec')
+    })
+    it('should return gas', () => {
+      expect(getFluidLabel(FluidType.GAS)).toBe('gaz')
+    })
+    it('should return water', () => {
+      expect(getFluidLabel(FluidType.WATER)).toBe('water')
+    })
+    it('should return multi', () => {
+      expect(getFluidLabel(FluidType.MULTIFLUID)).toBe('multi')
+    })
+  })
+
   describe('formatListWithAnd', () => {
     it('should return empty string', () => {
       expect(formatListWithAnd([])).toBe('')
diff --git a/src/utils/utils.ts b/src/utils/utils.ts
index 10ce560ca..a2336f765 100644
--- a/src/utils/utils.ts
+++ b/src/utils/utils.ts
@@ -64,6 +64,19 @@ export const getPartnerKey = (fluidType: FluidType) => {
   }
 }
 
+export const getFluidLabel = (fluidType: FluidType) => {
+  switch (fluidType) {
+    case FluidType.ELECTRICITY:
+      return 'elec'
+    case FluidType.GAS:
+      return 'gaz'
+    case FluidType.WATER:
+      return 'water'
+    case FluidType.MULTIFLUID:
+      return 'multi'
+  }
+}
+
 export function getKonnectorUpdateError(type: string) {
   switch (type.toUpperCase()) {
     case 'USER_ACTION_NEEDED.OAUTH_OUTDATED':
-- 
GitLab