From c74d6ef65ed0a2aa72c19f5056862570e36297d5 Mon Sep 17 00:00:00 2001 From: Nicolas Olmos Date: Tue, 30 Dec 2025 15:53:20 -0300 Subject: [PATCH 1/5] chore: request sponsor form items to update total value correctly --- src/actions/sponsor-forms-actions.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/actions/sponsor-forms-actions.js b/src/actions/sponsor-forms-actions.js index e54fc2134..e423c1607 100644 --- a/src/actions/sponsor-forms-actions.js +++ b/src/actions/sponsor-forms-actions.js @@ -932,13 +932,12 @@ export const getSponsorFormItem = export const deleteSponsorFormItem = (formId, itemId) => async (dispatch, getState) => { - const { currentSummitState } = getState(); + const { currentSummitState, sponsorFormItemsListState } = getState(); const accessToken = await getAccessTokenSafely(); const { currentSummit } = currentSummitState; const params = { access_token: accessToken }; dispatch(startLoading()); - return deleteRequest( null, createAction(SPONSOR_FORM_ITEM_DELETED)({ itemId }), @@ -947,6 +946,18 @@ export const deleteSponsorFormItem = snackbarErrorHandler )(params)(dispatch) .then(() => { + const { currentPage, perPage, order, orderDir, hideArchived } = + sponsorFormItemsListState; + dispatch( + getSponsorFormItems( + formId, + currentPage, + perPage, + order, + orderDir, + hideArchived + ) + ); dispatch( snackbarSuccessHandler({ title: T.translate("general.success"), From b494f004516ab3269813a9ee09b5bb4346ad08bd Mon Sep 17 00:00:00 2001 From: Nicolas Olmos Date: Tue, 30 Dec 2025 15:54:32 -0300 Subject: [PATCH 2/5] chore: test delete sponsor form item --- .../__tests__/sponsor-forms-actions.test.js | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/actions/__tests__/sponsor-forms-actions.test.js diff --git a/src/actions/__tests__/sponsor-forms-actions.test.js b/src/actions/__tests__/sponsor-forms-actions.test.js new file mode 100644 index 000000000..646f2483e --- /dev/null +++ b/src/actions/__tests__/sponsor-forms-actions.test.js @@ -0,0 +1,66 @@ +import * as OpenStackUiCoreActions from "openstack-uicore-foundation/lib/utils/actions"; +import { deleteSponsorFormItem } from "../sponsor-forms-actions"; +import * as UtilsMethods from "../../utils/methods"; +import * as BaseActions from "../base-actions"; + +jest.mock("openstack-uicore-foundation/lib/utils/actions", () => { + const originalModule = jest.requireActual( + "openstack-uicore-foundation/lib/utils/actions" + ); + + return { + __esModule: true, + ...originalModule, + deleteRequest: jest.fn(() => () => () => Promise.resolve()) + }; +}); + +describe("SponsorFormActions", () => { + describe("DeleteSponsorFormItem", () => { + afterEach(() => { + // restore the spy created with spyOn + jest.restoreAllMocks(); + }); + + it("execute", async () => { + const mockedDispatch = jest.fn(); + const mockedGetState = jest.fn(() => ({ + currentSummitState: { + currentSummit: "SSS" + }, + sponsorFormItemsListState: { + currentPage: 1, + perPage: 10, + order: "asc", + orderDir: 1, + hideArchived: false + } + })); + + const params = { + formId: "AAA", + itemId: "III" + }; + + const spyOnGetAccessTokenSafely = jest + .spyOn(UtilsMethods, "getAccessTokenSafely") + .mockImplementation(() => "access _token"); + const spyOnSnackbarSuccessHandler = jest.spyOn( + BaseActions, + "snackbarSuccessHandler" + ); + + await deleteSponsorFormItem(params.formId, params.itemId)( + mockedDispatch, + mockedGetState + ); + + // gets acces token safely + expect(spyOnGetAccessTokenSafely).toHaveBeenCalled(); + // calls delete request + expect(OpenStackUiCoreActions.deleteRequest).toHaveBeenCalled(); + // shows snackbar + expect(spyOnSnackbarSuccessHandler).toHaveBeenCalled(); + }); + }); +}); From 36df10aa094b60a4e46c41d609f127cda3d136eb Mon Sep 17 00:00:00 2001 From: Nicolas Olmos Date: Tue, 30 Dec 2025 15:55:18 -0300 Subject: [PATCH 3/5] chore: dont update total count on delete item reducer --- src/reducers/sponsors/sponsor-form-items-list-reducer.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/reducers/sponsors/sponsor-form-items-list-reducer.js b/src/reducers/sponsors/sponsor-form-items-list-reducer.js index 765060f96..67829092a 100644 --- a/src/reducers/sponsors/sponsor-form-items-list-reducer.js +++ b/src/reducers/sponsors/sponsor-form-items-list-reducer.js @@ -131,9 +131,8 @@ const sponsorFormItemsListReducer = (state = DEFAULT_STATE, action) => { case SPONSOR_FORM_ITEM_DELETED: { const { itemId } = payload; const items = state.items.filter((it) => it.id !== itemId); - const totalCount = items.length; - return { ...state, items, totalCount }; + return { ...state, items }; } case SPONSOR_FORM_ITEM_ARCHIVED: { const { id: itemId } = payload.response; From b1cd9570c45d4a85286e039acf33ddd6d4c52ee8 Mon Sep 17 00:00:00 2001 From: Nicolas Olmos Date: Tue, 30 Dec 2025 15:55:33 -0300 Subject: [PATCH 4/5] chore: update reducer test --- .../sponsors/__tests__/sponsor-form-items-list-reducer.test.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/reducers/sponsors/__tests__/sponsor-form-items-list-reducer.test.js b/src/reducers/sponsors/__tests__/sponsor-form-items-list-reducer.test.js index ba685eea9..31e2ac275 100644 --- a/src/reducers/sponsors/__tests__/sponsor-form-items-list-reducer.test.js +++ b/src/reducers/sponsors/__tests__/sponsor-form-items-list-reducer.test.js @@ -234,7 +234,6 @@ describe("SponsorFormItemsListReducer", () => { result = SponsorFormItemsListReducer( { ...initialState, - totalCount: 2, items: [ { id: "A", @@ -267,7 +266,6 @@ describe("SponsorFormItemsListReducer", () => { ); expect(result).toStrictEqual({ ...initialState, - totalCount: 1, items: [ { id: "B", From 156ba5b2fa0ba7a914fd4535864bab0ecfb110ac Mon Sep 17 00:00:00 2001 From: Nicolas Olmos Date: Fri, 9 Jan 2026 10:19:55 -0300 Subject: [PATCH 5/5] chore: move action dispatch --- src/actions/sponsor-forms-actions.js | 14 +------------- .../sponsors/sponsor-form-item-list-page/index.js | 11 ++++++++++- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/actions/sponsor-forms-actions.js b/src/actions/sponsor-forms-actions.js index e423c1607..569770b3b 100644 --- a/src/actions/sponsor-forms-actions.js +++ b/src/actions/sponsor-forms-actions.js @@ -932,7 +932,7 @@ export const getSponsorFormItem = export const deleteSponsorFormItem = (formId, itemId) => async (dispatch, getState) => { - const { currentSummitState, sponsorFormItemsListState } = getState(); + const { currentSummitState } = getState(); const accessToken = await getAccessTokenSafely(); const { currentSummit } = currentSummitState; const params = { access_token: accessToken }; @@ -946,18 +946,6 @@ export const deleteSponsorFormItem = snackbarErrorHandler )(params)(dispatch) .then(() => { - const { currentPage, perPage, order, orderDir, hideArchived } = - sponsorFormItemsListState; - dispatch( - getSponsorFormItems( - formId, - currentPage, - perPage, - order, - orderDir, - hideArchived - ) - ); dispatch( snackbarSuccessHandler({ title: T.translate("general.success"), diff --git a/src/pages/sponsors/sponsor-form-item-list-page/index.js b/src/pages/sponsors/sponsor-form-item-list-page/index.js index 94a3bd0a7..21f7f4d77 100644 --- a/src/pages/sponsors/sponsor-form-item-list-page/index.js +++ b/src/pages/sponsors/sponsor-form-item-list-page/index.js @@ -102,7 +102,16 @@ const SponsorFormItemListPage = ({ : archiveSponsorFormItem(formId, item.id); const handleRowDelete = (itemId) => { - deleteSponsorFormItem(formId, itemId); + deleteSponsorFormItem(formId, itemId).then(() => { + getSponsorFormItems( + formId, + currentPage, + perPage, + order, + orderDir, + hideArchived + ); + }); }; const handleNewItem = () => {