// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { API } from '@aws-amplify/api';
import { I18n } from '@aws-amplify/core';
import { fireEvent, queryByAttribute, render, screen, waitFor } from '@testing-library/react';
import ConnectionLogsModal from '../connection/ConnectionLogsModal';
import { ConnectionLogsModalProps, ListLogsResponse, LogType } from '../../util/types';
// Mock API
const mockAPI = {
get: jest.fn()
};
jest.mock('@aws-amplify/api');
API.get = mockAPI.get;
const getById = queryByAttribute.bind(null, 'id');
const response: ListLogsResponse = {
logs: [
{
connectionName: 'mock-connection-id',
logType: LogType.INFO,
timestamp: new Date(0).getTime(),
message: JSON.stringify({ message: 'info message' })
},
{
connectionName: 'mock-connection-id',
logType: LogType.ERROR,
timestamp: new Date(0).getTime(),
message: JSON.stringify({ message: 'error message' })
}
]
};
beforeEach(() => {
mockAPI.get.mockReset();
});
test('renders the connection message modal component when connection logs are empty', async () => {
mockAPI.get.mockResolvedValueOnce({ logs: [] });
const props: ConnectionLogsModalProps = {
show: true,
hide: () => console.log('hide'),
connectionName: 'mock-connection-id'
};
const connectionMessageModal = render();
await waitFor(() => {
getById(connectionMessageModal.container, 'empty-logs-jumbotron');
});
expect(mockAPI.get).toHaveBeenCalledTimes(1);
expect(mockAPI.get).toHaveBeenCalledWith('M2C2Api', '/logs/mock-connection-id', {
queryStringParameters: { nextToken: undefined }
});
expect(connectionMessageModal.baseElement).toMatchSnapshot();
});
test('renders the connection message modal component when getting connection logs fails', async () => {
mockAPI.get.mockRejectedValueOnce('Error');
const props: ConnectionLogsModalProps = {
show: true,
hide: () => console.log('hide'),
connectionName: 'mock-connection-id'
};
const connectionMessageModal = render();
await waitFor(() => {
screen.findByText(I18n.get('error.message.get.logs'));
});
expect(mockAPI.get).toHaveBeenCalledTimes(1);
expect(mockAPI.get).toHaveBeenCalledWith('M2C2Api', '/logs/mock-connection-id', {
queryStringParameters: { nextToken: undefined }
});
expect(connectionMessageModal.baseElement).toMatchSnapshot();
});
test('renders the connection message modal component when there are connection logs', async () => {
mockAPI.get.mockResolvedValueOnce(response);
const props: ConnectionLogsModalProps = {
show: true,
hide: () => console.log('hide'),
connectionName: 'mock-connection-id'
};
const connectionMessageModal = render();
await waitFor(() => {
getById(connectionMessageModal.container, 'connection-logs-table');
});
expect(mockAPI.get).toHaveBeenCalledTimes(1);
expect(mockAPI.get).toHaveBeenCalledWith('M2C2Api', '/logs/mock-connection-id', {
queryStringParameters: { nextToken: undefined }
});
expect(connectionMessageModal.baseElement).toMatchSnapshot();
});
test('renders the connection message modal component when there are connection logs and the next token', async () => {
mockAPI.get.mockResolvedValueOnce({
...response,
nextToken: JSON.stringify({ connectionName: 'mock-connection-id', timestamp: new Date(0).getTime() })
});
const props: ConnectionLogsModalProps = {
show: true,
hide: () => console.log('hide'),
connectionName: 'mock-connection-id'
};
const connectionMessageModal = render();
await waitFor(() => {
getById(connectionMessageModal.container, 'connection-logs-table');
});
expect(mockAPI.get).toHaveBeenCalledTimes(1);
expect(mockAPI.get).toHaveBeenNthCalledWith(1, 'M2C2Api', '/logs/mock-connection-id', {
queryStringParameters: { nextToken: undefined }
});
expect(connectionMessageModal.baseElement).toMatchSnapshot();
});
test('tests close button', async () => {
mockAPI.get.mockResolvedValueOnce({ logs: [] });
const props: ConnectionLogsModalProps = {
show: true,
hide: () => console.log('hide'),
connectionName: 'mock-connection-id'
};
const connectionMessageModal = render();
await waitFor(() => {
getById(connectionMessageModal.container, 'empty-logs-jumbotron');
});
expect(screen.queryByText(I18n.get('close'))).not.toBeNull();
fireEvent.click(screen.getByText(I18n.get('close')));
});
test('tests next and prev buttons', async () => {
mockAPI.get
.mockResolvedValueOnce({
...response,
nextToken: JSON.stringify({ connectionName: 'mock-connection-id', timestamp: new Date(0).getTime() })
})
.mockResolvedValueOnce({
...response,
nextToken: JSON.stringify({ connectionName: 'mock-connection-id', timestamp: new Date(1).getTime() })
})
.mockResolvedValueOnce({ ...response, nextToken: undefined })
.mockResolvedValueOnce({
...response,
nextToken: JSON.stringify({ connectionName: 'mock-connection-id', timestamp: new Date(1).getTime() })
});
const props: ConnectionLogsModalProps = {
show: true,
hide: () => console.log('hide'),
connectionName: 'mock-connection-id'
};
const connectionMessageModal = render();
await waitFor(() => {
getById(connectionMessageModal.container, 'connection-logs-table');
});
for (let i = 0; i < 2; i++) {
fireEvent.click(screen.getByText(I18n.get('next.page')));
await waitFor(() => {
getById(connectionMessageModal.container, 'connection-logs-table');
});
}
fireEvent.click(screen.getByText(I18n.get('prev.page')));
await waitFor(() => {
getById(connectionMessageModal.container, 'connection-logs-table');
});
expect(mockAPI.get).toHaveBeenCalledTimes(4);
expect(mockAPI.get).toHaveBeenNthCalledWith(1, 'M2C2Api', '/logs/mock-connection-id', {
queryStringParameters: { nextToken: undefined }
});
expect(mockAPI.get).toHaveBeenNthCalledWith(2, 'M2C2Api', '/logs/mock-connection-id', {
queryStringParameters: {
nextToken: JSON.stringify({ connectionName: 'mock-connection-id', timestamp: new Date(0).getTime() })
}
});
expect(mockAPI.get).toHaveBeenNthCalledWith(3, 'M2C2Api', '/logs/mock-connection-id', {
queryStringParameters: {
nextToken: JSON.stringify({ connectionName: 'mock-connection-id', timestamp: new Date(1).getTime() })
}
});
expect(mockAPI.get).toHaveBeenNthCalledWith(4, 'M2C2Api', '/logs/mock-connection-id', {
queryStringParameters: {
nextToken: JSON.stringify({ connectionName: 'mock-connection-id', timestamp: new Date(0).getTime() })
}
});
});