mirror of
https://github.com/Telecominfraproject/wlan-cloud-ui.git
synced 2025-11-01 11:17:59 +00:00
Compare commits
8 Commits
master
...
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