1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import Axios, { AxiosInstance, AxiosResponse } from "axios";
6 import { mockConfig } from "common/config";
7 import { createBrowserHistory } from "history";
8 import { GroupsPanelMiddlewareService } from "./groups-panel-middleware-service";
9 import { dataExplorerMiddleware } from "store/data-explorer/data-explorer-middleware";
10 import { Dispatch, MiddlewareAPI } from "redux";
11 import { DataColumns } from "components/data-table/data-table";
12 import { dataExplorerActions } from "store/data-explorer/data-explorer-action";
13 import { SortDirection } from "components/data-table/data-column";
14 import { createTree } from 'models/tree';
15 import { DataTableFilterItem } from "components/data-table-filters/data-table-filters-tree";
16 import { GROUPS_PANEL_ID } from "./groups-panel-actions";
17 import { RootState, RootStore, configureStore } from "store/store";
18 import { ServiceRepository, createServices } from "services/services";
19 import { ApiActions } from "services/api/api-actions";
20 import { ListResults } from "services/common-service/common-service";
21 import { GroupResource } from "models/group";
22 import { getResource } from "store/resources/resources";
24 describe("GroupsPanelMiddlewareService", () => {
25 let axiosInst: AxiosInstance;
27 let services: ServiceRepository;
28 const config: any = {};
29 const actions: ApiActions = {
30 progressFn: (id: string, working: boolean) => { },
31 errorFn: (id: string, message: string) => { }
35 axiosInst = Axios.create({ headers: {} });
36 services = createServices(mockConfig({}), actions, axiosInst);
37 store = configureStore(createBrowserHistory(), services, config);
40 it("requests group member counts and updates resource store", async () => {
42 const fakeUuid = "zzzzz-j7d0g-000000000000000";
43 axiosInst.get = jest.fn((url: string) => {
44 if (url === '/groups') {
45 return Promise.resolve(
53 created_at: "2023-11-15T20:57:01.723043000Z",
56 etag: "0000000000000000000000000",
59 href: `/groups/${fakeUuid}`,
61 kind: "arvados#group",
62 modified_at: "2023-11-15T20:57:01.719986000Z",
63 modified_by_user_uuid: "zzzzz-tpzed-000000000000000",
65 owner_uuid: "zzzzz-tpzed-000000000000000",
70 "zzzzz-tpzed-000000000000000",
75 } else if (url === '/links') {
76 return Promise.resolve(
80 kind: "arvados#linkList",
85 return Promise.resolve(
86 { data: {}} as AxiosResponse);
88 }) as AxiosInstance['get'];
91 await store.dispatch(dataExplorerActions.REQUEST_ITEMS({id: GROUPS_PANEL_ID}));
92 // Wait for async fetching of group count promises to resolve
93 await new Promise(setImmediate);
96 expect(axiosInst.get).toHaveBeenCalledTimes(2);
97 expect(axiosInst.get).toHaveBeenCalledWith('/groups', expect.anything());
98 expect(axiosInst.get).toHaveBeenCalledWith('/links', expect.anything());
99 const group = getResource<GroupResource>(fakeUuid)(store.getState().resources);
100 expect(group?.memberCount).toBe(234);
103 it('requests group member count and stores null on failure', async () => {
105 const fakeUuid = "zzzzz-j7d0g-000000000000000";
106 axiosInst.get = jest.fn((url: string) => {
107 if (url === '/groups') {
108 return Promise.resolve(
116 created_at: "2023-11-15T20:57:01.723043000Z",
119 etag: "0000000000000000000000000",
120 frozen_by_uuid: null,
122 href: `/groups/${fakeUuid}`,
124 kind: "arvados#group",
125 modified_at: "2023-11-15T20:57:01.719986000Z",
126 modified_by_user_uuid: "zzzzz-tpzed-000000000000000",
128 owner_uuid: "zzzzz-tpzed-000000000000000",
133 "zzzzz-tpzed-000000000000000",
137 }} as AxiosResponse);
138 } else if (url === '/links') {
139 return Promise.reject();
141 return Promise.resolve({ data: {}} as AxiosResponse);
143 }) as AxiosInstance['get'];
146 await store.dispatch(dataExplorerActions.REQUEST_ITEMS({id: GROUPS_PANEL_ID}));
147 // Wait for async fetching of group count promises to resolve
148 await new Promise(setImmediate);
151 expect(axiosInst.get).toHaveBeenCalledTimes(2);
152 expect(axiosInst.get).toHaveBeenCalledWith('/groups', expect.anything());
153 expect(axiosInst.get).toHaveBeenCalledWith('/links', expect.anything());
154 const group = getResource<GroupResource>(fakeUuid)(store.getState().resources);
155 expect(group?.memberCount).toBe(null);