From 9f4d1d91214587bc683163397e47630f17079fa8 Mon Sep 17 00:00:00 2001 From: arbulu89 Date: Thu, 6 Jul 2023 15:04:56 +0200 Subject: [PATCH] Deregister host saga --- assets/js/state/sagas/hosts.js | 31 ++++++++++++++- assets/js/state/sagas/hosts.test.js | 58 ++++++++++++++++++++++++++++- assets/js/state/sagas/index.js | 3 +- 3 files changed, 87 insertions(+), 5 deletions(-) diff --git a/assets/js/state/sagas/hosts.js b/assets/js/state/sagas/hosts.js index e2d93ab7a0..99174839e0 100644 --- a/assets/js/state/sagas/hosts.js +++ b/assets/js/state/sagas/hosts.js @@ -1,5 +1,12 @@ -import { put, takeEvery } from 'redux-saga/effects'; -import { HOST_DEREGISTERED, removeHost } from '@state/hosts'; +import { put, call, takeEvery } from 'redux-saga/effects'; +import { + DEREGISTER_HOST, + HOST_DEREGISTERED, + removeHost, + setHostDeregistering, + setHostNotDeregistering, +} from '@state/hosts'; +import { del } from '@lib/network'; import { notify } from '@state/actions/notifications'; export function* hostDeregistered({ payload }) { @@ -12,6 +19,26 @@ export function* hostDeregistered({ payload }) { ); } +export function* deregisterHost({ payload }) { + yield put(setHostDeregistering(payload)); + try { + yield call(del, `/hosts/${payload.id}`); + } catch (error) { + yield put( + notify({ + text: `Error deregistering host ${payload?.hostname}.`, + icon: '❌', + }) + ); + } finally { + yield put(setHostNotDeregistering(payload)); + } +} + export function* watchHostDeregistered() { yield takeEvery(HOST_DEREGISTERED, hostDeregistered); } + +export function* watchDeregisterHost() { + yield takeEvery(DEREGISTER_HOST, deregisterHost); +} diff --git a/assets/js/state/sagas/hosts.test.js b/assets/js/state/sagas/hosts.test.js index 017d14a0e8..b8a1169941 100644 --- a/assets/js/state/sagas/hosts.test.js +++ b/assets/js/state/sagas/hosts.test.js @@ -1,9 +1,29 @@ +import MockAdapter from 'axios-mock-adapter'; + import { recordSaga } from '@lib/test-utils'; -import { hostDeregistered } from '@state/sagas/hosts'; -import { removeHost } from '@state/hosts'; +import { networkClient } from '@lib/network'; +import { deregisterHost, hostDeregistered } from '@state/sagas/hosts'; +import { + removeHost, + setHostDeregistering, + setHostNotDeregistering, +} from '@state/hosts'; +import { notify } from '@state/actions/notifications'; import { hostFactory } from '@lib/test-utils/factories'; +const axiosMock = new MockAdapter(networkClient); + describe('Hosts sagas', () => { + beforeEach(() => { + axiosMock.reset(); + jest.spyOn(console, 'error').mockImplementation(() => null); + }); + + afterEach(() => { + /* eslint-disable-next-line */ + console.error.mockRestore(); + }); + it('should remove the host', async () => { const { id, hostname } = hostFactory.build(); const payload = { id, hostname }; @@ -14,4 +34,38 @@ describe('Hosts sagas', () => { expect(dispatched).toContainEqual(removeHost(payload)); }); + + it('should send host deregister request', async () => { + const host = hostFactory.build(); + + axiosMock.onDelete(`/hosts/${host.id}`).reply(204, {}); + + const dispatched = await recordSaga(deregisterHost, { + payload: host, + }); + + expect(dispatched).toEqual([ + setHostDeregistering(host), + setHostNotDeregistering(host), + ]); + }); + + it('should notify error on host deregistration request', async () => { + const host = hostFactory.build(); + + axiosMock.onDelete(`/hosts/${host.id}`).reply(404, {}); + + const dispatched = await recordSaga(deregisterHost, { + payload: host, + }); + + expect(dispatched).toEqual([ + setHostDeregistering(host), + notify({ + text: `Error deregistering host ${host.hostname}.`, + icon: '❌', + }), + setHostNotDeregistering(host), + ]); + }); }); diff --git a/assets/js/state/sagas/index.js b/assets/js/state/sagas/index.js index 86262b38b2..be6e2a8ffa 100644 --- a/assets/js/state/sagas/index.js +++ b/assets/js/state/sagas/index.js @@ -62,7 +62,7 @@ import { watchAcceptEula } from '@state/sagas/eula'; import { watchCatalogUpdate } from '@state/sagas/catalog'; import { watchSapSystem } from '@state/sagas/sapSystems'; import { watchDatabase } from '@state/sagas/databases'; -import { watchHostDeregistered } from '@state/sagas/hosts'; +import { watchHostDeregistered, watchDeregisterHost } from '@state/sagas/hosts'; import { watchClusterDeregistered } from '@state/sagas/clusters'; import { @@ -410,5 +410,6 @@ export default function* rootSaga() { watchAcceptEula(), refreshHealthSummaryOnComnponentsHealthChange(), watchPerformLogin(), + watchDeregisterHost(), ]); }