diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e6661dbfcc524b436c7a5e8d67ce1f93124ac433..3c12ea75791485aad6dfeb95d44c25b577a73372 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,5 +1,5 @@ default: - image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/node:14.19.3-alpine + image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/node:16.19.1-alpine services: - name: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/docker:20.10.9-dind alias: docker diff --git a/package.json b/package.json index bb2761d794eecab9bb0a5541d3b507faa862424a..884278f061cbc2e7dcb4bd008e1ed45890124718 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "@types/enzyme": "^3.10.8", "@types/file-saver": "^2.0.5", "@types/history": "^5.0.0", - "@types/jest": "^29.0.0", + "@types/jest": "^29.4.0", "@types/lodash": "^4.14.149", "@types/luxon": "^3.0.0", "@types/node-fetch": "^2.5.7", @@ -116,8 +116,8 @@ "eslint-plugin-react-hooks": "^4.2.0", "git-directory-deploy": "1.5.1", "husky": "^8.0.1", - "jest-canvas-mock": "^2.3.0", - "jest-junit": "^14.0.0", + "jest-canvas-mock": "^2.4.0", + "jest-junit": "^15.0.0", "lint-staged": ">=8", "loglevel": "^1.6.6", "luxon": "^3.0.0", diff --git a/src/components/Action/ActionCard.spec.tsx b/src/components/Action/ActionCard.spec.tsx index b91d9de04786fb04148019726bc3c6a397ab8368..db4315c17d86bb499e36897017baa0fe738c1105 100644 --- a/src/components/Action/ActionCard.spec.tsx +++ b/src/components/Action/ActionCard.spec.tsx @@ -1,4 +1,5 @@ import { Button } from '@material-ui/core' +import defaultIcon from 'assets/icons/visu/duel/default.svg' import EcogestureModal from 'components/Ecogesture/EcogestureModal' import { mount } from 'enzyme' import React from 'react' @@ -21,7 +22,8 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { }), } }) -const mockImportIconById = jest.fn() + +const mockImportIconById = jest.fn(() => defaultIcon) jest.mock('utils/utils', () => { return { importIconById: jest.fn(() => { diff --git a/src/components/Action/ActionChoose.spec.tsx b/src/components/Action/ActionChoose.spec.tsx index d1c67697be9abf67bf3f5fc4fad3c55749b509d8..41a5db7fddb76e0eed26fa8cb77650eafe14b6b7 100644 --- a/src/components/Action/ActionChoose.spec.tsx +++ b/src/components/Action/ActionChoose.spec.tsx @@ -17,6 +17,15 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { }), } }) + +const mockGetEcogesturesByIds = jest.fn(() => []) +jest.mock('services/ecogesture.service', () => { + return jest.fn(() => { + return { + getEcogesturesByIds: mockGetEcogesturesByIds, + } + }) +}) const mockStore = configureStore([]) describe('ActionChoose component', () => { diff --git a/src/components/Action/ActionList.spec.tsx b/src/components/Action/ActionList.spec.tsx index 038cc7e91c6719a71b88aa12fa2488bdbe714f83..85516527b9cc7b8cbba8b9bf854dc0f5be14063a 100644 --- a/src/components/Action/ActionList.spec.tsx +++ b/src/components/Action/ActionList.spec.tsx @@ -23,6 +23,16 @@ jest.mock('services/action.service', () => { }) }) +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) + describe('ActionList component', () => { it('should be rendered correctly', () => { mockgetDefaultActions.mockResolvedValueOnce(defaultEcogestureData) diff --git a/src/components/Action/ActionView.spec.tsx b/src/components/Action/ActionView.spec.tsx index d6bd172a6fc807182814ba36a57c93cbf684779b..e10f9778f36aa4950e842de684702d7332c9cbe5 100644 --- a/src/components/Action/ActionView.spec.tsx +++ b/src/components/Action/ActionView.spec.tsx @@ -29,6 +29,7 @@ jest.mock('react-router-dom', () => ({ jest.mock('components/Header/CozyBar', () => 'mock-cozybar') jest.mock('components/Header/Header', () => 'mock-header') jest.mock('components/Content/Content', () => 'mock-content') +jest.mock('components/Action/ActionBegin', () => 'mock-action-begin') const mockStore = configureStore([]) describe('ActionView component', () => { diff --git a/src/components/Analysis/MaxConsumptionCard.spec.tsx b/src/components/Analysis/MaxConsumptionCard.spec.tsx index f5cad1f946cd0de6d4fb192fed62d931a5184364..5a3ac902d1c0823b6692c2953888b9a9626cd28e 100644 --- a/src/components/Analysis/MaxConsumptionCard.spec.tsx +++ b/src/components/Analysis/MaxConsumptionCard.spec.tsx @@ -5,6 +5,7 @@ import React from 'react' import * as reactRedux from 'react-redux' import { Provider } from 'react-redux' import configureStore from 'redux-mock-store' +import mockClient from '../../../tests/__mocks__/client' import { globalStateData } from '../../../tests/__mocks__/globalStateData.mock' import MaxConsumptionCard from './MaxConsumptionCard' @@ -17,6 +18,23 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { }), } }) + +const mockGetMaxLoad = jest.fn(() => 0) +jest.mock('services/consumption.service', () => { + return jest.fn(() => { + return { + getMaxLoad: mockGetMaxLoad, + } + }) +}) +jest.mock('cozy-client', () => { + return { + useClient: jest.fn(() => { + return mockClient + }), + } +}) + const mockStore = configureStore([]) const mockUseSelector = jest.spyOn(reactRedux, 'useSelector') diff --git a/src/components/Analysis/MonthlyAnalysis.spec.tsx b/src/components/Analysis/MonthlyAnalysis.spec.tsx index 21cfb67c11be43c25e72274b0ad9b1fa6c280122..ea7ede3c010c4eb3cd9a501bceb4b6c03706195f 100644 --- a/src/components/Analysis/MonthlyAnalysis.spec.tsx +++ b/src/components/Analysis/MonthlyAnalysis.spec.tsx @@ -1,4 +1,5 @@ import MonthlyAnalysis from 'components/Analysis/MonthlyAnalysis' +import { FluidType } from 'enum/fluid.enum' import { mount } from 'enzyme' import { DateTime } from 'luxon' import React from 'react' @@ -6,7 +7,6 @@ import * as reactRedux from 'react-redux' import { Provider } from 'react-redux' import configureStore from 'redux-mock-store' import { globalStateData } from '../../../tests/__mocks__/globalStateData.mock' -import { userChallengeExplo1OnGoing } from '../../../tests/__mocks__/userChallengeData.mock' jest.mock('cozy-ui/transpiled/react/I18n', () => { return { @@ -17,12 +17,20 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { }), } }) +jest.mock('services/consumption.service') +jest.mock( + 'components/PerformanceIndicator/FluidPerformanceIndicator', + () => 'mock-fluid-performance-indicator' +) + const mockStore = configureStore([]) const mockUseSelector = jest.spyOn(reactRedux, 'useSelector') describe('MonthlyAnalysis component', () => { - mockUseSelector.mockReturnValue(userChallengeExplo1OnGoing) + mockUseSelector.mockReturnValue({ + fluidTypes: [FluidType.ELECTRICITY, FluidType.GAS], + }) it('should be rendered correctly', () => { const store = mockStore({ diff --git a/src/components/Analysis/PieChart.spec.tsx b/src/components/Analysis/PieChart.spec.tsx index 371b1e57c542b68586cae370d9d4268e16db8f87..84bba0ee8718f6d486f76884a1b214e248b027ab 100644 --- a/src/components/Analysis/PieChart.spec.tsx +++ b/src/components/Analysis/PieChart.spec.tsx @@ -17,6 +17,16 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { }), } }) + +const mockGetAllLastPrices = jest.fn() +jest.mock('services/fluidsPrices.service', () => { + return jest.fn(() => { + return { + getAllLastPrices: mockGetAllLastPrices, + } + }) +}) + const mockStore = configureStore([]) describe('PieChart component', () => { diff --git a/src/components/Challenge/ChallengeCardUnlocked.spec.tsx b/src/components/Challenge/ChallengeCardUnlocked.spec.tsx index 3a8dcbb186ec5b0930ac94e722e45bae3d847810..d705c58d051219aff5aecefd1eb41bc1e62b1409 100644 --- a/src/components/Challenge/ChallengeCardUnlocked.spec.tsx +++ b/src/components/Challenge/ChallengeCardUnlocked.spec.tsx @@ -1,8 +1,10 @@ +import defaultIcon from 'assets/icons/visu/challenge/challengeLocked.svg' import { FluidType } from 'enum/fluid.enum' import { mount } from 'enzyme' import React from 'react' import { Provider } from 'react-redux' import configureStore from 'redux-mock-store' +import UsageEventService from 'services/usageEvent.service' import { globalStateData } from '../../../tests/__mocks__/globalStateData.mock' import { userChallengeData } from '../../../tests/__mocks__/userChallengeData.mock' import ChallengeCardUnlocked from './ChallengeCardUnlocked' @@ -26,13 +28,16 @@ jest.mock('services/challenge.service', () => { } }) }) -const mockImportIconById = jest.fn() +const mockImportIconById = jest.fn(() => defaultIcon) jest.mock('utils/utils', () => { return { importIconById: jest.fn(() => mockImportIconById), getChallengeTitleWithLineReturn: jest.fn(() => 'Challenge 1'), } }) +jest.mock('services/usageEvent.service') +const mockAddEvent = jest.fn() +UsageEventService.addEvent = mockAddEvent const mockStore = configureStore([]) diff --git a/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx b/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx index f332cd631c72abc6e3a1e4f54a6a7daf20d5ad74..50dde72a4dac679eee16dd9de80d2c7d6ce737a1 100644 --- a/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx +++ b/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx @@ -25,6 +25,15 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { } }) +const mockGetAllLastPrices = jest.fn() +jest.mock('services/fluidsPrices.service', () => { + return jest.fn(() => { + return { + getAllLastPrices: mockGetAllLastPrices, + } + }) +}) + const mockStore = configureStore([]) const mockChartStateLoaded = { ...mockInitialChartState, loading: false } const emptyDataLoad = { ...baseDataLoad, value: -1 } diff --git a/src/components/ConsumptionVisualizer/EstimatedConsumptionModal.spec.tsx b/src/components/ConsumptionVisualizer/EstimatedConsumptionModal.spec.tsx index 30499b12e2959060c4529a247b2ebed526db0ee4..6c6816dff5e797fce51b7a35c762fe908a279628 100644 --- a/src/components/ConsumptionVisualizer/EstimatedConsumptionModal.spec.tsx +++ b/src/components/ConsumptionVisualizer/EstimatedConsumptionModal.spec.tsx @@ -15,6 +15,15 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { } }) +const mockGetAllLastPrices = jest.fn() +jest.mock('services/fluidsPrices.service', () => { + return jest.fn(() => { + return { + getAllLastPrices: mockGetAllLastPrices, + } + }) +}) + const mockStore = configureStore([]) const mockHandleClose = jest.fn() describe('EstimatedConsumptionModal component', () => { diff --git a/src/components/Duel/DuelUnlocked.spec.tsx b/src/components/Duel/DuelUnlocked.spec.tsx index cbc81c630edb99cb32fdb76bff01414b870abd21..cf155a120faac08c69d2141685bf8e48968b2b42 100644 --- a/src/components/Duel/DuelUnlocked.spec.tsx +++ b/src/components/Duel/DuelUnlocked.spec.tsx @@ -1,4 +1,5 @@ import Button from '@material-ui/core/Button' +import defaultIcon from 'assets/icons/visu/duel/default.svg' import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import DuelUnlocked from 'components/Duel/DuelUnlocked' import { FluidType } from 'enum/fluid.enum' @@ -7,6 +8,7 @@ import { mount } from 'enzyme' import React from 'react' import { Provider } from 'react-redux' import configureStore from 'redux-mock-store' +import UsageEventService from 'services/usageEvent.service' import { formatNumberValues } from 'utils/utils' import { globalStateData } from '../../../tests/__mocks__/globalStateData.mock' import { userChallengeData } from '../../../tests/__mocks__/userChallengeData.mock' @@ -20,7 +22,7 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { }), } }) -const mockImportIconById = jest.fn() +const mockImportIconById = jest.fn(() => defaultIcon) const mockFormatNumberValues = jest.fn() jest.mock('utils/utils', () => { return { @@ -43,9 +45,21 @@ jest.mock('services/challenge.service', () => { }) }) +const mockAddEvent = jest.fn() +jest.mock('services/usageEvent.service') +UsageEventService.addEvent = mockAddEvent + const mockStore = configureStore([]) describe('DuelUnlocked component', () => { + beforeAll(() => { + jest.useFakeTimers() + }) + + afterAll(() => { + jest.useRealTimers() + }) + it('should be rendered correctly', () => { const store = mockStore({ ecolyo: { diff --git a/src/components/Ecogesture/EcogestureEmptyList.tsx b/src/components/Ecogesture/EcogestureEmptyList.tsx index dfeb15139aa0387088e93412481be8f1bb93991b..521cf35fd068c437da07b0ed2be69cd6ea6ba983 100644 --- a/src/components/Ecogesture/EcogestureEmptyList.tsx +++ b/src/components/Ecogesture/EcogestureEmptyList.tsx @@ -53,7 +53,7 @@ const EcogestureEmptyList: React.FC<EcogestureEmptyListProps> = ({ {isSelectionDone && ( <Button - aria-label={t('ecogesture.emptyList.reinit')} + aria-label={t('ecogesture.reinit')} onClick={handleReinitClick} classes={{ root: 'reinit-button btn-profile-next rounded', diff --git a/src/components/Ecogesture/SingleEcogesture.tsx b/src/components/Ecogesture/SingleEcogesture.tsx index 563ed8ca74f5473180c379c32f8b85380ac2a025..ec5c06c56355dd76471d70663579cf2bfa864e80 100644 --- a/src/components/Ecogesture/SingleEcogesture.tsx +++ b/src/components/Ecogesture/SingleEcogesture.tsx @@ -134,13 +134,13 @@ const SingleEcogesture: React.FC = () => { return ( <> <CozyBar - titleKey={t('common.title_ecogesture')} + titleKey={'common.title_ecogesture'} displayBackArrow={true} backFunction={() => navigate('/ecogestures')} /> <Header setHeaderHeight={defineHeaderHeight} - desktopTitleKey={t('common.title_ecogesture')} + desktopTitleKey={'common.title_ecogesture'} displayBackArrow={true} /> <Content height={headerHeight}> diff --git a/src/components/Onboarding/WelcomeModal.spec.tsx b/src/components/Onboarding/WelcomeModal.spec.tsx index 32a1543149d0d63b6b375cae68d5d2e210d3675e..c6ed7950f96f56e6a5ac137545cc20a7a1001dae 100644 --- a/src/components/Onboarding/WelcomeModal.spec.tsx +++ b/src/components/Onboarding/WelcomeModal.spec.tsx @@ -4,6 +4,7 @@ import toJson from 'enzyme-to-json' import React from 'react' import { Provider } from 'react-redux' import configureStore from 'redux-mock-store' +import thunk from 'redux-thunk' import * as profileActions from 'store/profile/profile.actions' import mockClient from '../../../tests/__mocks__/client' import { profileData } from '../../../tests/__mocks__/profileData.mock' @@ -60,8 +61,9 @@ jest.mock('mjml-browser', () => { } }) }) +jest.mock('services/profile.service') -const mockStore = configureStore([]) +const mockStore = configureStore([thunk.withExtraArgument({ mockClient })]) const updateProfileSpy = jest.spyOn(profileActions, 'updateProfile') describe('WelcomeModal component', () => { diff --git a/src/components/Options/exportOptions.spec.tsx b/src/components/Options/exportOptions.spec.tsx index f9248186d09ff934f3b3ca8532afd8beac73aebb..360828b02ce15580dbe5257801d8dc2c1c2ca397 100644 --- a/src/components/Options/exportOptions.spec.tsx +++ b/src/components/Options/exportOptions.spec.tsx @@ -13,12 +13,16 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { }), } }) +const mockGetExportableFluids = jest.fn(() => { + return [] +}) jest.mock('services/consumption.service', () => { return jest.fn(() => { return { fetchAllFirstDateData: jest.fn(() => { return [null, null, null] }), + getExportableFluids: mockGetExportableFluids, } }) }) diff --git a/src/components/ProfileType/ProfileTypeFinished.spec.tsx b/src/components/ProfileType/ProfileTypeFinished.spec.tsx index 9e5393094f4f30c5ef0e3ed5cb8654c2572ea8c9..0b4dda62045cb71531415c19515d58f3d05a7d67 100644 --- a/src/components/ProfileType/ProfileTypeFinished.spec.tsx +++ b/src/components/ProfileType/ProfileTypeFinished.spec.tsx @@ -2,6 +2,7 @@ import { Button } from '@material-ui/core' import { mount } from 'enzyme' import React from 'react' import { Provider } from 'react-redux' +import UsageEventService from 'services/usageEvent.service' import { mockProfileType } from '../../../tests/__mocks__/profileType.mock' import { createMockEcolyoStore } from '../../../tests/__mocks__/store' import ProfileTypeFinished from './ProfileTypeFinished' @@ -24,6 +25,20 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { }), } }) +const mockAddEvent = jest.fn() +jest.mock('services/usageEvent.service') +UsageEventService.addEvent = mockAddEvent + +const mockGetAllProfileTypes = jest.fn() +const mockDeleteProfileTypes = jest.fn() +jest.mock('services/profileTypeEntity.service', () => { + return jest.fn(() => { + return { + getAllProfileTypes: mockGetAllProfileTypes, + deleteProfileTypes: mockDeleteProfileTypes, + } + }) +}) describe('ProfileTypeFinished component', () => { const store = createMockEcolyoStore() diff --git a/src/components/Terms/TermsView.spec.tsx b/src/components/Terms/TermsView.spec.tsx index 015e409851c0a385dfbec77498bde7ab86e96b1b..377c3e49cfb52fea474d0d98cfe63946bbf8c340 100644 --- a/src/components/Terms/TermsView.spec.tsx +++ b/src/components/Terms/TermsView.spec.tsx @@ -20,10 +20,12 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { }) const mockCreateTerm = jest.fn() +const mockGetTermsVersionType = jest.fn() jest.mock('services/terms.service', () => { return jest.fn(() => { return { createTerm: mockCreateTerm, + getTermsVersionType: mockGetTermsVersionType, } }) }) diff --git a/src/migrations/migration.spec.ts b/src/migrations/migration.spec.ts index 925d7af862ace14e120359bbbce7dae571d0227c..25ef2b9aabddf6ec4267c8d568cc080390e2eeb7 100644 --- a/src/migrations/migration.spec.ts +++ b/src/migrations/migration.spec.ts @@ -114,7 +114,9 @@ describe('migration', () => { const result = await migrate(migration, mockClient) expect(result).toEqual({ type: MIGRATION_RESULT_FAILED, - errors: ["TypeError: Cannot read property 'data' of undefined"], + errors: [ + "TypeError: Cannot read properties of undefined (reading 'data')", + ], }) }) diff --git a/yarn.lock b/yarn.lock index ca4d2f7fbcccea50f4ef9752ca13ce6d5a579920..b9f5def0a02167acc632d3bfade469518c031bd8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2807,10 +2807,10 @@ jest-diff "^26.0.0" pretty-format "^26.0.0" -"@types/jest@^29.0.0": - version "29.0.3" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.0.3.tgz#b61a5ed100850686b8d3c5e28e3a1926b2001b59" - integrity sha512-F6ukyCTwbfsEX5F2YmVYmM5TcTHy1q9P5rWlRbrk56KyMh3v9xRGUO3aa8+SkvMi0SHXtASJv1283enXimC0Og== +"@types/jest@^29.4.0": + version "29.4.0" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.4.0.tgz#a8444ad1704493e84dbf07bb05990b275b3b9206" + integrity sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -9835,7 +9835,7 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-canvas-mock@^2.3.0: +jest-canvas-mock@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jest-canvas-mock/-/jest-canvas-mock-2.4.0.tgz#947b71442d7719f8e055decaecdb334809465341" integrity sha512-mmMpZzpmLzn5vepIaHk5HoH3Ka4WykbSoLuG/EKoJd0x0ID/t+INo1l8ByfcUJuDM+RIsL4QDg/gDnBbrj2/IQ== @@ -10023,10 +10023,10 @@ jest-jasmine2@^26.6.3: pretty-format "^26.6.2" throat "^5.0.0" -jest-junit@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-14.0.0.tgz#f69fc31bab32224848f443480c2c808fccb2a802" - integrity sha512-kALvBDegstTROfDGXH71UGD7k5g7593Y1wuX1wpWT+QTYcBbmtuGOA8UlAt56zo/B2eMIOcaOVEON3j0VXVa4g== +jest-junit@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-15.0.0.tgz#a47544ab42e9f8fe7ada56306c218e09e52bd690" + integrity sha512-Z5sVX0Ag3HZdMUnD5DFlG+1gciIFSy7yIVPhOdGUi8YJaI9iLvvBb530gtQL2CHmv0JJeiwRZenr0VrSR7frvg== dependencies: mkdirp "^1.0.4" strip-ansi "^6.0.1"