import React from 'react';
import { cleanup, render, screen } from '@testing-library/react';
import { expect } from 'chai';
import AppRegistry from 'hadron-app-registry';
import QueryBarPlugin from './plugin';
import configureStore from './stores';
import Sinon from 'sinon';
import userEvent from '@testing-library/user-event';
import preferencesAccess from 'compass-preferences-model';
const mockQueryHistoryRole = {
name: 'Query History',
// eslint-disable-next-line react/display-name
component: () =>
Query history
,
configureStore: () => ({}),
configureActions: () => {},
storeName: 'Query.History',
actionName: 'Query.History.Actions',
};
const fakeAppInstanceStore = {
getState: function () {
return {
instance: {
on() {},
},
};
},
} as any;
describe('QueryBar [Plugin]', function () {
let store: ReturnType;
const globalAppRegistry = new AppRegistry();
globalAppRegistry.registerRole('Query.QueryHistory', mockQueryHistoryRole);
globalAppRegistry.registerStore('App.InstanceStore', fakeAppInstanceStore);
const localAppRegistry = new AppRegistry();
localAppRegistry.registerStore('Query.History', {
onActivated: () => {},
});
localAppRegistry.registerAction('Query.History.Actions', {
actions: true,
});
beforeEach(function () {
store = configureStore({
globalAppRegistry,
localAppRegistry,
});
});
afterEach(cleanup);
describe('when find is clicked', function () {
const onApply = Sinon.spy();
beforeEach(function () {
render();
expect(onApply).to.be.not.called;
userEvent.click(screen.getByTestId('query-bar-apply-filter-button'));
});
it('it calls the onApply prop', function () {
expect(onApply).to.have.been.calledOnce;
});
});
describe('when the plugin is rendered with or without a query history button', function () {
let enableSavedAggregationsQueries: boolean;
before(function () {
enableSavedAggregationsQueries =
preferencesAccess.getPreferences().enableSavedAggregationsQueries;
});
after(async function () {
await preferencesAccess.savePreferences({
enableSavedAggregationsQueries,
});
});
it('query history button renders when saved queries are enabled', async function () {
await preferencesAccess.savePreferences({
enableSavedAggregationsQueries: true,
});
render();
expect(screen.getByTestId('query-history-button')).to.exist;
});
it('query history button does not render when ssaved queries are disabled', async function () {
await preferencesAccess.savePreferences({
enableSavedAggregationsQueries: false,
});
render();
expect(screen.queryByTestId('query-history-button')).to.not.exist;
});
});
describe('when rendered with or without an export to language button', function () {
it('export to language button renders by default', function () {
render();
expect(screen.getByTestId('query-bar-open-export-to-language-button')).to
.exist;
});
it('export to language button renders when showExportToLanguageButton prop is passed and set to true', function () {
render();
expect(screen.getByTestId('query-bar-open-export-to-language-button')).to
.exist;
});
it('export to language button does not render when showExportToLanguageButton prop is passed and set to false', function () {
render(
);
expect(screen.queryByTestId('query-bar-open-export-to-language-button'))
.to.not.exist;
});
});
describe('a user is able to provide custom placeholders for the input fields', function () {
const queryOptionsLayout: any[] = [
'project',
['sort', 'maxTimeMS'],
['collation', 'skip', 'limit'],
];
it('the input fields have a placeholder by default', function () {
render(
);
userEvent.click(screen.getByTestId('query-bar-options-toggle'));
// getByText for ace editor that doesn't use actual placeholder attr
expect(screen.getByText(/Type a query: { field: 'value' }/)).to.exist;
expect(screen.getByText(/{ field: 0 }/)).to.exist;
expect(screen.getByText(/{ field: -1 }/)).to.exist;
expect(screen.getByText(/{ locale: 'simple' }/)).to.exist;
// getByPlaceholderText for input elements
expect(screen.getByPlaceholderText('60000')).to.exist;
expect(
// getAll because two inputs have the same label
screen.getAllByPlaceholderText('0')
).to.exist;
});
it('the input fields placeholders can be modified', function () {
render(
);
userEvent.click(screen.getByTestId('query-bar-options-toggle'));
expect(screen.getByText(/{field: 'matchValue'}/)).to.exist;
expect(screen.getByText(/{field: 1}/)).to.exist;
expect(screen.getByText(/{locale: 'fr' }/)).to.exist;
expect(screen.getByText(/{field: -1}/)).to.exist;
expect(screen.getByPlaceholderText('10')).to.exist;
expect(screen.getByPlaceholderText('20')).to.exist;
expect(screen.getByPlaceholderText('50000')).to.exist;
});
});
});