diff --git a/package.json b/package.json index 70e176df49541f57ff67edf16646adeb0e8c473c..683a63b2323d0fbbd436cb6f1e83cb17bb5a7be2 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "@babel/preset-typescript": "^7.7.4", "@types/classnames": "^2.2.10", "@types/d3": "^5.7.2", + "@types/enzyme": "^3.10.8", "@types/lodash": "^4.14.149", "@types/luxon": "^1.21.0", "@types/node-fetch": "^2.5.7", diff --git a/src/components/Version/Version.spec.tsx b/src/components/Version/Version.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..be325f3b0248bab39c8b6d0b5b1fd8052ab1a03d --- /dev/null +++ b/src/components/Version/Version.spec.tsx @@ -0,0 +1,25 @@ +'use strict' +/* eslint-env jest */ +import React from 'react' +import { shallow } from 'enzyme' +// import { RecoilRoot } from 'recoil' +import Version from 'components/Version/Version' + +jest.mock('cozy-client', () => { + return { + useClient: jest.fn(() => { + return { + appMetadata: { + version: '0.0.0', + }, + } + }), + } +}) + +describe('Version component', () => { + it('should be rendered correctly', () => { + const component = shallow(<Version />).getElement() + expect(component).toMatchSnapshot() + }) +}) diff --git a/src/components/Version/Version.tsx b/src/components/Version/Version.tsx index 3f4e58db3c3b462c9956f146231bc5d99abb8ada..36a3b85fef38f4da00c377333c2049591b0669c3 100644 --- a/src/components/Version/Version.tsx +++ b/src/components/Version/Version.tsx @@ -1,8 +1,8 @@ import React from 'react' -import { useClient } from 'cozy-client' +import { Client, useClient } from 'cozy-client' const Version: React.FC = () => { - const client = useClient() + const client: Client = useClient() return ( <div className="version-root text-14-normal"> {`v ${client.appMetadata.version}`} diff --git a/src/components/Version/__snapshots__/Version.spec.tsx.snap b/src/components/Version/__snapshots__/Version.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..c087d2c916dac1d088be590dfba0dbe339ae114a --- /dev/null +++ b/src/components/Version/__snapshots__/Version.spec.tsx.snap @@ -0,0 +1,17 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Navbar component should be rendered correctly 1`] = ` +<div + className="version-root text-14-normal" +> + v 0.0.° +</div> +`; + +exports[`Version component should be rendered correctly 1`] = ` +<div + className="version-root text-14-normal" +> + v 0.0.0 +</div> +`; diff --git a/src/cozy-client.d.ts b/src/cozy-client.d.ts index f0fe6c423f6b265c44bba13751483d3a9714a26c..7f090e3d2df79daf6ecbbf498c4b50d605063f73 100644 --- a/src/cozy-client.d.ts +++ b/src/cozy-client.d.ts @@ -82,7 +82,7 @@ declare module 'cozy-client' { } export class Client { - appMetadata: unknown + appMetadata: { version: string } options: ClientLogin idCounter: number isLogged: boolean diff --git a/src/doctypes/com-grandlyon-egl-day.ts b/src/doctypes/com-grandlyon-egl-day.ts index 8e7ce7b4a72fe0154787a4a44bd6e8e8281dc1a8..579fbd1ea3f8d67270afb4e9859e9750c782c751 100644 --- a/src/doctypes/com-grandlyon-egl-day.ts +++ b/src/doctypes/com-grandlyon-egl-day.ts @@ -1,21 +1 @@ -import { QueryDefinitionBuilder } from 'cozy-client' - export const EGL_DAY_DOCTYPE = 'com.grandlyon.egl.day' - -export type EglDay = { - time: string - load: string - type: string -} - -export function isEglDay(day: any): day is EglDay { - return day && 'time' in day && 'load' in day -} - -export function isEglData(data: any[]): data is EglDay[] { - return data.every(isEglDay) -} - -// queries for CozyClient -export const eglQueryClient: QueryDefinitionBuilder = client => - client.find(EGL_DAY_DOCTYPE) diff --git a/src/doctypes/com-grandlyon-enedis-day.ts b/src/doctypes/com-grandlyon-enedis-day.ts index 5d603130888ce2723d945d40392e59161e64a008..d052e250f78583665b91a5f663e3d4b3e2a911b8 100644 --- a/src/doctypes/com-grandlyon-enedis-day.ts +++ b/src/doctypes/com-grandlyon-enedis-day.ts @@ -1,20 +1 @@ -import { QueryDefinitionBuilder } from 'cozy-client' - export const ENEDIS_DAY_DOCTYPE = 'com.grandlyon.enedis.day' - -export type EnedisDay = { - time: string - load: string -} - -export function isEnedisDay(day: any): day is EnedisDay { - return day && 'time' in day && 'load' in day -} - -export function isEnedisData(data: any[]): data is EnedisDay[] { - return data.every(isEnedisDay) -} - -// queries for CozyClient -export const enedisQueryClient: QueryDefinitionBuilder = client => - client.find(ENEDIS_DAY_DOCTYPE) diff --git a/src/doctypes/com-grandlyon-grdf-day.ts b/src/doctypes/com-grandlyon-grdf-day.ts index 3949f1fcc33a16e0c753b2abbeecd270df7aed5f..fdc19a903efedd93e13e4500d28b1c8c8685c0e9 100644 --- a/src/doctypes/com-grandlyon-grdf-day.ts +++ b/src/doctypes/com-grandlyon-grdf-day.ts @@ -1,20 +1 @@ -import { QueryDefinitionBuilder } from 'cozy-client' - export const GRDF_DAY_DOCTYPE = 'com.grandlyon.grdf.day' - -export type GrdfDay = { - time: string - load: string -} - -export function isGrdfDay(day: any): day is GrdfDay { - return day && 'time' in day && 'load' in day -} - -export function isGrdfData(data: any[]): data is GrdfDay[] { - return data.every(isGrdfDay) -} - -// queries for CozyClient -export const grdfQueryClient: QueryDefinitionBuilder = client => - client.find(GRDF_DAY_DOCTYPE) diff --git a/src/models/ecogesture.model.ts b/src/models/ecogesture.model.ts index 4eb05ed763f96513b9499e752a3885845441ecda..843c748b85a86d5e727c7e449db3ee69f4e01a2f 100644 --- a/src/models/ecogesture.model.ts +++ b/src/models/ecogesture.model.ts @@ -11,4 +11,7 @@ export interface Ecogesture { nwh: number pack: number unlocked?: boolean + _id: string + _rev?: string + _type?: string } diff --git a/src/models/userProfile.model.ts b/src/models/userProfile.model.ts index a009f04f0672ec93ea953f9f0cb7fe68109ae5db..237cc7541c3c5263d40e74f01ffc79b6b5ed4b7a 100644 --- a/src/models/userProfile.model.ts +++ b/src/models/userProfile.model.ts @@ -8,7 +8,7 @@ export interface UserProfile { ecogestureHash: string haveSeenFavoriteModal: boolean isFirstConnection: boolean - haveSeenOldFluidModal: DateTime | false + haveSeenOldFluidModal: DateTime | boolean notificationEcogesture: string[] report: ReportAttributes } diff --git a/src/services/__mocks__/userProfile.json b/src/services/__mocks__/userProfile.json new file mode 100644 index 0000000000000000000000000000000000000000..930134512b606f08e3d6557ad3f076b0af657728 --- /dev/null +++ b/src/services/__mocks__/userProfile.json @@ -0,0 +1,17 @@ +{ + "_id": "4d9403218ef13e65b2e3a8ad1700bc41", + "_rev": "16-57473da4fc26315247c217083175dfa0", + "challengeTypeHash": "1136feb6185c7643e071d14180c0e95782aa4ba3", + "ecogestureHash": "9798a0aaccb47cff906fc4931a2eff5f9371dd8b", + "haveSeenFavoriteModal": false, + "haveSeenOldFluidModal": false, + "id": "4d9403218ef13e65b2e3a8ad1700bc41", + "isFirstConnection": true, + "level": 1, + "notificationEcogesture": ["0085", "0092"], + "report": { + "haveSeenLastReport": true, + "monthlyReportDate": "2020-11-03T00:00:00.000+01:00", + "sendReportNotification": false + } +} diff --git a/src/services/initialization.service.spec.ts b/src/services/initialization.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..bde3373d30f4cc6fee67635480b9d4e97f2b221f --- /dev/null +++ b/src/services/initialization.service.spec.ts @@ -0,0 +1,154 @@ +import { QueryResult } from 'cozy-client' +import { DateTime } from 'luxon' +import { UserProfile } from 'models' +import InitializationService from './initialization.service' +import mockClient from './__mocks__/client' +import userProfileEntityData from './__mocks__/userProfile.json' + +const mockCreateIndexKonnector = jest.fn() +jest.mock('./konnector.service', () => { + return jest.fn(() => { + return { + createIndexKonnector: mockCreateIndexKonnector, + } + }) +}) + +const mockCreateIndexAccount = jest.fn() +jest.mock('./account.service', () => { + return jest.fn(() => { + return { + createIndexAccount: mockCreateIndexAccount, + } + }) +}) + +const mockGetUserProfile = jest.fn() +jest.mock('./userProfile.service', () => { + return jest.fn(() => { + return { + getUserProfile: mockGetUserProfile, + } + }) +}) + +const userProfileData = { + ...userProfileEntityData, + report: { + ...userProfileEntityData.report, + monthlyReportDate: DateTime.fromISO( + userProfileEntityData.report.monthlyReportDate + ), + }, +} + +describe('Initialization service', () => { + const initializationService = new InitializationService(mockClient) + + describe('initIndex method', () => { + it('shoud return true when all indexes created', async () => { + const mockQueryResult: QueryResult<boolean> = { + data: true, + bookmark: '', + next: false, + skip: 0, + } + mockClient.query.mockResolvedValue(mockQueryResult) + mockCreateIndexKonnector.mockResolvedValue(mockQueryResult) + mockCreateIndexAccount.mockResolvedValue(mockQueryResult) + const result: boolean = await initializationService.initIndex() + expect(result).toBe(true) + }) + + it('shoud throw error when an index is not created', async () => { + let error + const mockQueryResult: QueryResult<boolean> = { + data: true, + bookmark: '', + next: false, + skip: 0, + } + mockClient.query.mockResolvedValue(mockQueryResult) + mockCreateIndexKonnector.mockRejectedValue(new Error()) + mockCreateIndexAccount.mockResolvedValue(mockQueryResult) + try { + await initializationService.initIndex() + } catch (err) { + error = err + } + expect(error).toEqual(new Error()) + }) + }) + + describe('initUserProfile method', () => { + it('shoud return the userProfil when existing', async () => { + mockGetUserProfile.mockResolvedValue(userProfileData) + const result: UserProfile | null = await initializationService.initUserProfile() + expect(result).toEqual(userProfileData) + }) + + it('shoud create and return the userProfil when no existing', async () => { + const mockQueryResult: QueryResult<boolean> = { + data: true, + bookmark: '', + next: false, + skip: 0, + } + mockGetUserProfile + .mockResolvedValueOnce(null) + .mockResolvedValueOnce(userProfileData) + mockClient.create.mockResolvedValue(mockQueryResult) + const result: UserProfile | null = await initializationService.initUserProfile() + expect(result).toEqual(userProfileData) + }) + + it('shoud throw error when the userProfile is not created', async () => { + const mockQueryResult: QueryResult<boolean> = { + data: true, + bookmark: '', + next: false, + skip: 0, + } + mockGetUserProfile.mockResolvedValueOnce(null).mockResolvedValueOnce(null) + mockClient.create.mockResolvedValue(mockQueryResult) + let error + try { + await initializationService.initUserProfile() + } catch (err) { + error = err + } + expect(error).toEqual( + new Error('initUserProfile: UserProfile not created') + ) + }) + + it('shoud throw error when the userProfile could not be fetched', async () => { + mockGetUserProfile.mockRejectedValueOnce(new Error()) + let error + try { + await initializationService.initUserProfile() + } catch (err) { + error = err + } + expect(error).toEqual(new Error()) + }) + + it('shoud throw error when the userProfile failed to be created', async () => { + const mockQueryResult: QueryResult<UserProfile> = { + data: userProfileData, + bookmark: '', + next: false, + skip: 0, + } + mockGetUserProfile.mockResolvedValueOnce(null) + mockClient.create.mockRejectedValueOnce(new Error()) + let error + try { + await initializationService.initUserProfile() + } catch (err) { + error = err + } + expect(error).toEqual(new Error()) + }) + }) +}) diff --git a/src/services/initialization.service.ts b/src/services/initialization.service.ts index 1c89702a242de5c9724fcce65e8f59b31d50a0b8..645323f610d14d0540004d40113ba245dec574f9 100644 --- a/src/services/initialization.service.ts +++ b/src/services/initialization.service.ts @@ -1,4 +1,4 @@ -import { Client } from 'cozy-client' +import { Client, Q, QueryDefinition } from 'cozy-client' import { CHALLENGETYPE_DOCTYPE, ECOGESTURE_DOCTYPE, @@ -50,23 +50,21 @@ export default class InitializationService { /* * Call a query with where clause to create the index if not exist */ - public async createIndex(doctype: string): Promise<object> { - return await this._client.query( - this._client - .find(doctype) - .where({ - year: { - $lte: 9999, - }, - month: { - $lte: 12, - }, - day: { - $lte: 31, - }, - }) - .limitBy(1) - ) + private async createIndex(doctype: string): Promise<object> { + const query: QueryDefinition = Q(doctype) + .where({ + year: { + $lte: 9999, + }, + month: { + $lte: 12, + }, + day: { + $lte: 31, + }, + }) + .limitBy(1) + return await this._client.query(query) } /* diff --git a/src/services/konnector.service.spec.ts b/src/services/konnector.service.spec.ts index 1022eda47ed7d0dc7559a43b5a42f1815199d514..9ef12d71d9aeb094da54439a5e583dc8f3e805df 100644 --- a/src/services/konnector.service.spec.ts +++ b/src/services/konnector.service.spec.ts @@ -21,8 +21,8 @@ jest.mock('./triggers.service', () => { describe('KonnectorService service', () => { const konnectorService = new KonnectorService(mockClient) - describe('getFluidConfig method', () => { - it('shoud return an array with the fluid config', async () => { + describe('getKonnector method', () => { + it('shoud return konnector', async () => { const mockQueryResult: QueryResult<Konnector[]> = { data: [konnectorsData[0]], bookmark: '', @@ -33,6 +33,18 @@ describe('KonnectorService service', () => { const result = await konnectorService.getKonnector('enedisgrandlyon') expect(result).toEqual(konnectorsData[0]) }) + + it('shoud return null when konnector is not found', async () => { + const mockQueryResult: QueryResult<Konnector[]> = { + data: [], + bookmark: '', + next: false, + skip: 0, + } + mockClient.query.mockResolvedValueOnce(mockQueryResult) + const result = await konnectorService.getKonnector('enedisgrandlyon') + expect(result).toBeNull() + }) }) describe('getKonnectorLastState method', () => { diff --git a/src/services/konnector.service.ts b/src/services/konnector.service.ts index 3784df1309b3e64f15a06657656df005ae590fa2..37f1ad53180bbfa7f6656de89e9c4f7690a9aad4 100644 --- a/src/services/konnector.service.ts +++ b/src/services/konnector.service.ts @@ -26,7 +26,6 @@ export default class KonnectorService { ): Promise<TriggerState | null> { const triggerService = new TriggerService(this._client) const trigger = await triggerService.getTrigger(account, konnector) - console.log(trigger) if (trigger) { const triggerState = await triggerService.fetchTriggerState(trigger) return triggerState diff --git a/src/services/mail.service.spec.ts b/src/services/mail.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..5c238a24ac27bbfc1e18fe99282c5f974949a338 --- /dev/null +++ b/src/services/mail.service.spec.ts @@ -0,0 +1,129 @@ +import MailService from './mail.service' +import mockClient from './__mocks__/client' + +describe('Mail service', () => { + const mailService = new MailService() + + describe('SendMail service', () => { + it('should return void when mail is sent', async () => { + const mockMailData = { + mode: 'noreply', + subject: '[Ecolyo] - Bienvenu', + parts: [ + { + type: 'text/html', + body: '<html>Body</html>', + }, + ], + } + const result: void = await mailService.SendMail(mockClient, mockMailData) + expect(result).toEqual(undefined) + }) + + it('should throw error when failed to send mail', async () => { + let error + const mockMailData = { + mode: 'noreply', + subject: '[Ecolyo] - Bienvenu', + parts: [ + { + type: 'text/html', + body: '<html>Body</html>', + }, + ], + } + mockClient.collection('').create.mockRejectedValue(new Error()) + try { + await mailService.SendMail(mockClient, mockMailData) + } catch (err) { + error = err + } + expect(error).toEqual(new Error('Failed to send mail')) + }) + }) + + describe('CreateBodyWelcome service', () => { + it('should return body mail with the right values when url is consumption', () => { + const result: string = mailService.CreateBodyWelcome( + 'user', + 'https://user-ecolyo.test.com/#/consumption' + ) + expect(result).toEqual(expect.stringContaining('Bonjour user')) + expect(result).toEqual( + expect.stringContaining( + '<a class="link" href="https://user-ecolyo.test.com/#/consumption">https://user-ecolyo.test.com/#/consumption</a>' + ) + ) + expect(result).toEqual( + expect.stringContaining( + '<a class="btnEcolyo" href="https://user-ecolyo.test.com/#/consumption">J\'ai compris</a>' + ) + ) + expect(result).toEqual( + expect.stringContaining( + '<a href="https://user-ecolyo.test.com/#/options" style="color: #ffffff">Unsubscribe</a>' + ) + ) + }) + it('should return body mail with the right values when url is options', () => { + const result: string = mailService.CreateBodyWelcome( + 'user', + 'https://user-ecolyo.test.com/#/options' + ) + expect(result).toEqual(expect.stringContaining('Bonjour user')) + expect(result).toEqual( + expect.stringContaining( + '<a class="link" href="https://user-ecolyo.test.com/#/options">https://user-ecolyo.test.com/#/options</a>' + ) + ) + expect(result).toEqual( + expect.stringContaining( + '<a class="btnEcolyo" href="https://user-ecolyo.test.com/#/options">J\'ai compris</a>' + ) + ) + expect(result).toEqual( + expect.stringContaining( + '<a href="https://user-ecolyo.test.com/#/options" style="color: #ffffff">Unsubscribe</a>' + ) + ) + }) + }) + + describe('CreateBodyMonthlyReport service', () => { + it('should return body mail with the right values when url is different from bilan', () => { + const result: string = mailService.CreateBodyMonthlyReport( + 'user', + 'https://user-ecolyo.test.com' + ) + expect(result).toEqual(expect.stringContaining('Bonjour user')) + expect(result).toEqual( + expect.stringContaining( + '<a class="btnEcolyo" href="https://user-ecolyo.test.com/#/bilan">' + ) + ) + expect(result).toEqual( + expect.stringContaining( + '<a href="https://user-ecolyo.test.com/#/options" style="color: #ffffff">Unsubscribe</a>' + ) + ) + }) + + it('should return body mail with the right values when url is equals to bilan', () => { + const result: string = mailService.CreateBodyMonthlyReport( + 'user', + 'https://user-ecolyo.test.com/#/bilan' + ) + expect(result).toEqual(expect.stringContaining('Bonjour user')) + expect(result).toEqual( + expect.stringContaining( + '<a class="btnEcolyo" href="https://user-ecolyo.test.com/#/bilan">' + ) + ) + expect(result).toEqual( + expect.stringContaining( + '<a href="https://user-ecolyo.test.com/#/options" style="color: #ffffff">Unsubscribe</a>' + ) + ) + }) + }) +}) diff --git a/src/services/mail.service.ts b/src/services/mail.service.ts index 52d54215d68b2606554b9d87c63ac749bfdf3099..ae9f90bbf7386faaf74e6f12c095309073bb352b 100644 --- a/src/services/mail.service.ts +++ b/src/services/mail.service.ts @@ -7,11 +7,11 @@ export default class MailService { ): Promise<void> { try { const jobCollection = client.collection('io.cozy.jobs') - jobCollection.create('sendmail', mailInfo) - } catch (e) { + await jobCollection.create('sendmail', mailInfo) + } catch (error) { // eslint-disable-next-line no-console - console.error(e) - throw e + console.log(error) + throw new Error('Failed to send mail') } } public CreateBodyWelcome(username: string, clientUrl: string) { @@ -415,6 +415,8 @@ export default class MailService { if (!clientUrl.includes('bilan')) { unsubscibeUrl = clientUrl + '/#/options' clientUrl = clientUrl + '/#/bilan' + } else { + unsubscibeUrl = clientUrl.replace('bilan', 'options') } return ` <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> diff --git a/src/services/queryRunner.service.spec.ts b/src/services/queryRunner.service.spec.ts index e829f7e30a1c0782460eadc7e07c2c995d8c8b45..6228f83f6a950f40e5b6e34e556747ee5ad0e86f 100644 --- a/src/services/queryRunner.service.spec.ts +++ b/src/services/queryRunner.service.spec.ts @@ -498,6 +498,36 @@ describe('queryRunner service', () => { }) it('should return the data of the elec fluid and month time step with start year <> end year', async () => { + const mockTimePeriod = { + startDate: DateTime.fromISO('2019-12-01T00:00:00.000'), + endDate: DateTime.fromISO('2020-10-30T23:59:59.999'), + } + const expectedResult: Dataload[] = [ + { + date: DateTime.fromISO('2020-09-01T00:00:00.000'), + value: 125.25, + }, + { + date: DateTime.fromISO('2020-10-01T00:00:00.000'), + value: 220.5, + }, + ] + const mockQueryResult: QueryResult<DataloadEntity[]> = { + data: [loadMonthData[0], loadMonthData[1]], + bookmark: '', + next: false, + skip: 0, + } + mockClient.query.mockResolvedValue(mockQueryResult) + const result: Dataload[] | null = await queryRunner.fetchFluidData( + mockTimePeriod, + TimeStep.MONTH, + FluidType.ELECTRICITY + ) + expect(result).toEqual(expectedResult) + }) + + it('should return the data of the elec fluid and month time step with period >=12 months', async () => { const mockTimePeriod = { startDate: DateTime.fromISO('2019-12-01T00:00:00.000'), endDate: DateTime.fromISO('2020-11-30T23:59:59.999'), @@ -534,7 +564,7 @@ describe('queryRunner service', () => { it('should return the data of the elec fluid and day time step with start month <> end month', async () => { const mockTimePeriod = { startDate: DateTime.fromISO('2020-10-15T00:00:00.000'), - endDate: DateTime.fromISO('2020-11-5T23:59:59.999'), + endDate: DateTime.fromISO('2020-11-05T23:59:59.999'), } const expectedResult: Dataload[] = [ { diff --git a/src/utils/hash.ts b/src/utils/hash.ts index 89b4eadadd5cdf4f58e44b9c1225bd3e1bd30908..5ce23aa0cfeac129e942bd629e3470a8529d3a79 100644 --- a/src/utils/hash.ts +++ b/src/utils/hash.ts @@ -1,8 +1,9 @@ +import { ChallengeType, Ecogesture } from 'models' import hash from 'object-hash' /*** * sha1 hex encoding (default) */ -export function hashFile(file: File) { +export function hashFile(file: any) { return hash(file) } diff --git a/yarn.lock b/yarn.lock index c1e43b85c1ae4f73d349cd137acc88163d848965..1552e305724324d5340069b55918d3dfba56f196 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1362,6 +1362,13 @@ dependencies: "@babel/types" "^7.3.0" +"@types/cheerio@*": + version "0.22.22" + resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.22.tgz#ae71cf4ca59b8bbaf34c99af7a5d6c8894988f5f" + integrity sha512-05DYX4zU96IBfZFY+t3Mh88nlwSMtmmzSYaQkKN48T495VV1dkHSah6qYyDTN5ngaS0i0VonH37m+RuzSM0YiA== + dependencies: + "@types/node" "*" + "@types/classnames@^2.2.10": version "2.2.10" resolved "https://registry.yarnpkg.com/@types/classnames/-/classnames-2.2.10.tgz#cc658ca319b6355399efc1f5b9e818f1a24bf999" @@ -1564,6 +1571,14 @@ resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== +"@types/enzyme@^3.10.8": + version "3.10.8" + resolved "https://registry.yarnpkg.com/@types/enzyme/-/enzyme-3.10.8.tgz#ad7ac9d3af3de6fd0673773123fafbc63db50d42" + integrity sha512-vlOuzqsTHxog6PV79+tvOHFb6hq4QZKMq1lLD9MaWD1oec2lHTKndn76XOpSwCA0oFTaIbKVPrgM3k78Jjd16g== + dependencies: + "@types/cheerio" "*" + "@types/react" "*" + "@types/eslint-visitor-keys@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d"