import {render, screen} from 'sentry-test/reactTestingLibrary';
import {Client} from 'sentry/api';
import AsyncComponent from 'sentry/components/asyncComponent';
describe('AsyncComponent', function () {
class TestAsyncComponent extends AsyncComponent {
shouldRenderBadRequests = true;
constructor(props) {
super(props);
this.state = {};
}
getEndpoints() {
return [['data', '/some/path/to/something/']];
}
renderBody() {
return
{this.state.data.message}
;
}
}
it('renders on successful request', function () {
Client.clearMockResponses();
Client.addMockResponse({
url: '/some/path/to/something/',
method: 'GET',
body: {
message: 'hi',
},
});
render();
expect(screen.getByText('hi')).toBeInTheDocument();
});
it('renders error message', function () {
Client.clearMockResponses();
Client.addMockResponse({
url: '/some/path/to/something/',
method: 'GET',
body: {
detail: 'oops there was a problem',
},
statusCode: 400,
});
render();
expect(screen.getByText('oops there was a problem')).toBeInTheDocument();
});
it('renders only unique error message', function () {
Client.clearMockResponses();
Client.addMockResponse({
url: '/first/path/',
method: 'GET',
body: {
detail: 'oops there was a problem',
},
statusCode: 400,
});
Client.addMockResponse({
url: '/second/path/',
method: 'GET',
body: {
detail: 'oops there was a problem',
},
statusCode: 400,
});
Client.addMockResponse({
url: '/third/path/',
method: 'GET',
body: {
detail: 'oops there was a different problem',
},
statusCode: 400,
});
class UniqueErrorsAsyncComponent extends AsyncComponent {
shouldRenderBadRequests = true;
getEndpoints() {
return [
['first', '/first/path/'],
['second', '/second/path/'],
['third', '/third/path/'],
];
}
renderBody() {
return {this.state.data.message}
;
}
}
render();
expect(
screen.getByText('oops there was a problem oops there was a different problem')
).toBeInTheDocument();
});
describe('multi-route component', () => {
class MultiRouteComponent extends TestAsyncComponent {
getEndpoints() {
return [
['data', '/some/path/to/something/'],
['project', '/another/path/here'],
];
}
renderLoading() {
return (
{this.state.remainingRequests}
);
}
}
it('calls onLoadAllEndpointsSuccess when all endpoints have been loaded', () => {
jest.useFakeTimers();
jest.spyOn(Client.prototype, 'request').mockImplementation((url, options) => {
const timeout = url.includes('something') ? 100 : 50;
setTimeout(
() =>
options.success({
message: 'good',
}),
timeout
);
});
const mockOnAllEndpointsSuccess = jest.spyOn(
MultiRouteComponent.prototype,
'onLoadAllEndpointsSuccess'
);
render();
expect(screen.getByTestId('remaining-requests')).toHaveTextContent('2');
jest.advanceTimersByTime(40);
expect(screen.getByTestId('remaining-requests')).toHaveTextContent('2');
jest.advanceTimersByTime(40);
expect(screen.getByTestId('remaining-requests')).toHaveTextContent('1');
expect(mockOnAllEndpointsSuccess).not.toHaveBeenCalled();
jest.advanceTimersByTime(40);
expect(screen.queryByTestId('remaining-requests')).not.toBeInTheDocument();
expect(mockOnAllEndpointsSuccess).toHaveBeenCalled();
jest.restoreAllMocks();
});
});
});