mirror of
				https://github.com/Telecominfraproject/wlan-cloud-ui.git
				synced 2025-10-31 18:57:59 +00:00 
			
		
		
		
	Compare commits
	
		
			8 Commits
		
	
	
		
			v1.0.1
			...
			feature/TW
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | ded4393d46 | ||
|   | b3c9e32908 | ||
|   | 14e1dac68e | ||
|   | 670640f7d8 | ||
|   | 8a2769b15f | ||
|   | 9dee5dae32 | ||
|   | 8f63893190 | ||
|   | 8998b5ec0b | 
| @@ -1,6 +1,9 @@ | |||||||
| { | { | ||||||
|   "extends": ["airbnb", "prettier", "prettier/react"], |   "extends": ["airbnb", "prettier", "prettier/react"], | ||||||
|   "plugins": ["prettier"], |   "plugins": ["prettier"], | ||||||
|  |   "env": { | ||||||
|  |     "jest": true | ||||||
|  |   }, | ||||||
|   "rules": { |   "rules": { | ||||||
|     "react/jsx-filename-extension": [ |     "react/jsx-filename-extension": [ | ||||||
|       1, |       1, | ||||||
|   | |||||||
| @@ -1,74 +1,12 @@ | |||||||
| import React, { useContext } from 'react'; | import React, { useContext } from 'react'; | ||||||
| import gql from 'graphql-tag'; |  | ||||||
| import { useQuery, useMutation } from '@apollo/react-hooks'; | import { useQuery, useMutation } from '@apollo/react-hooks'; | ||||||
| import { Alert, notification } from 'antd'; | import { Alert, notification } from 'antd'; | ||||||
|  |  | ||||||
| import { Accounts as AccountsPage, Loading } from '@tip-wlan/wlan-cloud-ui-library'; | import { Accounts as AccountsPage, Loading } from '@tip-wlan/wlan-cloud-ui-library'; | ||||||
|  | import { GET_ALL_USERS } from 'graphql/queries'; | ||||||
|  | import { CREATE_USER, UPDATE_USER, DELETE_USER } from 'graphql/mutations'; | ||||||
| import UserContext from 'contexts/UserContext'; | import UserContext from 'contexts/UserContext'; | ||||||
|  |  | ||||||
| const GET_ALL_USERS = gql` |  | ||||||
|   query GetAllUsers($customerId: ID!, $cursor: String) { |  | ||||||
|     getAllUsers(customerId: $customerId, cursor: $cursor) { |  | ||||||
|       items { |  | ||||||
|         id |  | ||||||
|         email: username |  | ||||||
|         role |  | ||||||
|         lastModifiedTimestamp |  | ||||||
|         customerId |  | ||||||
|       } |  | ||||||
|       context { |  | ||||||
|         cursor |  | ||||||
|         lastPage |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| `; |  | ||||||
|  |  | ||||||
| const CREATE_USER = gql` |  | ||||||
|   mutation CreateUser($username: String!, $password: String!, $role: String!, $customerId: ID!) { |  | ||||||
|     createUser(username: $username, password: $password, role: $role, customerId: $customerId) { |  | ||||||
|       username |  | ||||||
|       role |  | ||||||
|       customerId |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| `; |  | ||||||
|  |  | ||||||
| const UPDATE_USER = gql` |  | ||||||
|   mutation UpdateUser( |  | ||||||
|     $id: ID! |  | ||||||
|     $username: String! |  | ||||||
|     $password: String! |  | ||||||
|     $role: String! |  | ||||||
|     $customerId: ID! |  | ||||||
|     $lastModifiedTimestamp: String |  | ||||||
|   ) { |  | ||||||
|     updateUser( |  | ||||||
|       id: $id |  | ||||||
|       username: $username |  | ||||||
|       password: $password |  | ||||||
|       role: $role |  | ||||||
|       customerId: $customerId |  | ||||||
|       lastModifiedTimestamp: $lastModifiedTimestamp |  | ||||||
|     ) { |  | ||||||
|       id |  | ||||||
|       username |  | ||||||
|       role |  | ||||||
|       customerId |  | ||||||
|       lastModifiedTimestamp |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| `; |  | ||||||
|  |  | ||||||
| const DELETE_USER = gql` |  | ||||||
|   mutation DeleteUser($id: ID!) { |  | ||||||
|     deleteUser(id: $id) { |  | ||||||
|       id |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| `; |  | ||||||
|  |  | ||||||
| const Accounts = () => { | const Accounts = () => { | ||||||
|   const { customerId } = useContext(UserContext); |   const { customerId } = useContext(UserContext); | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										222
									
								
								app/containers/Accounts/tests/index.test.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										222
									
								
								app/containers/Accounts/tests/index.test.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,222 @@ | |||||||
|  | import React from 'react'; | ||||||
|  | import '@testing-library/jest-dom/extend-expect'; | ||||||
|  | import { MockedProvider } from '@apollo/react-testing'; | ||||||
|  | import { fireEvent, render, waitFor } from '@testing-library/react'; | ||||||
|  | import UserProvider from 'contexts/UserProvider'; | ||||||
|  | import { accountsMutationMock, accountsQueryMock } from './mock'; | ||||||
|  | import Accounts from '..'; | ||||||
|  |  | ||||||
|  | Object.defineProperty(window, 'matchMedia', { | ||||||
|  |   writable: true, | ||||||
|  |   value: jest.fn().mockImplementation(query => ({ | ||||||
|  |     matches: false, | ||||||
|  |     media: query, | ||||||
|  |     onchange: null, | ||||||
|  |     addListener: jest.fn(), // deprecated | ||||||
|  |     removeListener: jest.fn(), // deprecated | ||||||
|  |     addEventListener: jest.fn(), | ||||||
|  |     removeEventListener: jest.fn(), | ||||||
|  |     dispatchEvent: jest.fn(), | ||||||
|  |   })), | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | const mockProp = { | ||||||
|  |   id: 123, | ||||||
|  |   email: 'test@test.com', | ||||||
|  |   role: 'admin', | ||||||
|  |   customerId: 2, | ||||||
|  |   updateUser: jest.fn(), | ||||||
|  |   updateToken: jest.fn(), | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | describe('<Accounts />', () => { | ||||||
|  |   afterEach(jest.resetModules); | ||||||
|  |  | ||||||
|  |   it('should render with data', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider mocks={[accountsQueryMock.success]} addTypename={false}> | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Accounts /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |  | ||||||
|  |     await waitFor(() => expect(getByText('user-0')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('error message should be visible with error true', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider mocks={[accountsQueryMock.error]} addTypename={false}> | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Accounts /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('Failed to load Users.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('deleting account should be successful with valid query', async () => { | ||||||
|  |     const { getByText, getByRole, getAllByRole } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           accountsQueryMock.success, | ||||||
|  |           accountsMutationMock.deleteAccountSuccess, | ||||||
|  |           accountsQueryMock.success, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Accounts /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('user-0')).toBeVisible()); | ||||||
|  |  | ||||||
|  |     fireEvent.click(getAllByRole('button', { name: /delete/i })[0]); | ||||||
|  |  | ||||||
|  |     expect(getByRole('button', { name: 'Delete' })); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Delete' })); | ||||||
|  |  | ||||||
|  |     await waitFor(() => expect(getByText('Account successfully deleted.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('deleting account should not be successful with invalid query', async () => { | ||||||
|  |     const { getByText, getByRole, getAllByRole } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[accountsQueryMock.success, accountsMutationMock.deleteAccountError]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Accounts /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('user-0')).toBeVisible()); | ||||||
|  |  | ||||||
|  |     fireEvent.click(getAllByRole('button', { name: /delete/i })[0]); | ||||||
|  |  | ||||||
|  |     expect(getByRole('button', { name: 'Delete' })); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Delete' })); | ||||||
|  |     await waitFor(() => expect(getByText('Account could not be deleted.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('editing user should not be successful when query is invalid', async () => { | ||||||
|  |     const { getByText, getByLabelText, getByRole, getAllByRole } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[accountsQueryMock.success, accountsMutationMock.editUserError]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Accounts /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |  | ||||||
|  |     await waitFor(() => expect(getByText('user-0')).toBeVisible()); | ||||||
|  |  | ||||||
|  |     fireEvent.click(getAllByRole('button', { name: /edit/i })[0]); | ||||||
|  |     expect(getByText('Edit Account')).toBeVisible(); | ||||||
|  |  | ||||||
|  |     fireEvent.change(getByLabelText('E-mail'), { target: { value: 'test@test.com' } }); | ||||||
|  |     fireEvent.change(getByLabelText('Password'), { target: { value: 'password' } }); | ||||||
|  |     fireEvent.change(getByLabelText('Confirm Password'), { target: { value: 'password' } }); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Save' })); | ||||||
|  |  | ||||||
|  |     await waitFor(() => expect(getByText('Account could not be updated.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('adding user should be successful when query is valid', async () => { | ||||||
|  |     const { getByText, getByLabelText, getAllByRole, getByRole } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           accountsQueryMock.success, | ||||||
|  |           accountsQueryMock.success, | ||||||
|  |           accountsQueryMock.success, | ||||||
|  |  | ||||||
|  |           accountsMutationMock.addUserSuccess, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Accounts /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('user-0')).toBeVisible()); | ||||||
|  |     fireEvent.click(getAllByRole('button', { name: /addaccount/i })[0]); | ||||||
|  |     expect(getByText('Add Account', { selector: 'div' })).toBeVisible(); | ||||||
|  |  | ||||||
|  |     fireEvent.change(getByLabelText('E-mail'), { target: { value: 'test@test.com' } }); | ||||||
|  |     fireEvent.change(getByLabelText('Password'), { target: { value: 'password' } }); | ||||||
|  |     fireEvent.change(getByLabelText('Confirm Password'), { target: { value: 'password' } }); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Save' })); | ||||||
|  |     await waitFor(() => expect(getByText('Account successfully created.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('adding user should not be successful when query is invalid', async () => { | ||||||
|  |     const { getByText, getByLabelText, getByRole } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[accountsQueryMock.success, accountsMutationMock.addUserError]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Accounts /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('user-0')).toBeVisible()); | ||||||
|  |  | ||||||
|  |     fireEvent.click(getByRole('button', { name: /addaccount/i })); | ||||||
|  |     expect(getByText('Add Account', { selector: 'div' })).toBeVisible(); | ||||||
|  |  | ||||||
|  |     fireEvent.change(getByLabelText('E-mail'), { target: { value: 'test@test.com' } }); | ||||||
|  |     fireEvent.change(getByLabelText('Password'), { target: { value: 'password' } }); | ||||||
|  |     fireEvent.change(getByLabelText('Confirm Password'), { target: { value: 'password' } }); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Save' })); | ||||||
|  |     await waitFor(() => expect(getByText('Account could not be created.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('fetchmore shoudl be called when onLoadMore button is clicked', async () => { | ||||||
|  |     const { getByRole, getByText } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[accountsQueryMock.success, accountsQueryMock.fetchMore, accountsQueryMock.success]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Accounts /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('user-0')).toBeVisible()); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Load More' })); | ||||||
|  |     await waitFor(() => expect(getByText('user-18')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |   it('editing user should be successful when query is valid', async () => { | ||||||
|  |     const { getByText, getByLabelText, getByRole, getAllByRole } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           accountsQueryMock.success, | ||||||
|  |           accountsQueryMock.success, | ||||||
|  |           accountsMutationMock.editUserSuccess, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Accounts /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('user-0')).toBeVisible()); | ||||||
|  |     fireEvent.click(getAllByRole('button', { name: /edit/i })[0]); | ||||||
|  |  | ||||||
|  |     await waitFor(() => expect(getByText('Edit Account')).toBeVisible()); | ||||||
|  |  | ||||||
|  |     fireEvent.change(getByLabelText('E-mail'), { target: { value: 'test@test.com' } }); | ||||||
|  |     fireEvent.change(getByLabelText('Password'), { target: { value: 'password' } }); | ||||||
|  |     fireEvent.change(getByLabelText('Confirm Password'), { target: { value: 'password' } }); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Save' })); | ||||||
|  |     await waitFor(() => expect(getByText('user-0')).toBeVisible()); | ||||||
|  |     await waitFor(() => expect(getByText('Edit Account')).not.toBeVisible()); | ||||||
|  |     await waitFor(() => expect(getByText('Account successfully updated.')).toBeVisible()); | ||||||
|  |   }, 5000); | ||||||
|  | }); | ||||||
							
								
								
									
										202
									
								
								app/containers/Accounts/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										202
									
								
								app/containers/Accounts/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,202 @@ | |||||||
|  | import { GET_ALL_USERS } from 'graphql/queries'; | ||||||
|  | import { CREATE_USER, UPDATE_USER, DELETE_USER } from 'graphql/mutations'; | ||||||
|  |  | ||||||
|  | export const accountsQueryMock = { | ||||||
|  |   success: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_ALL_USERS, | ||||||
|  |       variables: { customerId: 2 }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         getAllUsers: { | ||||||
|  |           items: [ | ||||||
|  |             { | ||||||
|  |               id: '1', | ||||||
|  |               email: 'user-0', | ||||||
|  |               role: 'CustomerIT', | ||||||
|  |               lastModifiedTimestamp: '1596814602673', | ||||||
|  |               customerId: '2', | ||||||
|  |               __typename: 'User', | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |               id: '2', | ||||||
|  |               email: 'user-1', | ||||||
|  |               role: 'CustomerIT', | ||||||
|  |               lastModifiedTimestamp: '1596814602814', | ||||||
|  |               customerId: '2', | ||||||
|  |               __typename: 'User', | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |               id: '3', | ||||||
|  |               email: 'user-2', | ||||||
|  |               role: 'CustomerIT', | ||||||
|  |               lastModifiedTimestamp: '1596814602815', | ||||||
|  |               customerId: '2', | ||||||
|  |               __typename: 'User', | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |               id: '4', | ||||||
|  |               email: 'user-3', | ||||||
|  |               role: 'CustomerIT', | ||||||
|  |               lastModifiedTimestamp: '1596814602815', | ||||||
|  |               customerId: '2', | ||||||
|  |               __typename: 'User', | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |               id: '5', | ||||||
|  |               email: 'user-4', | ||||||
|  |               role: 'CustomerIT', | ||||||
|  |               lastModifiedTimestamp: '1596814602815', | ||||||
|  |               customerId: '2', | ||||||
|  |               __typename: 'User', | ||||||
|  |             }, | ||||||
|  |           ], | ||||||
|  |           context: { | ||||||
|  |             cursor: 'test', | ||||||
|  |             lastPage: false, | ||||||
|  |           }, | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |       loading: false, | ||||||
|  |       networkStatus: 7, | ||||||
|  |       stale: false, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   fetchMore: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_ALL_USERS, | ||||||
|  |       variables: { customerId: 2, cursor: 'test' }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         getAllUsers: { | ||||||
|  |           items: [ | ||||||
|  |             { | ||||||
|  |               id: '18', | ||||||
|  |               email: 'user-18', | ||||||
|  |               role: 'CustomerIT', | ||||||
|  |               lastModifiedTimestamp: '1596814602673', | ||||||
|  |               customerId: '2', | ||||||
|  |               __typename: 'User', | ||||||
|  |             }, | ||||||
|  |           ], | ||||||
|  |           context: { | ||||||
|  |             cursor: 'test', | ||||||
|  |             lastPage: true, | ||||||
|  |           }, | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |       loading: false, | ||||||
|  |       networkStatus: 7, | ||||||
|  |       stale: false, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   error: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_ALL_USERS, | ||||||
|  |       variables: { customerId: 2 }, | ||||||
|  |       errorPolicy: 'all', | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: null, | ||||||
|  |       errors: [{}], | ||||||
|  |       loading: false, | ||||||
|  |       networkStatus: 7, | ||||||
|  |       stale: false, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | export const accountsMutationMock = { | ||||||
|  |   addUserSuccess: { | ||||||
|  |     request: { | ||||||
|  |       query: CREATE_USER, | ||||||
|  |       variables: { | ||||||
|  |         username: 'test@test.com', | ||||||
|  |         password: 'password', | ||||||
|  |         role: 'CustomerIT', | ||||||
|  |         customerId: 2, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         createUser: { | ||||||
|  |           username: 'test@test.com', | ||||||
|  |           role: 'CustomerIT', | ||||||
|  |           customerId: '2', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   addUserError: { | ||||||
|  |     request: { | ||||||
|  |       query: CREATE_USER, | ||||||
|  |       variables: {}, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: null, | ||||||
|  |       errors: [{}], | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   editUserSuccess: { | ||||||
|  |     request: { | ||||||
|  |       query: UPDATE_USER, | ||||||
|  |       variables: { | ||||||
|  |         id: '1', | ||||||
|  |         username: 'test@test.com', | ||||||
|  |         password: 'password', | ||||||
|  |         role: 'CustomerIT', | ||||||
|  |         customerId: 2, | ||||||
|  |         lastModifiedTimestamp: '1596814602673', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         updateUser: { | ||||||
|  |           id: '1', | ||||||
|  |           username: 'test@test.com', | ||||||
|  |           role: 'CustomerIT', | ||||||
|  |           customerId: '2', | ||||||
|  |           lastModifiedTimestamp: '1597080851726', | ||||||
|  |           __typename: 'User', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   editUserError: { | ||||||
|  |     request: { | ||||||
|  |       query: UPDATE_USER, | ||||||
|  |       variables: {}, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: null, | ||||||
|  |       errors: [{}], | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   deleteAccountSuccess: { | ||||||
|  |     request: { | ||||||
|  |       query: DELETE_USER, | ||||||
|  |       variables: { id: '1' }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         deleteUser: { | ||||||
|  |           id: '1', | ||||||
|  |           __typename: 'User', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   deleteAccountError: { | ||||||
|  |     request: { | ||||||
|  |       query: DELETE_USER, | ||||||
|  |       variables: { id: '2' }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: null, | ||||||
|  |       errors: [{}], | ||||||
|  |       loading: false, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }; | ||||||
| @@ -1,35 +1,11 @@ | |||||||
| import React, { useContext } from 'react'; | import React, { useContext } from 'react'; | ||||||
| import { AddProfile as AddProfilePage } from '@tip-wlan/wlan-cloud-ui-library'; | import { AddProfile as AddProfilePage } from '@tip-wlan/wlan-cloud-ui-library'; | ||||||
| import gql from 'graphql-tag'; |  | ||||||
| import { useMutation, useQuery } from '@apollo/react-hooks'; | import { useMutation, useQuery } from '@apollo/react-hooks'; | ||||||
| import { notification } from 'antd'; | import { notification } from 'antd'; | ||||||
|  |  | ||||||
| import UserContext from 'contexts/UserContext'; | import UserContext from 'contexts/UserContext'; | ||||||
| import { GET_ALL_PROFILES } from 'graphql/queries'; | import { GET_ALL_PROFILES } from 'graphql/queries'; | ||||||
|  | import { CREATE_PROFILE } from 'graphql/mutations'; | ||||||
| const CREATE_PROFILE = gql` |  | ||||||
|   mutation CreateProfile( |  | ||||||
|     $profileType: String! |  | ||||||
|     $customerId: ID! |  | ||||||
|     $name: String! |  | ||||||
|     $childProfileIds: [ID] |  | ||||||
|     $details: JSONObject |  | ||||||
|   ) { |  | ||||||
|     createProfile( |  | ||||||
|       profileType: $profileType |  | ||||||
|       customerId: $customerId |  | ||||||
|       name: $name |  | ||||||
|       childProfileIds: $childProfileIds |  | ||||||
|       details: $details |  | ||||||
|     ) { |  | ||||||
|       profileType |  | ||||||
|       customerId |  | ||||||
|       name |  | ||||||
|       childProfileIds |  | ||||||
|       details |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| `; |  | ||||||
|  |  | ||||||
| const AddProfile = () => { | const AddProfile = () => { | ||||||
|   const { customerId } = useContext(UserContext); |   const { customerId } = useContext(UserContext); | ||||||
|   | |||||||
							
								
								
									
										75
									
								
								app/containers/AddProfile/tests/index.test.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								app/containers/AddProfile/tests/index.test.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,75 @@ | |||||||
|  | import React from 'react'; | ||||||
|  | import '@testing-library/jest-dom/extend-expect'; | ||||||
|  | import { MockedProvider } from '@apollo/react-testing'; | ||||||
|  | import { cleanup, fireEvent, render, waitFor } from '@testing-library/react'; | ||||||
|  |  | ||||||
|  | import UserProvider from 'contexts/UserProvider'; | ||||||
|  | import { addProfileMutationMock, getAllProfilesQueryMock } from './mock'; | ||||||
|  | import AddProfile from '..'; | ||||||
|  |  | ||||||
|  | Object.defineProperty(window, 'matchMedia', { | ||||||
|  |   writable: true, | ||||||
|  |   value: jest.fn().mockImplementation(query => ({ | ||||||
|  |     matches: false, | ||||||
|  |     media: query, | ||||||
|  |     onchange: null, | ||||||
|  |     addListener: jest.fn(), // deprecated | ||||||
|  |     removeListener: jest.fn(), // deprecated | ||||||
|  |     addEventListener: jest.fn(), | ||||||
|  |     removeEventListener: jest.fn(), | ||||||
|  |     dispatchEvent: jest.fn(), | ||||||
|  |   })), | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | const mockProp = { | ||||||
|  |   id: 123, | ||||||
|  |   email: 'test@test.com', | ||||||
|  |   role: 'admin', | ||||||
|  |   customerId: 2, | ||||||
|  |   updateUser: jest.fn(), | ||||||
|  |   updateToken: jest.fn(), | ||||||
|  | }; | ||||||
|  | const DOWN_ARROW = { keyCode: 40 }; | ||||||
|  |  | ||||||
|  | describe('<AddProfile />', () => { | ||||||
|  |   afterEach(cleanup); | ||||||
|  |   it('should create profile when provide correct Mutation', async () => { | ||||||
|  |     const { getByText, getByLabelText, getByRole } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[getAllProfilesQueryMock.success, addProfileMutationMock.success]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <AddProfile /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByRole('button', { name: 'Save' })).toBeVisible()); | ||||||
|  |  | ||||||
|  |     fireEvent.change(getByLabelText('Name'), { target: { value: 'test' } }); | ||||||
|  |     await waitFor(() => expect(getByLabelText('Name')).toHaveValue('test')); | ||||||
|  |  | ||||||
|  |     fireEvent.keyDown(getByLabelText('Type'), DOWN_ARROW); | ||||||
|  |     fireEvent.click(getByText('Access Point')); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Save' })); | ||||||
|  |     await waitFor(() => expect(getByText('Profile successfully created.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |   it('should show error when provide incorrect Mutation', async () => { | ||||||
|  |     const { getByText, getByLabelText, getByRole } = render( | ||||||
|  |       <MockedProvider mocks={[getAllProfilesQueryMock.success]} addTypename={false}> | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <AddProfile /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByRole('button', { name: 'Save' })).toBeVisible()); | ||||||
|  |  | ||||||
|  |     fireEvent.change(getByLabelText('Name'), { target: { value: 'test' } }); | ||||||
|  |     await waitFor(() => expect(getByLabelText('Name')).toHaveValue('test')); | ||||||
|  |  | ||||||
|  |     fireEvent.keyDown(getByLabelText('Type'), DOWN_ARROW); | ||||||
|  |     fireEvent.click(getByText('Access Point')); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Save' })); | ||||||
|  |     await waitFor(() => expect(getByText('Profile could not be created.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
							
								
								
									
										146
									
								
								app/containers/AddProfile/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								app/containers/AddProfile/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,146 @@ | |||||||
|  | import { GET_ALL_PROFILES } from 'graphql/queries'; | ||||||
|  | import { CREATE_PROFILE } from 'graphql/mutations'; | ||||||
|  |  | ||||||
|  | export const getAllProfilesQueryMock = { | ||||||
|  |   success: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_ALL_PROFILES, | ||||||
|  |       variables: { customerId: 2, type: 'ssid' }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         getAllProfiles: { | ||||||
|  |           items: [ | ||||||
|  |             { | ||||||
|  |               id: '1', | ||||||
|  |               name: 'Radius-Profile', | ||||||
|  |               profileType: 'radius', | ||||||
|  |               details: { | ||||||
|  |                 model_type: 'RadiusProfile', | ||||||
|  |                 subnetConfiguration: null, | ||||||
|  |                 serviceRegionMap: { | ||||||
|  |                   Ottawa: { | ||||||
|  |                     model_type: 'RadiusServiceRegion', | ||||||
|  |                     serverMap: { | ||||||
|  |                       'Radius-Profile': [ | ||||||
|  |                         { | ||||||
|  |                           model_type: 'RadiusServer', | ||||||
|  |                           ipAddress: '192.168.0.1', | ||||||
|  |                           secret: 'testing123', | ||||||
|  |                           authPort: 1812, | ||||||
|  |                           timeout: null, | ||||||
|  |                         }, | ||||||
|  |                       ], | ||||||
|  |                     }, | ||||||
|  |                     regionName: 'Ottawa', | ||||||
|  |                   }, | ||||||
|  |                 }, | ||||||
|  |                 profileType: 'radius', | ||||||
|  |               }, | ||||||
|  |               __typename: 'Profile', | ||||||
|  |             }, | ||||||
|  |           ], | ||||||
|  |           context: { | ||||||
|  |             cursor: | ||||||
|  |               'bnVsbEBAQHsibW9kZWxfdHlwZSI6IkNvbnRleHRDaGlsZHJlbiIsImNoaWxkcmVuIjp7fX1AQEBudWxs', | ||||||
|  |             lastPage: true, | ||||||
|  |             __typename: 'PaginationContext', | ||||||
|  |           }, | ||||||
|  |           __typename: 'ProfilePagination', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |       loading: false, | ||||||
|  |       networkStatus: 7, | ||||||
|  |       stale: false, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   errpr: [], | ||||||
|  | }; | ||||||
|  | export const addProfileMutationMock = { | ||||||
|  |   success: { | ||||||
|  |     request: { | ||||||
|  |       query: CREATE_PROFILE, | ||||||
|  |       variables: { | ||||||
|  |         profileType: 'equipment_ap', | ||||||
|  |         customerId: 2, | ||||||
|  |         name: 'test', | ||||||
|  |         childProfileIds: [], | ||||||
|  |         details: { | ||||||
|  |           profileType: 'equipment_ap', | ||||||
|  |           name: 'test', | ||||||
|  |           vlanNative: true, | ||||||
|  |           ntpServer: { auto: undefined }, | ||||||
|  |           ledControlEnabled: undefined, | ||||||
|  |           rtlsSettings: { enabled: false }, | ||||||
|  |           syslogRelay: { enabled: false }, | ||||||
|  |           syntheticClientEnabled: false, | ||||||
|  |           equipmentDiscovery: false, | ||||||
|  |           childProfileIds: [], | ||||||
|  |           model_type: 'ApNetworkConfiguration', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         createProfile: { | ||||||
|  |           profileType: 'equipment_ap', | ||||||
|  |           customerId: '2', | ||||||
|  |           name: 'test', | ||||||
|  |           childProfileIds: [], | ||||||
|  |           details: { | ||||||
|  |             model_type: 'ApNetworkConfiguration', | ||||||
|  |             networkConfigVersion: 'AP-1', | ||||||
|  |             equipmentType: 'AP', | ||||||
|  |             vlanNative: true, | ||||||
|  |             vlan: 0, | ||||||
|  |             ntpServer: { | ||||||
|  |               model_type: 'AutoOrManualString', | ||||||
|  |               auto: false, | ||||||
|  |               value: null, | ||||||
|  |             }, | ||||||
|  |             syslogRelay: { | ||||||
|  |               model_type: 'SyslogRelay', | ||||||
|  |               enabled: false, | ||||||
|  |               srvHostIp: null, | ||||||
|  |               srvHostPort: 514, | ||||||
|  |               severity: 'NOTICE', | ||||||
|  |             }, | ||||||
|  |             rtlsSettings: { | ||||||
|  |               model_type: 'RtlsSettings', | ||||||
|  |               enabled: false, | ||||||
|  |               srvHostIp: null, | ||||||
|  |               srvHostPort: 0, | ||||||
|  |             }, | ||||||
|  |             syntheticClientEnabled: false, | ||||||
|  |             ledControlEnabled: true, | ||||||
|  |             equipmentDiscovery: false, | ||||||
|  |             radioMap: { | ||||||
|  |               is5GHz: { | ||||||
|  |                 model_type: 'RadioProfileConfiguration', | ||||||
|  |                 bestApEnabled: true, | ||||||
|  |                 bestAPSteerType: 'both', | ||||||
|  |               }, | ||||||
|  |               is2dot4GHz: { | ||||||
|  |                 model_type: 'RadioProfileConfiguration', | ||||||
|  |                 bestApEnabled: true, | ||||||
|  |                 bestAPSteerType: 'both', | ||||||
|  |               }, | ||||||
|  |               is5GHzU: { | ||||||
|  |                 model_type: 'RadioProfileConfiguration', | ||||||
|  |                 bestApEnabled: true, | ||||||
|  |                 bestAPSteerType: 'both', | ||||||
|  |               }, | ||||||
|  |               is5GHzL: { | ||||||
|  |                 model_type: 'RadioProfileConfiguration', | ||||||
|  |                 bestApEnabled: true, | ||||||
|  |                 bestAPSteerType: 'both', | ||||||
|  |               }, | ||||||
|  |             }, | ||||||
|  |             profileType: 'equipment_ap', | ||||||
|  |           }, | ||||||
|  |           __typename: 'Profile', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }; | ||||||
| @@ -1,31 +1,10 @@ | |||||||
| import React, { useContext } from 'react'; | import React, { useContext } from 'react'; | ||||||
| import gql from 'graphql-tag'; |  | ||||||
| import { useQuery } from '@apollo/react-hooks'; | import { useQuery } from '@apollo/react-hooks'; | ||||||
| import { Alert, notification } from 'antd'; | import { Alert, notification } from 'antd'; | ||||||
| import { Alarms as AlarmsPage, Loading } from '@tip-wlan/wlan-cloud-ui-library'; | import { Alarms as AlarmsPage, Loading } from '@tip-wlan/wlan-cloud-ui-library'; | ||||||
|  |  | ||||||
| import UserContext from 'contexts/UserContext'; | import UserContext from 'contexts/UserContext'; | ||||||
|  | import { GET_ALL_ALARMS } from 'graphql/queries'; | ||||||
| const GET_ALL_ALARMS = gql` |  | ||||||
|   query GetAllAlarms($customerId: ID!, $cursor: String) { |  | ||||||
|     getAllAlarms(customerId: $customerId, cursor: $cursor) { |  | ||||||
|       items { |  | ||||||
|         severity |  | ||||||
|         alarmCode |  | ||||||
|         details |  | ||||||
|         createdTimestamp |  | ||||||
|         equipment { |  | ||||||
|           id |  | ||||||
|           name |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|       context { |  | ||||||
|         cursor |  | ||||||
|         lastPage |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| `; |  | ||||||
|  |  | ||||||
| const Alarms = () => { | const Alarms = () => { | ||||||
|   const { customerId } = useContext(UserContext); |   const { customerId } = useContext(UserContext); | ||||||
|   | |||||||
							
								
								
									
										121
									
								
								app/containers/Alarms/tests/index.test.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								app/containers/Alarms/tests/index.test.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,121 @@ | |||||||
|  | import React from 'react'; | ||||||
|  | import '@testing-library/jest-dom/extend-expect'; | ||||||
|  | import { fireEvent, render, waitFor } from '@testing-library/react'; | ||||||
|  | import { MockedProvider } from '@apollo/react-testing'; | ||||||
|  | import { BrowserRouter as Router } from 'react-router-dom'; | ||||||
|  | import UserProvider from 'contexts/UserProvider'; | ||||||
|  | import { alarmsQueryMock } from './mock'; | ||||||
|  | import Alarms from '..'; | ||||||
|  |  | ||||||
|  | Object.defineProperty(window, 'matchMedia', { | ||||||
|  |   writable: true, | ||||||
|  |   value: jest.fn().mockImplementation(query => ({ | ||||||
|  |     matches: false, | ||||||
|  |     media: query, | ||||||
|  |     onchange: null, | ||||||
|  |     addListener: jest.fn(), // deprecated | ||||||
|  |     removeListener: jest.fn(), // deprecated | ||||||
|  |     addEventListener: jest.fn(), | ||||||
|  |     removeEventListener: jest.fn(), | ||||||
|  |     dispatchEvent: jest.fn(), | ||||||
|  |   })), | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | const mockProp = { | ||||||
|  |   id: 123, | ||||||
|  |   email: 'test@test.com', | ||||||
|  |   role: 'admin', | ||||||
|  |   customerId: 2, | ||||||
|  |   updateUser: jest.fn(), | ||||||
|  |   updateToken: jest.fn(), | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | describe('<Alarms />', () => { | ||||||
|  |   afterEach(jest.resetModules); | ||||||
|  |  | ||||||
|  |   it('should render with Data', async () => { | ||||||
|  |     const { getAllByText } = render( | ||||||
|  |       <MockedProvider mocks={[alarmsQueryMock.success]} addTypename={false}> | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <Alarms /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getAllByText('Available memory is too low')[0]).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should show error when query return error', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider mocks={[alarmsQueryMock.error]} addTypename={false}> | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <Alarms /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('Failed to load alarms.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should work with the onLoadMore', async () => { | ||||||
|  |     const { getAllByText, getByRole } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[alarmsQueryMock.success, alarmsQueryMock.loadmore]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <Alarms /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getAllByText('Available memory is too low')[0]).toBeVisible()); | ||||||
|  |  | ||||||
|  |     fireEvent.click(getByRole('button', { name: /load more/i })); | ||||||
|  |     await waitFor(() => expect(getAllByText('Available memory is too low')[0]).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should work with the onReload', async () => { | ||||||
|  |     const { getAllByText, getByText, container } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[alarmsQueryMock.success, alarmsQueryMock.success]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <Alarms /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getAllByText('Available memory is too low')[0]).toBeVisible()); | ||||||
|  |  | ||||||
|  |     const reloadButton = container.querySelector( | ||||||
|  |       '.ant-btn.index-module__Button___VGygY.ant-btn-icon-only' | ||||||
|  |     ); | ||||||
|  |     fireEvent.click(reloadButton); | ||||||
|  |     await waitFor(() => expect(getByText('Alarms reloaded.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should show error when reload wuery return error', async () => { | ||||||
|  |     const { getAllByText, getByText, container } = render( | ||||||
|  |       <MockedProvider mocks={[alarmsQueryMock.success]} addTypename={false}> | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <Alarms /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getAllByText('Available memory is too low')[0]).toBeVisible()); | ||||||
|  |  | ||||||
|  |     const reloadButton = container.querySelector( | ||||||
|  |       '.ant-btn.index-module__Button___VGygY.ant-btn-icon-only' | ||||||
|  |     ); | ||||||
|  |     fireEvent.click(reloadButton); | ||||||
|  |     await waitFor(() => expect(getByText('Alarms reloaded.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
							
								
								
									
										191
									
								
								app/containers/Alarms/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										191
									
								
								app/containers/Alarms/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,191 @@ | |||||||
|  | import { GET_ALL_ALARMS } from 'graphql/queries'; | ||||||
|  |  | ||||||
|  | export const alarmsQueryMock = { | ||||||
|  |   success: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_ALL_ALARMS, | ||||||
|  |       variables: { customerId: 2 }, | ||||||
|  |       errorPolicy: 'all', | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         getAllAlarms: { | ||||||
|  |           items: [ | ||||||
|  |             { | ||||||
|  |               severity: 'error', | ||||||
|  |               alarmCode: 'MemoryUtilization', | ||||||
|  |               details: { | ||||||
|  |                 model_type: 'AlarmDetails', | ||||||
|  |                 message: 'Available memory is too low', | ||||||
|  |                 affectedEquipmentIds: null, | ||||||
|  |                 generatedBy: null, | ||||||
|  |                 contextAttrs: null, | ||||||
|  |               }, | ||||||
|  |               createdTimestamp: '1596564234684', | ||||||
|  |               equipment: { | ||||||
|  |                 id: '7', | ||||||
|  |                 name: 'AP 7', | ||||||
|  |               }, | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |               severity: 'error', | ||||||
|  |               alarmCode: 'MemoryUtilization', | ||||||
|  |               details: { | ||||||
|  |                 model_type: 'AlarmDetails', | ||||||
|  |                 message: 'Available memory is too low', | ||||||
|  |                 affectedEquipmentIds: null, | ||||||
|  |                 generatedBy: null, | ||||||
|  |                 contextAttrs: null, | ||||||
|  |               }, | ||||||
|  |               createdTimestamp: '1596564234796', | ||||||
|  |               equipment: { | ||||||
|  |                 id: '14', | ||||||
|  |                 name: 'AP 14', | ||||||
|  |               }, | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |               severity: 'error', | ||||||
|  |               alarmCode: 'MemoryUtilization', | ||||||
|  |               details: { | ||||||
|  |                 model_type: 'AlarmDetails', | ||||||
|  |                 message: 'Available memory is too low', | ||||||
|  |                 affectedEquipmentIds: null, | ||||||
|  |                 generatedBy: null, | ||||||
|  |                 contextAttrs: null, | ||||||
|  |               }, | ||||||
|  |               createdTimestamp: '1596564234885', | ||||||
|  |               equipment: { | ||||||
|  |                 id: '21', | ||||||
|  |                 name: 'AP 21', | ||||||
|  |               }, | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |               severity: 'error', | ||||||
|  |               alarmCode: 'MemoryUtilization', | ||||||
|  |               details: { | ||||||
|  |                 model_type: 'AlarmDetails', | ||||||
|  |                 message: 'Available memory is too low', | ||||||
|  |                 affectedEquipmentIds: null, | ||||||
|  |                 generatedBy: null, | ||||||
|  |                 contextAttrs: null, | ||||||
|  |               }, | ||||||
|  |               createdTimestamp: '1596564234957', | ||||||
|  |               equipment: { | ||||||
|  |                 id: '28', | ||||||
|  |                 name: 'AP 28', | ||||||
|  |               }, | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |               severity: 'error', | ||||||
|  |               alarmCode: 'MemoryUtilization', | ||||||
|  |               details: { | ||||||
|  |                 model_type: 'AlarmDetails', | ||||||
|  |                 message: 'Available memory is too low', | ||||||
|  |                 affectedEquipmentIds: null, | ||||||
|  |                 generatedBy: null, | ||||||
|  |                 contextAttrs: null, | ||||||
|  |               }, | ||||||
|  |               createdTimestamp: '1596564235022', | ||||||
|  |               equipment: { | ||||||
|  |                 id: '35', | ||||||
|  |                 name: 'AP 35', | ||||||
|  |               }, | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |               severity: 'error', | ||||||
|  |               alarmCode: 'MemoryUtilization', | ||||||
|  |               details: { | ||||||
|  |                 model_type: 'AlarmDetails', | ||||||
|  |                 message: 'Available memory is too low', | ||||||
|  |                 affectedEquipmentIds: null, | ||||||
|  |                 generatedBy: null, | ||||||
|  |                 contextAttrs: null, | ||||||
|  |               }, | ||||||
|  |               createdTimestamp: '1596564235082', | ||||||
|  |               equipment: { | ||||||
|  |                 id: '42', | ||||||
|  |                 name: 'AP 42', | ||||||
|  |               }, | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |               severity: 'error', | ||||||
|  |               alarmCode: 'MemoryUtilization', | ||||||
|  |               details: { | ||||||
|  |                 model_type: 'AlarmDetails', | ||||||
|  |                 message: 'Available memory is too low', | ||||||
|  |                 affectedEquipmentIds: null, | ||||||
|  |                 generatedBy: null, | ||||||
|  |                 contextAttrs: null, | ||||||
|  |               }, | ||||||
|  |               createdTimestamp: '1596564235155', | ||||||
|  |               equipment: { | ||||||
|  |                 id: '49', | ||||||
|  |                 name: 'AP 49', | ||||||
|  |               }, | ||||||
|  |             }, | ||||||
|  |           ], | ||||||
|  |           context: { | ||||||
|  |             cursor: 'test', | ||||||
|  |             lastPage: false, | ||||||
|  |           }, | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |       loading: false, | ||||||
|  |       networkStatus: 7, | ||||||
|  |       stale: false, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   loadmore: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_ALL_ALARMS, | ||||||
|  |       variables: { customerId: 2, cursor: 'test' }, | ||||||
|  |       errorPolicy: 'all', | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         getAllAlarms: { | ||||||
|  |           items: [ | ||||||
|  |             { | ||||||
|  |               severity: 'error', | ||||||
|  |               alarmCode: 'MemoryUtilization', | ||||||
|  |               details: { | ||||||
|  |                 model_type: 'AlarmDetails', | ||||||
|  |                 message: 'Available memory is too low', | ||||||
|  |                 affectedEquipmentIds: null, | ||||||
|  |                 generatedBy: null, | ||||||
|  |                 contextAttrs: null, | ||||||
|  |               }, | ||||||
|  |               createdTimestamp: '1596564234684', | ||||||
|  |               equipment: { | ||||||
|  |                 id: '7', | ||||||
|  |                 name: 'AP 7', | ||||||
|  |               }, | ||||||
|  |             }, | ||||||
|  |           ], | ||||||
|  |           context: { | ||||||
|  |             cursor: 'test2', | ||||||
|  |             lastPage: true, | ||||||
|  |           }, | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |       loading: false, | ||||||
|  |       networkStatus: 7, | ||||||
|  |       stale: false, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |  | ||||||
|  |   error: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_ALL_ALARMS, | ||||||
|  |       variables: { customerId: 2 }, | ||||||
|  |       errorPolicy: 'all', | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: null, | ||||||
|  |       loading: false, | ||||||
|  |       errors: [{}], | ||||||
|  |       networkStatus: 7, | ||||||
|  |       stale: false, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }; | ||||||
							
								
								
									
										68
									
								
								app/containers/Dashboard/tests/index.test.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								app/containers/Dashboard/tests/index.test.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | |||||||
|  | import React from 'react'; | ||||||
|  | import '@testing-library/jest-dom/extend-expect'; | ||||||
|  | import { MockedProvider } from '@apollo/react-testing'; | ||||||
|  | import { render, waitFor } from '@testing-library/react'; | ||||||
|  | import UserProvider from 'contexts/UserProvider'; | ||||||
|  | import { dashboardQueryMock } from './mock'; | ||||||
|  | import Dashboard from '..'; | ||||||
|  |  | ||||||
|  | Object.defineProperty(window, 'matchMedia', { | ||||||
|  |   writable: true, | ||||||
|  |   value: jest.fn().mockImplementation(query => ({ | ||||||
|  |     matches: false, | ||||||
|  |     media: query, | ||||||
|  |     onchange: null, | ||||||
|  |     addListener: jest.fn(), // deprecated | ||||||
|  |     removeListener: jest.fn(), // deprecated | ||||||
|  |     addEventListener: jest.fn(), | ||||||
|  |     removeEventListener: jest.fn(), | ||||||
|  |     dispatchEvent: jest.fn(), | ||||||
|  |   })), | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | const mockProp = { | ||||||
|  |   id: 123, | ||||||
|  |   email: 'test@test.com', | ||||||
|  |   role: 'admin', | ||||||
|  |   customerId: 2, | ||||||
|  |   updateUser: jest.fn(), | ||||||
|  |   updateToken: jest.fn(), | ||||||
|  | }; | ||||||
|  | jest.mock('moment', () => () => ({ | ||||||
|  |   subtract: () => ({ valueOf: () => ({ toString: () => '1234' }) }), | ||||||
|  |   valueOf: () => ({ toString: () => '1234' }), | ||||||
|  | })); | ||||||
|  | jest.useFakeTimers(); | ||||||
|  | describe('<Dashboard />', () => { | ||||||
|  |   afterEach(jest.resetModules); | ||||||
|  |  | ||||||
|  |   it('should render with data', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           dashboardQueryMock.filterSystemEvents.success, | ||||||
|  |           dashboardQueryMock.filterSystemEvents.success, | ||||||
|  |           dashboardQueryMock.getAllStatus.success, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Dashboard /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     jest.advanceTimersByTime('300000'); | ||||||
|  |     await waitFor(() => expect(getByText('2.4GHz')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('error message should be visible with error true', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider mocks={[dashboardQueryMock.filterSystemEvents.error]} addTypename={false}> | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Dashboard /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('Failed to load Dashboard')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
							
								
								
									
										2436
									
								
								app/containers/Dashboard/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2436
									
								
								app/containers/Dashboard/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,48 +1,11 @@ | |||||||
| import React, { useContext } from 'react'; | import React, { useContext } from 'react'; | ||||||
| import gql from 'graphql-tag'; |  | ||||||
| import { useMutation, useQuery } from '@apollo/react-hooks'; | import { useMutation, useQuery } from '@apollo/react-hooks'; | ||||||
| import { notification, Alert } from 'antd'; | import { notification, Alert } from 'antd'; | ||||||
| import { EditAccount as EditAccountPage, Loading } from '@tip-wlan/wlan-cloud-ui-library'; | import { EditAccount as EditAccountPage, Loading } from '@tip-wlan/wlan-cloud-ui-library'; | ||||||
|  |  | ||||||
| import UserContext from 'contexts/UserContext'; | import UserContext from 'contexts/UserContext'; | ||||||
|  | import { GET_USER } from 'graphql/queries'; | ||||||
| const GET_USER = gql` | import { UPDATE_USER } from 'graphql/mutations'; | ||||||
|   query GetUser($id: ID!) { |  | ||||||
|     getUser(id: $id) { |  | ||||||
|       id |  | ||||||
|       username |  | ||||||
|       role |  | ||||||
|       customerId |  | ||||||
|       lastModifiedTimestamp |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| `; |  | ||||||
|  |  | ||||||
| const UPDATE_USER = gql` |  | ||||||
|   mutation UpdateUser( |  | ||||||
|     $id: ID! |  | ||||||
|     $username: String! |  | ||||||
|     $password: String! |  | ||||||
|     $role: String! |  | ||||||
|     $customerId: ID! |  | ||||||
|     $lastModifiedTimestamp: String |  | ||||||
|   ) { |  | ||||||
|     updateUser( |  | ||||||
|       id: $id |  | ||||||
|       username: $username |  | ||||||
|       password: $password |  | ||||||
|       role: $role |  | ||||||
|       customerId: $customerId |  | ||||||
|       lastModifiedTimestamp: $lastModifiedTimestamp |  | ||||||
|     ) { |  | ||||||
|       id |  | ||||||
|       username |  | ||||||
|       role |  | ||||||
|       customerId |  | ||||||
|       lastModifiedTimestamp |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| `; |  | ||||||
|  |  | ||||||
| const EditAccount = () => { | const EditAccount = () => { | ||||||
|   const { id, email } = useContext(UserContext); |   const { id, email } = useContext(UserContext); | ||||||
|   | |||||||
							
								
								
									
										86
									
								
								app/containers/EditAccount/tests/index.test.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								app/containers/EditAccount/tests/index.test.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,86 @@ | |||||||
|  | import React from 'react'; | ||||||
|  | import '@testing-library/jest-dom/extend-expect'; | ||||||
|  | import { fireEvent, render, waitFor } from '@testing-library/react'; | ||||||
|  | import { MockedProvider } from '@apollo/react-testing'; | ||||||
|  | import UserProvider from 'contexts/UserProvider'; | ||||||
|  | import { editAccountMutationMock, editAccountQueryMock } from './mock'; | ||||||
|  | import EditAccount from '..'; | ||||||
|  |  | ||||||
|  | Object.defineProperty(window, 'matchMedia', { | ||||||
|  |   writable: true, | ||||||
|  |   value: jest.fn().mockImplementation(query => ({ | ||||||
|  |     matches: false, | ||||||
|  |     media: query, | ||||||
|  |     onchange: null, | ||||||
|  |     addListener: jest.fn(), // deprecated | ||||||
|  |     removeListener: jest.fn(), // deprecated | ||||||
|  |     addEventListener: jest.fn(), | ||||||
|  |     removeEventListener: jest.fn(), | ||||||
|  |     dispatchEvent: jest.fn(), | ||||||
|  |   })), | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | const mockProp = { | ||||||
|  |   id: 123, | ||||||
|  |   email: 'test@test.com', | ||||||
|  |   role: 'admin', | ||||||
|  |   customerId: 2, | ||||||
|  |   updateUser: jest.fn(), | ||||||
|  |   updateToken: jest.fn(), | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | describe('<EditAccount />', () => { | ||||||
|  |   afterEach(jest.resetModules); | ||||||
|  |  | ||||||
|  |   it('should render with Data and Edit Profile when valid Mutation', async () => { | ||||||
|  |     const { getByText, getByTestId, getByLabelText } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[editAccountQueryMock.success, editAccountMutationMock.success]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <EditAccount /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('New Password')).toBeVisible()); | ||||||
|  |  | ||||||
|  |     fireEvent.change(getByLabelText('New Password'), { target: { value: 'password' } }); | ||||||
|  |     await waitFor(() => expect(getByLabelText('New Password')).toHaveValue('password')); | ||||||
|  |     fireEvent.change(getByLabelText('Confirm Password'), { target: { value: 'password' } }); | ||||||
|  |     fireEvent.submit(getByTestId('saveButton')); | ||||||
|  |     await waitFor(() => expect(getByText('Password successfully updated.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should show error when query return Error', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider mocks={[editAccountQueryMock.error]} addTypename={false}> | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <EditAccount /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |  | ||||||
|  |     await waitFor(() => expect(getByText('Failed to load User.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should show error when edit profile Mutation return error', async () => { | ||||||
|  |     const { getByText, getByTestId, getByLabelText } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[editAccountQueryMock.success, editAccountMutationMock.error]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <EditAccount /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('New Password')).toBeVisible()); | ||||||
|  |  | ||||||
|  |     fireEvent.change(getByLabelText('New Password'), { target: { value: 'password' } }); | ||||||
|  |     await waitFor(() => expect(getByLabelText('New Password')).toHaveValue('password')); | ||||||
|  |     fireEvent.change(getByLabelText('Confirm Password'), { target: { value: 'password' } }); | ||||||
|  |     fireEvent.submit(getByTestId('saveButton')); | ||||||
|  |     await waitFor(() => expect(getByText('Password could not be updated.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
							
								
								
									
										85
									
								
								app/containers/EditAccount/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								app/containers/EditAccount/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | |||||||
|  | import { GET_USER } from 'graphql/queries'; | ||||||
|  | import { UPDATE_USER } from 'graphql/mutations'; | ||||||
|  |  | ||||||
|  | export const editAccountQueryMock = { | ||||||
|  |   success: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_USER, | ||||||
|  |       variables: { id: 123 }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         getUser: { | ||||||
|  |           id: '123', | ||||||
|  |           username: 'user-0', | ||||||
|  |           role: 'CustomerIT', | ||||||
|  |           customerId: '2', | ||||||
|  |           lastModifiedTimestamp: '1597238767547', | ||||||
|  |           __typename: 'User', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |       loading: false, | ||||||
|  |       networkStatus: 7, | ||||||
|  |       stale: false, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |  | ||||||
|  |   error: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_USER, | ||||||
|  |       variables: { id: 123 }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: null, | ||||||
|  |       errors: [{}], | ||||||
|  |       loading: false, | ||||||
|  |       networkStatus: 7, | ||||||
|  |       stale: false, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | export const editAccountMutationMock = { | ||||||
|  |   success: { | ||||||
|  |     request: { | ||||||
|  |       query: UPDATE_USER, | ||||||
|  |       variables: { | ||||||
|  |         id: 123, | ||||||
|  |         username: 'test@test.com', | ||||||
|  |         password: 'password', | ||||||
|  |         role: 'CustomerIT', | ||||||
|  |         customerId: '2', | ||||||
|  |         lastModifiedTimestamp: '1597238767547', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         updateUser: { | ||||||
|  |           id: 123, | ||||||
|  |           username: 'user-0', | ||||||
|  |           role: 'CustomerIT', | ||||||
|  |           customerId: '2', | ||||||
|  |           lastModifiedTimestamp: '1597238767547', | ||||||
|  |           __typename: 'User', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   error: { | ||||||
|  |     request: { | ||||||
|  |       query: UPDATE_USER, | ||||||
|  |       variables: { | ||||||
|  |         id: 123, | ||||||
|  |         username: 'test@test.com', | ||||||
|  |         password: 'password', | ||||||
|  |         role: 'CustomerIT', | ||||||
|  |         customerId: '2', | ||||||
|  |         lastModifiedTimestamp: '1597238767547', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: null, | ||||||
|  |       errors: [{}], | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }; | ||||||
| @@ -1,5 +1,4 @@ | |||||||
| import React, { useContext } from 'react'; | import React, { useContext } from 'react'; | ||||||
| import gql from 'graphql-tag'; |  | ||||||
| import { useMutation, useApolloClient } from '@apollo/react-hooks'; | import { useMutation, useApolloClient } from '@apollo/react-hooks'; | ||||||
| import { useHistory } from 'react-router-dom'; | import { useHistory } from 'react-router-dom'; | ||||||
| import { notification } from 'antd'; | import { notification } from 'antd'; | ||||||
| @@ -7,16 +6,7 @@ import { notification } from 'antd'; | |||||||
| import { Login as LoginPage } from '@tip-wlan/wlan-cloud-ui-library'; | import { Login as LoginPage } from '@tip-wlan/wlan-cloud-ui-library'; | ||||||
|  |  | ||||||
| import UserContext from 'contexts/UserContext'; | import UserContext from 'contexts/UserContext'; | ||||||
|  | import { AUTHENTICATE_USER } from 'graphql/mutations'; | ||||||
| const AUTHENTICATE_USER = gql` |  | ||||||
|   mutation AuthenticateUser($email: String!, $password: String!) { |  | ||||||
|     authenticateUser(email: $email, password: $password) { |  | ||||||
|       access_token |  | ||||||
|       refresh_token |  | ||||||
|       expires_in |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| `; |  | ||||||
|  |  | ||||||
| const Login = () => { | const Login = () => { | ||||||
|   const history = useHistory(); |   const history = useHistory(); | ||||||
|   | |||||||
							
								
								
									
										71
									
								
								app/containers/Login/tests/index.test.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								app/containers/Login/tests/index.test.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,71 @@ | |||||||
|  | import React from 'react'; | ||||||
|  | import '@testing-library/jest-dom/extend-expect'; | ||||||
|  | import { fireEvent, cleanup, render, waitFor } from '@testing-library/react'; | ||||||
|  | import { MockedProvider } from '@apollo/react-testing'; | ||||||
|  | import UserProvider from 'contexts/UserProvider'; | ||||||
|  | import { ThemeProvider } from '@tip-wlan/wlan-cloud-ui-library'; | ||||||
|  | import { loginMutationMock } from './mock'; | ||||||
|  | import Login from '..'; | ||||||
|  |  | ||||||
|  | jest.mock('react-router-dom', () => ({ | ||||||
|  |   useHistory: () => ({ push: jest.fn() }), | ||||||
|  | })); | ||||||
|  |  | ||||||
|  | Object.defineProperty(window, 'matchMedia', { | ||||||
|  |   writable: true, | ||||||
|  |   value: jest.fn().mockImplementation(query => ({ | ||||||
|  |     matches: false, | ||||||
|  |     media: query, | ||||||
|  |     onchange: null, | ||||||
|  |     addListener: jest.fn(), // deprecated | ||||||
|  |     removeListener: jest.fn(), // deprecated | ||||||
|  |     addEventListener: jest.fn(), | ||||||
|  |     removeEventListener: jest.fn(), | ||||||
|  |     dispatchEvent: jest.fn(), | ||||||
|  |   })), | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | const mockProp = { | ||||||
|  |   id: 123, | ||||||
|  |   email: 'test@test.com', | ||||||
|  |   role: 'admin', | ||||||
|  |   customerId: 2, | ||||||
|  |   updateUser: jest.fn(), | ||||||
|  |   updateToken: jest.fn(), | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | describe('<Login />', () => { | ||||||
|  |   afterEach(() => cleanup); | ||||||
|  |   it('login should be successful when mutation is valid', async () => { | ||||||
|  |     const { getByLabelText, getByTestId } = render( | ||||||
|  |       <ThemeProvider company="Test" logo="test.png" logoMobile="test.png"> | ||||||
|  |         <MockedProvider mocks={[loginMutationMock.loginSuccess]} addTypename={false}> | ||||||
|  |           <UserProvider {...mockProp}> | ||||||
|  |             <Login /> | ||||||
|  |           </UserProvider> | ||||||
|  |         </MockedProvider> | ||||||
|  |       </ThemeProvider> | ||||||
|  |     ); | ||||||
|  |  | ||||||
|  |     fireEvent.change(getByLabelText('E-mail'), { target: { value: 'test@test.com' } }); | ||||||
|  |     fireEvent.change(getByLabelText('Password'), { target: { value: 'password' } }); | ||||||
|  |     fireEvent.submit(getByTestId('loginButton')); | ||||||
|  |     await waitFor(() => expect(getByLabelText('E-mail')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('login should not be successful when mutation is invalid', async () => { | ||||||
|  |     const { getByLabelText, getByText, getByTestId } = render( | ||||||
|  |       <ThemeProvider company="Test" logo="test.png" logoMobile="test.png"> | ||||||
|  |         <MockedProvider mocks={[loginMutationMock.loginError]} addTypename={false}> | ||||||
|  |           <UserProvider {...mockProp}> | ||||||
|  |             <Login /> | ||||||
|  |           </UserProvider> | ||||||
|  |         </MockedProvider> | ||||||
|  |       </ThemeProvider> | ||||||
|  |     ); | ||||||
|  |     fireEvent.change(getByLabelText('E-mail'), { target: { value: 'test@test.com' } }); | ||||||
|  |     fireEvent.change(getByLabelText('Password'), { target: { value: 'password' } }); | ||||||
|  |     fireEvent.submit(getByTestId('loginButton')); | ||||||
|  |     await waitFor(() => expect(getByText('Invalid e-mail or password.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
							
								
								
									
										32
									
								
								app/containers/Login/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								app/containers/Login/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | |||||||
|  | import { AUTHENTICATE_USER } from 'graphql/mutations'; | ||||||
|  |  | ||||||
|  | export const loginMutationMock = { | ||||||
|  |   loginSuccess: { | ||||||
|  |     request: { | ||||||
|  |       query: AUTHENTICATE_USER, | ||||||
|  |       variables: { | ||||||
|  |         email: 'test@test.com', | ||||||
|  |         password: 'password', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         authenticateUser: { | ||||||
|  |           access_token: '123', | ||||||
|  |           refresh_token: '345', | ||||||
|  |           expires_in: '1', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   loginError: { | ||||||
|  |     request: { | ||||||
|  |       query: AUTHENTICATE_USER, | ||||||
|  |       variables: {}, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: null, | ||||||
|  |       errors: [{}], | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }; | ||||||
| @@ -1,7 +1,7 @@ | |||||||
| import React, { useContext } from 'react'; | import React, { useContext } from 'react'; | ||||||
| import PropTypes from 'prop-types'; | import PropTypes from 'prop-types'; | ||||||
| import { useParams } from 'react-router-dom'; |  | ||||||
| import gql from 'graphql-tag'; | import gql from 'graphql-tag'; | ||||||
|  | import { useParams } from 'react-router-dom'; | ||||||
| import { useQuery, useMutation } from '@apollo/react-hooks'; | import { useQuery, useMutation } from '@apollo/react-hooks'; | ||||||
| import { Alert, notification } from 'antd'; | import { Alert, notification } from 'antd'; | ||||||
| import moment from 'moment'; | import moment from 'moment'; | ||||||
| @@ -10,129 +10,10 @@ import { | |||||||
|   Loading, |   Loading, | ||||||
| } from '@tip-wlan/wlan-cloud-ui-library'; | } from '@tip-wlan/wlan-cloud-ui-library'; | ||||||
|  |  | ||||||
| import { FILTER_SERVICE_METRICS } from 'graphql/queries'; | import { GET_EQUIPMENT, GET_ALL_FIRMWARE, FILTER_SERVICE_METRICS } from 'graphql/queries'; | ||||||
| import { UPDATE_EQUIPMENT_FIRMWARE } from 'graphql/mutations'; | import { UPDATE_EQUIPMENT, UPDATE_EQUIPMENT_FIRMWARE } from 'graphql/mutations'; | ||||||
| import UserContext from 'contexts/UserContext'; | import UserContext from 'contexts/UserContext'; | ||||||
|  |  | ||||||
| const GET_EQUIPMENT = gql` |  | ||||||
|   query GetEquipment($id: ID!) { |  | ||||||
|     getEquipment(id: $id) { |  | ||||||
|       id |  | ||||||
|       equipmentType |  | ||||||
|       inventoryId |  | ||||||
|       customerId |  | ||||||
|       profileId |  | ||||||
|       locationId |  | ||||||
|       name |  | ||||||
|       latitude |  | ||||||
|       longitude |  | ||||||
|       serial |  | ||||||
|       lastModifiedTimestamp |  | ||||||
|       details |  | ||||||
|       profile { |  | ||||||
|         id |  | ||||||
|         name |  | ||||||
|         childProfiles { |  | ||||||
|           id |  | ||||||
|           name |  | ||||||
|           details |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|       status { |  | ||||||
|         firmware { |  | ||||||
|           detailsJSON |  | ||||||
|         } |  | ||||||
|         protocol { |  | ||||||
|           detailsJSON |  | ||||||
|           details { |  | ||||||
|             reportedMacAddr |  | ||||||
|             manufacturer |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|         radioUtilization { |  | ||||||
|           detailsJSON |  | ||||||
|         } |  | ||||||
|         clientDetails { |  | ||||||
|           detailsJSON |  | ||||||
|           details { |  | ||||||
|             numClientsPerRadio |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|         osPerformance { |  | ||||||
|           detailsJSON |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|       model |  | ||||||
|       alarmsCount |  | ||||||
|       alarms { |  | ||||||
|         severity |  | ||||||
|         alarmCode |  | ||||||
|         details |  | ||||||
|         createdTimestamp |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| `; |  | ||||||
|  |  | ||||||
| export const GET_ALL_FIRMWARE = gql` |  | ||||||
|   query GetAllFirmware { |  | ||||||
|     getAllFirmware { |  | ||||||
|       id |  | ||||||
|       modelId |  | ||||||
|       versionName |  | ||||||
|       description |  | ||||||
|       filename |  | ||||||
|       commit |  | ||||||
|       releaseDate |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| `; |  | ||||||
|  |  | ||||||
| const UPDATE_EQUIPMENT = gql` |  | ||||||
|   mutation UpdateEquipment( |  | ||||||
|     $id: ID! |  | ||||||
|     $equipmentType: String! |  | ||||||
|     $inventoryId: String! |  | ||||||
|     $customerId: ID! |  | ||||||
|     $profileId: ID! |  | ||||||
|     $locationId: ID! |  | ||||||
|     $name: String! |  | ||||||
|     $latitude: String |  | ||||||
|     $longitude: String |  | ||||||
|     $serial: String |  | ||||||
|     $lastModifiedTimestamp: String |  | ||||||
|     $details: JSONObject |  | ||||||
|   ) { |  | ||||||
|     updateEquipment( |  | ||||||
|       id: $id |  | ||||||
|       equipmentType: $equipmentType |  | ||||||
|       inventoryId: $inventoryId |  | ||||||
|       customerId: $customerId |  | ||||||
|       profileId: $profileId |  | ||||||
|       locationId: $locationId |  | ||||||
|       name: $name |  | ||||||
|       latitude: $latitude |  | ||||||
|       longitude: $longitude |  | ||||||
|       serial: $serial |  | ||||||
|       lastModifiedTimestamp: $lastModifiedTimestamp |  | ||||||
|       details: $details |  | ||||||
|     ) { |  | ||||||
|       id |  | ||||||
|       equipmentType |  | ||||||
|       inventoryId |  | ||||||
|       customerId |  | ||||||
|       profileId |  | ||||||
|       locationId |  | ||||||
|       name |  | ||||||
|       latitude |  | ||||||
|       longitude |  | ||||||
|       serial |  | ||||||
|       lastModifiedTimestamp |  | ||||||
|       details |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| `; |  | ||||||
|  |  | ||||||
| export const GET_ALL_PROFILES = gql` | export const GET_ALL_PROFILES = gql` | ||||||
|   query GetAllProfiles($customerId: ID!, $cursor: String, $type: String, $limit: Int) { |   query GetAllProfiles($customerId: ID!, $cursor: String, $type: String, $limit: Int) { | ||||||
|     getAllProfiles(customerId: $customerId, cursor: $cursor, type: $type, limit: $limit) { |     getAllProfiles(customerId: $customerId, cursor: $cursor, type: $type, limit: $limit) { | ||||||
|   | |||||||
| @@ -0,0 +1,106 @@ | |||||||
|  | import React from 'react'; | ||||||
|  | import '@testing-library/jest-dom/extend-expect'; | ||||||
|  | import { MockedProvider } from '@apollo/react-testing'; | ||||||
|  | import { render, waitFor } from '@testing-library/react'; | ||||||
|  | import UserProvider from 'contexts/UserProvider'; | ||||||
|  | import { APDetailsQueryMock } from './mock'; | ||||||
|  | import AccessPointDetails from '..'; | ||||||
|  |  | ||||||
|  | Object.defineProperty(window, 'matchMedia', { | ||||||
|  |   writable: true, | ||||||
|  |   value: jest.fn().mockImplementation(query => ({ | ||||||
|  |     matches: false, | ||||||
|  |     media: query, | ||||||
|  |     onchange: null, | ||||||
|  |     addListener: jest.fn(), // deprecated | ||||||
|  |     removeListener: jest.fn(), // deprecated | ||||||
|  |     addEventListener: jest.fn(), | ||||||
|  |     removeEventListener: jest.fn(), | ||||||
|  |     dispatchEvent: jest.fn(), | ||||||
|  |   })), | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | const mockProp = { | ||||||
|  |   id: 123, | ||||||
|  |   email: 'test@test.com', | ||||||
|  |   role: 'admin', | ||||||
|  |   customerId: 2, | ||||||
|  |   updateUser: jest.fn(), | ||||||
|  |   updateToken: jest.fn(), | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | jest.mock('moment', () => () => ({ | ||||||
|  |   subtract: () => ({ valueOf: () => ({ toString: () => '1234' }) }), | ||||||
|  |   valueOf: () => ({ toString: () => '1234' }), | ||||||
|  | })); | ||||||
|  | jest.mock('react-router-dom', () => ({ | ||||||
|  |   useParams: () => ({ | ||||||
|  |     id: '1', | ||||||
|  |   }), | ||||||
|  |   useHistory: () => ({ push: jest.fn() }), | ||||||
|  | })); | ||||||
|  |  | ||||||
|  | jest.useFakeTimers(); | ||||||
|  | describe('<AccessPointDetails />', () => { | ||||||
|  |   afterEach(jest.resetModules); | ||||||
|  |  | ||||||
|  |   it('error message should be visible with error true', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           APDetailsQueryMock.getEquipment.error, | ||||||
|  |           APDetailsQueryMock.getAllProfiles.error, | ||||||
|  |           APDetailsQueryMock.getAllFirmware.error, | ||||||
|  |           APDetailsQueryMock.filterServiceMetrics.error, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <AccessPointDetails locations={[1, 2, 3]} /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     jest.advanceTimersByTime(1000); | ||||||
|  |     await waitFor(() => expect(getByText('Failed to load Access Point data.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('error message should be visible with error true', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           APDetailsQueryMock.getEquipment.success, | ||||||
|  |           APDetailsQueryMock.getAllProfiles.error, | ||||||
|  |           APDetailsQueryMock.getAllFirmware.success, | ||||||
|  |           APDetailsQueryMock.filterServiceMetrics.success, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <AccessPointDetails locations={[1, 2, 3]} /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     jest.advanceTimersByTime(1000); | ||||||
|  |     await waitFor(() => expect(getByText('Failed to load Access Point profiles.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('error message should be visible with error true', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           APDetailsQueryMock.getEquipment.success, | ||||||
|  |           APDetailsQueryMock.getAllProfiles.success, | ||||||
|  |           APDetailsQueryMock.getAllFirmware.error, | ||||||
|  |           APDetailsQueryMock.filterServiceMetrics.success, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <AccessPointDetails locations={[1, 2, 3]} /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     jest.advanceTimersByTime(1000); | ||||||
|  |     await waitFor(() => expect(getByText('Failed to load Access Point firmware.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
							
								
								
									
										1064
									
								
								app/containers/Network/containers/AccessPointDetails/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1064
									
								
								app/containers/Network/containers/AccessPointDetails/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -0,0 +1,124 @@ | |||||||
|  | import React from 'react'; | ||||||
|  | import '@testing-library/jest-dom/extend-expect'; | ||||||
|  | import { MockedProvider } from '@apollo/react-testing'; | ||||||
|  | import { fireEvent, render, waitFor } from '@testing-library/react'; | ||||||
|  | import UserProvider from 'contexts/UserProvider'; | ||||||
|  | import { BrowserRouter as Router } from 'react-router-dom'; | ||||||
|  | import { AccessPointsQueryMock } from './mock'; | ||||||
|  | import AccessPoints from '..'; | ||||||
|  |  | ||||||
|  | Object.defineProperty(window, 'matchMedia', { | ||||||
|  |   writable: true, | ||||||
|  |   value: jest.fn().mockImplementation(query => ({ | ||||||
|  |     matches: false, | ||||||
|  |     media: query, | ||||||
|  |     onchange: null, | ||||||
|  |     addListener: jest.fn(), // deprecated | ||||||
|  |     removeListener: jest.fn(), // deprecated | ||||||
|  |     addEventListener: jest.fn(), | ||||||
|  |     removeEventListener: jest.fn(), | ||||||
|  |     dispatchEvent: jest.fn(), | ||||||
|  |   })), | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | const mockProp = { | ||||||
|  |   id: 123, | ||||||
|  |   email: 'test@test.com', | ||||||
|  |   role: 'admin', | ||||||
|  |   customerId: 2, | ||||||
|  |   updateUser: jest.fn(), | ||||||
|  |   updateToken: jest.fn(), | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | describe('<AccessPoints />', () => { | ||||||
|  |   afterEach(jest.resetModules); | ||||||
|  |  | ||||||
|  |   it('should render with data', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider mocks={[AccessPointsQueryMock.filterEquipment.success]} addTypename={false}> | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <AccessPoints checkedLocations={['2', '3', '4', '5', '6', '7', '8']} /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('AP 1')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('error message should be visible with error true', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider mocks={[AccessPointsQueryMock.filterEquipment.error]} addTypename={false}> | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <AccessPoints checkedLocations={[1, 2, 3]} /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('Failed to load equipment.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('click on Load More should fetch more data', async () => { | ||||||
|  |     const { getByRole, getByText } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           AccessPointsQueryMock.filterEquipment.success, | ||||||
|  |           AccessPointsQueryMock.filterEquipment.loadmore, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <AccessPoints checkedLocations={['2', '3', '4', '5', '6', '7', '8']} /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('AP 1')).toBeVisible()); | ||||||
|  |     fireEvent.click(getByRole('button', { name: /load more/i })); | ||||||
|  |     await waitFor(() => expect(getByText('AP 1')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('click on reload button should refetch data', async () => { | ||||||
|  |     const { getByText, container } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           AccessPointsQueryMock.filterEquipment.success, | ||||||
|  |           AccessPointsQueryMock.filterEquipment.success, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <AccessPoints checkedLocations={['2', '3', '4', '5', '6', '7', '8']} /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('AP 1')).toBeVisible()); | ||||||
|  |     const reloadButton = container.querySelector( | ||||||
|  |       '.ant-btn.index-module__Button___VGygY.ant-btn-icon-only' | ||||||
|  |     ); | ||||||
|  |     fireEvent.click(reloadButton); | ||||||
|  |     await waitFor(() => expect(getByText('Access points reloaded.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('click on reload button should not refetch data when query return error', async () => { | ||||||
|  |     const { getByText, container } = render( | ||||||
|  |       <MockedProvider mocks={[AccessPointsQueryMock.filterEquipment.success]} addTypename={false}> | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <AccessPoints checkedLocations={['2', '3', '4', '5', '6', '7', '8']} /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('AP 1')).toBeVisible()); | ||||||
|  |     const reloadButton = container.querySelector( | ||||||
|  |       '.ant-btn.index-module__Button___VGygY.ant-btn-icon-only' | ||||||
|  |     ); | ||||||
|  |     fireEvent.click(reloadButton); | ||||||
|  |     await waitFor(() => expect(getByText('Access points could not be reloaded.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
							
								
								
									
										1951
									
								
								app/containers/Network/containers/AccessPoints/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1951
									
								
								app/containers/Network/containers/AccessPoints/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -0,0 +1,152 @@ | |||||||
|  | import React from 'react'; | ||||||
|  | import '@testing-library/jest-dom/extend-expect'; | ||||||
|  | import { MockedProvider } from '@apollo/react-testing'; | ||||||
|  | import { render, waitFor } from '@testing-library/react'; | ||||||
|  | import UserProvider from 'contexts/UserProvider'; | ||||||
|  | import { BulkEditAPsQueryMock } from './mock'; | ||||||
|  | import BulkEditAPs from '..'; | ||||||
|  |  | ||||||
|  | Object.defineProperty(window, 'matchMedia', { | ||||||
|  |   writable: true, | ||||||
|  |   value: jest.fn().mockImplementation(query => ({ | ||||||
|  |     matches: false, | ||||||
|  |     media: query, | ||||||
|  |     onchange: null, | ||||||
|  |     addListener: jest.fn(), // deprecated | ||||||
|  |     removeListener: jest.fn(), // deprecated | ||||||
|  |     addEventListener: jest.fn(), | ||||||
|  |     removeEventListener: jest.fn(), | ||||||
|  |     dispatchEvent: jest.fn(), | ||||||
|  |   })), | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | const mockProp = { | ||||||
|  |   id: 123, | ||||||
|  |   email: 'test@test.com', | ||||||
|  |   role: 'admin', | ||||||
|  |   customerId: 2, | ||||||
|  |   updateUser: jest.fn(), | ||||||
|  |   updateToken: jest.fn(), | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | const locations = [ | ||||||
|  |   { | ||||||
|  |     children: [ | ||||||
|  |       { | ||||||
|  |         children: [ | ||||||
|  |           { | ||||||
|  |             id: '4', | ||||||
|  |             key: '4', | ||||||
|  |             locationType: 'FLOOR', | ||||||
|  |             name: 'Floor 1', | ||||||
|  |             parentId: '3', | ||||||
|  |             title: '', | ||||||
|  |             value: '4', | ||||||
|  |             __typename: 'Location', | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             id: '5', | ||||||
|  |             key: '5', | ||||||
|  |             locationType: 'FLOOR', | ||||||
|  |             name: 'Floor 2', | ||||||
|  |             parentId: '3', | ||||||
|  |             title: '', | ||||||
|  |             value: '5', | ||||||
|  |             __typename: 'Location', | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             id: '6', | ||||||
|  |             key: '6', | ||||||
|  |             locationType: 'FLOOR', | ||||||
|  |             name: 'Floor 3', | ||||||
|  |             parentId: '3', | ||||||
|  |             title: '', | ||||||
|  |             value: '6', | ||||||
|  |             __typename: 'Location', | ||||||
|  |           }, | ||||||
|  |         ], | ||||||
|  |         id: '3', | ||||||
|  |         key: '3', | ||||||
|  |         locationType: 'BUILDING', | ||||||
|  |         name: 'Building 1', | ||||||
|  |         parentId: '2', | ||||||
|  |         title: '', | ||||||
|  |         value: '3', | ||||||
|  |         __typename: 'Location', | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         id: '7', | ||||||
|  |         key: '7', | ||||||
|  |         locationType: 'BUILDING', | ||||||
|  |         name: 'Building 2', | ||||||
|  |         parentId: '2', | ||||||
|  |         title: '', | ||||||
|  |         value: '7', | ||||||
|  |         __typename: 'Location', | ||||||
|  |       }, | ||||||
|  |     ], | ||||||
|  |     id: '2', | ||||||
|  |     key: '2', | ||||||
|  |     locationType: 'SITE', | ||||||
|  |     name: 'Menlo Park', | ||||||
|  |     parentId: '0', | ||||||
|  |     title: '', | ||||||
|  |     value: '2', | ||||||
|  |     __typename: 'Location', | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     id: '8', | ||||||
|  |     key: '8', | ||||||
|  |     locationType: 'SITE', | ||||||
|  |     name: 'Ottawa', | ||||||
|  |     parentId: '0', | ||||||
|  |     title: 'test', | ||||||
|  |     value: '8', | ||||||
|  |     __typename: 'Location', | ||||||
|  |   }, | ||||||
|  | ]; | ||||||
|  |  | ||||||
|  | jest.mock('react-router-dom', () => ({ | ||||||
|  |   useParams: () => ({ | ||||||
|  |     id: '6', | ||||||
|  |   }), | ||||||
|  |   useHistory: () => ({ push: jest.fn() }), | ||||||
|  | })); | ||||||
|  | describe('<BulkEditAPs />', () => { | ||||||
|  |   afterEach(jest.resetModules); | ||||||
|  |  | ||||||
|  |   it('should render with data', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[BulkEditAPsQueryMock.filterEquipmentBulkEditAps.success]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <BulkEditAPs | ||||||
|  |             locations={locations} | ||||||
|  |             checkedLocations={['2', '3', '4', '5', '6', '7', '8']} | ||||||
|  |           /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |  | ||||||
|  |     await waitFor(() => expect(getByText('AP 1')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('error message should be visible with error true', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[BulkEditAPsQueryMock.filterEquipmentBulkEditAps.error]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <BulkEditAPs | ||||||
|  |             locations={locations} | ||||||
|  |             checkedLocations={['2', '3', '4', '5', '6', '7', '8']} | ||||||
|  |           /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('Failed to load equipments data.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
							
								
								
									
										9228
									
								
								app/containers/Network/containers/BulkEditAccessPoints/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9228
									
								
								app/containers/Network/containers/BulkEditAccessPoints/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -0,0 +1,122 @@ | |||||||
|  | import React from 'react'; | ||||||
|  | import '@testing-library/jest-dom/extend-expect'; | ||||||
|  | import { MockedProvider } from '@apollo/react-testing'; | ||||||
|  | import { fireEvent, render, waitFor, cleanup } from '@testing-library/react'; | ||||||
|  | import UserProvider from 'contexts/UserProvider'; | ||||||
|  | import { ClientDevicesDetailsQueryMock } from './mock'; | ||||||
|  | import ClientDeviceDetails from '..'; | ||||||
|  |  | ||||||
|  | Object.defineProperty(window, 'matchMedia', { | ||||||
|  |   writable: true, | ||||||
|  |   value: jest.fn().mockImplementation(query => ({ | ||||||
|  |     matches: false, | ||||||
|  |     media: query, | ||||||
|  |     onchange: null, | ||||||
|  |     addListener: jest.fn(), // deprecated | ||||||
|  |     removeListener: jest.fn(), // deprecated | ||||||
|  |     addEventListener: jest.fn(), | ||||||
|  |     removeEventListener: jest.fn(), | ||||||
|  |     dispatchEvent: jest.fn(), | ||||||
|  |   })), | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | const mockProp = { | ||||||
|  |   id: 123, | ||||||
|  |   email: 'test@test.com', | ||||||
|  |   role: 'admin', | ||||||
|  |   customerId: 2, | ||||||
|  |   updateUser: jest.fn(), | ||||||
|  |   updateToken: jest.fn(), | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | jest.mock('moment', () => () => ({ | ||||||
|  |   subtract: () => ({ valueOf: () => ({ toString: () => '1234' }) }), | ||||||
|  |   valueOf: () => ({ toString: () => '1234' }), | ||||||
|  | })); | ||||||
|  | jest.mock('react-router-dom', () => ({ | ||||||
|  |   useParams: () => ({ | ||||||
|  |     id: '74:9c:00:01:45:ae', | ||||||
|  |   }), | ||||||
|  |   useHistory: () => ({ push: jest.fn() }), | ||||||
|  | })); | ||||||
|  |  | ||||||
|  | jest.useFakeTimers(); | ||||||
|  | describe('<ClientDeviceDetails />', () => { | ||||||
|  |   afterEach(cleanup); | ||||||
|  |   beforeEach(() => jest.useFakeTimers()); | ||||||
|  |   it('error message should be visible with error true', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ClientDevicesDetailsQueryMock.getClientSession.error]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <ClientDeviceDetails /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('Failed to load Client Device.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should render with data', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           ClientDevicesDetailsQueryMock.getClientSession.success, | ||||||
|  |           ClientDevicesDetailsQueryMock.filterServiceMetrics.success, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <ClientDeviceDetails /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     // jest.advanceTimersByTime('1000'); | ||||||
|  |     await waitFor(() => expect(getByText('74:9c:00:01:45:ae')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it.only('click on reload button should refetch data', async () => { | ||||||
|  |     const { getByText, container } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           ClientDevicesDetailsQueryMock.getClientSession.success, | ||||||
|  |           ClientDevicesDetailsQueryMock.filterServiceMetrics.success, | ||||||
|  |           ClientDevicesDetailsQueryMock.getClientSession.success, | ||||||
|  |           ClientDevicesDetailsQueryMock.filterServiceMetrics.success, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <ClientDeviceDetails /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('74:9c:00:01:45:ae')).toBeVisible()); | ||||||
|  |     // await waitFor(() => expect(getByText('hostName-128213363803566')).toBeVisible()); | ||||||
|  |     const reloadButton = container.querySelector( | ||||||
|  |       '.ant-btn.index-module__Button___VGygY.ant-btn-icon-only' | ||||||
|  |     ); | ||||||
|  |     fireEvent.click(reloadButton); | ||||||
|  |     await waitFor(() => expect(getByText('Successfully reloaded.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   // it('error message should be visible with error true', async () => { | ||||||
|  |   //   const { getByText } = render( | ||||||
|  |   //     <MockedProvider | ||||||
|  |   //       mocks={[ | ||||||
|  |   //         ClientDevicesDetailsQueryMock.getClientSession.success, | ||||||
|  |   //         ClientDevicesDetailsQueryMock.filterServiceMetrics.success, | ||||||
|  |   //         ClientDevicesDetailsQueryMock.filterServiceMetrics.success, | ||||||
|  |   //         ClientDevicesDetailsQueryMock.getClientSession.success, | ||||||
|  |   //       ]} | ||||||
|  |   //       addTypename={false} | ||||||
|  |   //     > | ||||||
|  |   //       <UserProvider {...mockProp}> | ||||||
|  |   //         <ClientDeviceDetails  /> | ||||||
|  |   //       </UserProvider> | ||||||
|  |   //     </MockedProvider> | ||||||
|  |   //   ); | ||||||
|  |   //   jest.advanceTimersByTime(60000); | ||||||
|  |   // }); | ||||||
|  | }); | ||||||
| @@ -0,0 +1,183 @@ | |||||||
|  | import { GET_CLIENT_SESSION, FILTER_SERVICE_METRICS } from 'graphql/queries'; | ||||||
|  |  | ||||||
|  | export const ClientDevicesDetailsQueryMock = { | ||||||
|  |   getClientSession: { | ||||||
|  |     success: { | ||||||
|  |       request: { | ||||||
|  |         query: GET_CLIENT_SESSION, | ||||||
|  |         variables: { | ||||||
|  |           customerId: 2, | ||||||
|  |           macAddress: '74:9c:00:01:45:ae', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |       result: { | ||||||
|  |         data: { | ||||||
|  |           getClientSession: [ | ||||||
|  |             { | ||||||
|  |               id: '74:9c:00:01:45:ae', | ||||||
|  |               macAddress: '74:9c:00:01:45:ae', | ||||||
|  |               ipAddress: '192.168.10.171', | ||||||
|  |               hostname: 'hostName-128213363803566', | ||||||
|  |               ssid: 'Default-SSID-1597172801679', | ||||||
|  |               radioType: 'is2dot4GHz', | ||||||
|  |               signal: '-56', | ||||||
|  |               manufacturer: null, | ||||||
|  |               equipment: { | ||||||
|  |                 name: 'AP 40', | ||||||
|  |                 __typename: 'Equipment', | ||||||
|  |               }, | ||||||
|  |               details: { | ||||||
|  |                 model_type: 'ClientSessionDetails', | ||||||
|  |                 sessionId: 1597172802575, | ||||||
|  |                 authTimestamp: null, | ||||||
|  |                 assocTimestamp: 1597172185365, | ||||||
|  |                 assocInternalSC: null, | ||||||
|  |                 ipTimestamp: null, | ||||||
|  |                 disconnectByApTimestamp: null, | ||||||
|  |                 disconnectByClientTimestamp: null, | ||||||
|  |                 timeoutTimestamp: null, | ||||||
|  |                 firstDataSentTimestamp: null, | ||||||
|  |                 firstDataRcvdTimestamp: null, | ||||||
|  |                 ipAddress: '192.168.10.171', | ||||||
|  |                 radiusUsername: null, | ||||||
|  |                 ssid: 'Default-SSID-1597172801679', | ||||||
|  |                 radioType: 'is2dot4GHz', | ||||||
|  |                 lastEventTimestamp: 0, | ||||||
|  |                 hostname: 'hostName-128213363803566', | ||||||
|  |                 apFingerprint: 'fp 74:9c:00:01:45:ae', | ||||||
|  |                 userAgentStr: null, | ||||||
|  |                 lastRxTimestamp: null, | ||||||
|  |                 lastTxTimestamp: null, | ||||||
|  |                 cpUsername: null, | ||||||
|  |                 dhcpDetails: { | ||||||
|  |                   model_type: 'ClientDhcpDetails', | ||||||
|  |                   dhcpServerIp: '192.168.0.1', | ||||||
|  |                   primaryDns: '8.8.8.8', | ||||||
|  |                   secondaryDns: '192.168.0.1', | ||||||
|  |                   subnetMask: '192.168.0.255', | ||||||
|  |                   gatewayIp: '192.168.0.1', | ||||||
|  |                   leaseStartTimestamp: 1597160501039, | ||||||
|  |                   leaseTimeInSeconds: 14400, | ||||||
|  |                   firstRequestTimestamp: null, | ||||||
|  |                   firstOfferTimestamp: null, | ||||||
|  |                   firstDiscoverTimestamp: null, | ||||||
|  |                   nakTimestamp: null, | ||||||
|  |                   fromInternal: false, | ||||||
|  |                   associationId: 1597172802575, | ||||||
|  |                 }, | ||||||
|  |                 eapDetails: null, | ||||||
|  |                 metricDetails: { | ||||||
|  |                   model_type: 'ClientSessionMetricDetails', | ||||||
|  |                   rxBytes: 6048860, | ||||||
|  |                   txBytes: 6400949, | ||||||
|  |                   totalRxPackets: null, | ||||||
|  |                   totalTxPackets: null, | ||||||
|  |                   rxMbps: 91.4453, | ||||||
|  |                   txMbps: 65.76753, | ||||||
|  |                   rssi: -56, | ||||||
|  |                   snr: -51, | ||||||
|  |                   rxRateKbps: null, | ||||||
|  |                   txRateKbps: null, | ||||||
|  |                   lastMetricTimestamp: 0, | ||||||
|  |                   lastRxTimestamp: null, | ||||||
|  |                   lastTxTimestamp: null, | ||||||
|  |                   classification: null, | ||||||
|  |                   txDataFrames: null, | ||||||
|  |                   txDataFramesRetried: null, | ||||||
|  |                   rxDataFrames: null, | ||||||
|  |                 }, | ||||||
|  |                 isReassociation: null, | ||||||
|  |                 disconnectByApReasonCode: null, | ||||||
|  |                 disconnectByClientReasonCode: null, | ||||||
|  |                 disconnectByApInternalReasonCode: null, | ||||||
|  |                 disconnectByClientInternalReasonCode: null, | ||||||
|  |                 portEnabledTimestamp: null, | ||||||
|  |                 is11RUsed: null, | ||||||
|  |                 is11KUsed: null, | ||||||
|  |                 is11VUsed: null, | ||||||
|  |                 securityType: 'PSK', | ||||||
|  |                 steerType: null, | ||||||
|  |                 previousValidSessionId: null, | ||||||
|  |                 lastFailureDetails: null, | ||||||
|  |                 firstFailureDetails: null, | ||||||
|  |                 associationStatus: null, | ||||||
|  |                 dynamicVlan: null, | ||||||
|  |                 assocRssi: null, | ||||||
|  |                 priorSessionId: null, | ||||||
|  |                 priorEquipmentId: null, | ||||||
|  |                 classificationName: null, | ||||||
|  |                 associationState: null, | ||||||
|  |                 eapSuccessTimestamp: null, | ||||||
|  |                 eapKey4Timestamp: null, | ||||||
|  |               }, | ||||||
|  |               __typename: 'ClientSession', | ||||||
|  |             }, | ||||||
|  |           ], | ||||||
|  |         }, | ||||||
|  |         loading: false, | ||||||
|  |         networkStatus: 7, | ||||||
|  |         stale: false, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     error: { | ||||||
|  |       request: { | ||||||
|  |         query: GET_CLIENT_SESSION, | ||||||
|  |         variables: { customerId: 2 }, | ||||||
|  |         errorPolicy: 'all', | ||||||
|  |       }, | ||||||
|  |       result: { | ||||||
|  |         data: null, | ||||||
|  |         errors: [{}], | ||||||
|  |         loading: false, | ||||||
|  |         networkStatus: 7, | ||||||
|  |         stale: false, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   filterServiceMetrics: { | ||||||
|  |     success: { | ||||||
|  |       request: { | ||||||
|  |         query: FILTER_SERVICE_METRICS, | ||||||
|  |         variables: { | ||||||
|  |           customerId: 2, | ||||||
|  |           fromTime: '1234', | ||||||
|  |           toTime: '1234', | ||||||
|  |           clientMacs: ['74:9c:00:01:45:ae'], | ||||||
|  |           dataTypes: ['Client'], | ||||||
|  |           limit: 1000, | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |       result: { | ||||||
|  |         data: { | ||||||
|  |           filterServiceMetrics: { | ||||||
|  |             items: [], | ||||||
|  |             context: { | ||||||
|  |               lastPage: true, | ||||||
|  |               cursor: | ||||||
|  |                 'bnVsbEBAQHsibW9kZWxfdHlwZSI6IkNvbnRleHRDaGlsZHJlbiIsImNoaWxkcmVuIjp7fX1AQEBudWxs', | ||||||
|  |               __typename: 'PaginationContext', | ||||||
|  |             }, | ||||||
|  |             __typename: 'ServiceMetricPagination', | ||||||
|  |           }, | ||||||
|  |         }, | ||||||
|  |         loading: false, | ||||||
|  |         networkStatus: 7, | ||||||
|  |         stale: false, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     error: { | ||||||
|  |       request: { | ||||||
|  |         query: FILTER_SERVICE_METRICS, | ||||||
|  |         variables: { customerId: 2 }, | ||||||
|  |         errorPolicy: 'all', | ||||||
|  |       }, | ||||||
|  |       result: { | ||||||
|  |         data: null, | ||||||
|  |         errors: [{}], | ||||||
|  |         loading: false, | ||||||
|  |         networkStatus: 7, | ||||||
|  |         stale: false, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }; | ||||||
| @@ -0,0 +1,138 @@ | |||||||
|  | import React from 'react'; | ||||||
|  | import '@testing-library/jest-dom/extend-expect'; | ||||||
|  | import { MockedProvider } from '@apollo/react-testing'; | ||||||
|  | import { fireEvent, render, waitFor } from '@testing-library/react'; | ||||||
|  | import UserProvider from 'contexts/UserProvider'; | ||||||
|  | import { BrowserRouter as Router } from 'react-router-dom'; | ||||||
|  | import { ClientDevicesQueryMock } from './mock'; | ||||||
|  | import ClientDevices from '..'; | ||||||
|  |  | ||||||
|  | Object.defineProperty(window, 'matchMedia', { | ||||||
|  |   writable: true, | ||||||
|  |   value: jest.fn().mockImplementation(query => ({ | ||||||
|  |     matches: false, | ||||||
|  |     media: query, | ||||||
|  |     onchange: null, | ||||||
|  |     addListener: jest.fn(), // deprecated | ||||||
|  |     removeListener: jest.fn(), // deprecated | ||||||
|  |     addEventListener: jest.fn(), | ||||||
|  |     removeEventListener: jest.fn(), | ||||||
|  |     dispatchEvent: jest.fn(), | ||||||
|  |   })), | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | const mockProp = { | ||||||
|  |   id: 123, | ||||||
|  |   email: 'test@test.com', | ||||||
|  |   role: 'admin', | ||||||
|  |   customerId: 2, | ||||||
|  |   updateUser: jest.fn(), | ||||||
|  |   updateToken: jest.fn(), | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | describe('<ClientDevices />', () => { | ||||||
|  |   afterEach(jest.resetModules); | ||||||
|  |  | ||||||
|  |   it('should render with data', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ClientDevicesQueryMock.filterClientSessions.success]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <ClientDevices checkedLocations={['2', '3', '4', '5', '6', '7', '8']} /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('74:9c:00:01:45:ae')).toBeVisible()); | ||||||
|  |     await waitFor(() => expect(getByText('hostName-128213363803566')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('error message should be visible with error true', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ClientDevicesQueryMock.filterClientSessions.error]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <ClientDevices checkedLocations={[1, 2, 3]} /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('Failed to load client devices.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('click on Load More should fetch more data', async () => { | ||||||
|  |     const { getByRole, getByText, getAllByText } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           ClientDevicesQueryMock.filterClientSessions.success, | ||||||
|  |           ClientDevicesQueryMock.filterClientSessions.loadmore, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <ClientDevices checkedLocations={['2', '3', '4', '5', '6', '7', '8']} /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('74:9c:00:01:45:ae')).toBeVisible()); | ||||||
|  |     await waitFor(() => expect(getByText('hostName-128213363803566')).toBeVisible()); | ||||||
|  |     fireEvent.click(getByRole('button', { name: /load more/i })); | ||||||
|  |     await waitFor(() => expect(getByText('74:9c:00:01:45:ae')).toBeVisible()); | ||||||
|  |     await waitFor(() => expect(getAllByText('hostName-128213363803566')[1]).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('click on reload button should refetch data', async () => { | ||||||
|  |     const { getByText, container } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           ClientDevicesQueryMock.filterClientSessions.success, | ||||||
|  |           ClientDevicesQueryMock.filterClientSessions.success, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <ClientDevices checkedLocations={['2', '3', '4', '5', '6', '7', '8']} /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('74:9c:00:01:45:ae')).toBeVisible()); | ||||||
|  |     await waitFor(() => expect(getByText('hostName-128213363803566')).toBeVisible()); | ||||||
|  |     const reloadButton = container.querySelector( | ||||||
|  |       '.ant-btn.index-module__Button___VGygY.ant-btn-icon-only' | ||||||
|  |     ); | ||||||
|  |     fireEvent.click(reloadButton); | ||||||
|  |     await waitFor(() => expect(getByText('Client devices reloaded.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('click on reload button should not refetch data when query return error', async () => { | ||||||
|  |     const { getByText, container } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ClientDevicesQueryMock.filterClientSessions.success]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <ClientDevices checkedLocations={['2', '3', '4', '5', '6', '7', '8']} /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('74:9c:00:01:45:ae')).toBeVisible()); | ||||||
|  |     await waitFor(() => expect(getByText('hostName-128213363803566')).toBeVisible()); | ||||||
|  |     const reloadButton = container.querySelector( | ||||||
|  |       '.ant-btn.index-module__Button___VGygY.ant-btn-icon-only' | ||||||
|  |     ); | ||||||
|  |     fireEvent.click(reloadButton); | ||||||
|  |     await waitFor(() => expect(getByText('Client devices could not be reloaded.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
							
								
								
									
										591
									
								
								app/containers/Network/containers/ClientDevices/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										591
									
								
								app/containers/Network/containers/ClientDevices/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,591 @@ | |||||||
|  | import { FILTER_CLIENT_SESSIONS } from 'graphql/queries'; | ||||||
|  |  | ||||||
|  | export const ClientDevicesQueryMock = { | ||||||
|  |   filterClientSessions: { | ||||||
|  |     success: { | ||||||
|  |       request: { | ||||||
|  |         query: FILTER_CLIENT_SESSIONS, | ||||||
|  |         variables: { | ||||||
|  |           customerId: 2, | ||||||
|  |           locationIds: ['2', '3', '4', '5', '6', '7', '8'], | ||||||
|  |           equipmentType: 'AP', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |       result: { | ||||||
|  |         data: { | ||||||
|  |           filterClientSessions: { | ||||||
|  |             items: [ | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:00:01:45:ae', | ||||||
|  |                 macAddress: '74:9c:00:01:45:ae', | ||||||
|  |                 ipAddress: '192.168.10.171', | ||||||
|  |                 hostname: 'hostName-128213363803566', | ||||||
|  |                 ssid: 'Default-SSID-1597172801679', | ||||||
|  |                 radioType: 'is2dot4GHz', | ||||||
|  |                 signal: '-56', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 40', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:00:8a:70:8b', | ||||||
|  |                 macAddress: '74:9c:00:8a:70:8b', | ||||||
|  |                 ipAddress: '192.168.10.159', | ||||||
|  |                 hostname: 'hostName-128213372792971', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is5GHzL', | ||||||
|  |                 signal: '-53', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 2', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:00:ae:78:0b', | ||||||
|  |                 macAddress: '74:9c:00:ae:78:0b', | ||||||
|  |                 ipAddress: '192.168.10.21', | ||||||
|  |                 hostname: 'hostName-128213375154187', | ||||||
|  |                 ssid: 'Default-SSID-1597172801679', | ||||||
|  |                 radioType: 'is5GHzL', | ||||||
|  |                 signal: '-56', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 37', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:00:b8:6e:6b', | ||||||
|  |                 macAddress: '74:9c:00:b8:6e:6b', | ||||||
|  |                 ipAddress: '192.168.10.145', | ||||||
|  |                 hostname: 'hostName-128213375807083', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is5GHzL', | ||||||
|  |                 signal: '-55', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 9', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:00:da:28:86', | ||||||
|  |                 macAddress: '74:9c:00:da:28:86', | ||||||
|  |                 ipAddress: '192.168.10.136', | ||||||
|  |                 hostname: 'hostName-128213378017414', | ||||||
|  |                 ssid: 'Default-SSID-1597172801679', | ||||||
|  |                 radioType: 'is5GHzL', | ||||||
|  |                 signal: '-54', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 34', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:01:20:7f:35', | ||||||
|  |                 macAddress: '74:9c:01:20:7f:35', | ||||||
|  |                 ipAddress: '192.168.10.132', | ||||||
|  |                 hostname: 'hostName-128213382627125', | ||||||
|  |                 ssid: 'Default-SSID-1597172801679', | ||||||
|  |                 radioType: 'is5GHzU', | ||||||
|  |                 signal: '-53', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 37', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:01:4b:bd:77', | ||||||
|  |                 macAddress: '74:9c:01:4b:bd:77', | ||||||
|  |                 ipAddress: '192.168.10.114', | ||||||
|  |                 hostname: 'hostName-128213385461111', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is5GHzU', | ||||||
|  |                 signal: '-53', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 19', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:01:77:97:6c', | ||||||
|  |                 macAddress: '74:9c:01:77:97:6c', | ||||||
|  |                 ipAddress: '192.168.10.35', | ||||||
|  |                 hostname: 'hostName-128213388334956', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is2dot4GHz', | ||||||
|  |                 signal: '-52', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 26', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:01:9c:29:be', | ||||||
|  |                 macAddress: '74:9c:01:9c:29:be', | ||||||
|  |                 ipAddress: '192.168.10.174', | ||||||
|  |                 hostname: 'hostName-128213390731710', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is2dot4GHz', | ||||||
|  |                 signal: '-44', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 6', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:01:bf:ce:af', | ||||||
|  |                 macAddress: '74:9c:01:bf:ce:af', | ||||||
|  |                 ipAddress: '192.168.10.36', | ||||||
|  |                 hostname: 'hostName-128213393067695', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is5GHzU', | ||||||
|  |                 signal: '-60', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 31', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:02:41:bf:2a', | ||||||
|  |                 macAddress: '74:9c:02:41:bf:2a', | ||||||
|  |                 ipAddress: '192.168.10.202', | ||||||
|  |                 hostname: 'hostName-128213401583402', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is5GHzU', | ||||||
|  |                 signal: '-42', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 29', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:02:86:89:6a', | ||||||
|  |                 macAddress: '74:9c:02:86:89:6a', | ||||||
|  |                 ipAddress: '192.168.10.77', | ||||||
|  |                 hostname: 'hostName-128213406091626', | ||||||
|  |                 ssid: 'Default-SSID-1597172801679', | ||||||
|  |                 radioType: 'is2dot4GHz', | ||||||
|  |                 signal: '-54', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 38', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:02:8f:14:91', | ||||||
|  |                 macAddress: '74:9c:02:8f:14:91', | ||||||
|  |                 ipAddress: '192.168.10.144', | ||||||
|  |                 hostname: 'hostName-128213406651537', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is2dot4GHz', | ||||||
|  |                 signal: '-60', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 3', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:02:9f:25:27', | ||||||
|  |                 macAddress: '74:9c:02:9f:25:27', | ||||||
|  |                 ipAddress: '192.168.10.125', | ||||||
|  |                 hostname: 'hostName-128213407704359', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is5GHzU', | ||||||
|  |                 signal: '-45', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 3', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:03:12:cd:00', | ||||||
|  |                 macAddress: '74:9c:03:12:cd:00', | ||||||
|  |                 ipAddress: '192.168.10.214', | ||||||
|  |                 hostname: 'hostName-128213415283968', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is2dot4GHz', | ||||||
|  |                 signal: '-46', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 14', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:03:47:bc:43', | ||||||
|  |                 macAddress: '74:9c:03:47:bc:43', | ||||||
|  |                 ipAddress: '192.168.10.187', | ||||||
|  |                 hostname: 'hostName-128213418753091', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is5GHzL', | ||||||
|  |                 signal: '-49', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 3', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:03:73:2d:d0', | ||||||
|  |                 macAddress: '74:9c:03:73:2d:d0', | ||||||
|  |                 ipAddress: '192.168.10.107', | ||||||
|  |                 hostname: 'hostName-128213421600208', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is5GHzL', | ||||||
|  |                 signal: '-49', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 17', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:04:1f:a0:26', | ||||||
|  |                 macAddress: '74:9c:04:1f:a0:26', | ||||||
|  |                 ipAddress: '192.168.10.48', | ||||||
|  |                 hostname: 'hostName-128213432901670', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is5GHzL', | ||||||
|  |                 signal: '-44', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 10', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:04:61:19:c8', | ||||||
|  |                 macAddress: '74:9c:04:61:19:c8', | ||||||
|  |                 ipAddress: '192.168.10.218', | ||||||
|  |                 hostname: 'hostName-128213437192648', | ||||||
|  |                 ssid: 'Default-SSID-1597172801679', | ||||||
|  |                 radioType: 'is5GHzL', | ||||||
|  |                 signal: '-53', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 48', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:04:7e:5c:ae', | ||||||
|  |                 macAddress: '74:9c:04:7e:5c:ae', | ||||||
|  |                 ipAddress: '192.168.10.92', | ||||||
|  |                 hostname: 'hostName-128213439110318', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is5GHzU', | ||||||
|  |                 signal: '-43', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 5', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |             ], | ||||||
|  |             context: { | ||||||
|  |               lastPage: false, | ||||||
|  |               cursor: 'test', | ||||||
|  |             }, | ||||||
|  |           }, | ||||||
|  |         }, | ||||||
|  |         loading: false, | ||||||
|  |         networkStatus: 7, | ||||||
|  |         stale: false, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     loadmore: { | ||||||
|  |       request: { | ||||||
|  |         query: FILTER_CLIENT_SESSIONS, | ||||||
|  |         variables: { | ||||||
|  |           customerId: 2, | ||||||
|  |           locationIds: ['2', '3', '4', '5', '6', '7', '8'], | ||||||
|  |           equipmentType: 'AP', | ||||||
|  |           cursor: 'test', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |       result: { | ||||||
|  |         data: { | ||||||
|  |           filterClientSessions: { | ||||||
|  |             items: [ | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:00:01:45:ae', | ||||||
|  |                 macAddress: '74:9c:00:01:45:ae', | ||||||
|  |                 ipAddress: '192.168.10.171', | ||||||
|  |                 hostname: 'hostName-128213363803566', | ||||||
|  |                 ssid: 'Default-SSID-1597172801679', | ||||||
|  |                 radioType: 'is2dot4GHz', | ||||||
|  |                 signal: '-56', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 40', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:00:8a:70:8b', | ||||||
|  |                 macAddress: '74:9c:00:8a:70:8b', | ||||||
|  |                 ipAddress: '192.168.10.159', | ||||||
|  |                 hostname: 'hostName-128213372792971', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is5GHzL', | ||||||
|  |                 signal: '-53', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 2', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:00:ae:78:0b', | ||||||
|  |                 macAddress: '74:9c:00:ae:78:0b', | ||||||
|  |                 ipAddress: '192.168.10.21', | ||||||
|  |                 hostname: 'hostName-128213375154187', | ||||||
|  |                 ssid: 'Default-SSID-1597172801679', | ||||||
|  |                 radioType: 'is5GHzL', | ||||||
|  |                 signal: '-56', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 37', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:00:b8:6e:6b', | ||||||
|  |                 macAddress: '74:9c:00:b8:6e:6b', | ||||||
|  |                 ipAddress: '192.168.10.145', | ||||||
|  |                 hostname: 'hostName-128213375807083', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is5GHzL', | ||||||
|  |                 signal: '-55', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 9', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:00:da:28:86', | ||||||
|  |                 macAddress: '74:9c:00:da:28:86', | ||||||
|  |                 ipAddress: '192.168.10.136', | ||||||
|  |                 hostname: 'hostName-128213378017414', | ||||||
|  |                 ssid: 'Default-SSID-1597172801679', | ||||||
|  |                 radioType: 'is5GHzL', | ||||||
|  |                 signal: '-54', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 34', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:01:20:7f:35', | ||||||
|  |                 macAddress: '74:9c:01:20:7f:35', | ||||||
|  |                 ipAddress: '192.168.10.132', | ||||||
|  |                 hostname: 'hostName-128213382627125', | ||||||
|  |                 ssid: 'Default-SSID-1597172801679', | ||||||
|  |                 radioType: 'is5GHzU', | ||||||
|  |                 signal: '-53', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 37', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:01:4b:bd:77', | ||||||
|  |                 macAddress: '74:9c:01:4b:bd:77', | ||||||
|  |                 ipAddress: '192.168.10.114', | ||||||
|  |                 hostname: 'hostName-128213385461111', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is5GHzU', | ||||||
|  |                 signal: '-53', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 19', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:01:77:97:6c', | ||||||
|  |                 macAddress: '74:9c:01:77:97:6c', | ||||||
|  |                 ipAddress: '192.168.10.35', | ||||||
|  |                 hostname: 'hostName-128213388334956', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is2dot4GHz', | ||||||
|  |                 signal: '-52', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 26', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:01:9c:29:be', | ||||||
|  |                 macAddress: '74:9c:01:9c:29:be', | ||||||
|  |                 ipAddress: '192.168.10.174', | ||||||
|  |                 hostname: 'hostName-128213390731710', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is2dot4GHz', | ||||||
|  |                 signal: '-44', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 6', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:01:bf:ce:af', | ||||||
|  |                 macAddress: '74:9c:01:bf:ce:af', | ||||||
|  |                 ipAddress: '192.168.10.36', | ||||||
|  |                 hostname: 'hostName-128213393067695', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is5GHzU', | ||||||
|  |                 signal: '-60', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 31', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:02:41:bf:2a', | ||||||
|  |                 macAddress: '74:9c:02:41:bf:2a', | ||||||
|  |                 ipAddress: '192.168.10.202', | ||||||
|  |                 hostname: 'hostName-128213401583402', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is5GHzU', | ||||||
|  |                 signal: '-42', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 29', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:02:86:89:6a', | ||||||
|  |                 macAddress: '74:9c:02:86:89:6a', | ||||||
|  |                 ipAddress: '192.168.10.77', | ||||||
|  |                 hostname: 'hostName-128213406091626', | ||||||
|  |                 ssid: 'Default-SSID-1597172801679', | ||||||
|  |                 radioType: 'is2dot4GHz', | ||||||
|  |                 signal: '-54', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 38', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:02:8f:14:91', | ||||||
|  |                 macAddress: '74:9c:02:8f:14:91', | ||||||
|  |                 ipAddress: '192.168.10.144', | ||||||
|  |                 hostname: 'hostName-128213406651537', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is2dot4GHz', | ||||||
|  |                 signal: '-60', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 3', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:02:9f:25:27', | ||||||
|  |                 macAddress: '74:9c:02:9f:25:27', | ||||||
|  |                 ipAddress: '192.168.10.125', | ||||||
|  |                 hostname: 'hostName-128213407704359', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is5GHzU', | ||||||
|  |                 signal: '-45', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 3', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:03:12:cd:00', | ||||||
|  |                 macAddress: '74:9c:03:12:cd:00', | ||||||
|  |                 ipAddress: '192.168.10.214', | ||||||
|  |                 hostname: 'hostName-128213415283968', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is2dot4GHz', | ||||||
|  |                 signal: '-46', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 14', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:03:47:bc:43', | ||||||
|  |                 macAddress: '74:9c:03:47:bc:43', | ||||||
|  |                 ipAddress: '192.168.10.187', | ||||||
|  |                 hostname: 'hostName-128213418753091', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is5GHzL', | ||||||
|  |                 signal: '-49', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 3', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:03:73:2d:d0', | ||||||
|  |                 macAddress: '74:9c:03:73:2d:d0', | ||||||
|  |                 ipAddress: '192.168.10.107', | ||||||
|  |                 hostname: 'hostName-128213421600208', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is5GHzL', | ||||||
|  |                 signal: '-49', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 17', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:04:1f:a0:26', | ||||||
|  |                 macAddress: '74:9c:04:1f:a0:26', | ||||||
|  |                 ipAddress: '192.168.10.48', | ||||||
|  |                 hostname: 'hostName-128213432901670', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is5GHzL', | ||||||
|  |                 signal: '-44', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 10', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:04:61:19:c8', | ||||||
|  |                 macAddress: '74:9c:04:61:19:c8', | ||||||
|  |                 ipAddress: '192.168.10.218', | ||||||
|  |                 hostname: 'hostName-128213437192648', | ||||||
|  |                 ssid: 'Default-SSID-1597172801679', | ||||||
|  |                 radioType: 'is5GHzL', | ||||||
|  |                 signal: '-53', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 48', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |               { | ||||||
|  |                 id: '74:9c:04:7e:5c:ae', | ||||||
|  |                 macAddress: '74:9c:04:7e:5c:ae', | ||||||
|  |                 ipAddress: '192.168.10.92', | ||||||
|  |                 hostname: 'hostName-128213439110318', | ||||||
|  |                 ssid: 'TipWlan-cloud-3-radios', | ||||||
|  |                 radioType: 'is5GHzU', | ||||||
|  |                 signal: '-43', | ||||||
|  |                 manufacturer: null, | ||||||
|  |                 equipment: { | ||||||
|  |                   name: 'AP 5', | ||||||
|  |                 }, | ||||||
|  |               }, | ||||||
|  |             ], | ||||||
|  |             context: { | ||||||
|  |               lastPage: false, | ||||||
|  |               cursor: 'test', | ||||||
|  |             }, | ||||||
|  |           }, | ||||||
|  |         }, | ||||||
|  |         loading: false, | ||||||
|  |         networkStatus: 7, | ||||||
|  |         stale: false, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     error: { | ||||||
|  |       request: { | ||||||
|  |         query: FILTER_CLIENT_SESSIONS, | ||||||
|  |         variables: { customerId: 2 }, | ||||||
|  |         errorPolicy: 'all', | ||||||
|  |       }, | ||||||
|  |       result: { | ||||||
|  |         data: null, | ||||||
|  |         errors: [{}], | ||||||
|  |         loading: false, | ||||||
|  |         networkStatus: 7, | ||||||
|  |         stale: false, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }; | ||||||
| @@ -1,72 +1,12 @@ | |||||||
| import React, { useState, useContext } from 'react'; | import React, { useState, useContext } from 'react'; | ||||||
| import { useParams, Redirect } from 'react-router-dom'; | import { useParams, Redirect } from 'react-router-dom'; | ||||||
| import gql from 'graphql-tag'; |  | ||||||
| import { useQuery, useMutation } from '@apollo/react-hooks'; | import { useQuery, useMutation } from '@apollo/react-hooks'; | ||||||
| import { Alert, notification } from 'antd'; | import { Alert, notification } from 'antd'; | ||||||
| import { ProfileDetails as ProfileDetailsPage, Loading } from '@tip-wlan/wlan-cloud-ui-library'; | import { ProfileDetails as ProfileDetailsPage, Loading } from '@tip-wlan/wlan-cloud-ui-library'; | ||||||
|  |  | ||||||
| import UserContext from 'contexts/UserContext'; | import UserContext from 'contexts/UserContext'; | ||||||
| import { GET_ALL_PROFILES } from 'graphql/queries'; | import { GET_PROFILE, GET_ALL_PROFILES } from 'graphql/queries'; | ||||||
| import { FILE_UPLOAD } from 'graphql/mutations'; | import { FILE_UPLOAD, UPDATE_PROFILE, DELETE_PROFILE } from 'graphql/mutations'; | ||||||
|  |  | ||||||
| const GET_PROFILE = gql` |  | ||||||
|   query GetProfile($id: ID!) { |  | ||||||
|     getProfile(id: $id) { |  | ||||||
|       id |  | ||||||
|       profileType |  | ||||||
|       customerId |  | ||||||
|       name |  | ||||||
|       childProfiles { |  | ||||||
|         id |  | ||||||
|         name |  | ||||||
|         profileType |  | ||||||
|         details |  | ||||||
|       } |  | ||||||
|       childProfileIds |  | ||||||
|       createdTimestamp |  | ||||||
|       lastModifiedTimestamp |  | ||||||
|       details |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| `; |  | ||||||
|  |  | ||||||
| const UPDATE_PROFILE = gql` |  | ||||||
|   mutation UpdateProfile( |  | ||||||
|     $id: ID! |  | ||||||
|     $profileType: String! |  | ||||||
|     $customerId: ID! |  | ||||||
|     $name: String! |  | ||||||
|     $childProfileIds: [ID] |  | ||||||
|     $lastModifiedTimestamp: String |  | ||||||
|     $details: JSONObject |  | ||||||
|   ) { |  | ||||||
|     updateProfile( |  | ||||||
|       id: $id |  | ||||||
|       profileType: $profileType |  | ||||||
|       customerId: $customerId |  | ||||||
|       name: $name |  | ||||||
|       childProfileIds: $childProfileIds |  | ||||||
|       lastModifiedTimestamp: $lastModifiedTimestamp |  | ||||||
|       details: $details |  | ||||||
|     ) { |  | ||||||
|       id |  | ||||||
|       profileType |  | ||||||
|       customerId |  | ||||||
|       name |  | ||||||
|       childProfileIds |  | ||||||
|       lastModifiedTimestamp |  | ||||||
|       details |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| `; |  | ||||||
|  |  | ||||||
| const DELETE_PROFILE = gql` |  | ||||||
|   mutation DeleteProfile($id: ID!) { |  | ||||||
|     deleteProfile(id: $id) { |  | ||||||
|       id |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| `; |  | ||||||
|  |  | ||||||
| const ProfileDetails = () => { | const ProfileDetails = () => { | ||||||
|   const { customerId } = useContext(UserContext); |   const { customerId } = useContext(UserContext); | ||||||
|   | |||||||
							
								
								
									
										186
									
								
								app/containers/ProfileDetails/tests/index.test.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										186
									
								
								app/containers/ProfileDetails/tests/index.test.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,186 @@ | |||||||
|  | import React from 'react'; | ||||||
|  | import '@testing-library/jest-dom/extend-expect'; | ||||||
|  | import { fireEvent, render, waitFor } from '@testing-library/react'; | ||||||
|  | import { MockedProvider } from '@apollo/react-testing'; | ||||||
|  | import UserProvider from 'contexts/UserProvider'; | ||||||
|  | import { getAllProfilesQueryMock } from '../../AddProfile/tests/mock'; | ||||||
|  | import { profileDetailsMutationMock, profileDetailsQueryMock } from './mock'; | ||||||
|  | import ProfileDetails from '..'; | ||||||
|  |  | ||||||
|  | jest.mock('rc-upload/lib/uid.js', () => ({ | ||||||
|  |   __esModule: true, | ||||||
|  |   default: () => '1234', | ||||||
|  | })); | ||||||
|  | Object.defineProperty(window, 'matchMedia', { | ||||||
|  |   writable: true, | ||||||
|  |   value: jest.fn().mockImplementation(query => ({ | ||||||
|  |     matches: false, | ||||||
|  |     media: query, | ||||||
|  |     onchange: null, | ||||||
|  |     addListener: jest.fn(), // deprecated | ||||||
|  |     removeListener: jest.fn(), // deprecated | ||||||
|  |     addEventListener: jest.fn(), | ||||||
|  |     removeEventListener: jest.fn(), | ||||||
|  |     dispatchEvent: jest.fn(), | ||||||
|  |   })), | ||||||
|  | }); | ||||||
|  | jest.mock('react-router-dom', () => ({ | ||||||
|  |   useParams: () => ({ | ||||||
|  |     id: 123, | ||||||
|  |   }), | ||||||
|  |   useHistory: () => ({ push: jest.fn() }), | ||||||
|  | })); | ||||||
|  | const mockProp = { | ||||||
|  |   id: 123, | ||||||
|  |   email: 'test@test.com', | ||||||
|  |   role: 'admin', | ||||||
|  |   customerId: 2, | ||||||
|  |   updateUser: jest.fn(), | ||||||
|  |   updateToken: jest.fn(), | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | describe('<ProfileDetails />', () => { | ||||||
|  |   afterEach(jest.resetModules); | ||||||
|  |  | ||||||
|  |   it('should render with Data', async () => { | ||||||
|  |     const { getByLabelText } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[profileDetailsQueryMock.success, getAllProfilesQueryMock.success]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <ProfileDetails /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByLabelText('Profile Name')).toHaveValue('Radius-Profile')); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should show error when query return error', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider mocks={[profileDetailsQueryMock.error]} addTypename={false}> | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <ProfileDetails /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('Failed to load profile data.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should render with Data and update successfully', async () => { | ||||||
|  |     const { getByLabelText, getByText, getByRole } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           profileDetailsQueryMock.success, | ||||||
|  |           getAllProfilesQueryMock.success, | ||||||
|  |           profileDetailsMutationMock.updateSuccess, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <ProfileDetails /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByLabelText('Profile Name')).toHaveValue('Radius-Profile')); | ||||||
|  |     await waitFor(() => expect(getByText('0.0.0.0')).toBeVisible()); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Save' })); | ||||||
|  |     await waitFor(() => expect(getByText('Profile successfully updated.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |   it('should render with Data and show error when update mutation return error', async () => { | ||||||
|  |     const { getByLabelText, getByText, getByRole } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           profileDetailsQueryMock.success, | ||||||
|  |           getAllProfilesQueryMock.success, | ||||||
|  |           profileDetailsMutationMock.updateError, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <ProfileDetails /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByLabelText('Profile Name')).toHaveValue('Radius-Profile')); | ||||||
|  |     await waitFor(() => expect(getByText('0.0.0.0')).toBeVisible()); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Save' })); | ||||||
|  |     await waitFor(() => expect(getByText('Profile could not be updated.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should render with Data and upload image successfully', async () => { | ||||||
|  |     global.URL.createObjectURL = jest.fn(); | ||||||
|  |  | ||||||
|  |     const { getByLabelText, getByTestId, getByText } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           profileDetailsQueryMock.successCaptivePortal, | ||||||
|  |           getAllProfilesQueryMock.success, | ||||||
|  |           profileDetailsMutationMock.uploadSuccess, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <ProfileDetails /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByLabelText('Profile Name')).toHaveValue('Captive-portal')); | ||||||
|  |     fireEvent.change(getByTestId('logoFile'), { | ||||||
|  |       target: { | ||||||
|  |         files: [ | ||||||
|  |           { | ||||||
|  |             lastModified: 1595008730671, | ||||||
|  |             lastModifiedDate: undefined, | ||||||
|  |             name: 'testImg.jpg', | ||||||
|  |             size: 100, | ||||||
|  |             type: 'image/jpg', | ||||||
|  |             percent: 0, | ||||||
|  |             originFileObj: { uid: 'rc-upload-1595008718690-73' }, | ||||||
|  |           }, | ||||||
|  |         ], | ||||||
|  |       }, | ||||||
|  |     }); | ||||||
|  |     expect(getByText(/testImg\.jpg/)).toBeInTheDocument(); | ||||||
|  |  | ||||||
|  |     await waitFor(() => expect(getByText('File successfully uploaded.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |   it('should render with Data and show error when upload mutation return error', async () => { | ||||||
|  |     global.URL.createObjectURL = jest.fn(); | ||||||
|  |  | ||||||
|  |     const { getByLabelText, getByTestId, getByText } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           profileDetailsQueryMock.successCaptivePortal, | ||||||
|  |           getAllProfilesQueryMock.success, | ||||||
|  |           profileDetailsMutationMock.uploadError, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <ProfileDetails /> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByLabelText('Profile Name')).toHaveValue('Captive-portal')); | ||||||
|  |  | ||||||
|  |     fireEvent.change(getByTestId('logoFile'), { | ||||||
|  |       target: { | ||||||
|  |         files: [ | ||||||
|  |           { | ||||||
|  |             lastModified: 1595008730671, | ||||||
|  |             lastModifiedDate: undefined, | ||||||
|  |             name: 'testImg.jpg', | ||||||
|  |             size: 100, | ||||||
|  |             type: 'image/jpg', | ||||||
|  |             percent: 0, | ||||||
|  |             originFileObj: { uid: 'rc-upload-1595008718690-73' }, | ||||||
|  |           }, | ||||||
|  |         ], | ||||||
|  |       }, | ||||||
|  |     }); | ||||||
|  |     expect(getByText(/testImg\.jpg/)).toBeInTheDocument(); | ||||||
|  |  | ||||||
|  |     await waitFor(() => expect(getByText('File could not be uploaded.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
							
								
								
									
										344
									
								
								app/containers/ProfileDetails/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										344
									
								
								app/containers/ProfileDetails/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,344 @@ | |||||||
|  | import { GET_PROFILE } from 'graphql/queries'; | ||||||
|  | import { FILE_UPLOAD, UPDATE_PROFILE } from 'graphql/mutations'; | ||||||
|  |  | ||||||
|  | export const profileDetailsQueryMock = { | ||||||
|  |   success: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_PROFILE, | ||||||
|  |       variables: { id: 123 }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         getProfile: { | ||||||
|  |           id: '123', | ||||||
|  |           profileType: 'radius', | ||||||
|  |           customerId: '2', | ||||||
|  |           name: 'Radius-Profile', | ||||||
|  |           childProfiles: [], | ||||||
|  |           childProfileIds: [], | ||||||
|  |           createdTimestamp: '0', | ||||||
|  |           lastModifiedTimestamp: '1597243756957', | ||||||
|  |           details: { | ||||||
|  |             model_type: 'RadiusProfile', | ||||||
|  |             subnetConfiguration: { | ||||||
|  |               test: { | ||||||
|  |                 model_type: 'RadiusSubnetConfiguration', | ||||||
|  |                 subnetAddress: '0.0.0.0', | ||||||
|  |                 subnetCidrPrefix: 0, | ||||||
|  |                 subnetName: 'test', | ||||||
|  |                 proxyConfig: { | ||||||
|  |                   model_type: 'RadiusProxyConfiguration', | ||||||
|  |                   floatingIpAddress: null, | ||||||
|  |                   floatingIfCidrPrefix: null, | ||||||
|  |                   floatingIfGwAddress: null, | ||||||
|  |                   floatingIfVlan: null, | ||||||
|  |                   sharedSecret: null, | ||||||
|  |                 }, | ||||||
|  |                 probeInterval: null, | ||||||
|  |                 serviceRegionName: 'Ottawa', | ||||||
|  |               }, | ||||||
|  |             }, | ||||||
|  |             serviceRegionMap: { | ||||||
|  |               Ottawa: { | ||||||
|  |                 model_type: 'RadiusServiceRegion', | ||||||
|  |                 serverMap: { | ||||||
|  |                   'Radius-Profile': [ | ||||||
|  |                     { | ||||||
|  |                       model_type: 'RadiusServer', | ||||||
|  |                       ipAddress: '192.168.0.1', | ||||||
|  |                       secret: 'testing123', | ||||||
|  |                       authPort: 1812, | ||||||
|  |                       timeout: null, | ||||||
|  |                     }, | ||||||
|  |                   ], | ||||||
|  |                 }, | ||||||
|  |                 regionName: 'Ottawa', | ||||||
|  |               }, | ||||||
|  |             }, | ||||||
|  |             profileType: 'radius', | ||||||
|  |           }, | ||||||
|  |           __typename: 'Profile', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |       loading: false, | ||||||
|  |       networkStatus: 7, | ||||||
|  |       stale: false, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   successCaptivePortal: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_PROFILE, | ||||||
|  |       variables: { id: 123 }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         getProfile: { | ||||||
|  |           id: '123', | ||||||
|  |           profileType: 'captive_portal', | ||||||
|  |           customerId: '2', | ||||||
|  |           name: 'Captive-portal', | ||||||
|  |           childProfiles: [], | ||||||
|  |           childProfileIds: [], | ||||||
|  |           createdTimestamp: '1597238768150', | ||||||
|  |           lastModifiedTimestamp: '1597238768150', | ||||||
|  |           details: { | ||||||
|  |             model_type: 'CaptivePortalConfiguration', | ||||||
|  |             name: 'Captive-portal', | ||||||
|  |             browserTitle: 'Access the network as Guest', | ||||||
|  |             headerContent: 'Captive Portal', | ||||||
|  |             userAcceptancePolicy: 'Use this network at your own risk. No warranty of any kind.', | ||||||
|  |             successPageMarkdownText: 'Welcome to the network', | ||||||
|  |             redirectURL: '', | ||||||
|  |             externalCaptivePortalURL: null, | ||||||
|  |             sessionTimeoutInMinutes: 60, | ||||||
|  |             logoFile: null, | ||||||
|  |             backgroundFile: null, | ||||||
|  |             walledGardenWhitelist: [], | ||||||
|  |             usernamePasswordFile: null, | ||||||
|  |             authenticationType: 'guest', | ||||||
|  |             radiusAuthMethod: 'CHAP', | ||||||
|  |             maxUsersWithSameCredentials: 42, | ||||||
|  |             externalPolicyFile: null, | ||||||
|  |             backgroundPosition: 'left_top', | ||||||
|  |             backgroundRepeat: 'no_repeat', | ||||||
|  |             radiusServiceName: null, | ||||||
|  |             expiryType: 'unlimited', | ||||||
|  |             userList: [], | ||||||
|  |             macWhiteList: [], | ||||||
|  |             profileType: 'captive_portal', | ||||||
|  |           }, | ||||||
|  |           __typename: 'Profile', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |       loading: false, | ||||||
|  |       networkStatus: 7, | ||||||
|  |       stale: false, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   error: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_PROFILE, | ||||||
|  |       variables: { id: 123 }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: null, | ||||||
|  |       errors: [{}], | ||||||
|  |       loading: false, | ||||||
|  |       networkStatus: 7, | ||||||
|  |       stale: false, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | export const profileDetailsMutationMock = { | ||||||
|  |   updateSuccess: { | ||||||
|  |     request: { | ||||||
|  |       query: UPDATE_PROFILE, | ||||||
|  |       variables: { | ||||||
|  |         id: '123', | ||||||
|  |         profileType: 'radius', | ||||||
|  |         customerId: '2', | ||||||
|  |         name: 'Radius-Profile', | ||||||
|  |         childProfiles: [], | ||||||
|  |         childProfileIds: [], | ||||||
|  |         createdTimestamp: '0', | ||||||
|  |         lastModifiedTimestamp: '1597243756957', | ||||||
|  |         details: { | ||||||
|  |           model_type: 'RadiusProfile', | ||||||
|  |           subnetConfiguration: { | ||||||
|  |             test: { | ||||||
|  |               model_type: 'RadiusSubnetConfiguration', | ||||||
|  |               subnetAddress: '0.0.0.0', | ||||||
|  |               subnetCidrPrefix: 0, | ||||||
|  |               subnetName: 'test', | ||||||
|  |               proxyConfig: { | ||||||
|  |                 model_type: 'RadiusProxyConfiguration', | ||||||
|  |                 floatingIpAddress: null, | ||||||
|  |                 floatingIfCidrPrefix: null, | ||||||
|  |                 floatingIfGwAddress: null, | ||||||
|  |                 floatingIfVlan: null, | ||||||
|  |                 sharedSecret: null, | ||||||
|  |               }, | ||||||
|  |               probeInterval: null, | ||||||
|  |               serviceRegionName: 'Ottawa', | ||||||
|  |             }, | ||||||
|  |           }, | ||||||
|  |           serviceRegionMap: { | ||||||
|  |             Ottawa: { | ||||||
|  |               regionName: 'Ottawa', | ||||||
|  |               serverMap: { | ||||||
|  |                 'Radius-Profile': [ | ||||||
|  |                   { | ||||||
|  |                     model_type: 'RadiusServer', | ||||||
|  |                     ipAddress: '192.168.0.1', | ||||||
|  |                     secret: 'testing123', | ||||||
|  |                     authPort: 1812, | ||||||
|  |                     timeout: null, | ||||||
|  |                   }, | ||||||
|  |                 ], | ||||||
|  |               }, | ||||||
|  |             }, | ||||||
|  |           }, | ||||||
|  |           profileType: 'radius', | ||||||
|  |           name: 'Radius-Profile', | ||||||
|  |           probeInterval: 0, | ||||||
|  |           services: [ | ||||||
|  |             { | ||||||
|  |               name: 'Radius-Profile', | ||||||
|  |               ips: [ | ||||||
|  |                 { | ||||||
|  |                   model_type: 'RadiusServer', | ||||||
|  |                   ipAddress: '192.168.0.1', | ||||||
|  |                   secret: 'testing123', | ||||||
|  |                   authPort: 1812, | ||||||
|  |                   timeout: null, | ||||||
|  |                 }, | ||||||
|  |               ], | ||||||
|  |             }, | ||||||
|  |           ], | ||||||
|  |           zones: [ | ||||||
|  |             { | ||||||
|  |               name: 'Ottawa', | ||||||
|  |               subnets: [ | ||||||
|  |                 { | ||||||
|  |                   model_type: 'RadiusSubnetConfiguration', | ||||||
|  |                   subnetAddress: '0.0.0.0', | ||||||
|  |                   subnetCidrPrefix: 0, | ||||||
|  |                   subnetName: 'test', | ||||||
|  |                   proxyConfig: { | ||||||
|  |                     model_type: 'RadiusProxyConfiguration', | ||||||
|  |                     floatingIpAddress: null, | ||||||
|  |                     floatingIfCidrPrefix: null, | ||||||
|  |                     floatingIfGwAddress: null, | ||||||
|  |                     floatingIfVlan: null, | ||||||
|  |                     sharedSecret: null, | ||||||
|  |                   }, | ||||||
|  |                   probeInterval: null, | ||||||
|  |                   serviceRegionName: 'Ottawa', | ||||||
|  |                 }, | ||||||
|  |               ], | ||||||
|  |             }, | ||||||
|  |           ], | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         updateProfile: { | ||||||
|  |           id: '123', | ||||||
|  |           profileType: 'radius', | ||||||
|  |           customerId: '2', | ||||||
|  |           name: 'Radius-Profile', | ||||||
|  |           childProfileIds: [], | ||||||
|  |           lastModifiedTimestamp: '1597245742733', | ||||||
|  |           details: { | ||||||
|  |             model_type: 'RadiusProfile', | ||||||
|  |             subnetConfiguration: { | ||||||
|  |               test: { | ||||||
|  |                 model_type: 'RadiusSubnetConfiguration', | ||||||
|  |                 subnetAddress: '0.0.0.0', | ||||||
|  |                 subnetCidrPrefix: 0, | ||||||
|  |                 subnetName: 'test', | ||||||
|  |                 proxyConfig: { | ||||||
|  |                   model_type: 'RadiusProxyConfiguration', | ||||||
|  |                   floatingIpAddress: null, | ||||||
|  |                   floatingIfCidrPrefix: null, | ||||||
|  |                   floatingIfGwAddress: null, | ||||||
|  |                   floatingIfVlan: null, | ||||||
|  |                   sharedSecret: null, | ||||||
|  |                 }, | ||||||
|  |                 probeInterval: null, | ||||||
|  |                 serviceRegionName: 'Ottawa', | ||||||
|  |               }, | ||||||
|  |             }, | ||||||
|  |             serviceRegionMap: { | ||||||
|  |               Ottawa: { | ||||||
|  |                 model_type: 'RadiusServiceRegion', | ||||||
|  |                 serverMap: { | ||||||
|  |                   'Radius-Profile': [ | ||||||
|  |                     { | ||||||
|  |                       model_type: 'RadiusServer', | ||||||
|  |                       ipAddress: '192.168.0.1', | ||||||
|  |                       secret: 'testing123', | ||||||
|  |                       authPort: 1812, | ||||||
|  |                       timeout: null, | ||||||
|  |                     }, | ||||||
|  |                   ], | ||||||
|  |                 }, | ||||||
|  |                 regionName: 'Ottawa', | ||||||
|  |               }, | ||||||
|  |             }, | ||||||
|  |             profileType: 'radius', | ||||||
|  |           }, | ||||||
|  |           __typename: 'Profile', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   updateError: { | ||||||
|  |     request: { | ||||||
|  |       query: UPDATE_PROFILE, | ||||||
|  |       variables: { | ||||||
|  |         id: 123, | ||||||
|  |         username: 'test@test.com', | ||||||
|  |         password: 'password', | ||||||
|  |         role: 'CustomerIT', | ||||||
|  |         customerId: '2', | ||||||
|  |         lastModifiedTimestamp: '1597238767547', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: null, | ||||||
|  |       errors: [{}], | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   uploadSuccess: { | ||||||
|  |     request: { | ||||||
|  |       query: FILE_UPLOAD, | ||||||
|  |       variables: { | ||||||
|  |         fileName: 'testImg.jpg', | ||||||
|  |         file: { | ||||||
|  |           uid: '1234', | ||||||
|  |           lastModified: 1595008730671, | ||||||
|  |           lastModifiedDate: undefined, | ||||||
|  |           name: 'testImg.jpg', | ||||||
|  |           size: 100, | ||||||
|  |           type: 'image/jpg', | ||||||
|  |           percent: 0, | ||||||
|  |           originFileObj: { uid: 'rc-upload-1595008718690-73' }, | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         fileUpload: { | ||||||
|  |           fileName: 'talkblog@4x.png', | ||||||
|  |           baseUrl: 'https://localhost:9091/', | ||||||
|  |           __typename: 'File', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   uploadError: { | ||||||
|  |     request: { | ||||||
|  |       query: FILE_UPLOAD, | ||||||
|  |       variables: { | ||||||
|  |         fileName: 'testImg.jpg', | ||||||
|  |         file: { | ||||||
|  |           uid: '1234', | ||||||
|  |           lastModified: 1595008730671, | ||||||
|  |           lastModifiedDate: undefined, | ||||||
|  |           name: 'testImg.jpg', | ||||||
|  |           size: 100, | ||||||
|  |           type: 'image/jpg', | ||||||
|  |           percent: 0, | ||||||
|  |           originFileObj: { uid: 'rc-upload-1595008718690-73' }, | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: null, | ||||||
|  |       errors: [{}], | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }; | ||||||
| @@ -6,8 +6,9 @@ import { Alert, notification } from 'antd'; | |||||||
|  |  | ||||||
| import { Profile as ProfilePage, Loading } from '@tip-wlan/wlan-cloud-ui-library'; | import { Profile as ProfilePage, Loading } from '@tip-wlan/wlan-cloud-ui-library'; | ||||||
| import UserContext from 'contexts/UserContext'; | import UserContext from 'contexts/UserContext'; | ||||||
|  | import { DELETE_PROFILE } from 'graphql/mutations'; | ||||||
|  |  | ||||||
| const GET_ALL_PROFILES = gql` | export const GET_ALL_PROFILES = gql` | ||||||
|   query GetAllProfiles($customerId: ID!, $cursor: String, $limit: Int) { |   query GetAllProfiles($customerId: ID!, $cursor: String, $limit: Int) { | ||||||
|     getAllProfiles(customerId: $customerId, cursor: $cursor, limit: $limit) { |     getAllProfiles(customerId: $customerId, cursor: $cursor, limit: $limit) { | ||||||
|       items { |       items { | ||||||
| @@ -25,14 +26,6 @@ const GET_ALL_PROFILES = gql` | |||||||
|   } |   } | ||||||
| `; | `; | ||||||
|  |  | ||||||
| const DELETE_PROFILE = gql` |  | ||||||
|   mutation DeleteProfile($id: ID!) { |  | ||||||
|     deleteProfile(id: $id) { |  | ||||||
|       id |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| `; |  | ||||||
|  |  | ||||||
| const Profiles = () => { | const Profiles = () => { | ||||||
|   const { customerId } = useContext(UserContext); |   const { customerId } = useContext(UserContext); | ||||||
|   const { loading, error, data, refetch, fetchMore } = useQuery(GET_ALL_PROFILES, { |   const { loading, error, data, refetch, fetchMore } = useQuery(GET_ALL_PROFILES, { | ||||||
|   | |||||||
							
								
								
									
										171
									
								
								app/containers/Profiles/tests/index.test.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										171
									
								
								app/containers/Profiles/tests/index.test.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,171 @@ | |||||||
|  | import React from 'react'; | ||||||
|  | import '@testing-library/jest-dom/extend-expect'; | ||||||
|  | import { fireEvent, render, waitFor } from '@testing-library/react'; | ||||||
|  | import { MockedProvider } from '@apollo/react-testing'; | ||||||
|  | import { BrowserRouter as Router } from 'react-router-dom'; | ||||||
|  | import { screen } from '@testing-library/dom'; | ||||||
|  | import UserProvider from 'contexts/UserProvider'; | ||||||
|  | import { profilesMutationMock, profilesQueryMock } from './mock'; | ||||||
|  | import Profiles from '..'; | ||||||
|  |  | ||||||
|  | Object.defineProperty(window, 'matchMedia', { | ||||||
|  |   writable: true, | ||||||
|  |   value: jest.fn().mockImplementation(query => ({ | ||||||
|  |     matches: false, | ||||||
|  |     media: query, | ||||||
|  |     onchange: null, | ||||||
|  |     addListener: jest.fn(), // deprecated | ||||||
|  |     removeListener: jest.fn(), // deprecated | ||||||
|  |     addEventListener: jest.fn(), | ||||||
|  |     removeEventListener: jest.fn(), | ||||||
|  |     dispatchEvent: jest.fn(), | ||||||
|  |   })), | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | const mockProp = { | ||||||
|  |   id: 123, | ||||||
|  |   email: 'test@test.com', | ||||||
|  |   role: 'admin', | ||||||
|  |   customerId: 2, | ||||||
|  |   updateUser: jest.fn(), | ||||||
|  |   updateToken: jest.fn(), | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | describe('<Profiles />', () => { | ||||||
|  |   afterEach(jest.resetModules); | ||||||
|  |  | ||||||
|  |   it('should render with Data', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider mocks={[profilesQueryMock.success]} addTypename={false}> | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <Profiles /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('Radius-Profile')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should show error when query return error', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider mocks={[profilesQueryMock.error]} addTypename={false}> | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <Profiles /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('Failed to load profiles.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should render with Data and call onReload if reload button is clicked', async () => { | ||||||
|  |     const { getByText, getByRole } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[profilesQueryMock.success, profilesQueryMock.success]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <Profiles /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('Radius-Profile')).toBeVisible()); | ||||||
|  |     fireEvent.click(getByRole('button', { name: /reload/i })); | ||||||
|  |     await waitFor(() => expect(getByText('Radius-Profile')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should render with Data and show error if reload button is clicked', async () => { | ||||||
|  |     const { getByText, getByRole } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[profilesQueryMock.success, profilesQueryMock.error]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <Profiles /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('Radius-Profile')).toBeVisible()); | ||||||
|  |     fireEvent.click(getByRole('button', { name: /reload/i })); | ||||||
|  |     await waitFor(() => expect(getByText('Radius-Profile')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should render with Data and Load More Button Should show when isLastPage false', async () => { | ||||||
|  |     const { getByText, getByRole } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[profilesQueryMock.success, profilesQueryMock.loadmore]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <Profiles /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('Radius-Profile')).toBeVisible()); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Load More' })); | ||||||
|  |  | ||||||
|  |     await waitFor(() => expect(getByText('TipWlan-cloud-Enterprise')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should render with Data and Delete profile successfully', async () => { | ||||||
|  |     const { getByText, getByRole } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           profilesQueryMock.success, | ||||||
|  |           profilesQueryMock.loadmore, | ||||||
|  |           profilesMutationMock.deleteSuccess, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <Profiles /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('Radius-Profile')).toBeVisible()); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Load More' })); | ||||||
|  |  | ||||||
|  |     await waitFor(() => expect(getByText('TipWlan-cloud-Enterprise')).toBeVisible()); | ||||||
|  |     fireEvent.click(screen.getByTitle('delete')); | ||||||
|  |     expect(getByRole('button', { name: 'Delete' })); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Delete' })); | ||||||
|  |     await waitFor(() => expect(getByText('Profile successfully deleted.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should render with Data and show error when Delete profile', async () => { | ||||||
|  |     const { getByText, getByRole } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           profilesQueryMock.success, | ||||||
|  |           profilesQueryMock.loadmore, | ||||||
|  |           profilesMutationMock.deleteError, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <Profiles /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('Radius-Profile')).toBeVisible()); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Load More' })); | ||||||
|  |  | ||||||
|  |     await waitFor(() => expect(getByText('TipWlan-cloud-Enterprise')).toBeVisible()); | ||||||
|  |     fireEvent.click(screen.getByTitle('delete')); | ||||||
|  |     expect(getByRole('button', { name: 'Delete' })); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Delete' })); | ||||||
|  |     await waitFor(() => expect(getByText('Profile could not be deleted.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
							
								
								
									
										175
									
								
								app/containers/Profiles/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										175
									
								
								app/containers/Profiles/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,175 @@ | |||||||
|  | import { DELETE_PROFILE } from 'graphql/mutations'; | ||||||
|  | import { GET_ALL_PROFILES } from '..'; | ||||||
|  |  | ||||||
|  | export const profilesQueryMock = { | ||||||
|  |   success: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_ALL_PROFILES, | ||||||
|  |       variables: { customerId: 2, limit: 100 }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         getAllProfiles: { | ||||||
|  |           items: [ | ||||||
|  |             { | ||||||
|  |               id: '123', | ||||||
|  |               name: 'Radius-Profile', | ||||||
|  |               profileType: 'radius', | ||||||
|  |               details: { | ||||||
|  |                 model_type: 'RadiusProfile', | ||||||
|  |                 subnetConfiguration: { | ||||||
|  |                   test: { | ||||||
|  |                     model_type: 'RadiusSubnetConfiguration', | ||||||
|  |                     subnetAddress: '0.0.0.0', | ||||||
|  |                     subnetCidrPrefix: 0, | ||||||
|  |                     subnetName: 'test', | ||||||
|  |                     proxyConfig: { | ||||||
|  |                       model_type: 'RadiusProxyConfiguration', | ||||||
|  |                       floatingIpAddress: null, | ||||||
|  |                       floatingIfCidrPrefix: null, | ||||||
|  |                       floatingIfGwAddress: null, | ||||||
|  |                       floatingIfVlan: null, | ||||||
|  |                       sharedSecret: null, | ||||||
|  |                     }, | ||||||
|  |                     probeInterval: null, | ||||||
|  |                     serviceRegionName: 'Ottawa', | ||||||
|  |                   }, | ||||||
|  |                 }, | ||||||
|  |                 serviceRegionMap: { | ||||||
|  |                   Ottawa: { | ||||||
|  |                     model_type: 'RadiusServiceRegion', | ||||||
|  |                     serverMap: { | ||||||
|  |                       'Radius-Profile': [ | ||||||
|  |                         { | ||||||
|  |                           model_type: 'RadiusServer', | ||||||
|  |                           ipAddress: '192.168.0.1', | ||||||
|  |                           secret: 'testing123', | ||||||
|  |                           authPort: 1812, | ||||||
|  |                           timeout: null, | ||||||
|  |                         }, | ||||||
|  |                       ], | ||||||
|  |                     }, | ||||||
|  |                     regionName: 'Ottawa', | ||||||
|  |                   }, | ||||||
|  |                 }, | ||||||
|  |                 profileType: 'radius', | ||||||
|  |               }, | ||||||
|  |               __typename: 'Profile', | ||||||
|  |             }, | ||||||
|  |           ], | ||||||
|  |           context: { | ||||||
|  |             cursor: 'test', | ||||||
|  |             lastPage: false, | ||||||
|  |           }, | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |       loading: false, | ||||||
|  |       networkStatus: 7, | ||||||
|  |       stale: false, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   loadmore: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_ALL_PROFILES, | ||||||
|  |       variables: { customerId: 2, limit: 100, cursor: 'test' }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         getAllProfiles: { | ||||||
|  |           items: [ | ||||||
|  |             { | ||||||
|  |               id: '2', | ||||||
|  |               name: 'TipWlan-cloud-Enterprise', | ||||||
|  |               profileType: 'ssid', | ||||||
|  |               details: { | ||||||
|  |                 model_type: 'SsidConfiguration', | ||||||
|  |                 ssid: 'Default-SSID-1597238767760', | ||||||
|  |                 appliedRadios: ['is5GHzU', 'is2dot4GHz', 'is5GHzL'], | ||||||
|  |                 ssidAdminState: 'enabled', | ||||||
|  |                 secureMode: 'wpaEAP', | ||||||
|  |                 vlanId: 1, | ||||||
|  |                 keyStr: 'testing123', | ||||||
|  |                 broadcastSsid: 'enabled', | ||||||
|  |                 keyRefresh: 0, | ||||||
|  |                 noLocalSubnets: false, | ||||||
|  |                 radiusServiceName: 'Radius-Profile', | ||||||
|  |                 captivePortalId: null, | ||||||
|  |                 bandwidthLimitDown: 0, | ||||||
|  |                 bandwidthLimitUp: 0, | ||||||
|  |                 videoTrafficOnly: false, | ||||||
|  |                 radioBasedConfigs: { | ||||||
|  |                   is5GHz: { | ||||||
|  |                     model_type: 'RadioBasedSsidConfiguration', | ||||||
|  |                     enable80211r: null, | ||||||
|  |                     enable80211k: null, | ||||||
|  |                     enable80211v: null, | ||||||
|  |                   }, | ||||||
|  |                   is2dot4GHz: { | ||||||
|  |                     model_type: 'RadioBasedSsidConfiguration', | ||||||
|  |                     enable80211r: null, | ||||||
|  |                     enable80211k: null, | ||||||
|  |                     enable80211v: null, | ||||||
|  |                   }, | ||||||
|  |                   is5GHzU: { | ||||||
|  |                     model_type: 'RadioBasedSsidConfiguration', | ||||||
|  |                     enable80211r: null, | ||||||
|  |                     enable80211k: null, | ||||||
|  |                     enable80211v: null, | ||||||
|  |                   }, | ||||||
|  |                   is5GHzL: { | ||||||
|  |                     model_type: 'RadioBasedSsidConfiguration', | ||||||
|  |                     enable80211r: null, | ||||||
|  |                     enable80211k: null, | ||||||
|  |                     enable80211v: null, | ||||||
|  |                   }, | ||||||
|  |                 }, | ||||||
|  |                 bonjourGatewayProfileId: null, | ||||||
|  |                 enable80211w: null, | ||||||
|  |                 wepConfig: null, | ||||||
|  |                 forwardMode: null, | ||||||
|  |                 profileType: 'ssid', | ||||||
|  |               }, | ||||||
|  |             }, | ||||||
|  |           ], | ||||||
|  |           context: { | ||||||
|  |             cursor: 'test2', | ||||||
|  |             lastPage: true, | ||||||
|  |           }, | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |       loading: false, | ||||||
|  |       networkStatus: 7, | ||||||
|  |       stale: false, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   error: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_ALL_PROFILES, | ||||||
|  |       variables: { customerId: 2 }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: null, | ||||||
|  |       errors: [{}], | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | export const profilesMutationMock = { | ||||||
|  |   deleteSuccess: { | ||||||
|  |     request: { | ||||||
|  |       query: DELETE_PROFILE, | ||||||
|  |       variables: { id: '2' }, | ||||||
|  |     }, | ||||||
|  |     result: { data: { deleteProfile: { id: '2', __typename: 'Profile' } } }, | ||||||
|  |   }, | ||||||
|  |   deleteError: { | ||||||
|  |     request: { | ||||||
|  |       query: DELETE_PROFILE, | ||||||
|  |       variables: { id: '2' }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: null, | ||||||
|  |       errors: [{}], | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }; | ||||||
| @@ -0,0 +1,124 @@ | |||||||
|  | import React from 'react'; | ||||||
|  | import '@testing-library/jest-dom/extend-expect'; | ||||||
|  | import { fireEvent, render, waitFor } from '@testing-library/react'; | ||||||
|  | import { MockedProvider } from '@apollo/react-testing'; | ||||||
|  | import { BrowserRouter as Router } from 'react-router-dom'; | ||||||
|  | import UserProvider from 'contexts/UserProvider'; | ||||||
|  | import { autoProvisionMutationMock, autoProvisionQueryMock } from './mock'; | ||||||
|  | import AutoProvision from '..'; | ||||||
|  |  | ||||||
|  | Object.defineProperty(window, 'matchMedia', { | ||||||
|  |   writable: true, | ||||||
|  |   value: jest.fn().mockImplementation(query => ({ | ||||||
|  |     matches: false, | ||||||
|  |     media: query, | ||||||
|  |     onchange: null, | ||||||
|  |     addListener: jest.fn(), // deprecated | ||||||
|  |     removeListener: jest.fn(), // deprecated | ||||||
|  |     addEventListener: jest.fn(), | ||||||
|  |     removeEventListener: jest.fn(), | ||||||
|  |     dispatchEvent: jest.fn(), | ||||||
|  |   })), | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | const mockProp = { | ||||||
|  |   id: 123, | ||||||
|  |   email: 'test@test.com', | ||||||
|  |   role: 'admin', | ||||||
|  |   customerId: 2, | ||||||
|  |   updateUser: jest.fn(), | ||||||
|  |   updateToken: jest.fn(), | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | describe('<AutoProvision />', () => { | ||||||
|  |   afterEach(jest.resetModules); | ||||||
|  |  | ||||||
|  |   it('should render with Data', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           autoProvisionQueryMock.getAllProfilesSuccess, | ||||||
|  |           autoProvisionQueryMock.getCustomerSuccess, | ||||||
|  |           autoProvisionQueryMock.getAllLocationsSuccess, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <AutoProvision /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('EA8300')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should show error when customer query return error', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           autoProvisionQueryMock.getAllProfilesSuccess, | ||||||
|  |           autoProvisionQueryMock.error, | ||||||
|  |           autoProvisionQueryMock.getAllLocationsSuccess, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <AutoProvision /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('Failed to load Customer Data.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should render with Data and update successfully', async () => { | ||||||
|  |     const { getByText, getByRole } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           autoProvisionQueryMock.getAllProfilesSuccess, | ||||||
|  |           autoProvisionQueryMock.getCustomerSuccess, | ||||||
|  |           autoProvisionQueryMock.getCustomerSuccess, | ||||||
|  |           autoProvisionQueryMock.getAllLocationsSuccess, | ||||||
|  |           autoProvisionMutationMock.success, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <AutoProvision /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('EA8300')).toBeVisible()); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Save' })); | ||||||
|  |     await waitFor(() => expect(getByText('Settings successfully updated.')).toBeVisible()); | ||||||
|  |     await waitFor(() => expect(getByText('EA8300')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should render with Data and update show error when mutation return error', async () => { | ||||||
|  |     const { getByText, getByRole } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           autoProvisionQueryMock.getAllProfilesSuccess, | ||||||
|  |           autoProvisionQueryMock.getCustomerSuccess, | ||||||
|  |           autoProvisionQueryMock.getCustomerSuccess, | ||||||
|  |           autoProvisionQueryMock.getAllLocationsSuccess, | ||||||
|  |           autoProvisionMutationMock.error, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <AutoProvision /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('EA8300')).toBeVisible()); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Save' })); | ||||||
|  |     await waitFor(() => expect(getByText('Settings could not be updated.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
							
								
								
									
										361
									
								
								app/containers/System/containers/AutoProvision/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										361
									
								
								app/containers/System/containers/AutoProvision/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,361 @@ | |||||||
|  | import { GET_ALL_LOCATIONS, GET_ALL_PROFILES, GET_CUSTOMER } from 'graphql/queries'; | ||||||
|  | import { UPDATE_CUSTOMER } from 'graphql/mutations'; | ||||||
|  |  | ||||||
|  | export const autoProvisionQueryMock = { | ||||||
|  |   getAllProfilesSuccess: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_ALL_PROFILES, | ||||||
|  |       variables: { customerId: 2, type: 'equipment_ap' }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         getAllProfiles: { | ||||||
|  |           items: [ | ||||||
|  |             { | ||||||
|  |               id: '6', | ||||||
|  |               name: 'ApProfile-3-radios', | ||||||
|  |               profileType: 'equipment_ap', | ||||||
|  |               details: { | ||||||
|  |                 model_type: 'ApNetworkConfiguration', | ||||||
|  |                 networkConfigVersion: 'AP-1', | ||||||
|  |                 equipmentType: 'AP', | ||||||
|  |                 vlanNative: true, | ||||||
|  |                 vlan: 0, | ||||||
|  |                 ntpServer: { | ||||||
|  |                   model_type: 'AutoOrManualString', | ||||||
|  |                   auto: true, | ||||||
|  |                   value: 'pool.ntp.org', | ||||||
|  |                 }, | ||||||
|  |                 syslogRelay: null, | ||||||
|  |                 rtlsSettings: null, | ||||||
|  |                 syntheticClientEnabled: true, | ||||||
|  |                 ledControlEnabled: true, | ||||||
|  |                 equipmentDiscovery: false, | ||||||
|  |                 radioMap: { | ||||||
|  |                   is2dot4GHz: { | ||||||
|  |                     model_type: 'RadioProfileConfiguration', | ||||||
|  |                     bestApEnabled: true, | ||||||
|  |                     bestAPSteerType: 'both', | ||||||
|  |                   }, | ||||||
|  |                   is5GHzU: { | ||||||
|  |                     model_type: 'RadioProfileConfiguration', | ||||||
|  |                     bestApEnabled: true, | ||||||
|  |                     bestAPSteerType: 'both', | ||||||
|  |                   }, | ||||||
|  |                   is5GHzL: { | ||||||
|  |                     model_type: 'RadioProfileConfiguration', | ||||||
|  |                     bestApEnabled: true, | ||||||
|  |                     bestAPSteerType: 'both', | ||||||
|  |                   }, | ||||||
|  |                 }, | ||||||
|  |                 profileType: 'equipment_ap', | ||||||
|  |               }, | ||||||
|  |               __typename: 'Profile', | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |               id: '7', | ||||||
|  |               name: 'ApProfile-2-radios', | ||||||
|  |               profileType: 'equipment_ap', | ||||||
|  |               details: { | ||||||
|  |                 model_type: 'ApNetworkConfiguration', | ||||||
|  |                 networkConfigVersion: 'AP-1', | ||||||
|  |                 equipmentType: 'AP', | ||||||
|  |                 vlanNative: true, | ||||||
|  |                 vlan: 0, | ||||||
|  |                 ntpServer: { | ||||||
|  |                   model_type: 'AutoOrManualString', | ||||||
|  |                   auto: true, | ||||||
|  |                   value: 'pool.ntp.org', | ||||||
|  |                 }, | ||||||
|  |                 syslogRelay: null, | ||||||
|  |                 rtlsSettings: null, | ||||||
|  |                 syntheticClientEnabled: true, | ||||||
|  |                 ledControlEnabled: true, | ||||||
|  |                 equipmentDiscovery: false, | ||||||
|  |                 radioMap: { | ||||||
|  |                   is5GHz: { | ||||||
|  |                     model_type: 'RadioProfileConfiguration', | ||||||
|  |                     bestApEnabled: true, | ||||||
|  |                     bestAPSteerType: 'both', | ||||||
|  |                   }, | ||||||
|  |                   is2dot4GHz: { | ||||||
|  |                     model_type: 'RadioProfileConfiguration', | ||||||
|  |                     bestApEnabled: true, | ||||||
|  |                     bestAPSteerType: 'both', | ||||||
|  |                   }, | ||||||
|  |                 }, | ||||||
|  |                 profileType: 'equipment_ap', | ||||||
|  |               }, | ||||||
|  |               __typename: 'Profile', | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |               id: '8', | ||||||
|  |               name: 'EnterpriseApProfile', | ||||||
|  |               profileType: 'equipment_ap', | ||||||
|  |               details: { | ||||||
|  |                 model_type: 'ApNetworkConfiguration', | ||||||
|  |                 networkConfigVersion: 'AP-1', | ||||||
|  |                 equipmentType: 'AP', | ||||||
|  |                 vlanNative: true, | ||||||
|  |                 vlan: 0, | ||||||
|  |                 ntpServer: { | ||||||
|  |                   model_type: 'AutoOrManualString', | ||||||
|  |                   auto: true, | ||||||
|  |                   value: 'pool.ntp.org', | ||||||
|  |                 }, | ||||||
|  |                 syslogRelay: null, | ||||||
|  |                 rtlsSettings: null, | ||||||
|  |                 syntheticClientEnabled: true, | ||||||
|  |                 ledControlEnabled: true, | ||||||
|  |                 equipmentDiscovery: false, | ||||||
|  |                 radioMap: { | ||||||
|  |                   is5GHz: { | ||||||
|  |                     model_type: 'RadioProfileConfiguration', | ||||||
|  |                     bestApEnabled: true, | ||||||
|  |                     bestAPSteerType: 'both', | ||||||
|  |                   }, | ||||||
|  |                   is2dot4GHz: { | ||||||
|  |                     model_type: 'RadioProfileConfiguration', | ||||||
|  |                     bestApEnabled: true, | ||||||
|  |                     bestAPSteerType: 'both', | ||||||
|  |                   }, | ||||||
|  |                   is5GHzU: { | ||||||
|  |                     model_type: 'RadioProfileConfiguration', | ||||||
|  |                     bestApEnabled: true, | ||||||
|  |                     bestAPSteerType: 'both', | ||||||
|  |                   }, | ||||||
|  |                   is5GHzL: { | ||||||
|  |                     model_type: 'RadioProfileConfiguration', | ||||||
|  |                     bestApEnabled: true, | ||||||
|  |                     bestAPSteerType: 'both', | ||||||
|  |                   }, | ||||||
|  |                 }, | ||||||
|  |                 profileType: 'equipment_ap', | ||||||
|  |               }, | ||||||
|  |               __typename: 'Profile', | ||||||
|  |             }, | ||||||
|  |           ], | ||||||
|  |           context: { | ||||||
|  |             cursor: | ||||||
|  |               'bnVsbEBAQHsibW9kZWxfdHlwZSI6IkNvbnRleHRDaGlsZHJlbiIsImNoaWxkcmVuIjp7fX1AQEBudWxs', | ||||||
|  |             lastPage: true, | ||||||
|  |             __typename: 'PaginationContext', | ||||||
|  |           }, | ||||||
|  |           __typename: 'ProfilePagination', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |       loading: false, | ||||||
|  |       networkStatus: 7, | ||||||
|  |       stale: false, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |  | ||||||
|  |   getCustomerSuccess: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_CUSTOMER, | ||||||
|  |       variables: { id: 2 }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         getCustomer: { | ||||||
|  |           id: '2', | ||||||
|  |           name: 'Test Customer', | ||||||
|  |           email: 'test@example.com', | ||||||
|  |           createdTimestamp: '1597329016138', | ||||||
|  |           lastModifiedTimestamp: '1597329017058', | ||||||
|  |           details: { | ||||||
|  |             model_type: 'CustomerDetails', | ||||||
|  |             autoProvisioning: { | ||||||
|  |               model_type: 'EquipmentAutoProvisioningSettings', | ||||||
|  |               enabled: true, | ||||||
|  |               locationId: 8, | ||||||
|  |               equipmentProfileIdPerModel: { | ||||||
|  |                 default: 6, | ||||||
|  |                 TIP_AP: 7, | ||||||
|  |                 ECW5410: 7, | ||||||
|  |                 ECW5211: 7, | ||||||
|  |                 AP2220: 7, | ||||||
|  |                 'EA8300-CA': 6, | ||||||
|  |                 EA8300: 6, | ||||||
|  |               }, | ||||||
|  |             }, | ||||||
|  |           }, | ||||||
|  |           __typename: 'Customer', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |       loading: false, | ||||||
|  |       networkStatus: 7, | ||||||
|  |       stale: false, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |  | ||||||
|  |   getAllLocationsSuccess: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_ALL_LOCATIONS, | ||||||
|  |       variables: { customerId: 2 }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         getAllLocations: [ | ||||||
|  |           { | ||||||
|  |             id: '2', | ||||||
|  |             name: 'Menlo Park', | ||||||
|  |             parentId: '0', | ||||||
|  |             locationType: 'SITE', | ||||||
|  |             __typename: 'Location', | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             id: '3', | ||||||
|  |             name: 'Building 1', | ||||||
|  |             parentId: '2', | ||||||
|  |             locationType: 'BUILDING', | ||||||
|  |             __typename: 'Location', | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             id: '4', | ||||||
|  |             name: 'Floor 1', | ||||||
|  |             parentId: '3', | ||||||
|  |             locationType: 'FLOOR', | ||||||
|  |             __typename: 'Location', | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             id: '5', | ||||||
|  |             name: 'Floor 2', | ||||||
|  |             parentId: '3', | ||||||
|  |             locationType: 'FLOOR', | ||||||
|  |             __typename: 'Location', | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             id: '6', | ||||||
|  |             name: 'Floor 3', | ||||||
|  |             parentId: '3', | ||||||
|  |             locationType: 'FLOOR', | ||||||
|  |             __typename: 'Location', | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             id: '7', | ||||||
|  |             name: 'Building 2', | ||||||
|  |             parentId: '2', | ||||||
|  |             locationType: 'BUILDING', | ||||||
|  |             __typename: 'Location', | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             id: '8', | ||||||
|  |             name: 'Ottawa', | ||||||
|  |             parentId: '0', | ||||||
|  |             locationType: 'SITE', | ||||||
|  |             __typename: 'Location', | ||||||
|  |           }, | ||||||
|  |         ], | ||||||
|  |       }, | ||||||
|  |       loading: false, | ||||||
|  |       networkStatus: 7, | ||||||
|  |       stale: false, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |  | ||||||
|  |   error: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_CUSTOMER, | ||||||
|  |       variables: { id: 2 }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: null, | ||||||
|  |       errors: [{}], | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | export const autoProvisionMutationMock = { | ||||||
|  |   success: { | ||||||
|  |     request: { | ||||||
|  |       query: UPDATE_CUSTOMER, | ||||||
|  |       variables: { | ||||||
|  |         id: '2', | ||||||
|  |         email: 'test@example.com', | ||||||
|  |         name: 'Test Customer', | ||||||
|  |         details: { | ||||||
|  |           model_type: 'CustomerDetails', | ||||||
|  |           autoProvisioning: { | ||||||
|  |             model_type: 'EquipmentAutoProvisioningSettings', | ||||||
|  |             enabled: true, | ||||||
|  |             locationId: '8', | ||||||
|  |             equipmentProfileIdPerModel: { | ||||||
|  |               default: 6, | ||||||
|  |               TIP_AP: 7, | ||||||
|  |               ECW5410: 7, | ||||||
|  |               ECW5211: 7, | ||||||
|  |               AP2220: 7, | ||||||
|  |               'EA8300-CA': 6, | ||||||
|  |               EA8300: 6, | ||||||
|  |             }, | ||||||
|  |           }, | ||||||
|  |         }, | ||||||
|  |         createdTimestamp: '1597329016138', | ||||||
|  |         lastModifiedTimestamp: '1597329017058', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         updateCustomer: { | ||||||
|  |           id: '2', | ||||||
|  |           email: 'test@example.com', | ||||||
|  |           name: 'Test Customer', | ||||||
|  |           details: { | ||||||
|  |             model_type: 'CustomerDetails', | ||||||
|  |             autoProvisioning: { | ||||||
|  |               model_type: 'EquipmentAutoProvisioningSettings', | ||||||
|  |               enabled: true, | ||||||
|  |               locationId: 8, | ||||||
|  |               equipmentProfileIdPerModel: { | ||||||
|  |                 default: 6, | ||||||
|  |                 TIP_AP: 7, | ||||||
|  |                 ECW5410: 7, | ||||||
|  |                 ECW5211: 7, | ||||||
|  |                 AP2220: 7, | ||||||
|  |                 'EA8300-CA': 6, | ||||||
|  |                 EA8300: 6, | ||||||
|  |               }, | ||||||
|  |             }, | ||||||
|  |           }, | ||||||
|  |           createdTimestamp: '1597329016138', | ||||||
|  |           lastModifiedTimestamp: '1597331154979', | ||||||
|  |           __typename: 'Customer', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   error: { | ||||||
|  |     request: { | ||||||
|  |       query: UPDATE_CUSTOMER, | ||||||
|  |       variables: { | ||||||
|  |         id: '2', | ||||||
|  |         email: 'test@example.com', | ||||||
|  |         name: 'Test Customer', | ||||||
|  |         details: { | ||||||
|  |           model_type: 'CustomerDetails', | ||||||
|  |           autoProvisioning: { | ||||||
|  |             model_type: 'EquipmentAutoProvisioningSettings', | ||||||
|  |             enabled: true, | ||||||
|  |             locationId: '8', | ||||||
|  |             equipmentProfileIdPerModel: { | ||||||
|  |               default: 6, | ||||||
|  |               TIP_AP: 7, | ||||||
|  |               ECW5410: 7, | ||||||
|  |               ECW5211: 7, | ||||||
|  |               AP2220: 7, | ||||||
|  |               'EA8300-CA': 6, | ||||||
|  |               EA8300: 6, | ||||||
|  |             }, | ||||||
|  |           }, | ||||||
|  |         }, | ||||||
|  |         createdTimestamp: '1597329016138', | ||||||
|  |         lastModifiedTimestamp: '1597329017058', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: null, | ||||||
|  |       errors: [{}], | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }; | ||||||
							
								
								
									
										167
									
								
								app/containers/System/containers/BlockedList/tests/index.test.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								app/containers/System/containers/BlockedList/tests/index.test.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,167 @@ | |||||||
|  | import React from 'react'; | ||||||
|  | import '@testing-library/jest-dom/extend-expect'; | ||||||
|  | import { fireEvent, render, waitFor } from '@testing-library/react'; | ||||||
|  | import { MockedProvider } from '@apollo/react-testing'; | ||||||
|  | import { BrowserRouter as Router } from 'react-router-dom'; | ||||||
|  | import UserProvider from 'contexts/UserProvider'; | ||||||
|  | import { blockListMutationMock, blockListQueryMock } from './mock'; | ||||||
|  | import BlockedList from '..'; | ||||||
|  |  | ||||||
|  | Object.defineProperty(window, 'matchMedia', { | ||||||
|  |   writable: true, | ||||||
|  |   value: jest.fn().mockImplementation(query => ({ | ||||||
|  |     matches: false, | ||||||
|  |     media: query, | ||||||
|  |     onchange: null, | ||||||
|  |     addListener: jest.fn(), // deprecated | ||||||
|  |     removeListener: jest.fn(), // deprecated | ||||||
|  |     addEventListener: jest.fn(), | ||||||
|  |     removeEventListener: jest.fn(), | ||||||
|  |     dispatchEvent: jest.fn(), | ||||||
|  |   })), | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | const mockProp = { | ||||||
|  |   id: 123, | ||||||
|  |   email: 'test@test.com', | ||||||
|  |   role: 'admin', | ||||||
|  |   customerId: 2, | ||||||
|  |   updateUser: jest.fn(), | ||||||
|  |   updateToken: jest.fn(), | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | describe('<BlockedList />', () => { | ||||||
|  |   afterEach(jest.resetModules); | ||||||
|  |  | ||||||
|  |   it('should render with Data', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider mocks={[blockListQueryMock.success]} addTypename={false}> | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <BlockedList /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('74:9c:00:01:45:ae')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should show error when Block query return error', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider mocks={[blockListQueryMock.error]} addTypename={false}> | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <BlockedList /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('Failed to load Client Data.')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should render with Data and add Client successfully', async () => { | ||||||
|  |     const { getByText, getByLabelText, getByRole } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           blockListQueryMock.success, | ||||||
|  |           blockListQueryMock.success, | ||||||
|  |           blockListMutationMock.addClientSuccess, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <BlockedList /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('74:9c:00:01:45:ae')).toBeVisible()); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Add Client' })); | ||||||
|  |     fireEvent.change(getByLabelText('MAC Address'), { target: { value: '74:8c:00:01:45:ae' } }); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Save' })); | ||||||
|  |     await waitFor(() => | ||||||
|  |       expect(getByText('Client successfully added to Blocked List')).toBeVisible() | ||||||
|  |     ); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should render with Data and add Client return error when mutation not work', async () => { | ||||||
|  |     const { getByText, getByLabelText, getByRole } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[blockListQueryMock.success, blockListMutationMock.addClientError]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <BlockedList /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('74:9c:00:01:45:ae')).toBeVisible()); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Add Client' })); | ||||||
|  |     fireEvent.change(getByLabelText('MAC Address'), { target: { value: '74:8c:00:01:45:ae' } }); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Save' })); | ||||||
|  |     await waitFor(() => | ||||||
|  |       expect(getByText('Client could not be added to Blocked List')).toBeVisible() | ||||||
|  |     ); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should render with Data and update Client successfully', async () => { | ||||||
|  |     const { getByText, getByRole } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           blockListQueryMock.success, | ||||||
|  |           blockListQueryMock.success, | ||||||
|  |           blockListMutationMock.updateClientSuccess, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <BlockedList /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('74:9c:00:01:45:ae')).toBeVisible()); | ||||||
|  |     fireEvent.click( | ||||||
|  |       getByRole('button', { | ||||||
|  |         name: `delete-mac-74:9c:00:01:45:ae`, | ||||||
|  |       }) | ||||||
|  |     ); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Remove' })); | ||||||
|  |     await waitFor(() => | ||||||
|  |       expect(getByText('Client successfully removed from Blocked List')).toBeVisible() | ||||||
|  |     ); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should render with Data and update Client return error when mutation not work', async () => { | ||||||
|  |     const { getByText, getByRole } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           blockListQueryMock.success, | ||||||
|  |           blockListQueryMock.success, | ||||||
|  |           blockListMutationMock.updateClientError, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <BlockedList /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('74:9c:00:01:45:ae')).toBeVisible()); | ||||||
|  |     fireEvent.click( | ||||||
|  |       getByRole('button', { | ||||||
|  |         name: `delete-mac-74:9c:00:01:45:ae`, | ||||||
|  |       }) | ||||||
|  |     ); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Remove' })); | ||||||
|  |     await waitFor(() => | ||||||
|  |       expect(getByText('Client could not be removed from Blocked List')).toBeVisible() | ||||||
|  |     ); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
							
								
								
									
										189
									
								
								app/containers/System/containers/BlockedList/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										189
									
								
								app/containers/System/containers/BlockedList/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,189 @@ | |||||||
|  | import { ADD_BLOCKED_CLIENT, UPDATE_CLIENT } from 'graphql/mutations'; | ||||||
|  | import { GET_BLOCKED_CLIENTS } from 'graphql/queries'; | ||||||
|  |  | ||||||
|  | export const blockListQueryMock = { | ||||||
|  |   success: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_BLOCKED_CLIENTS, | ||||||
|  |       variables: { customerId: 2 }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         getBlockedClients: [ | ||||||
|  |           { | ||||||
|  |             customerId: '2', | ||||||
|  |             macAddress: '74:9c:00:01:45:ae', | ||||||
|  |             createdTimestamp: '1597172802575', | ||||||
|  |             lastModifiedTimestamp: '1597333913133', | ||||||
|  |             details: { | ||||||
|  |               model_type: 'ClientInfoDetails', | ||||||
|  |               alias: 'alias 128213363803566', | ||||||
|  |               clientType: 0, | ||||||
|  |               apFingerprint: 'fp 74:9c:00:01:45:ae', | ||||||
|  |               userName: 'user-128213363803566', | ||||||
|  |               hostName: 'hostName-128213363803566', | ||||||
|  |               lastUsedCpUsername: null, | ||||||
|  |               lastUserAgent: null, | ||||||
|  |               doNotSteer: false, | ||||||
|  |               blocklistDetails: { | ||||||
|  |                 model_type: 'BlocklistDetails', | ||||||
|  |                 enabled: true, | ||||||
|  |                 startTime: null, | ||||||
|  |                 endTime: null, | ||||||
|  |               }, | ||||||
|  |             }, | ||||||
|  |             __typename: 'Client', | ||||||
|  |           }, | ||||||
|  |         ], | ||||||
|  |       }, | ||||||
|  |       loading: false, | ||||||
|  |       networkStatus: 7, | ||||||
|  |       stale: false, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |  | ||||||
|  |   error: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_BLOCKED_CLIENTS, | ||||||
|  |       variables: { customerId: 2 }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: null, | ||||||
|  |       errors: [{}], | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | export const blockListMutationMock = { | ||||||
|  |   addClientSuccess: { | ||||||
|  |     request: { | ||||||
|  |       query: ADD_BLOCKED_CLIENT, | ||||||
|  |       variables: { | ||||||
|  |         customerId: 2, | ||||||
|  |         macAddress: '74:8c:00:01:45:ae', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         addBlockedClient: { | ||||||
|  |           customerId: '2', | ||||||
|  |           macAddress: '74:8c:00:01:45:ae', | ||||||
|  |           details: { | ||||||
|  |             model_type: 'ClientInfoDetails', | ||||||
|  |             alias: null, | ||||||
|  |             clientType: 0, | ||||||
|  |             apFingerprint: null, | ||||||
|  |             userName: null, | ||||||
|  |             hostName: null, | ||||||
|  |             lastUsedCpUsername: null, | ||||||
|  |             lastUserAgent: null, | ||||||
|  |             doNotSteer: false, | ||||||
|  |             blocklistDetails: { | ||||||
|  |               model_type: 'BlocklistDetails', | ||||||
|  |               enabled: true, | ||||||
|  |               startTime: null, | ||||||
|  |               endTime: null, | ||||||
|  |             }, | ||||||
|  |           }, | ||||||
|  |           lastModifiedTimestamp: '1597334825157', | ||||||
|  |           createdTimestamp: '1597334825157', | ||||||
|  |           __typename: 'Client', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   addClientError: { | ||||||
|  |     request: { | ||||||
|  |       query: ADD_BLOCKED_CLIENT, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: null, | ||||||
|  |       errors: [{}], | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   updateClientSuccess: { | ||||||
|  |     request: { | ||||||
|  |       query: UPDATE_CLIENT, | ||||||
|  |       variables: { | ||||||
|  |         customerId: 2, | ||||||
|  |         macAddress: '74:9c:00:01:45:ae', | ||||||
|  |         details: { | ||||||
|  |           model_type: 'ClientInfoDetails', | ||||||
|  |           alias: 'alias 128213363803566', | ||||||
|  |           clientType: 0, | ||||||
|  |           apFingerprint: 'fp 74:9c:00:01:45:ae', | ||||||
|  |           userName: 'user-128213363803566', | ||||||
|  |           hostName: 'hostName-128213363803566', | ||||||
|  |           lastUsedCpUsername: null, | ||||||
|  |           lastUserAgent: null, | ||||||
|  |           doNotSteer: false, | ||||||
|  |           blocklistDetails: { | ||||||
|  |             model_type: 'BlocklistDetails', | ||||||
|  |             enabled: false, | ||||||
|  |             startTime: null, | ||||||
|  |             endTime: null, | ||||||
|  |           }, | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         updateClient: { | ||||||
|  |           customerId: '2', | ||||||
|  |           macAddress: 'mac-74:9c:00:01:45:ae', | ||||||
|  |           createdTimestamp: '0', | ||||||
|  |           lastModifiedTimestamp: '1597336036972', | ||||||
|  |           details: { | ||||||
|  |             model_type: 'ClientInfoDetails', | ||||||
|  |             alias: 'alias 128213363803566', | ||||||
|  |             clientType: 0, | ||||||
|  |             apFingerprint: 'fp 74:9c:00:01:45:ae', | ||||||
|  |             userName: 'user-128213363803566', | ||||||
|  |             hostName: 'hostName-128213363803566', | ||||||
|  |             lastUsedCpUsername: null, | ||||||
|  |             lastUserAgent: null, | ||||||
|  |             doNotSteer: false, | ||||||
|  |             blocklistDetails: { | ||||||
|  |               model_type: 'BlocklistDetails', | ||||||
|  |               enabled: false, | ||||||
|  |               startTime: null, | ||||||
|  |               endTime: null, | ||||||
|  |             }, | ||||||
|  |           }, | ||||||
|  |           __typename: 'Client', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |  | ||||||
|  |   updateClientError: { | ||||||
|  |     request: { | ||||||
|  |       query: UPDATE_CLIENT, | ||||||
|  |       variables: { | ||||||
|  |         customerId: 2, | ||||||
|  |         macAddress: '74:9c:00:01:45:ae', | ||||||
|  |         details: { | ||||||
|  |           model_type: 'ClientInfoDetails', | ||||||
|  |           alias: 'alias 128213363803566', | ||||||
|  |           clientType: 0, | ||||||
|  |           apFingerprint: 'fp 74:9c:00:01:45:ae', | ||||||
|  |           userName: 'user-128213363803566', | ||||||
|  |           hostName: 'hostName-128213363803566', | ||||||
|  |           lastUsedCpUsername: null, | ||||||
|  |           lastUserAgent: null, | ||||||
|  |           doNotSteer: false, | ||||||
|  |           blocklistDetails: { | ||||||
|  |             model_type: 'BlocklistDetails', | ||||||
|  |             enabled: false, | ||||||
|  |             startTime: null, | ||||||
|  |             endTime: null, | ||||||
|  |           }, | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: null, | ||||||
|  |       errors: [{}], | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }; | ||||||
							
								
								
									
										119
									
								
								app/containers/System/containers/Firmware/tests/index.test.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								app/containers/System/containers/Firmware/tests/index.test.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,119 @@ | |||||||
|  | import React from 'react'; | ||||||
|  | import '@testing-library/jest-dom/extend-expect'; | ||||||
|  | import { fireEvent, render, waitFor } from '@testing-library/react'; | ||||||
|  | import { MockedProvider } from '@apollo/react-testing'; | ||||||
|  | import { BrowserRouter as Router } from 'react-router-dom'; | ||||||
|  | import UserProvider from 'contexts/UserProvider'; | ||||||
|  | import { firmwareMutationMock, firmwareQueryMock } from './mock'; | ||||||
|  | import Firmware from '..'; | ||||||
|  |  | ||||||
|  | const { | ||||||
|  |   getAllFirmwareModelsSuccess, | ||||||
|  |   getAllFirmwareSuccess, | ||||||
|  |   getFirmwareTrackAssignmentSuccess, | ||||||
|  |   getFirmwareTrackSuccess, | ||||||
|  | } = firmwareQueryMock; | ||||||
|  |  | ||||||
|  | Object.defineProperty(window, 'matchMedia', { | ||||||
|  |   writable: true, | ||||||
|  |   value: jest.fn().mockImplementation(query => ({ | ||||||
|  |     matches: false, | ||||||
|  |     media: query, | ||||||
|  |     onchange: null, | ||||||
|  |     addListener: jest.fn(), // deprecated | ||||||
|  |     removeListener: jest.fn(), // deprecated | ||||||
|  |     addEventListener: jest.fn(), | ||||||
|  |     removeEventListener: jest.fn(), | ||||||
|  |     dispatchEvent: jest.fn(), | ||||||
|  |   })), | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | const mockProp = { | ||||||
|  |   id: 123, | ||||||
|  |   email: 'test@test.com', | ||||||
|  |   role: 'admin', | ||||||
|  |   customerId: 2, | ||||||
|  |   updateUser: jest.fn(), | ||||||
|  |   updateToken: jest.fn(), | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | describe('<Firmware />', () => { | ||||||
|  |   afterEach(jest.resetModules); | ||||||
|  |  | ||||||
|  |   it('should render with Data', async () => { | ||||||
|  |     const { getByText } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           getAllFirmwareModelsSuccess, | ||||||
|  |           getAllFirmwareSuccess, | ||||||
|  |           getFirmwareTrackAssignmentSuccess, | ||||||
|  |           getFirmwareTrackSuccess, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <Firmware /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('ap2220-2020-06-25-ce03472')).toBeVisible()); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should render with Data and Edit Model Target successfully', async () => { | ||||||
|  |     const { getByText, getByRole } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           getAllFirmwareModelsSuccess, | ||||||
|  |           getAllFirmwareSuccess, | ||||||
|  |           getFirmwareTrackAssignmentSuccess, | ||||||
|  |           getFirmwareTrackAssignmentSuccess, | ||||||
|  |           getFirmwareTrackSuccess, | ||||||
|  |           firmwareMutationMock.updateTrackAssignmentSuccess, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <Firmware /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('ap2220-2020-06-25-ce03472')).toBeVisible()); | ||||||
|  |     fireEvent.click(getByRole('button', { name: `edit-track-ap2220` })); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Save' })); | ||||||
|  |     await waitFor(() => | ||||||
|  |       expect(getByText('Model Target Version successfully updated.')).toBeVisible() | ||||||
|  |     ); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   it('should render with Data and Edit Model Target show error when mutation not work ', async () => { | ||||||
|  |     const { getByText, getByRole } = render( | ||||||
|  |       <MockedProvider | ||||||
|  |         mocks={[ | ||||||
|  |           getAllFirmwareModelsSuccess, | ||||||
|  |           getAllFirmwareSuccess, | ||||||
|  |           getFirmwareTrackAssignmentSuccess, | ||||||
|  |           getFirmwareTrackAssignmentSuccess, | ||||||
|  |           getFirmwareTrackSuccess, | ||||||
|  |           firmwareMutationMock.updateTrackAssignmentError, | ||||||
|  |         ]} | ||||||
|  |         addTypename={false} | ||||||
|  |       > | ||||||
|  |         <UserProvider {...mockProp}> | ||||||
|  |           <Router> | ||||||
|  |             <Firmware /> | ||||||
|  |           </Router> | ||||||
|  |         </UserProvider> | ||||||
|  |       </MockedProvider> | ||||||
|  |     ); | ||||||
|  |     await waitFor(() => expect(getByText('ap2220-2020-06-25-ce03472')).toBeVisible()); | ||||||
|  |     fireEvent.click(getByRole('button', { name: `edit-track-ap2220` })); | ||||||
|  |     fireEvent.click(getByRole('button', { name: 'Save' })); | ||||||
|  |     await waitFor(() => | ||||||
|  |       expect(getByText('Model Target Version could not be updated.')).toBeVisible() | ||||||
|  |     ); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
							
								
								
									
										223
									
								
								app/containers/System/containers/Firmware/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										223
									
								
								app/containers/System/containers/Firmware/tests/mock.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,223 @@ | |||||||
|  | import { UPDATE_TRACK_ASSIGNMENT } from 'graphql/mutations'; | ||||||
|  | import { | ||||||
|  |   GET_ALL_FIRMWARE, | ||||||
|  |   GET_ALL_FIRMWARE_MODELS, | ||||||
|  |   GET_FIRMWARE_TRACK, | ||||||
|  |   GET_TRACK_ASSIGNMENTS, | ||||||
|  | } from 'graphql/queries'; | ||||||
|  |  | ||||||
|  | export const firmwareQueryMock = { | ||||||
|  |   getAllFirmwareSuccess: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_ALL_FIRMWARE, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         getAllFirmware: [ | ||||||
|  |           { | ||||||
|  |             id: '1', | ||||||
|  |             modelId: 'ap2220', | ||||||
|  |             versionName: 'ap2220-2020-06-25-ce03472', | ||||||
|  |             description: '', | ||||||
|  |             filename: | ||||||
|  |               'https://tip-read:tip-read@tip.jfrog.io/artifactory/tip-wlan-ap-firmware/ap2220/ap2220-2020-06-25-ce03472.tar.gz', | ||||||
|  |             commit: 'ce03472', | ||||||
|  |             releaseDate: '1597329017106', | ||||||
|  |             validationCode: 'c69370aa5b6622d91a0fba3a5441f31c', | ||||||
|  |             createdTimestamp: '1597329017115', | ||||||
|  |             lastModifiedTimestamp: '1597329017115', | ||||||
|  |             __typename: 'Firmware', | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             id: '2', | ||||||
|  |             modelId: 'ea8300', | ||||||
|  |             versionName: 'ea8300-2020-06-25-ce03472', | ||||||
|  |             description: '', | ||||||
|  |             filename: | ||||||
|  |               'https://tip-read:tip-read@tip-read:tip-read@tip.jfrog.io/artifactory/tip-wlan-ap-firmware/ea8300/ea8300-2020-06-25-ce03472.tar.gz', | ||||||
|  |             commit: 'ce03472', | ||||||
|  |             releaseDate: '1597329017115', | ||||||
|  |             validationCode: 'b209deb9847bdf40a31e45edf2e5a8d7', | ||||||
|  |             createdTimestamp: '1597329017115', | ||||||
|  |             lastModifiedTimestamp: '1597329017115', | ||||||
|  |             __typename: 'Firmware', | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             id: '3', | ||||||
|  |             modelId: 'ea8300-ca', | ||||||
|  |             versionName: 'ea8300-2020-06-25-ce03472', | ||||||
|  |             description: '', | ||||||
|  |             filename: | ||||||
|  |               'https://tip-read:tip-read@tip.jfrog.io/artifactory/tip-wlan-ap-firmware/ea8300/ea8300-2020-06-25-ce03472.tar.gz', | ||||||
|  |             commit: 'ce03472', | ||||||
|  |             releaseDate: '1597329017115', | ||||||
|  |             validationCode: 'b209deb9847bdf40a31e45edf2e5a8d7', | ||||||
|  |             createdTimestamp: '1597329017115', | ||||||
|  |             lastModifiedTimestamp: '1597329017115', | ||||||
|  |             __typename: 'Firmware', | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             id: '4', | ||||||
|  |             modelId: 'ecw5211', | ||||||
|  |             versionName: 'ecw5211-2020-06-26-4ff7208', | ||||||
|  |             description: '', | ||||||
|  |             filename: | ||||||
|  |               'https://tip-read:tip-read@tip.jfrog.io/artifactory/tip-wlan-ap-firmware/ecw5211/ecw5211-2020-06-26-4ff7208.tar.gz', | ||||||
|  |             commit: '4ff7208', | ||||||
|  |             releaseDate: '1597329017115', | ||||||
|  |             validationCode: '133072b0e8a440063109604375938fba', | ||||||
|  |             createdTimestamp: '1597329017115', | ||||||
|  |             lastModifiedTimestamp: '1597329017115', | ||||||
|  |             __typename: 'Firmware', | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             id: '5', | ||||||
|  |             modelId: 'ecw5410', | ||||||
|  |             versionName: 'ecw5410-2020-06-25-ce03472', | ||||||
|  |             description: '', | ||||||
|  |             filename: | ||||||
|  |               'https://tip-read:tip-read@tip.jfrog.io/artifactory/tip-wlan-ap-firmware/ecw5410/ecw5410-2020-06-25-ce03472.tar.gz', | ||||||
|  |             commit: 'ce03472', | ||||||
|  |             releaseDate: '1597329017115', | ||||||
|  |             validationCode: '2940ca34eeab85be18f3a4b79f4da6d9', | ||||||
|  |             createdTimestamp: '1597329017115', | ||||||
|  |             lastModifiedTimestamp: '1597329017115', | ||||||
|  |             __typename: 'Firmware', | ||||||
|  |           }, | ||||||
|  |         ], | ||||||
|  |       }, | ||||||
|  |       loading: false, | ||||||
|  |       networkStatus: 7, | ||||||
|  |       stale: false, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |  | ||||||
|  |   getAllFirmwareModelsSuccess: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_ALL_FIRMWARE_MODELS, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         getAllFirmwareModelId: ['ea8300-ca', 'ap2220', 'ecw5211', 'ea8300', 'ecw5410'], | ||||||
|  |       }, | ||||||
|  |       loading: false, | ||||||
|  |       networkStatus: 7, | ||||||
|  |       stale: false, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |  | ||||||
|  |   getFirmwareTrackAssignmentSuccess: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_TRACK_ASSIGNMENTS, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         getAllFirmwareTrackAssignment: [ | ||||||
|  |           { | ||||||
|  |             modelId: 'ap2220', | ||||||
|  |             firmwareVersionRecordId: '1', | ||||||
|  |             trackRecordId: '1', | ||||||
|  |             lastModifiedTimestamp: '1597342689340', | ||||||
|  |             __typename: 'FirmwareTrackAssignment', | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             modelId: 'ea8300', | ||||||
|  |             firmwareVersionRecordId: '2', | ||||||
|  |             trackRecordId: '1', | ||||||
|  |             lastModifiedTimestamp: '1597172802693', | ||||||
|  |             __typename: 'FirmwareTrackAssignment', | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             modelId: 'ea8300-ca', | ||||||
|  |             firmwareVersionRecordId: '3', | ||||||
|  |             trackRecordId: '1', | ||||||
|  |             lastModifiedTimestamp: '1597172802693', | ||||||
|  |             __typename: 'FirmwareTrackAssignment', | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             modelId: 'ecw5211', | ||||||
|  |             firmwareVersionRecordId: '4', | ||||||
|  |             trackRecordId: '1', | ||||||
|  |             lastModifiedTimestamp: '1597172802693', | ||||||
|  |             __typename: 'FirmwareTrackAssignment', | ||||||
|  |           }, | ||||||
|  |         ], | ||||||
|  |       }, | ||||||
|  |       loading: false, | ||||||
|  |       networkStatus: 7, | ||||||
|  |       stale: false, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |  | ||||||
|  |   getFirmwareTrackSuccess: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_FIRMWARE_TRACK, | ||||||
|  |       variables: { firmwareTrackName: 'DEFAULT' }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         getFirmwareTrack: { | ||||||
|  |           recordId: '1', | ||||||
|  |           trackName: 'DEFAULT', | ||||||
|  |           createdTimestamp: '1597329017117', | ||||||
|  |           lastModifiedTimestamp: '1597329017117', | ||||||
|  |           __typename: 'FirmwareTrack', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |       loading: false, | ||||||
|  |       networkStatus: 7, | ||||||
|  |       stale: false, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   error: { | ||||||
|  |     request: { | ||||||
|  |       query: GET_FIRMWARE_TRACK, | ||||||
|  |       variables: { customerId: 2 }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: null, | ||||||
|  |       errors: [{}], | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | export const firmwareMutationMock = { | ||||||
|  |   updateTrackAssignmentSuccess: { | ||||||
|  |     request: { | ||||||
|  |       query: UPDATE_TRACK_ASSIGNMENT, | ||||||
|  |       variables: { | ||||||
|  |         trackRecordId: '1', | ||||||
|  |         firmwareVersionRecordId: '1', | ||||||
|  |         modelId: 'ap2220', | ||||||
|  |         lastModifiedTimestamp: '1597342689340', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: { | ||||||
|  |         updateFirmwareTrackAssignment: { | ||||||
|  |           trackRecordId: '1', | ||||||
|  |           firmwareVersionRecordId: '1', | ||||||
|  |           modelId: 'ap2220', | ||||||
|  |           createdTimestamp: '0', | ||||||
|  |           lastModifiedTimestamp: '1597342689340', | ||||||
|  |           __typename: 'FirmwareTrackAssignment', | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   updateTrackAssignmentError: { | ||||||
|  |     request: { | ||||||
|  |       query: UPDATE_TRACK_ASSIGNMENT, | ||||||
|  |       variables: { | ||||||
|  |         trackRecordId: '1', | ||||||
|  |         firmwareVersionRecordId: '1', | ||||||
|  |         modelId: 'ap2220', | ||||||
|  |         lastModifiedTimestamp: '1597342689340', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     result: { | ||||||
|  |       data: null, | ||||||
|  |       errors: [{}], | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }; | ||||||
| @@ -10,6 +10,167 @@ export const REFRESH_TOKEN = gql` | |||||||
|   } |   } | ||||||
| `; | `; | ||||||
|  |  | ||||||
|  | export const AUTHENTICATE_USER = gql` | ||||||
|  |   mutation AuthenticateUser($email: String!, $password: String!) { | ||||||
|  |     authenticateUser(email: $email, password: $password) { | ||||||
|  |       access_token | ||||||
|  |       refresh_token | ||||||
|  |       expires_in | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | `; | ||||||
|  |  | ||||||
|  | export const UPDATE_PROFILE = gql` | ||||||
|  |   mutation UpdateProfile( | ||||||
|  |     $id: ID! | ||||||
|  |     $profileType: String! | ||||||
|  |     $customerId: ID! | ||||||
|  |     $name: String! | ||||||
|  |     $childProfileIds: [ID] | ||||||
|  |     $lastModifiedTimestamp: String | ||||||
|  |     $details: JSONObject | ||||||
|  |   ) { | ||||||
|  |     updateProfile( | ||||||
|  |       id: $id | ||||||
|  |       profileType: $profileType | ||||||
|  |       customerId: $customerId | ||||||
|  |       name: $name | ||||||
|  |       childProfileIds: $childProfileIds | ||||||
|  |       lastModifiedTimestamp: $lastModifiedTimestamp | ||||||
|  |       details: $details | ||||||
|  |     ) { | ||||||
|  |       id | ||||||
|  |       profileType | ||||||
|  |       customerId | ||||||
|  |       name | ||||||
|  |       childProfileIds | ||||||
|  |       lastModifiedTimestamp | ||||||
|  |       details | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | `; | ||||||
|  |  | ||||||
|  | export const UPDATE_USER = gql` | ||||||
|  |   mutation UpdateUser( | ||||||
|  |     $id: ID! | ||||||
|  |     $username: String! | ||||||
|  |     $password: String! | ||||||
|  |     $role: String! | ||||||
|  |     $customerId: ID! | ||||||
|  |     $lastModifiedTimestamp: String | ||||||
|  |   ) { | ||||||
|  |     updateUser( | ||||||
|  |       id: $id | ||||||
|  |       username: $username | ||||||
|  |       password: $password | ||||||
|  |       role: $role | ||||||
|  |       customerId: $customerId | ||||||
|  |       lastModifiedTimestamp: $lastModifiedTimestamp | ||||||
|  |     ) { | ||||||
|  |       id | ||||||
|  |       username | ||||||
|  |       role | ||||||
|  |       customerId | ||||||
|  |       lastModifiedTimestamp | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | `; | ||||||
|  |  | ||||||
|  | export const UPDATE_EQUIPMENT = gql` | ||||||
|  |   mutation UpdateEquipment( | ||||||
|  |     $id: ID! | ||||||
|  |     $equipmentType: String! | ||||||
|  |     $inventoryId: String! | ||||||
|  |     $customerId: ID! | ||||||
|  |     $profileId: ID! | ||||||
|  |     $locationId: ID! | ||||||
|  |     $name: String! | ||||||
|  |     $latitude: String | ||||||
|  |     $longitude: String | ||||||
|  |     $serial: String | ||||||
|  |     $lastModifiedTimestamp: String | ||||||
|  |     $details: JSONObject | ||||||
|  |   ) { | ||||||
|  |     updateEquipment( | ||||||
|  |       id: $id | ||||||
|  |       equipmentType: $equipmentType | ||||||
|  |       inventoryId: $inventoryId | ||||||
|  |       customerId: $customerId | ||||||
|  |       profileId: $profileId | ||||||
|  |       locationId: $locationId | ||||||
|  |       name: $name | ||||||
|  |       latitude: $latitude | ||||||
|  |       longitude: $longitude | ||||||
|  |       serial: $serial | ||||||
|  |       lastModifiedTimestamp: $lastModifiedTimestamp | ||||||
|  |       details: $details | ||||||
|  |     ) { | ||||||
|  |       id | ||||||
|  |       equipmentType | ||||||
|  |       inventoryId | ||||||
|  |       customerId | ||||||
|  |       profileId | ||||||
|  |       locationId | ||||||
|  |       name | ||||||
|  |       latitude | ||||||
|  |       longitude | ||||||
|  |       serial | ||||||
|  |       lastModifiedTimestamp | ||||||
|  |       details | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | `; | ||||||
|  |  | ||||||
|  | export const DELETE_PROFILE = gql` | ||||||
|  |   mutation DeleteProfile($id: ID!) { | ||||||
|  |     deleteProfile(id: $id) { | ||||||
|  |       id | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | `; | ||||||
|  |  | ||||||
|  | export const CREATE_PROFILE = gql` | ||||||
|  |   mutation CreateProfile( | ||||||
|  |     $profileType: String! | ||||||
|  |     $customerId: ID! | ||||||
|  |     $name: String! | ||||||
|  |     $childProfileIds: [ID] | ||||||
|  |     $details: JSONObject | ||||||
|  |   ) { | ||||||
|  |     createProfile( | ||||||
|  |       profileType: $profileType | ||||||
|  |       customerId: $customerId | ||||||
|  |       name: $name | ||||||
|  |       childProfileIds: $childProfileIds | ||||||
|  |       details: $details | ||||||
|  |     ) { | ||||||
|  |       profileType | ||||||
|  |       customerId | ||||||
|  |       name | ||||||
|  |       childProfileIds | ||||||
|  |       details | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | `; | ||||||
|  |  | ||||||
|  | export const CREATE_USER = gql` | ||||||
|  |   mutation CreateUser($username: String!, $password: String!, $role: String!, $customerId: ID!) { | ||||||
|  |     createUser(username: $username, password: $password, role: $role, customerId: $customerId) { | ||||||
|  |       username | ||||||
|  |       role | ||||||
|  |       customerId | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | `; | ||||||
|  |  | ||||||
|  | export const DELETE_USER = gql` | ||||||
|  |   mutation DeleteUser($id: ID!) { | ||||||
|  |     deleteUser(id: $id) { | ||||||
|  |       id | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | `; | ||||||
|  |  | ||||||
| export const CREATE_LOCATION = gql` | export const CREATE_LOCATION = gql` | ||||||
|   mutation CreateLocation( |   mutation CreateLocation( | ||||||
|     $locationType: String! |     $locationType: String! | ||||||
|   | |||||||
| @@ -1,5 +1,171 @@ | |||||||
| import gql from 'graphql-tag'; | import gql from 'graphql-tag'; | ||||||
|  |  | ||||||
|  | export const GET_PROFILE = gql` | ||||||
|  |   query GetProfile($id: ID!) { | ||||||
|  |     getProfile(id: $id) { | ||||||
|  |       id | ||||||
|  |       profileType | ||||||
|  |       customerId | ||||||
|  |       name | ||||||
|  |       childProfiles { | ||||||
|  |         id | ||||||
|  |         name | ||||||
|  |         profileType | ||||||
|  |         details | ||||||
|  |       } | ||||||
|  |       childProfileIds | ||||||
|  |       createdTimestamp | ||||||
|  |       lastModifiedTimestamp | ||||||
|  |       details | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | `; | ||||||
|  |  | ||||||
|  | export const GET_USER = gql` | ||||||
|  |   query GetUser($id: ID!) { | ||||||
|  |     getUser(id: $id) { | ||||||
|  |       id | ||||||
|  |       username | ||||||
|  |       role | ||||||
|  |       customerId | ||||||
|  |       lastModifiedTimestamp | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | `; | ||||||
|  |  | ||||||
|  | export const GET_EQUIPMENT = gql` | ||||||
|  |   query GetEquipment($id: ID!) { | ||||||
|  |     getEquipment(id: $id) { | ||||||
|  |       id | ||||||
|  |       equipmentType | ||||||
|  |       inventoryId | ||||||
|  |       customerId | ||||||
|  |       profileId | ||||||
|  |       locationId | ||||||
|  |       name | ||||||
|  |       latitude | ||||||
|  |       longitude | ||||||
|  |       serial | ||||||
|  |       lastModifiedTimestamp | ||||||
|  |       details | ||||||
|  |       profile { | ||||||
|  |         id | ||||||
|  |         name | ||||||
|  |         childProfiles { | ||||||
|  |           id | ||||||
|  |           name | ||||||
|  |           details | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |       status { | ||||||
|  |         firmware { | ||||||
|  |           detailsJSON | ||||||
|  |         } | ||||||
|  |         protocol { | ||||||
|  |           detailsJSON | ||||||
|  |           details { | ||||||
|  |             reportedMacAddr | ||||||
|  |             manufacturer | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |         radioUtilization { | ||||||
|  |           detailsJSON | ||||||
|  |         } | ||||||
|  |         clientDetails { | ||||||
|  |           detailsJSON | ||||||
|  |           details { | ||||||
|  |             numClientsPerRadio | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |         osPerformance { | ||||||
|  |           detailsJSON | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |       model | ||||||
|  |       alarmsCount | ||||||
|  |       alarms { | ||||||
|  |         severity | ||||||
|  |         alarmCode | ||||||
|  |         details | ||||||
|  |         createdTimestamp | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | `; | ||||||
|  |  | ||||||
|  | export const GET_ALL_FIRMWARE = gql` | ||||||
|  |   query GetAllFirmware($modelId: String) { | ||||||
|  |     getAllFirmware(modelId: $modelId) { | ||||||
|  |       id | ||||||
|  |       modelId | ||||||
|  |       versionName | ||||||
|  |       description | ||||||
|  |       filename | ||||||
|  |       commit | ||||||
|  |       releaseDate | ||||||
|  |       validationCode | ||||||
|  |       createdTimestamp | ||||||
|  |       lastModifiedTimestamp | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | `; | ||||||
|  |  | ||||||
|  | export const GET_ALL_PROFILES = gql` | ||||||
|  |   query GetAllProfiles($customerId: ID!, $cursor: String, $type: String) { | ||||||
|  |     getAllProfiles(customerId: $customerId, cursor: $cursor, type: $type) { | ||||||
|  |       items { | ||||||
|  |         id | ||||||
|  |         name | ||||||
|  |         profileType | ||||||
|  |         details | ||||||
|  |       } | ||||||
|  |       context { | ||||||
|  |         cursor | ||||||
|  |         lastPage | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | `; | ||||||
|  |  | ||||||
|  | export const GET_ALL_ALARMS = gql` | ||||||
|  |   query GetAllAlarms($customerId: ID!, $cursor: String) { | ||||||
|  |     getAllAlarms(customerId: $customerId, cursor: $cursor) { | ||||||
|  |       items { | ||||||
|  |         severity | ||||||
|  |         alarmCode | ||||||
|  |         details | ||||||
|  |         createdTimestamp | ||||||
|  |         equipment { | ||||||
|  |           id | ||||||
|  |           name | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |       context { | ||||||
|  |         cursor | ||||||
|  |         lastPage | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | `; | ||||||
|  |  | ||||||
|  | export const GET_ALL_USERS = gql` | ||||||
|  |   query GetAllUsers($customerId: ID!, $cursor: String) { | ||||||
|  |     getAllUsers(customerId: $customerId, cursor: $cursor) { | ||||||
|  |       items { | ||||||
|  |         id | ||||||
|  |         email: username | ||||||
|  |         role | ||||||
|  |         lastModifiedTimestamp | ||||||
|  |         customerId | ||||||
|  |       } | ||||||
|  |       context { | ||||||
|  |         cursor | ||||||
|  |         lastPage | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | `; | ||||||
|  |  | ||||||
| export const GET_ALL_LOCATIONS = gql` | export const GET_ALL_LOCATIONS = gql` | ||||||
|   query GetAllLocations($customerId: ID!) { |   query GetAllLocations($customerId: ID!) { | ||||||
|     getAllLocations(customerId: $customerId) { |     getAllLocations(customerId: $customerId) { | ||||||
| @@ -191,23 +357,6 @@ export const FILTER_SERVICE_METRICS = gql` | |||||||
|   } |   } | ||||||
| `; | `; | ||||||
|  |  | ||||||
| export const GET_ALL_PROFILES = gql` |  | ||||||
|   query GetAllProfiles($customerId: ID!, $cursor: String, $type: String) { |  | ||||||
|     getAllProfiles(customerId: $customerId, cursor: $cursor, type: $type) { |  | ||||||
|       items { |  | ||||||
|         id |  | ||||||
|         name |  | ||||||
|         profileType |  | ||||||
|         details |  | ||||||
|       } |  | ||||||
|       context { |  | ||||||
|         cursor |  | ||||||
|         lastPage |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| `; |  | ||||||
|  |  | ||||||
| export const GET_ALL_STATUS = gql` | export const GET_ALL_STATUS = gql` | ||||||
|   query GetAllStatus($customerId: ID!, $statusDataTypes: [String]) { |   query GetAllStatus($customerId: ID!, $statusDataTypes: [String]) { | ||||||
|     getAllStatus(customerId: $customerId, statusDataTypes: $statusDataTypes) { |     getAllStatus(customerId: $customerId, statusDataTypes: $statusDataTypes) { | ||||||
| @@ -244,23 +393,6 @@ export const GET_FIRMWARE_TRACK = gql` | |||||||
|   } |   } | ||||||
| `; | `; | ||||||
|  |  | ||||||
| export const GET_ALL_FIRMWARE = gql` |  | ||||||
|   query GetAllFirmware($modelId: String) { |  | ||||||
|     getAllFirmware(modelId: $modelId) { |  | ||||||
|       id |  | ||||||
|       modelId |  | ||||||
|       versionName |  | ||||||
|       description |  | ||||||
|       filename |  | ||||||
|       commit |  | ||||||
|       releaseDate |  | ||||||
|       validationCode |  | ||||||
|       createdTimestamp |  | ||||||
|       lastModifiedTimestamp |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| `; |  | ||||||
|  |  | ||||||
| export const GET_TRACK_ASSIGNMENTS = gql` | export const GET_TRACK_ASSIGNMENTS = gql` | ||||||
|   query GetAllFirmwareTrackAssignment { |   query GetAllFirmwareTrackAssignment { | ||||||
|     getAllFirmwareTrackAssignment { |     getAllFirmwareTrackAssignment { | ||||||
|   | |||||||
							
								
								
									
										469
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										469
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -105,6 +105,17 @@ | |||||||
|         "tslib": "^1.10.0" |         "tslib": "^1.10.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "@apollo/react-testing": { | ||||||
|  |       "version": "3.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@apollo/react-testing/-/react-testing-3.0.0.tgz", | ||||||
|  |       "integrity": "sha512-AUhjWdIx3hgG/rwvg4Bf3GPw61BReh0feSO2Xa4mh9T+CqcKRb0OwmIwAdh/C0BoPf3zUKROBNd9IJhs80LPFA==", | ||||||
|  |       "dev": true, | ||||||
|  |       "requires": { | ||||||
|  |         "@apollo/react-common": "^3.0.0", | ||||||
|  |         "fast-json-stable-stringify": "^2.0.0", | ||||||
|  |         "tslib": "^1.10.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "@babel/code-frame": { |     "@babel/code-frame": { | ||||||
|       "version": "7.8.3", |       "version": "7.8.3", | ||||||
|       "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", |       "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", | ||||||
| @@ -1850,16 +1861,159 @@ | |||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "@testing-library/dom": { |     "@testing-library/dom": { | ||||||
|       "version": "7.2.2", |       "version": "7.22.1", | ||||||
|       "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.2.2.tgz", |       "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.22.1.tgz", | ||||||
|       "integrity": "sha512-g+gT//COYh2FgRrlgcgdkifkjqSk7wQIS7F8jbrf6yoEsh85PJUJ/QtO0bJ9QU7pQPYQgKcgqNJsOs0dlyFYag==", |       "integrity": "sha512-bEszhvj9LcspaRz56mqGV7uc+vJTAYKCKPJcGb5X6U1qBysgTAgCexQXvKZ3BBjWu5S/TANP2NniOVsMWqKXcw==", | ||||||
|  |       "dev": true, | ||||||
|  |       "requires": { | ||||||
|  |         "@babel/runtime": "^7.10.3", | ||||||
|  |         "@types/aria-query": "^4.2.0", | ||||||
|  |         "aria-query": "^4.2.2", | ||||||
|  |         "dom-accessibility-api": "^0.5.0", | ||||||
|  |         "pretty-format": "^25.5.0" | ||||||
|  |       }, | ||||||
|  |       "dependencies": { | ||||||
|  |         "@babel/runtime": { | ||||||
|  |           "version": "7.11.2", | ||||||
|  |           "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", | ||||||
|  |           "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", | ||||||
|  |           "dev": true, | ||||||
|  |           "requires": { | ||||||
|  |             "regenerator-runtime": "^0.13.4" | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         "regenerator-runtime": { | ||||||
|  |           "version": "0.13.7", | ||||||
|  |           "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", | ||||||
|  |           "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", | ||||||
|  |           "dev": true | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "@testing-library/jest-dom": { | ||||||
|  |       "version": "5.11.2", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.11.2.tgz", | ||||||
|  |       "integrity": "sha512-s+rWJx+lanEGKqvOl4qJR0rGjCrxsEjj9qjxFlg4NV4/FRD7fnUUAWPHqwpyafNHfLYArs58FADgdn4UKmjFmw==", | ||||||
|       "dev": true, |       "dev": true, | ||||||
|       "requires": { |       "requires": { | ||||||
|         "@babel/runtime": "^7.9.2", |         "@babel/runtime": "^7.9.2", | ||||||
|         "@types/testing-library__dom": "^7.0.0", |         "@types/testing-library__jest-dom": "^5.9.1", | ||||||
|         "aria-query": "^4.0.2", |         "aria-query": "^4.2.2", | ||||||
|         "dom-accessibility-api": "^0.4.2", |         "chalk": "^3.0.0", | ||||||
|         "pretty-format": "^25.1.0" |         "css": "^3.0.0", | ||||||
|  |         "css.escape": "^1.5.1", | ||||||
|  |         "jest-diff": "^25.1.0", | ||||||
|  |         "jest-matcher-utils": "^25.1.0", | ||||||
|  |         "lodash": "^4.17.15", | ||||||
|  |         "redent": "^3.0.0" | ||||||
|  |       }, | ||||||
|  |       "dependencies": { | ||||||
|  |         "@babel/runtime-corejs3": { | ||||||
|  |           "version": "7.11.2", | ||||||
|  |           "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz", | ||||||
|  |           "integrity": "sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A==", | ||||||
|  |           "dev": true, | ||||||
|  |           "requires": { | ||||||
|  |             "core-js-pure": "^3.0.0", | ||||||
|  |             "regenerator-runtime": "^0.13.4" | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         "ansi-styles": { | ||||||
|  |           "version": "4.2.1", | ||||||
|  |           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", | ||||||
|  |           "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", | ||||||
|  |           "dev": true, | ||||||
|  |           "requires": { | ||||||
|  |             "@types/color-name": "^1.1.1", | ||||||
|  |             "color-convert": "^2.0.1" | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         "aria-query": { | ||||||
|  |           "version": "4.2.2", | ||||||
|  |           "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", | ||||||
|  |           "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", | ||||||
|  |           "dev": true, | ||||||
|  |           "requires": { | ||||||
|  |             "@babel/runtime": "^7.10.2", | ||||||
|  |             "@babel/runtime-corejs3": "^7.10.2" | ||||||
|  |           }, | ||||||
|  |           "dependencies": { | ||||||
|  |             "@babel/runtime": { | ||||||
|  |               "version": "7.11.2", | ||||||
|  |               "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", | ||||||
|  |               "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", | ||||||
|  |               "dev": true, | ||||||
|  |               "requires": { | ||||||
|  |                 "regenerator-runtime": "^0.13.4" | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         "chalk": { | ||||||
|  |           "version": "3.0.0", | ||||||
|  |           "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", | ||||||
|  |           "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", | ||||||
|  |           "dev": true, | ||||||
|  |           "requires": { | ||||||
|  |             "ansi-styles": "^4.1.0", | ||||||
|  |             "supports-color": "^7.1.0" | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         "color-convert": { | ||||||
|  |           "version": "2.0.1", | ||||||
|  |           "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", | ||||||
|  |           "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", | ||||||
|  |           "dev": true, | ||||||
|  |           "requires": { | ||||||
|  |             "color-name": "~1.1.4" | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         "color-name": { | ||||||
|  |           "version": "1.1.4", | ||||||
|  |           "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", | ||||||
|  |           "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", | ||||||
|  |           "dev": true | ||||||
|  |         }, | ||||||
|  |         "has-flag": { | ||||||
|  |           "version": "4.0.0", | ||||||
|  |           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", | ||||||
|  |           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", | ||||||
|  |           "dev": true | ||||||
|  |         }, | ||||||
|  |         "redent": { | ||||||
|  |           "version": "3.0.0", | ||||||
|  |           "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", | ||||||
|  |           "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", | ||||||
|  |           "dev": true, | ||||||
|  |           "requires": { | ||||||
|  |             "indent-string": "^4.0.0", | ||||||
|  |             "strip-indent": "^3.0.0" | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         "regenerator-runtime": { | ||||||
|  |           "version": "0.13.7", | ||||||
|  |           "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", | ||||||
|  |           "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", | ||||||
|  |           "dev": true | ||||||
|  |         }, | ||||||
|  |         "strip-indent": { | ||||||
|  |           "version": "3.0.0", | ||||||
|  |           "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", | ||||||
|  |           "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", | ||||||
|  |           "dev": true, | ||||||
|  |           "requires": { | ||||||
|  |             "min-indent": "^1.0.0" | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         "supports-color": { | ||||||
|  |           "version": "7.1.0", | ||||||
|  |           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", | ||||||
|  |           "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", | ||||||
|  |           "dev": true, | ||||||
|  |           "requires": { | ||||||
|  |             "has-flag": "^4.0.0" | ||||||
|  |           } | ||||||
|  |         } | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "@testing-library/react": { |     "@testing-library/react": { | ||||||
| @@ -1883,6 +2037,12 @@ | |||||||
|       "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", |       "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", | ||||||
|       "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==" |       "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==" | ||||||
|     }, |     }, | ||||||
|  |     "@types/aria-query": { | ||||||
|  |       "version": "4.2.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.0.tgz", | ||||||
|  |       "integrity": "sha512-iIgQNzCm0v7QMhhe4Jjn9uRh+I6GoPmt03CbEtwx3ao8/EfoQcmgtqH4vQ5Db/lxiIGaWDv6nwvunuh0RyX0+A==", | ||||||
|  |       "dev": true | ||||||
|  |     }, | ||||||
|     "@types/babel__core": { |     "@types/babel__core": { | ||||||
|       "version": "7.1.7", |       "version": "7.1.7", | ||||||
|       "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz", |       "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz", | ||||||
| @@ -1979,6 +2139,16 @@ | |||||||
|         "@types/istanbul-lib-report": "*" |         "@types/istanbul-lib-report": "*" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "@types/jest": { | ||||||
|  |       "version": "26.0.9", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.9.tgz", | ||||||
|  |       "integrity": "sha512-k4qFfJ5AUKrWok5KYXp2EPm89b0P/KZpl7Vg4XuOTVVQEhLDBDBU3iBFrjjdgd8fLw96aAtmnwhXHl63bWeBQQ==", | ||||||
|  |       "dev": true, | ||||||
|  |       "requires": { | ||||||
|  |         "jest-diff": "^25.2.1", | ||||||
|  |         "pretty-format": "^25.2.1" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "@types/minimatch": { |     "@types/minimatch": { | ||||||
|       "version": "3.0.3", |       "version": "3.0.3", | ||||||
|       "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", |       "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", | ||||||
| @@ -2062,6 +2232,15 @@ | |||||||
|         "pretty-format": "^25.1.0" |         "pretty-format": "^25.1.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "@types/testing-library__jest-dom": { | ||||||
|  |       "version": "5.9.2", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.9.2.tgz", | ||||||
|  |       "integrity": "sha512-K7nUSpH/5i8i0NagTJ+uFUDRueDlnMNhJtMjMwTGPPSqyImbWC/hgKPDCKt6Phu2iMJg2kWqlax+Ucj2DKMwpA==", | ||||||
|  |       "dev": true, | ||||||
|  |       "requires": { | ||||||
|  |         "@types/jest": "*" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "@types/testing-library__react": { |     "@types/testing-library__react": { | ||||||
|       "version": "10.0.1", |       "version": "10.0.1", | ||||||
|       "resolved": "https://registry.npmjs.org/@types/testing-library__react/-/testing-library__react-10.0.1.tgz", |       "resolved": "https://registry.npmjs.org/@types/testing-library__react/-/testing-library__react-10.0.1.tgz", | ||||||
| @@ -2766,13 +2945,40 @@ | |||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "aria-query": { |     "aria-query": { | ||||||
|       "version": "4.0.2", |       "version": "4.2.2", | ||||||
|       "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.0.2.tgz", |       "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", | ||||||
|       "integrity": "sha512-S1G1V790fTaigUSM/Gd0NngzEfiMy9uTUfMyHhKhVyy4cH5O/eTuR01ydhGL0z4Za1PXFTRGH3qL8VhUQuEO5w==", |       "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", | ||||||
|       "dev": true, |       "dev": true, | ||||||
|       "requires": { |       "requires": { | ||||||
|         "@babel/runtime": "^7.7.4", |         "@babel/runtime": "^7.10.2", | ||||||
|         "@babel/runtime-corejs3": "^7.7.4" |         "@babel/runtime-corejs3": "^7.10.2" | ||||||
|  |       }, | ||||||
|  |       "dependencies": { | ||||||
|  |         "@babel/runtime": { | ||||||
|  |           "version": "7.11.2", | ||||||
|  |           "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", | ||||||
|  |           "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", | ||||||
|  |           "dev": true, | ||||||
|  |           "requires": { | ||||||
|  |             "regenerator-runtime": "^0.13.4" | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         "@babel/runtime-corejs3": { | ||||||
|  |           "version": "7.11.2", | ||||||
|  |           "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz", | ||||||
|  |           "integrity": "sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A==", | ||||||
|  |           "dev": true, | ||||||
|  |           "requires": { | ||||||
|  |             "core-js-pure": "^3.0.0", | ||||||
|  |             "regenerator-runtime": "^0.13.4" | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         "regenerator-runtime": { | ||||||
|  |           "version": "0.13.7", | ||||||
|  |           "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", | ||||||
|  |           "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", | ||||||
|  |           "dev": true | ||||||
|  |         } | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "arr-diff": { |     "arr-diff": { | ||||||
| @@ -4237,25 +4443,29 @@ | |||||||
|           "dependencies": { |           "dependencies": { | ||||||
|             "abbrev": { |             "abbrev": { | ||||||
|               "version": "1.1.1", |               "version": "1.1.1", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "ansi-regex": { |             "ansi-regex": { | ||||||
|               "version": "2.1.1", |               "version": "2.1.1", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "aproba": { |             "aproba": { | ||||||
|               "version": "1.2.0", |               "version": "1.2.0", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "are-we-there-yet": { |             "are-we-there-yet": { | ||||||
|               "version": "1.1.5", |               "version": "1.1.5", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4265,13 +4475,15 @@ | |||||||
|             }, |             }, | ||||||
|             "balanced-match": { |             "balanced-match": { | ||||||
|               "version": "1.0.0", |               "version": "1.0.0", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "brace-expansion": { |             "brace-expansion": { | ||||||
|               "version": "1.1.11", |               "version": "1.1.11", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4281,37 +4493,43 @@ | |||||||
|             }, |             }, | ||||||
|             "chownr": { |             "chownr": { | ||||||
|               "version": "1.1.4", |               "version": "1.1.4", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "code-point-at": { |             "code-point-at": { | ||||||
|               "version": "1.1.0", |               "version": "1.1.0", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "concat-map": { |             "concat-map": { | ||||||
|               "version": "0.0.1", |               "version": "0.0.1", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "console-control-strings": { |             "console-control-strings": { | ||||||
|               "version": "1.1.0", |               "version": "1.1.0", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "core-util-is": { |             "core-util-is": { | ||||||
|               "version": "1.0.2", |               "version": "1.0.2", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "debug": { |             "debug": { | ||||||
|               "version": "3.2.6", |               "version": "3.2.6", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4320,25 +4538,29 @@ | |||||||
|             }, |             }, | ||||||
|             "deep-extend": { |             "deep-extend": { | ||||||
|               "version": "0.6.0", |               "version": "0.6.0", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "delegates": { |             "delegates": { | ||||||
|               "version": "1.0.0", |               "version": "1.0.0", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "detect-libc": { |             "detect-libc": { | ||||||
|               "version": "1.0.3", |               "version": "1.0.3", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "fs-minipass": { |             "fs-minipass": { | ||||||
|               "version": "1.2.7", |               "version": "1.2.7", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4347,13 +4569,15 @@ | |||||||
|             }, |             }, | ||||||
|             "fs.realpath": { |             "fs.realpath": { | ||||||
|               "version": "1.0.0", |               "version": "1.0.0", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "gauge": { |             "gauge": { | ||||||
|               "version": "2.7.4", |               "version": "2.7.4", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4369,7 +4593,8 @@ | |||||||
|             }, |             }, | ||||||
|             "glob": { |             "glob": { | ||||||
|               "version": "7.1.6", |               "version": "7.1.6", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4383,13 +4608,15 @@ | |||||||
|             }, |             }, | ||||||
|             "has-unicode": { |             "has-unicode": { | ||||||
|               "version": "2.0.1", |               "version": "2.0.1", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "iconv-lite": { |             "iconv-lite": { | ||||||
|               "version": "0.4.24", |               "version": "0.4.24", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4398,7 +4625,8 @@ | |||||||
|             }, |             }, | ||||||
|             "ignore-walk": { |             "ignore-walk": { | ||||||
|               "version": "3.0.3", |               "version": "3.0.3", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4407,7 +4635,8 @@ | |||||||
|             }, |             }, | ||||||
|             "inflight": { |             "inflight": { | ||||||
|               "version": "1.0.6", |               "version": "1.0.6", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4417,19 +4646,22 @@ | |||||||
|             }, |             }, | ||||||
|             "inherits": { |             "inherits": { | ||||||
|               "version": "2.0.4", |               "version": "2.0.4", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "ini": { |             "ini": { | ||||||
|               "version": "1.3.5", |               "version": "1.3.5", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "is-fullwidth-code-point": { |             "is-fullwidth-code-point": { | ||||||
|               "version": "1.0.0", |               "version": "1.0.0", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4438,13 +4670,15 @@ | |||||||
|             }, |             }, | ||||||
|             "isarray": { |             "isarray": { | ||||||
|               "version": "1.0.0", |               "version": "1.0.0", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "minimatch": { |             "minimatch": { | ||||||
|               "version": "3.0.4", |               "version": "3.0.4", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4453,13 +4687,15 @@ | |||||||
|             }, |             }, | ||||||
|             "minimist": { |             "minimist": { | ||||||
|               "version": "1.2.5", |               "version": "1.2.5", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "minipass": { |             "minipass": { | ||||||
|               "version": "2.9.0", |               "version": "2.9.0", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4469,7 +4705,8 @@ | |||||||
|             }, |             }, | ||||||
|             "minizlib": { |             "minizlib": { | ||||||
|               "version": "1.3.3", |               "version": "1.3.3", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4478,7 +4715,8 @@ | |||||||
|             }, |             }, | ||||||
|             "mkdirp": { |             "mkdirp": { | ||||||
|               "version": "0.5.3", |               "version": "0.5.3", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4487,13 +4725,15 @@ | |||||||
|             }, |             }, | ||||||
|             "ms": { |             "ms": { | ||||||
|               "version": "2.1.2", |               "version": "2.1.2", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "needle": { |             "needle": { | ||||||
|               "version": "2.3.3", |               "version": "2.3.3", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4504,7 +4744,8 @@ | |||||||
|             }, |             }, | ||||||
|             "node-pre-gyp": { |             "node-pre-gyp": { | ||||||
|               "version": "0.14.0", |               "version": "0.14.0", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4522,7 +4763,8 @@ | |||||||
|             }, |             }, | ||||||
|             "nopt": { |             "nopt": { | ||||||
|               "version": "4.0.3", |               "version": "4.0.3", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4532,7 +4774,8 @@ | |||||||
|             }, |             }, | ||||||
|             "npm-bundled": { |             "npm-bundled": { | ||||||
|               "version": "1.1.1", |               "version": "1.1.1", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4541,13 +4784,15 @@ | |||||||
|             }, |             }, | ||||||
|             "npm-normalize-package-bin": { |             "npm-normalize-package-bin": { | ||||||
|               "version": "1.0.1", |               "version": "1.0.1", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "npm-packlist": { |             "npm-packlist": { | ||||||
|               "version": "1.4.8", |               "version": "1.4.8", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4558,7 +4803,8 @@ | |||||||
|             }, |             }, | ||||||
|             "npmlog": { |             "npmlog": { | ||||||
|               "version": "4.1.2", |               "version": "4.1.2", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4570,19 +4816,22 @@ | |||||||
|             }, |             }, | ||||||
|             "number-is-nan": { |             "number-is-nan": { | ||||||
|               "version": "1.0.1", |               "version": "1.0.1", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "object-assign": { |             "object-assign": { | ||||||
|               "version": "4.1.1", |               "version": "4.1.1", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "once": { |             "once": { | ||||||
|               "version": "1.4.0", |               "version": "1.4.0", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4591,19 +4840,22 @@ | |||||||
|             }, |             }, | ||||||
|             "os-homedir": { |             "os-homedir": { | ||||||
|               "version": "1.0.2", |               "version": "1.0.2", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "os-tmpdir": { |             "os-tmpdir": { | ||||||
|               "version": "1.0.2", |               "version": "1.0.2", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "osenv": { |             "osenv": { | ||||||
|               "version": "0.1.5", |               "version": "0.1.5", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4613,19 +4865,22 @@ | |||||||
|             }, |             }, | ||||||
|             "path-is-absolute": { |             "path-is-absolute": { | ||||||
|               "version": "1.0.1", |               "version": "1.0.1", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "process-nextick-args": { |             "process-nextick-args": { | ||||||
|               "version": "2.0.1", |               "version": "2.0.1", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "rc": { |             "rc": { | ||||||
|               "version": "1.2.8", |               "version": "1.2.8", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4637,7 +4892,8 @@ | |||||||
|             }, |             }, | ||||||
|             "readable-stream": { |             "readable-stream": { | ||||||
|               "version": "2.3.7", |               "version": "2.3.7", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4652,7 +4908,8 @@ | |||||||
|             }, |             }, | ||||||
|             "rimraf": { |             "rimraf": { | ||||||
|               "version": "2.7.1", |               "version": "2.7.1", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4661,43 +4918,50 @@ | |||||||
|             }, |             }, | ||||||
|             "safe-buffer": { |             "safe-buffer": { | ||||||
|               "version": "5.1.2", |               "version": "5.1.2", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "safer-buffer": { |             "safer-buffer": { | ||||||
|               "version": "2.1.2", |               "version": "2.1.2", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "sax": { |             "sax": { | ||||||
|               "version": "1.2.4", |               "version": "1.2.4", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "semver": { |             "semver": { | ||||||
|               "version": "5.7.1", |               "version": "5.7.1", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "set-blocking": { |             "set-blocking": { | ||||||
|               "version": "2.0.0", |               "version": "2.0.0", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "signal-exit": { |             "signal-exit": { | ||||||
|               "version": "3.0.2", |               "version": "3.0.2", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "string-width": { |             "string-width": { | ||||||
|               "version": "1.0.2", |               "version": "1.0.2", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4708,7 +4972,8 @@ | |||||||
|             }, |             }, | ||||||
|             "string_decoder": { |             "string_decoder": { | ||||||
|               "version": "1.1.1", |               "version": "1.1.1", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4717,7 +4982,8 @@ | |||||||
|             }, |             }, | ||||||
|             "strip-ansi": { |             "strip-ansi": { | ||||||
|               "version": "3.0.1", |               "version": "3.0.1", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4726,13 +4992,15 @@ | |||||||
|             }, |             }, | ||||||
|             "strip-json-comments": { |             "strip-json-comments": { | ||||||
|               "version": "2.0.1", |               "version": "2.0.1", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "tar": { |             "tar": { | ||||||
|               "version": "4.4.13", |               "version": "4.4.13", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4747,13 +5015,15 @@ | |||||||
|             }, |             }, | ||||||
|             "util-deprecate": { |             "util-deprecate": { | ||||||
|               "version": "1.0.2", |               "version": "1.0.2", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "wide-align": { |             "wide-align": { | ||||||
|               "version": "1.1.3", |               "version": "1.1.3", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true, |               "optional": true, | ||||||
|               "requires": { |               "requires": { | ||||||
| @@ -4762,13 +5032,15 @@ | |||||||
|             }, |             }, | ||||||
|             "wrappy": { |             "wrappy": { | ||||||
|               "version": "1.0.2", |               "version": "1.0.2", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             }, |             }, | ||||||
|             "yallist": { |             "yallist": { | ||||||
|               "version": "3.1.1", |               "version": "3.1.1", | ||||||
|               "bundled": true, |               "resolved": false, | ||||||
|  |               "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", | ||||||
|               "dev": true, |               "dev": true, | ||||||
|               "optional": true |               "optional": true | ||||||
|             } |             } | ||||||
| @@ -5538,6 +5810,29 @@ | |||||||
|         "randomfill": "^1.0.3" |         "randomfill": "^1.0.3" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "css": { | ||||||
|  |       "version": "3.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", | ||||||
|  |       "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", | ||||||
|  |       "dev": true, | ||||||
|  |       "requires": { | ||||||
|  |         "inherits": "^2.0.4", | ||||||
|  |         "source-map": "^0.6.1", | ||||||
|  |         "source-map-resolve": "^0.6.0" | ||||||
|  |       }, | ||||||
|  |       "dependencies": { | ||||||
|  |         "source-map-resolve": { | ||||||
|  |           "version": "0.6.0", | ||||||
|  |           "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", | ||||||
|  |           "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", | ||||||
|  |           "dev": true, | ||||||
|  |           "requires": { | ||||||
|  |             "atob": "^2.1.2", | ||||||
|  |             "decode-uri-component": "^0.2.0" | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "css-color-names": { |     "css-color-names": { | ||||||
|       "version": "0.0.4", |       "version": "0.0.4", | ||||||
|       "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", |       "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", | ||||||
| @@ -5647,6 +5942,12 @@ | |||||||
|       "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", |       "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", | ||||||
|       "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" |       "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" | ||||||
|     }, |     }, | ||||||
|  |     "css.escape": { | ||||||
|  |       "version": "1.5.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", | ||||||
|  |       "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=", | ||||||
|  |       "dev": true | ||||||
|  |     }, | ||||||
|     "cssesc": { |     "cssesc": { | ||||||
|       "version": "3.0.0", |       "version": "3.0.0", | ||||||
|       "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", |       "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", | ||||||
| @@ -6073,9 +6374,9 @@ | |||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "dom-accessibility-api": { |     "dom-accessibility-api": { | ||||||
|       "version": "0.4.3", |       "version": "0.5.0", | ||||||
|       "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.4.3.tgz", |       "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.0.tgz", | ||||||
|       "integrity": "sha512-JZ8iPuEHDQzq6q0k7PKMGbrIdsgBB7TRrtVOUm4nSMCExlg5qQG4KXWTH2k90yggjM4tTumRGwTKJSldMzKyLA==", |       "integrity": "sha512-eCVf9n4Ni5UQAFc2+fqfMPHdtiX7DA0rLakXgNBZfXNJzEbNo3MQIYd+zdYpFBqAaGYVrkd8leNSLGPrG4ODmA==", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|     "dom-align": { |     "dom-align": { | ||||||
| @@ -11820,6 +12121,12 @@ | |||||||
|       "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", |       "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|  |     "min-indent": { | ||||||
|  |       "version": "1.0.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", | ||||||
|  |       "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", | ||||||
|  |       "dev": true | ||||||
|  |     }, | ||||||
|     "mini-create-react-context": { |     "mini-create-react-context": { | ||||||
|       "version": "0.3.2", |       "version": "0.3.2", | ||||||
|       "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz", |       "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz", | ||||||
|   | |||||||
| @@ -49,10 +49,13 @@ | |||||||
|     "terser-webpack-plugin": "^2.3.5" |     "terser-webpack-plugin": "^2.3.5" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|  |     "@apollo/react-testing": "3.0.0", | ||||||
|     "@babel/core": "^7.8.7", |     "@babel/core": "^7.8.7", | ||||||
|     "@babel/plugin-proposal-class-properties": "^7.8.3", |     "@babel/plugin-proposal-class-properties": "^7.8.3", | ||||||
|     "@babel/preset-env": "^7.8.7", |     "@babel/preset-env": "^7.8.7", | ||||||
|     "@babel/preset-react": "^7.8.3", |     "@babel/preset-react": "^7.8.3", | ||||||
|  |     "@testing-library/dom": "^7.22.1", | ||||||
|  |     "@testing-library/jest-dom": "^5.11.2", | ||||||
|     "@testing-library/react": "^10.0.3", |     "@testing-library/react": "^10.0.3", | ||||||
|     "babel-core": "^6.26.3", |     "babel-core": "^6.26.3", | ||||||
|     "babel-eslint": "^10.1.0", |     "babel-eslint": "^10.1.0", | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user