/*
* SPDX-License-Identifier: Apache-2.0
*
* The OpenSearch Contributors require contributions made to
* this file be licensed under the Apache-2.0 license or a
* compatible open source license.
*
* Any modifications Copyright OpenSearch Contributors. See
* GitHub history for details.
*/
/*
* Licensed to Elasticsearch B.V. under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch B.V. licenses this file to you under
* the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import React from 'react';
import { mountWithIntl, shallowWithIntl, wrapWithIntl } from 'test_utils/enzyme_helpers';
import TelemetryManagementSection from './telemetry_management_section';
import { TelemetryService } from '../../../telemetry/public/services';
import { coreMock } from '../../../../core/public/mocks';
import { render } from '@testing-library/react';
describe('TelemetryManagementSectionComponent', () => {
const coreStart = coreMock.createStart();
const coreSetup = coreMock.createSetup();
it('renders as expected', () => {
const onQueryMatchChange = jest.fn();
const isSecurityExampleEnabled = jest.fn().mockReturnValue(true);
const telemetryService = new TelemetryService({
config: {
enabled: true,
url: '',
banner: true,
allowChangingOptInStatus: true,
optIn: true,
optInStatusUrl: '',
sendUsageFrom: 'browser',
},
reportOptInStatusChange: false,
notifications: coreStart.notifications,
http: coreSetup.http,
});
expect(
shallowWithIntl(
)
).toMatchSnapshot();
});
it('renders null because query does not match the SEARCH_TERMS', () => {
const onQueryMatchChange = jest.fn();
const isSecurityExampleEnabled = jest.fn().mockReturnValue(true);
const telemetryService = new TelemetryService({
config: {
enabled: true,
url: '',
banner: true,
allowChangingOptInStatus: true,
optIn: false,
optInStatusUrl: '',
sendUsageFrom: 'browser',
},
reportOptInStatusChange: false,
notifications: coreStart.notifications,
http: coreSetup.http,
});
const component = render(
wrapWithIntl(
Fallback}>
)
);
try {
component.rerender(
wrapWithIntl(
Fallback}>
)
);
expect(onQueryMatchChange).toHaveBeenCalledWith(false);
expect(onQueryMatchChange).toHaveBeenCalledTimes(1);
} finally {
component.unmount();
}
});
it('renders because query matches the SEARCH_TERMS', () => {
const onQueryMatchChange = jest.fn();
const isSecurityExampleEnabled = jest.fn().mockReturnValue(true);
const telemetryService = new TelemetryService({
config: {
enabled: true,
url: '',
banner: true,
allowChangingOptInStatus: true,
optIn: false,
optInStatusUrl: '',
sendUsageFrom: 'browser',
},
reportOptInStatusChange: false,
notifications: coreStart.notifications,
http: coreSetup.http,
});
const component = mountWithIntl(
);
try {
expect(
component.setProps({ ...component.props(), query: { text: 'TeLEMetry' } }).html()
).not.toBe(''); // Renders something.
// I can't check against snapshot because of https://github.com/facebook/jest/issues/8618
// expect(component).toMatchSnapshot();
// It should also render if there is no query at all.
expect(component.setProps({ ...component.props(), query: {} }).html()).not.toBe('');
expect(onQueryMatchChange).toHaveBeenCalledWith(true);
// Should only be called once because the second time does not change the result
expect(onQueryMatchChange).toHaveBeenCalledTimes(1);
} finally {
component.unmount();
}
});
it('renders null because allowChangingOptInStatus is false', () => {
const onQueryMatchChange = jest.fn();
const isSecurityExampleEnabled = jest.fn().mockReturnValue(true);
const telemetryService = new TelemetryService({
config: {
enabled: true,
url: '',
banner: true,
allowChangingOptInStatus: false,
optIn: true,
optInStatusUrl: '',
sendUsageFrom: 'browser',
},
reportOptInStatusChange: false,
notifications: coreStart.notifications,
http: coreSetup.http,
});
const component = mountWithIntl(
);
try {
expect(component).toMatchSnapshot();
component.setProps({ ...component.props(), query: { text: 'TeLEMetry' } });
expect(onQueryMatchChange).toHaveBeenCalledWith(false);
} finally {
component.unmount();
}
});
it('shows the OptInExampleFlyout', () => {
const onQueryMatchChange = jest.fn();
const isSecurityExampleEnabled = jest.fn().mockReturnValue(true);
const telemetryService = new TelemetryService({
config: {
enabled: true,
url: '',
banner: true,
allowChangingOptInStatus: true,
optIn: false,
optInStatusUrl: '',
sendUsageFrom: 'browser',
},
reportOptInStatusChange: false,
notifications: coreStart.notifications,
http: coreSetup.http,
});
const component = mountWithIntl(
);
try {
const toggleExampleComponent = component.find('FormattedMessage > EuiLink[onClick]').at(0);
const updatedView = toggleExampleComponent.simulate('click');
updatedView.find('OptInExampleFlyout');
updatedView.simulate('close');
} finally {
component.unmount();
}
});
it('shows the OptInSecurityExampleFlyout', () => {
const onQueryMatchChange = jest.fn();
const isSecurityExampleEnabled = jest.fn().mockReturnValue(true);
const telemetryService = new TelemetryService({
config: {
enabled: true,
url: '',
banner: true,
allowChangingOptInStatus: true,
optIn: false,
optInStatusUrl: '',
sendUsageFrom: 'browser',
},
reportOptInStatusChange: false,
notifications: coreStart.notifications,
http: coreSetup.http,
});
const component = mountWithIntl(
);
try {
const toggleExampleComponent = component.find('FormattedMessage > EuiLink[onClick]').at(1);
const updatedView = toggleExampleComponent.simulate('click');
updatedView.find('OptInSecurityExampleFlyout');
updatedView.simulate('close');
} finally {
component.unmount();
}
});
it('does not show the endpoint link when isSecurityExampleEnabled returns false', () => {
const onQueryMatchChange = jest.fn();
const isSecurityExampleEnabled = jest.fn().mockReturnValue(false);
const telemetryService = new TelemetryService({
config: {
enabled: true,
url: '',
banner: true,
allowChangingOptInStatus: true,
optIn: false,
optInStatusUrl: '',
sendUsageFrom: 'browser',
},
reportOptInStatusChange: false,
notifications: coreStart.notifications,
http: coreSetup.http,
});
const component = mountWithIntl(
);
try {
const description = (component.instance() as TelemetryManagementSection).renderDescription();
expect(isSecurityExampleEnabled).toBeCalled();
expect(description).toMatchSnapshot();
} finally {
component.unmount();
}
});
it('toggles the OptIn button', async () => {
const onQueryMatchChange = jest.fn();
const isSecurityExampleEnabled = jest.fn().mockReturnValue(true);
const telemetryService = new TelemetryService({
config: {
enabled: true,
url: '',
banner: true,
allowChangingOptInStatus: true,
optIn: false,
optInStatusUrl: '',
sendUsageFrom: 'browser',
},
reportOptInStatusChange: false,
notifications: coreStart.notifications,
http: coreSetup.http,
});
const component = mountWithIntl(
);
try {
const toggleOptInComponent = component.find('Field');
await expect(
toggleOptInComponent.prop('handleChange')()
).resolves.toBe(true);
expect((component.state() as any).enabled).toBe(true);
await expect(
toggleOptInComponent.prop('handleChange')()
).resolves.toBe(true);
expect((component.state() as any).enabled).toBe(false);
telemetryService.setOptIn = jest.fn().mockRejectedValue(Error('test-error'));
await expect(
toggleOptInComponent.prop('handleChange')()
).rejects.toStrictEqual(Error('test-error'));
} finally {
component.unmount();
}
});
it('test the wrapper (for coverage purposes)', () => {
const onQueryMatchChange = jest.fn();
const isSecurityExampleEnabled = jest.fn().mockReturnValue(true);
const telemetryService = new TelemetryService({
config: {
enabled: true,
url: '',
banner: true,
allowChangingOptInStatus: false,
optIn: false,
optInStatusUrl: '',
sendUsageFrom: 'browser',
},
reportOptInStatusChange: false,
notifications: coreStart.notifications,
http: coreSetup.http,
});
expect(
shallowWithIntl(
).html()
).toMatchSnapshot();
});
});