diff --git a/awx/ui_next/src/screens/Inventory/InventoryList/InventoryList.test.jsx b/awx/ui_next/src/screens/Inventory/InventoryList/InventoryList.test.jsx
index 0db85887bb..e9b256e05e 100644
--- a/awx/ui_next/src/screens/Inventory/InventoryList/InventoryList.test.jsx
+++ b/awx/ui_next/src/screens/Inventory/InventoryList/InventoryList.test.jsx
@@ -119,6 +119,7 @@ const mockInventories = [
];
describe('', () => {
+ let debug;
beforeEach(() => {
InventoriesAPI.read.mockResolvedValue({
data: {
@@ -135,10 +136,13 @@ describe('', () => {
},
},
});
+ debug = global.console.debug; // eslint-disable-line prefer-destructuring
+ global.console.debug = () => {};
});
afterEach(() => {
jest.clearAllMocks();
+ global.console.debug = debug;
});
test('should load and render inventories', async () => {
diff --git a/awx/ui_next/src/screens/Inventory/InventoryList/useWsInventories.test.jsx b/awx/ui_next/src/screens/Inventory/InventoryList/useWsInventories.test.jsx
new file mode 100644
index 0000000000..196166add6
--- /dev/null
+++ b/awx/ui_next/src/screens/Inventory/InventoryList/useWsInventories.test.jsx
@@ -0,0 +1,129 @@
+import React from 'react';
+import { act } from 'react-dom/test-utils';
+import WS from 'jest-websocket-mock';
+import { mountWithContexts } from '../../../../testUtils/enzymeHelpers';
+import useWsInventories from './useWsInventories';
+
+/*
+ Jest mock timers don’t play well with jest-websocket-mock,
+ so we'll stub out throttling to resolve immediately
+*/
+jest.mock('../../../util/useThrottle', () => ({
+ __esModule: true,
+ default: jest.fn(val => val),
+}));
+
+function TestInner() {
+ return
;
+}
+function Test({ inventories, fetch }) {
+ const syncedJobs = useWsInventories(inventories, fetch);
+ return ;
+}
+
+describe('useWsInventories hook', () => {
+ let debug;
+ let wrapper;
+ beforeEach(() => {
+ debug = global.console.debug; // eslint-disable-line prefer-destructuring
+ global.console.debug = () => {};
+ });
+
+ afterEach(() => {
+ global.console.debug = debug;
+ });
+
+ test('should return inventories list', () => {
+ const inventories = [{ id: 1 }];
+ wrapper = mountWithContexts();
+
+ expect(wrapper.find('TestInner').prop('inventories')).toEqual(inventories);
+ WS.clean();
+ });
+
+ test('should establish websocket connection', async () => {
+ global.document.cookie = 'csrftoken=abc123';
+ const mockServer = new WS('wss://localhost/websocket/');
+
+ const inventories = [{ id: 1 }];
+ await act(async () => {
+ wrapper = await mountWithContexts();
+ });
+
+ await mockServer.connected;
+ await expect(mockServer).toReceiveMessage(
+ JSON.stringify({
+ xrftoken: 'abc123',
+ groups: {
+ inventories: ['status_changed'],
+ jobs: ['status_changed'],
+ control: ['limit_reached_1'],
+ },
+ })
+ );
+ WS.clean();
+ });
+
+ test('should update inventory sync status', async () => {
+ global.document.cookie = 'csrftoken=abc123';
+ const mockServer = new WS('wss://localhost/websocket/');
+
+ const inventories = [{ id: 1 }];
+ await act(async () => {
+ wrapper = await mountWithContexts();
+ });
+
+ await mockServer.connected;
+ await expect(mockServer).toReceiveMessage(
+ JSON.stringify({
+ xrftoken: 'abc123',
+ groups: {
+ inventories: ['status_changed'],
+ jobs: ['status_changed'],
+ control: ['limit_reached_1'],
+ },
+ })
+ );
+ act(() => {
+ mockServer.send(
+ JSON.stringify({
+ inventory_id: 1,
+ type: 'inventory_update',
+ status: 'running',
+ })
+ );
+ });
+ wrapper.update();
+
+ expect(
+ wrapper.find('TestInner').prop('inventories')[0].isSourceSyncRunning
+ ).toEqual(true);
+ WS.clean();
+ });
+
+ test('should fetch fresh inventory after sync runs', async () => {
+ global.document.cookie = 'csrftoken=abc123';
+ const mockServer = new WS('wss://localhost/websocket/');
+ const inventories = [{ id: 1 }];
+ const fetch = jest.fn(() => []);
+ await act(async () => {
+ wrapper = await mountWithContexts(
+
+ );
+ });
+
+ await mockServer.connected;
+ await act(async () => {
+ mockServer.send(
+ JSON.stringify({
+ inventory_id: 1,
+ type: 'inventory_update',
+ status: 'successful',
+ })
+ );
+ });
+
+ expect(fetch).toHaveBeenCalledWith([1]);
+ WS.clean();
+ });
+});