@northern.tech/testing 0.5.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,34 @@
1
+ import {
2
+ light
3
+ } from "./chunk-HRGVXWMH.js";
4
+
5
+ // src/utils.tsx
6
+ import { Provider } from "react-redux";
7
+ import { MemoryRouter } from "react-router-dom";
8
+ import { ThemeProvider, createTheme } from "@mui/material/styles";
9
+ import { render } from "@testing-library/react";
10
+ import { act, queryByRole, waitFor, within } from "@testing-library/react";
11
+ import { expect } from "vitest";
12
+ import { jsx } from "react/jsx-runtime";
13
+ var selectMaterialUiSelectOption = async (element, optionText, user) => {
14
+ const selectButton = element.parentNode.querySelector("[role=combobox]");
15
+ await act(async () => await user.click(selectButton));
16
+ const listbox = queryByRole(document.documentElement, "listbox");
17
+ const listItem = within(listbox).getByText(optionText);
18
+ await user.click(listItem);
19
+ await waitFor(() => expect(queryByRole(document.documentElement, "listbox")).not.toBeInTheDocument());
20
+ return Promise.resolve();
21
+ };
22
+ var theme = createTheme(light);
23
+ var renderWithRouter = (ui, { route = "/", preloadedState } = {}) => {
24
+ const store = getConfiguredStore({ preloadedState });
25
+ const Wrapper = ({ children }) => /* @__PURE__ */ jsx(ThemeProvider, { theme, children: /* @__PURE__ */ jsx(MemoryRouter, { initialEntries: [route], children: /* @__PURE__ */ jsx(Provider, { store, children }) }) });
26
+ return { store, ...render(ui, { wrapper: Wrapper }) };
27
+ };
28
+
29
+ export {
30
+ selectMaterialUiSelectOption,
31
+ theme,
32
+ renderWithRouter
33
+ };
34
+ //# sourceMappingURL=chunk-RG3ICJW5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils.tsx"],"sourcesContent":["// Copyright 2025 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//@ts-nocheck\nimport React from 'react';\nimport { Provider } from 'react-redux';\nimport { MemoryRouter } from 'react-router-dom';\n\nimport { createSerializer } from '@emotion/jest';\nimport { ThemeProvider, createTheme } from '@mui/material/styles';\n\nimport { yes } from '@northern.tech/utils/helpers';\nimport { configureStore } from '@reduxjs/toolkit';\nimport { cleanup, render } from '@testing-library/react';\nimport { act, queryByRole, waitFor, within } from '@testing-library/react';\nimport { expect } from 'vitest';\n\nimport { light } from './theme/light';\n\nexport const selectMaterialUiSelectOption = async (element, optionText, user) => {\n // The button that opens the dropdown, which is a sibling of the input\n const selectButton = element.parentNode.querySelector('[role=combobox]');\n // Open the select dropdown\n await act(async () => await user.click(selectButton));\n // Get the dropdown element. We don't use getByRole() because it includes <select>s too.\n const listbox = queryByRole(document.documentElement, 'listbox');\n // Click the list item\n const listItem = within(listbox!).getByText(optionText);\n await user.click(listItem);\n // Wait for the listbox to be removed, so it isn't visible in subsequent calls\n await waitFor(() => expect(queryByRole(document.documentElement, 'listbox')).not.toBeInTheDocument());\n return Promise.resolve();\n};\n\nexport const theme = createTheme(light);\n\nexport const renderWithRouter = (ui: React.ReactElement, { route = '/', preloadedState } = {}) => {\n const store = getConfiguredStore({ preloadedState });\n const Wrapper = ({ children }) => (\n <ThemeProvider theme={theme}>\n <MemoryRouter initialEntries={[route]}>\n <Provider store={store}>{children}</Provider>\n </MemoryRouter>\n </ThemeProvider>\n );\n return { store, ...render(ui, { wrapper: Wrapper }) };\n};\n"],"mappings":";;;;;AAeA,SAAS,gBAAgB;AACzB,SAAS,oBAAoB;AAG7B,SAAS,eAAe,mBAAmB;AAI3C,SAAkB,cAAc;AAChC,SAAS,KAAK,aAAa,SAAS,cAAc;AAClD,SAAS,cAAc;AA0Bf;AAtBD,IAAM,+BAA+B,OAAO,SAAS,YAAY,SAAS;AAE/E,QAAM,eAAe,QAAQ,WAAW,cAAc,iBAAiB;AAEvE,QAAM,IAAI,YAAY,MAAM,KAAK,MAAM,YAAY,CAAC;AAEpD,QAAM,UAAU,YAAY,SAAS,iBAAiB,SAAS;AAE/D,QAAM,WAAW,OAAO,OAAQ,EAAE,UAAU,UAAU;AACtD,QAAM,KAAK,MAAM,QAAQ;AAEzB,QAAM,QAAQ,MAAM,OAAO,YAAY,SAAS,iBAAiB,SAAS,CAAC,EAAE,IAAI,kBAAkB,CAAC;AACpG,SAAO,QAAQ,QAAQ;AACzB;AAEO,IAAM,QAAQ,YAAY,KAAK;AAE/B,IAAM,mBAAmB,CAAC,IAAwB,EAAE,QAAQ,KAAK,eAAe,IAAI,CAAC,MAAM;AAChG,QAAM,QAAQ,mBAAmB,EAAE,eAAe,CAAC;AACnD,QAAM,UAAU,CAAC,EAAE,SAAS,MAC1B,oBAAC,iBAAc,OACb,8BAAC,gBAAa,gBAAgB,CAAC,KAAK,GAClC,8BAAC,YAAS,OAAe,UAAS,GACpC,GACF;AAEF,SAAO,EAAE,OAAO,GAAG,OAAO,IAAI,EAAE,SAAS,QAAQ,CAAC,EAAE;AACtD;","names":[]}
@@ -40,15 +40,15 @@ __export(setupTests_exports, {
40
40
  render: () => customRender
41
41
  });
42
42
  module.exports = __toCommonJS(setupTests_exports);
43
- var import_react = __toESM(require("react"), 1);
44
- var import_react_redux = require("react-redux");
45
- var import_react_router_dom = require("react-router-dom");
43
+ var import_react3 = __toESM(require("react"), 1);
44
+ var import_react_redux2 = require("react-redux");
45
+ var import_react_router_dom2 = require("react-router-dom");
46
46
  var import_jest = require("@emotion/jest");
47
- var import_styles = require("@mui/material/styles");
47
+ var import_styles2 = require("@mui/material/styles");
48
48
  var import_helpers = require("@northern.tech/utils/helpers");
49
49
  var import_toolkit = require("@reduxjs/toolkit");
50
- var import_react2 = require("@testing-library/react");
51
- var import_vitest = require("vitest");
50
+ var import_react4 = require("@testing-library/react");
51
+ var import_vitest2 = require("vitest");
52
52
  var import_worker_threads = require("worker_threads");
53
53
 
54
54
  // src/mockData.ts
@@ -789,6 +789,14 @@ var receivedPermissionSets = permissionSets.reduce((accu, set) => {
789
789
  return accu;
790
790
  }, {});
791
791
 
792
+ // src/utils.tsx
793
+ var import_react_redux = require("react-redux");
794
+ var import_react_router_dom = require("react-router-dom");
795
+ var import_styles = require("@mui/material/styles");
796
+ var import_react = require("@testing-library/react");
797
+ var import_react2 = require("@testing-library/react");
798
+ var import_vitest = require("vitest");
799
+
792
800
  // src/theme/light.ts
793
801
  var palette = {
794
802
  border: {
@@ -802,60 +810,67 @@ var light = {
802
810
  palette
803
811
  };
804
812
 
813
+ // src/utils.tsx
814
+ var import_jsx_runtime = require("react/jsx-runtime");
815
+ var theme = (0, import_styles.createTheme)(light);
816
+
805
817
  // src/setupTests.tsx
806
818
  __reExport(setupTests_exports, require("@testing-library/react"), module.exports);
807
- var import_jsx_runtime = require("react/jsx-runtime");
808
- import_vitest.expect.addSnapshotSerializer((0, import_jest.createSerializer)({ includeStyles: true }));
819
+ var import_jsx_runtime2 = require("react/jsx-runtime");
820
+ import_vitest2.expect.addSnapshotSerializer((0, import_jest.createSerializer)({ includeStyles: true }));
809
821
  var TEST_LOCATION = "localhost";
810
- var mockAbortController = { signal: { addEventListener: () => {
811
- }, removeEventListener: () => {
812
- } } };
822
+ var mockAbortController = {
823
+ abort: import_vitest2.vi.fn(),
824
+ signal: { addEventListener: () => {
825
+ }, removeEventListener: () => {
826
+ } }
827
+ };
813
828
  var oldWindowLocalStorage = window.localStorage;
814
829
  var oldWindowLocation = window.location;
815
830
  var oldWindowSessionStorage = window.sessionStorage;
816
- import_vitest.vi.mock("uuid", () => ({ v4: () => "mock-uuid" }));
831
+ import_vitest2.vi.mock("uuid", () => ({ v4: () => "mock-uuid" }));
817
832
  var storage = {};
818
- global.HTMLCanvasElement.prototype.getContext = import_vitest.vi.fn();
833
+ global.HTMLCanvasElement.prototype.getContext = import_vitest2.vi.fn();
819
834
  var beforeAll = async () => {
820
835
  delete window.location;
821
836
  window.location = {
822
837
  ...oldWindowLocation,
823
838
  hostname: TEST_LOCATION,
824
839
  origin: "http://localhost",
825
- assign: import_vitest.vi.fn(),
826
- replace: import_vitest.vi.fn(),
827
- reload: import_vitest.vi.fn()
840
+ assign: import_vitest2.vi.fn(),
841
+ replace: import_vitest2.vi.fn(),
842
+ reload: import_vitest2.vi.fn()
828
843
  };
829
844
  delete window.sessionStorage;
830
845
  window.sessionStorage = {
831
846
  ...oldWindowSessionStorage,
832
- getItem: import_vitest.vi.fn(import_helpers.yes),
833
- setItem: import_vitest.vi.fn(),
834
- removeItem: import_vitest.vi.fn()
847
+ getItem: import_vitest2.vi.fn(import_helpers.yes),
848
+ setItem: import_vitest2.vi.fn(),
849
+ removeItem: import_vitest2.vi.fn()
835
850
  };
836
851
  delete window.localStorage;
837
852
  window.localStorage = {
838
853
  ...oldWindowLocalStorage,
839
- getItem: import_vitest.vi.fn((name) => {
854
+ getItem: import_vitest2.vi.fn((name) => {
840
855
  if (name === "JWT") {
841
856
  return JSON.stringify({ token });
842
857
  }
843
858
  return storage[name];
844
859
  }),
845
- setItem: import_vitest.vi.fn((name) => storage[name]),
846
- removeItem: import_vitest.vi.fn()
860
+ setItem: import_vitest2.vi.fn((name) => storage[name]),
861
+ removeItem: import_vitest2.vi.fn()
847
862
  };
848
863
  window.mender_environment = menderEnvironment;
849
864
  window.ENV = "test";
850
- global.AbortController = import_vitest.vi.fn().mockImplementation(function() {
865
+ global.AbortController = import_vitest2.vi.fn().mockImplementation(function() {
851
866
  return mockAbortController;
852
867
  });
853
868
  global.MessageChannel = import_worker_threads.MessageChannel;
854
- global.ResizeObserver = import_vitest.vi.fn().mockImplementation(function() {
869
+ global.ResizeObserver = import_vitest2.vi.fn().mockImplementation(function() {
855
870
  return {
856
- observe: import_vitest.vi.fn(),
857
- unobserve: import_vitest.vi.fn(),
858
- disconnect: import_vitest.vi.fn()
871
+ observe: import_vitest2.vi.fn(),
872
+ unobserve: import_vitest2.vi.fn(),
873
+ disconnect: import_vitest2.vi.fn()
859
874
  };
860
875
  });
861
876
  window.RTCPeerConnection = () => ({
@@ -869,44 +884,43 @@ var beforeAll = async () => {
869
884
  Object.defineProperty(navigator, "appVersion", { value: "Test", writable: true });
870
885
  const intersectionObserverMock = function() {
871
886
  return {
872
- observe: import_vitest.vi.fn(),
873
- disconnect: import_vitest.vi.fn()
887
+ observe: import_vitest2.vi.fn(),
888
+ disconnect: import_vitest2.vi.fn()
874
889
  };
875
890
  };
876
- window.prompt = import_vitest.vi.fn();
877
- window.IntersectionObserver = import_vitest.vi.fn().mockImplementation(intersectionObserverMock);
878
- import_vitest.vi.spyOn(import_react.default, "useEffect").mockImplementation(import_react.default.useLayoutEffect);
891
+ window.prompt = import_vitest2.vi.fn();
892
+ window.IntersectionObserver = import_vitest2.vi.fn().mockImplementation(intersectionObserverMock);
893
+ import_vitest2.vi.spyOn(import_react3.default, "useEffect").mockImplementation(import_react3.default.useLayoutEffect);
879
894
  const _jest = globalThis.jest;
880
895
  globalThis.jest = {
881
896
  ...globalThis.jest
882
897
  };
883
- import_vitest.vi.stubGlobal("jest", {
884
- advanceTimersByTime: import_vitest.vi.advanceTimersByTime.bind(import_vitest.vi)
898
+ import_vitest2.vi.stubGlobal("jest", {
899
+ advanceTimersByTime: import_vitest2.vi.advanceTimersByTime.bind(import_vitest2.vi)
885
900
  });
886
901
  return () => void (globalThis.jest = _jest);
887
902
  };
888
903
  var beforeEach = () => {
889
- import_vitest.vi.useFakeTimers({ now: mockDate });
890
- import_vitest.vi.setSystemTime(mockDate);
904
+ import_vitest2.vi.useFakeTimers({ now: mockDate });
905
+ import_vitest2.vi.setSystemTime(mockDate);
891
906
  };
892
907
  var afterEach = async () => {
893
- (0, import_react2.cleanup)();
894
- import_vitest.vi.runOnlyPendingTimers();
895
- import_vitest.vi.useRealTimers();
908
+ (0, import_react4.cleanup)();
909
+ import_vitest2.vi.runOnlyPendingTimers();
910
+ import_vitest2.vi.useRealTimers();
896
911
  };
897
912
  var afterAll = async () => {
898
913
  window.localStorage = oldWindowLocalStorage;
899
914
  window.location = oldWindowLocation;
900
915
  window.sessionStorage = oldWindowSessionStorage;
901
- import_react.default.useEffect.mockRestore();
902
- import_vitest.vi.unstubAllGlobals();
916
+ import_react3.default.useEffect.mockRestore();
917
+ import_vitest2.vi.unstubAllGlobals();
903
918
  };
904
- var theme = (0, import_styles.createTheme)(light);
905
919
  var customRender = (ui, options = {}) => {
906
920
  const { preloadedState = { users: { currentSession: { token, expiresAt: void 0 } } }, ...remainder } = options;
907
921
  const store = options.store ?? (0, import_toolkit.configureStore)({ preloadedState });
908
- const AllTheProviders = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_styles.ThemeProvider, { theme, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_router_dom.MemoryRouter, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_redux.Provider, { store, children }) }) });
909
- return { store, ...(0, import_react2.render)(ui, { wrapper: AllTheProviders, ...remainder }) };
922
+ const AllTheProviders = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_styles2.ThemeProvider, { theme, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react_router_dom2.MemoryRouter, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react_redux2.Provider, { store, children }) }) });
923
+ return { store, ...(0, import_react4.render)(ui, { wrapper: AllTheProviders, ...remainder }) };
910
924
  };
911
925
  // Annotate the CommonJS export names for ESM import in node:
912
926
  0 && (module.exports = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/setupTests.tsx","../src/mockData.ts","../src/theme/light.ts"],"sourcesContent":["// Copyright 2025 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//@ts-nocheck\nimport React from 'react';\nimport { Provider } from 'react-redux';\nimport { MemoryRouter } from 'react-router-dom';\n\nimport { createSerializer } from '@emotion/jest';\nimport { ThemeProvider, createTheme } from '@mui/material/styles';\n\nimport { yes } from '@northern.tech/utils/helpers';\nimport { configureStore } from '@reduxjs/toolkit';\nimport { cleanup, render } from '@testing-library/react';\nimport { expect, vi } from 'vitest';\nimport { MessageChannel } from 'worker_threads';\n\nimport { menderEnvironment, mockDate, token as mockToken } from './mockData';\nimport { light } from './theme/light';\n\nexpect.addSnapshotSerializer(createSerializer({ includeStyles: true }));\n\nexport const TEST_LOCATION = 'localhost';\n\nexport const mockAbortController = { signal: { addEventListener: () => {}, removeEventListener: () => {} } };\n\nconst oldWindowLocalStorage = window.localStorage;\nconst oldWindowLocation = window.location;\nconst oldWindowSessionStorage = window.sessionStorage;\n\nvi.mock('uuid', () => ({ v4: () => 'mock-uuid' }));\n\nconst storage = {};\nglobal.HTMLCanvasElement.prototype.getContext = vi.fn();\n\nexport const beforeAll = async () => {\n // Temporarily workaround for bug in @testing-library/react when use user-event with `vi.useFakeTimers()`\n\n // Enable the mocking in tests.\n delete window.location;\n window.location = {\n ...oldWindowLocation,\n hostname: TEST_LOCATION,\n origin: 'http://localhost',\n assign: vi.fn(),\n replace: vi.fn(),\n reload: vi.fn()\n };\n delete window.sessionStorage;\n window.sessionStorage = {\n ...oldWindowSessionStorage,\n getItem: vi.fn(yes),\n setItem: vi.fn(),\n removeItem: vi.fn()\n };\n delete window.localStorage;\n window.localStorage = {\n ...oldWindowLocalStorage,\n getItem: vi.fn(name => {\n if (name === 'JWT') {\n return JSON.stringify({ token: mockToken });\n }\n return storage[name];\n }),\n setItem: vi.fn(name => storage[name]),\n removeItem: vi.fn()\n };\n window.mender_environment = menderEnvironment;\n window.ENV = 'test';\n global.AbortController = vi.fn().mockImplementation(function () {\n return mockAbortController;\n });\n global.MessageChannel = MessageChannel;\n global.ResizeObserver = vi.fn().mockImplementation(function () {\n return {\n observe: vi.fn(),\n unobserve: vi.fn(),\n disconnect: vi.fn()\n };\n });\n window.RTCPeerConnection = () => ({\n createOffer: () => {},\n setLocalDescription: () => {},\n createDataChannel: () => {}\n });\n\n Object.defineProperty(navigator, 'appVersion', { value: 'Test', writable: true });\n const intersectionObserverMock = function () {\n return {\n observe: vi.fn(),\n disconnect: vi.fn()\n };\n };\n window.prompt = vi.fn();\n window.IntersectionObserver = vi.fn().mockImplementation(intersectionObserverMock);\n vi.spyOn(React, 'useEffect').mockImplementation(React.useLayoutEffect);\n\n //TODO: remove, once https://github.com/testing-library/react-testing-library/issues/1197 resolved\n const _jest = globalThis.jest;\n\n globalThis.jest = {\n ...globalThis.jest\n };\n\n vi.stubGlobal('jest', {\n advanceTimersByTime: vi.advanceTimersByTime.bind(vi)\n });\n return () => void (globalThis.jest = _jest);\n};\n\nexport const beforeEach = () => {\n vi.useFakeTimers({ now: mockDate });\n vi.setSystemTime(mockDate);\n};\n\nexport const afterEach = async () => {\n cleanup();\n vi.runOnlyPendingTimers();\n vi.useRealTimers();\n};\n\nexport const afterAll = async () => {\n // restore `window.location` etc. to the original `jsdom` `Location` object\n window.localStorage = oldWindowLocalStorage;\n window.location = oldWindowLocation;\n window.sessionStorage = oldWindowSessionStorage;\n React.useEffect.mockRestore();\n vi.unstubAllGlobals();\n};\n\nconst theme = createTheme(light);\n\nconst customRender = (ui, options = {}) => {\n const { preloadedState = { users: { currentSession: { token: mockToken, expiresAt: undefined } } }, ...remainder } = options;\n const store = options.store ?? configureStore({ preloadedState });\n const AllTheProviders = ({ children }) => (\n <ThemeProvider theme={theme}>\n <MemoryRouter>\n <Provider store={store}>{children}</Provider>\n </MemoryRouter>\n </ThemeProvider>\n );\n return { store, ...render(ui, { wrapper: AllTheProviders, ...remainder }) };\n};\n\nexport * from '@testing-library/react';\n// override render method\n\nexport { customRender as render };\n","// Copyright 2020 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport {\n ALL_DEVICES,\n ALL_RELEASES,\n defaultPermissionSets,\n emptyRole,\n emptyUiPermissions,\n maxSessionAge,\n rolesById,\n scopedPermissionAreas,\n uiPermissionsById\n} from '@northern.tech/utils/constants';\n\nexport const undefineds = /undefined|\\[object Object\\]/;\nexport const menderEnvironment = {\n features: {\n hasMultitenancy: true\n },\n integrationVersion: 'saas-123.34',\n menderVersion: 'next',\n metaMenderVersion: 'saas-123.34',\n services: {\n deploymentsVersion: '1.2.3',\n deviceauthVersion: null,\n inventoryVersion: null\n }\n};\nexport const TEST_SESSION_DATETIME = '2019-01-13T13:00:00.000Z';\nconst testDate = new Date(TEST_SESSION_DATETIME);\nexport const mockDate = new Date(testDate.setMilliseconds(testDate.getMilliseconds() + maxSessionAge));\n\nexport const defaultPassword = 'mysecretpassword!123';\nexport const defaultCreationDate = '2019-01-13T06:25:00.000Z';\nexport const defaultMacAddress = 'dc:a6:32:12:ad:bf';\n\nexport const testSsoId = 'sso_id';\n\nconst permissionSetObjectTypes = {\n any: 'Any',\n artifacts: 'Artifacts',\n empty: '',\n groups: 'Device groups',\n releases: 'Releases',\n tenantManagement: 'Tenant management',\n userManagement: 'User management'\n};\n\nconst commonEndpoints = {\n artifacts: '^/api/management/v1/deployments/artifacts',\n artifactDetails: '^/api/management/v1/deployments/artifacts/[^/]+',\n deviceManagement: '^/api/management/(v[1-9])/(devauth|inventory)/'\n};\n\nexport const token =\n 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJjZTNkMGY4Yy1hZWRlLTQwMzAtYjM5MS03ZDUwMjBlYjg3M2UiLCJzdWIiOiJhMzBhNzgwYi1iODQzLTUzNDQtODBlMy0wZmQ5NWE0ZjZmYzMiLCJleHAiOjE2MDY4MTUzNjksImlhdCI6MTYwNjIxMDU2OSwibWVuZGVyLnRlbmFudCI6IjVmODVjMTdiY2U2MmI3ZmE3ZjVmNzA0MCIsIm1lbmRlci51c2VyIjp0cnVlLCJpc3MiOiJNZW5kZXIgVXNlcnMiLCJzY3AiOiJtZW5kZXIuKiIsIm1lbmRlci5wbGFuIjoicHJvZmVzc2lvbmFsIiwibmJmIjoxNjA2MjEwNTY5fQ.qVgYdCzLTf8OdK9uUctqqaY_HWkIiwpekuGvuGQAXCEgOv4bRNDlZRN_ZRSbxQoARG3pquhScbQrjBV9tcF4irTUPlTn3yrsXNO17DpcbTVeKRkb88RDtIKiRw3orVZ_GlIb-ckTQ5dS-Nqlyyf3Fmrhca-gwt6m_xv2UrmJK6eYYTMfggdRRWb-4u7mEkBI_pHPMTQrT8kJ2BeX-vHgazH9AoH0k85LHtFZQXD7pXHlDZRnLxJXukncwMGDmF17374gavYAIyDIzcC8sEBMDnVXgpikeA1sauzirqix6mAVs6XmxdQO7aF0wfXO1_PTYUA3Nk1oQfMYNlEI3U9uLRJRZIq2L8fmrrBryhstKd4y0KlBbGAQrx8NtRkgajjd1ljMfPBUEZrb7uSerVjneiO-aIBO76CuH0zdklphIjpGJeogkBhe8pAYNggp1XsZHgpZfl7IE5faKaDkMGnutaea--Czor6bhqUNCuY4tR0cpQJbNwy6LS9o1CFy4Log';\n\nexport const accessTokens = [\n { id: 'some-id-1', expiration_date: '2022-06-02T11:11:21.725Z', name: 'some-name-1' },\n { id: 'some-id-2', expiration_date: '2022-06-02T11:11:21.725Z', last_used: '2022-06-02T11:05:21.725Z', name: 'some-name-2' }\n];\n\nexport const webhookEvents = [\n {\n id: '1',\n type: 'device-status-changed',\n data: { id: '1', status: 'accepted' },\n time: '2020-09-01T12:00:00.000Z',\n delivery_statuses: [{ integration_id: '1', success: true, status_code: 200 }]\n },\n {\n id: '2',\n type: 'device-status-changed',\n data: { id: '3', status: 'accepted' },\n time: '2020-09-01T12:00:05.000Z',\n delivery_statuses: [{ integration_id: '1', success: true, status_code: 200 }]\n }\n];\nexport const tenants = [\n {\n id: '671a0f1dd58c813118fe8622',\n parent_tenant_id: '6718de64b42e08dea2a2065d',\n name: 'child2',\n tenant_token: 'mQDYRCr-tGbDuJhPp7fArbfTA5htVTWE9G204AzhDUM',\n status: 'active',\n additional_info: {\n marketing: false,\n campaign: ''\n },\n plan: 'enterprise',\n trial: false,\n trial_expiration: null,\n service_provider: false,\n created_at: '2024-10-24T09:10:53.281Z',\n cancelled_at: null,\n children_tenants: null,\n max_child_tenants: 0,\n device_count: 0,\n device_limit: 100,\n binary_delta: true\n }\n];\n\nexport const adminUserCapabilities = {\n canAuditlog: true,\n canConfigure: true,\n canDeploy: true,\n canManageDevices: true,\n canManageReleases: true,\n canManageUsers: true,\n canReadDeployments: true,\n canReadDevices: true,\n canReadReleases: true,\n canReadUsers: true,\n canTroubleshoot: true,\n canUploadReleases: true,\n canWriteDevices: true\n};\n\nexport const userId = 'a30a780b-b843-5344-80e3-0fd95a4f6fc3';\n\nconst defaultUser = {\n created_ts: '2019-01-01T10:30:00.000Z',\n email: 'a@b.com',\n id: 'a1',\n roles: ['RBAC_ROLE_PERMIT_ALL'],\n tfa_status: 'enabled',\n verified: true\n};\n\nconst deviceTypes = { qemu: 'qemux86-64' };\n\nconst checkInTimeRounded = '2019-01-01T00:00:00.000Z';\nconst checkInTimeExact = '2019-01-01T10:25:00.000Z';\n\nexport const mockApiResponses = {\n deployments: {\n byId: {\n d1: {\n id: 'd1',\n name: 'test deployment',\n created: '2019-01-01T12:30:00.000Z',\n devices: {\n a1: {\n id: 'a1',\n status: 'installing',\n attributes: {},\n image: { size: 123 }\n }\n },\n statistics: {\n status: {\n 'already-installed': 0,\n decommissioned: 0,\n downloading: 0,\n failure: 0,\n installing: 1,\n noartifact: 0,\n pending: 0,\n rebooting: 0,\n success: 0\n },\n total_size: 1234\n }\n },\n d2: {\n id: 'd2',\n name: 'test deployment 2',\n artifact_name: 'r1',\n artifacts: ['123'],\n created: '2019-01-01T12:25:00.000Z',\n device_count: 1,\n devices: {\n b1: {\n attributes: {},\n id: 'b1',\n status: 'pending'\n }\n },\n filter: undefined,\n group: undefined,\n statistics: {\n status: {\n downloading: 0,\n decommissioned: 0,\n failure: 0,\n installing: 0,\n noartifact: 0,\n pending: 1,\n rebooting: 0,\n success: 0,\n 'already-installed': 0\n }\n }\n },\n d3: {\n id: 'd3',\n name: 'Test',\n phases: [\n { id: '0', batch_size: 2, device_count: 2 },\n { id: '1', start_ts: '2019-02-04T11:45:10.002Z', batch_size: 3, device_count: 3 },\n { id: '2', start_ts: '2019-02-05T11:45:10.002Z', batch_size: 5, device_count: 5 },\n { id: '3', start_ts: '2019-02-06T11:45:10.002Z', batch_size: 5, device_count: 5 },\n { id: '4', start_ts: '2019-02-21T11:45:10.002Z', batch_size: 5, device_count: 0 }\n ],\n max_devices: 0,\n created: '2019-01-31T12:59:30.020Z',\n devices: {},\n filter: undefined,\n group: undefined,\n stats: {\n pending: 3,\n decommissioned: 0,\n failure: 23,\n pause_before_committing: 0,\n pause_before_rebooting: 0,\n installing: 0,\n rebooting: 0,\n 'already-installed': 0,\n pause_before_installing: 0,\n downloading: 0,\n success: 6,\n aborted: 0,\n noartifact: 0\n },\n statistics: { total_size: '1234' },\n status: 'inprogress',\n active: true,\n device_count: 100,\n retries: '0',\n type: 'software'\n }\n },\n byStatus: {\n pending: { deploymentIds: ['d2'] },\n inprogress: { deploymentIds: ['d3'] }\n }\n },\n devices: {\n byId: {\n a1: {\n id: 'a1',\n auth_sets: [\n {\n id: 'auth1',\n identity_data: { mac: defaultMacAddress },\n pubkey: '-----BEGIN PUBLIC KEY-----\\nMIIBojWELzgJ62hcXIhAfqfoNiaB1326XZByZwcnHr5BuSPAgMBAAE=\\n-----END PUBLIC KEY-----\\n',\n status: 'accepted',\n ts: defaultCreationDate\n }\n ],\n updated_ts: '2019-01-01T09:25:00.000Z'\n },\n b1: {\n id: 'b1',\n attributes: {\n ipv4_wlan0: '192.168.10.141/24',\n device_type: [deviceTypes.qemu]\n },\n system: {\n check_in_time: checkInTimeRounded\n },\n check_in_time: checkInTimeExact,\n check_in_time_exact: checkInTimeExact,\n check_in_time_rounded: checkInTimeRounded,\n identity_data: { mac: defaultMacAddress },\n status: 'accepted',\n decommissioning: false,\n created_ts: defaultCreationDate,\n updated_ts: '2019-01-01T09:25:00.000Z',\n auth_sets: [\n {\n id: 'auth1',\n identity_data: { mac: defaultMacAddress },\n pubkey: '-----BEGIN PUBLIC KEY-----\\nMIIBojWELzgJ62hcXIhAfqfoNiaB1326XZByZwcnHr5BuSPAgMBAAE=\\n-----END PUBLIC KEY-----\\n',\n ts: defaultCreationDate,\n status: 'accepted'\n }\n ]\n }\n },\n groups: {\n byId: {\n testGroup: {\n deviceIds: ['a1', 'b1'],\n filters: [],\n total: 2\n },\n testGroupDynamic: {\n id: 'filter1',\n name: 'filter1',\n filters: [{ scope: 'system', key: 'group', operator: '$eq', value: 'things' }]\n }\n }\n },\n limits: { standard: 500, micro: 0, system: 0 },\n byStatus: {\n accepted: { deviceIds: ['a1', 'b1'], total: 2 },\n active: { deviceIds: [], total: 0 },\n inactive: { deviceIds: [], total: 0 },\n pending: { deviceIds: ['c1'], total: 1 },\n preauthorized: { deviceIds: [], total: 0 },\n rejected: { deviceIds: [], total: 0 }\n }\n },\n organization: {\n organization: {\n id: '1',\n addons: [],\n name: 'test',\n plan: 'os',\n trial: false\n },\n intentId: 'testIntent',\n auditlog: {\n events: [\n {\n actor: {\n id: 'string',\n type: 'user',\n email: 'string@example.com'\n },\n time: '2019-01-01T12:10:22.667Z',\n action: 'create',\n object: {\n id: 'string',\n type: 'user',\n user: {\n email: 'user@acme.com'\n }\n },\n change: 'change1'\n },\n {\n actor: {\n id: 'string',\n type: 'user',\n email: 'string',\n identity_data: 'string'\n },\n time: '2019-01-01T12:16:22.667Z',\n action: 'create',\n object: {\n id: 'string',\n type: 'deployment',\n deployment: {\n name: 'production',\n artifact_name: 'Application 0.0.1'\n }\n },\n change: 'change2'\n },\n {\n actor: {\n id: 'string',\n type: 'user',\n email: 'string@example.com'\n },\n time: '2019-01-01T12:10:22.669Z',\n action: 'open_terminal',\n meta: {\n session_id: ['abd313a8-ee88-48ab-9c99-fbcd80048e6e']\n },\n object: {\n id: 'a1',\n type: 'device'\n },\n change: 'change3'\n }\n ]\n }\n },\n releases: {\n byId: {\n r1: {\n name: 'r1',\n artifacts: [\n {\n id: 'art1',\n description: 'test description',\n device_types_compatible: [deviceTypes.qemu],\n modified: '2020-09-10T12:16:22.667Z',\n updates: [{ type_info: { type: 'testtype' } }],\n artifact_depends: {\n device_type: [deviceTypes.qemu]\n },\n artifact_provides: {\n artifact_name: 'myapp',\n 'data-partition.myapp.version': 'v2020.10',\n list_of_fancy: [deviceTypes.qemu, 'x172']\n },\n clears_artifact_provides: ['data-partition.myapp.*']\n }\n ],\n device_types_compatible: [deviceTypes.qemu],\n modified: '2020-09-10T12:16:22.667Z',\n metaData: {}\n }\n }\n },\n users: {\n byId: {\n a1: defaultUser,\n [userId]: { ...defaultUser, id: userId, email: 'a2@b.com', created_ts: '2019-01-01T12:30:00.000Z' }\n },\n rolesById: {\n admin: {\n name: 'admin',\n description: 'Administrator role',\n permissions: []\n },\n test: { name: 'test', description: 'test description', permissions: [] }\n },\n globalSettings: {\n '2fa': 'enabled',\n id_attribute: undefined,\n previousFilters: []\n },\n userSettings: {\n '2fa': 'disabled',\n columnSelection: [],\n onboarding: { something: 'here' },\n tooltips: {},\n previousFilters: []\n }\n }\n};\n\nexport const releasesList = Array.from({ length: 5000 }, (x, i) => ({\n artifacts: [\n {\n id: 'art1',\n description: 'test description',\n device_types_compatible: [deviceTypes.qemu],\n modified: '2020-09-10T12:16:22.667Z',\n updates: [{ type_info: { type: 'testtype' } }],\n artifact_depends: {\n device_type: [deviceTypes.qemu]\n },\n artifact_provides: {\n artifact_name: 'myapp',\n 'data-partition.myapp.version': 'v2020.10',\n list_of_fancy: [deviceTypes.qemu, 'x172']\n },\n clears_artifact_provides: ['data-partition.myapp.*']\n }\n ],\n device_types_compatible: [deviceTypes.qemu],\n metaData: {},\n name: `release-${i + 1}`,\n modified: i\n}));\n\nexport const permissionSets = [\n {\n ...defaultPermissionSets.Basic,\n object: permissionSetObjectTypes.empty,\n description: 'Set containing basic permissions.',\n permissions: [\n { action: 'http', object: { type: 'any', value: '^/api/management/v1/useradm/settings$' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/v1/useradm/users/me$' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/1.0/auth/verify$' } },\n { action: 'http', object: { type: 'PUT', value: '^/api/management/v1/useradm/2faverify$' } },\n { action: 'http', object: { type: 'POST', value: '^/api/management/v1/useradm/users/me/2fa/(enable|disable)$' } },\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9])/useradm/roles' } },\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9])/tenantadm/user/tenant' } }\n ]\n },\n {\n ...defaultPermissionSets.ManageReleases,\n action: uiPermissionsById.manage.title,\n object: permissionSetObjectTypes.releases,\n description: 'Set of permissions which allows user to manage releases',\n permissions: [\n { action: 'http', object: { type: 'GET', value: commonEndpoints.artifacts } },\n { action: 'http', object: { type: 'GET', value: commonEndpoints.artifactDetails } },\n { action: 'http', object: { type: 'PUT', value: commonEndpoints.artifactDetails } },\n { action: 'http', object: { type: 'DELETE', value: commonEndpoints.artifactDetails } },\n { action: 'http', object: { type: 'GET', value: '^/api/management/v1/deployments/artifacts/[^/]+/download' } }\n ]\n },\n {\n ...defaultPermissionSets.ReadUsers,\n action: uiPermissionsById.read.title,\n object: permissionSetObjectTypes.userManagement,\n description: 'Set of permissions which allows user to view other users',\n permissions: [{ action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9])/useradm/' } }]\n },\n {\n ...defaultPermissionSets.ManageUsers,\n action: uiPermissionsById.manage.title,\n object: permissionSetObjectTypes.userManagement,\n description: 'Set of permissions which allows user manage other user accounts',\n permissions: [{ action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/useradm/' } }]\n },\n {\n ...defaultPermissionSets.ReadTenants,\n action: uiPermissionsById.read.title,\n object: permissionSetObjectTypes.tenantManagement,\n description: 'Set of permissions which allows user to list other tenants and their config',\n permissions: [\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9])/tenantadm/' } },\n { action: 'http', object: { type: 'POST', value: '^/api/management/(v[1-9])/tenantadm/' } }\n ]\n },\n {\n ...defaultPermissionSets.ManageTenants,\n action: uiPermissionsById.manage.title,\n object: permissionSetObjectTypes.tenantManagement,\n description: 'Set of permissions which allows user to manage other tenants and their config',\n permissions: [\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9])/tenantadm/' } },\n { action: 'http', object: { type: 'POST', value: '^/api/management/(v[1-9])/tenantadm/' } },\n { action: 'http', object: { type: 'PUT', value: '^/api/management/(v[1-9])/tenantadm/' } }\n ]\n },\n {\n ...defaultPermissionSets.ReadAuditLogs,\n action: uiPermissionsById.read.title,\n object: 'System Audit Log',\n description: 'Set of permissions which allows user to view system audit log',\n permissions: [{ action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9]|0.1.0)/auditlogs/logs' } }]\n },\n {\n ...defaultPermissionSets.DeployToDevices,\n action: 'Deploy',\n object: permissionSetObjectTypes.groups,\n description: 'Set of permissions which allows user to deploy to devices',\n permissions: [{ action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/(deployments|deviceconfig)/' } }],\n supported_scope_types: [scopedPermissionAreas.groups.scopeType]\n },\n {\n ...defaultPermissionSets.ConfigureDevices,\n action: 'Configure',\n object: permissionSetObjectTypes.groups,\n description: 'Set of permissions which allows user to manage configuration of the devices',\n permissions: [{ action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deviceconfig/' } }],\n supported_scope_types: [scopedPermissionAreas.groups.scopeType]\n },\n {\n ...defaultPermissionSets.ConnectToDevices,\n action: 'Connect',\n object: permissionSetObjectTypes.groups,\n description: 'Set of permissions which allows user to use remote terminal and file transfer',\n permissions: [\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9]|0.1.0)/deviceconnect/devices/[^/]+/connect$' } },\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9]|0.1.0)/deviceconnect/devices/[^/]+/download\\\\?path=[^\\u0026]+$' } },\n { action: 'http', object: { type: 'PUT', value: '^/api/management/(v[1-9]|0.1.0)/deviceconnect/devices/[^/]+/upload$' } }\n ],\n supported_scope_types: [scopedPermissionAreas.groups.scopeType]\n },\n {\n ...defaultPermissionSets.SuperUser,\n action: 'Any',\n object: permissionSetObjectTypes.any,\n description: 'Set of permissions which allows user to do anything',\n permissions: [{ action: 'any', object: { type: 'any', value: 'any' } }]\n },\n {\n ...defaultPermissionSets.UploadArtifacts,\n action: 'Upload',\n object: permissionSetObjectTypes.artifacts,\n description: 'Set of permissions which allows user to upload artifacts',\n permissions: [\n { action: 'http', object: { type: 'POST', value: commonEndpoints.artifacts } },\n { action: 'http', object: { type: 'POST', value: '^/api/management/v1/deployments/artifacts/generate' } }\n ]\n },\n {\n ...defaultPermissionSets.ReadDevices,\n action: uiPermissionsById.read.title,\n object: permissionSetObjectTypes.groups,\n description: 'Set of permissions which allows user to view devices',\n permissions: [\n { action: 'http', object: { type: 'POST', value: '^/api/management/v2/inventory/filters/search' } },\n { action: 'http', object: { type: 'POST', value: '^/api/management/v1/reporting/devices/search' } },\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9])/(deployments|devauth|inventory|deviceconfig|devicemonitor)/' } },\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9]|0.1.0)/deviceconnect/devices/[^/]+$' } }\n ],\n supported_scope_types: [scopedPermissionAreas.groups.scopeType]\n },\n {\n ...defaultPermissionSets.ManageDevices,\n action: uiPermissionsById.manage.title,\n object: permissionSetObjectTypes.groups,\n description: 'Set of permissions which allows user to manage devices',\n permissions: [\n { action: 'http', object: { type: 'POST', value: commonEndpoints.deviceManagement } },\n { action: 'http', object: { type: 'PUT', value: commonEndpoints.deviceManagement } },\n { action: 'http', object: { type: 'DELETE', value: commonEndpoints.deviceManagement } }\n ],\n supported_scope_types: [scopedPermissionAreas.groups.scopeType]\n },\n {\n ...defaultPermissionSets.ReadReleases,\n action: uiPermissionsById.read.title,\n object: permissionSetObjectTypes.releases,\n description: 'Set of permissions which allows user to view releases',\n permissions: [\n { action: 'http', object: { type: 'GET', value: commonEndpoints.artifacts } },\n { action: 'http', object: { type: 'GET', value: commonEndpoints.artifactDetails } },\n { action: 'http', object: { type: 'GET', value: '^/api/management/v1/deployments/artifacts/[^/]+/download' } }\n ]\n },\n {\n name: 'almostAdmin',\n object: permissionSetObjectTypes.empty,\n description: 'Set containing all the permissions.',\n permissions: [\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/auditlogs/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deployments/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deployments/config/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deployments/deployments/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deployments/deployments/releases/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/devauth/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deviceconfig/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deviceconnect/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deviceconnect/devices' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/inventory/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/iot-manager/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/monitor/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/useradm/.*' } }\n ]\n }\n];\n\nexport const rbacRoles = [\n {\n name: 'dyn',\n description: '',\n permissions: [\n { action: 'CREATE_DEPLOYMENT', object: { type: 'DEVICE_GROUP', value: 'dyn' } },\n { action: 'VIEW_DEVICE', object: { type: 'DEVICE_GROUP', value: 'dyn' } }\n ]\n },\n { name: 'asdasd', description: '123', permissions: [{ action: 'http', object: { type: 'any', value: '/api/management/v1/useradm/.*' } }] },\n {\n name: '141sasd',\n description: '1313adg',\n permission_sets_with_scope: [\n { ...defaultPermissionSets.ReadDevices, scope: { type: scopedPermissionAreas.groups.scopeType, value: ['bestgroup'] } },\n { ...defaultPermissionSets.ConnectToDevices, scope: { type: scopedPermissionAreas.groups.scopeType, value: ['bestgroup'] } },\n { ...defaultPermissionSets.ManageUsers }\n ]\n },\n {\n name: 'kljlkk',\n description: 'lkl',\n permission_sets_with_scope: [{ ...defaultPermissionSets.ConnectToDevices, scope: { type: scopedPermissionAreas.groups.scopeType, value: ['bestgroup'] } }]\n },\n {\n name: 'yyyyy',\n description: 'asd',\n permission_sets_with_scope: [\n { ...defaultPermissionSets.ManageDevices, scope: { type: scopedPermissionAreas.groups.scopeType, value: ['dockerclient'] } },\n { ...defaultPermissionSets.ManageReleases }\n ]\n },\n {\n name: 'RBAC_ROLE_DEPLOYMENTS_MANAGER',\n description: 'Intended for users responsible for managing deployments, this role can create and abort deployments',\n permission_sets_with_scope: [{ ...defaultPermissionSets.DeployToDevices }]\n },\n {\n name: 'RBAC_ROLE_REMOTE_TERMINAL',\n description: `Intended for tech support accounts, this role can access the devices' Remote Terminal.`,\n permission_sets_with_scope: [{ ...defaultPermissionSets.ConnectToDevices }]\n },\n { name: 'RBAC_ROLE_PERMIT_ALL', description: '', permission_sets_with_scope: [{ ...defaultPermissionSets.SuperUser }] },\n {\n name: 'RBAC_ROLE_OBSERVER',\n description:\n 'Intended for team leaders or limited tech support accounts, this role can see all Devices, Artifacts and Deployment reports but not make any changes.',\n permission_sets_with_scope: [{ ...defaultPermissionSets.ReadReleases }, { ...defaultPermissionSets.ReadDevices }]\n },\n {\n name: 'RBAC_ROLE_CI',\n description:\n 'Intended for automation accounts building software (e.g. CI/CD systems), this role can only manage Artifacts, including upload new Artifacts and delete Artifacts. It does not have access to Devices or Deployments.',\n permission_sets_with_scope: [\n { ...defaultPermissionSets.ReadReleases },\n { ...defaultPermissionSets.ManageReleases },\n { ...defaultPermissionSets.UploadArtifacts }\n ]\n },\n {\n name: 'almostAdmin',\n description: 'almost admin rights',\n permissions: permissionSets.find(item => item.name === 'almostAdmin')?.permissions\n },\n {\n name: 'almostAdminNew',\n description: 'almost admin rights',\n permission_sets_with_scope: Object.values(defaultPermissionSets)\n }\n];\n\nconst expectedParsedRoles = {\n '141sasd': {\n editable: true,\n isCustom: undefined,\n uiPermissions: {\n ...emptyUiPermissions,\n groups: { bestgroup: [uiPermissionsById.read.value, uiPermissionsById.connect.value] },\n userManagement: [uiPermissionsById.manage.value]\n }\n },\n asdasd: {\n editable: false,\n isCustom: true,\n uiPermissions: { ...emptyUiPermissions, userManagement: [uiPermissionsById.read.value, uiPermissionsById.manage.value] }\n },\n dyn: {\n editable: false,\n isCustom: true,\n uiPermissions: {\n ...emptyUiPermissions,\n deployments: [uiPermissionsById.deploy.value],\n groups: { dyn: [uiPermissionsById.read.value, uiPermissionsById.deploy.value] }\n }\n },\n kljlkk: {\n editable: true,\n isCustom: false,\n uiPermissions: { ...emptyUiPermissions, groups: { bestgroup: [uiPermissionsById.read.value, uiPermissionsById.connect.value] } }\n },\n yyyyy: {\n editable: true,\n isCustom: undefined,\n uiPermissions: {\n ...emptyUiPermissions,\n groups: { dockerclient: [uiPermissionsById.read.value, uiPermissionsById.manage.value] },\n releases: { [ALL_RELEASES]: [uiPermissionsById.manage.value] }\n }\n },\n almostAdmin: {\n editable: false,\n isCustom: true,\n uiPermissions: {\n ...emptyUiPermissions,\n auditlog: [uiPermissionsById.read.value],\n deployments: [uiPermissionsById.manage.value, uiPermissionsById.deploy.value, uiPermissionsById.read.value],\n groups: {\n [ALL_DEVICES]: [\n uiPermissionsById.read.value,\n // we can't assign deployment permissions to devices here, since the old path based rbac controls don't allow the scoped permissions\n // uiPermissionsById.deploy.value,\n uiPermissionsById.manage.value,\n uiPermissionsById.connect.value,\n uiPermissionsById.configure.value\n ]\n },\n releases: {\n [ALL_RELEASES]: [uiPermissionsById.read.value, uiPermissionsById.upload.value, uiPermissionsById.manage.value]\n },\n userManagement: [uiPermissionsById.read.value, uiPermissionsById.manage.value]\n }\n },\n almostAdminNew: {\n editable: true,\n isCustom: undefined,\n uiPermissions: {\n ...emptyUiPermissions,\n auditlog: [uiPermissionsById.read.value],\n deployments: [uiPermissionsById.read.value, uiPermissionsById.deploy.value, uiPermissionsById.manage.value],\n groups: {\n [ALL_DEVICES]: [\n uiPermissionsById.read.value,\n uiPermissionsById.manage.value,\n uiPermissionsById.deploy.value,\n uiPermissionsById.connect.value,\n uiPermissionsById.configure.value\n ]\n },\n releases: {\n [ALL_RELEASES]: [uiPermissionsById.manage.value, uiPermissionsById.upload.value, uiPermissionsById.read.value]\n },\n tenantManagement: [uiPermissionsById.read.value, uiPermissionsById.manage.value],\n userManagement: [uiPermissionsById.read.value, uiPermissionsById.manage.value]\n }\n }\n};\n\nconst defaultRolesById = {\n ...rolesById,\n test: {\n ...emptyRole,\n name: 'test',\n description: 'test description',\n editable: true,\n uiPermissions: {\n ...emptyUiPermissions,\n groups: { testGroup: [uiPermissionsById.read.value] },\n releases: { bar: [uiPermissionsById.read.value] }\n }\n }\n};\n\nexport const receivedRoles = rbacRoles.reduce(\n (accu, role) => {\n const { name, description, ...roleRemainder } = role;\n if (name.startsWith('RBAC')) {\n accu[name] = {\n ...defaultRolesById[name],\n ...roleRemainder,\n editable: false,\n isCustom: false,\n description: defaultRolesById[name].description ? defaultRolesById[name].description : description\n };\n } else {\n const result = expectedParsedRoles[name] ?? {};\n accu[name] = {\n ...emptyRole,\n ...role,\n ...result,\n name\n };\n }\n return accu;\n },\n { ...defaultRolesById }\n);\n\nexport const receivedPermissionSets = permissionSets.reduce((accu, set) => {\n const result = defaultPermissionSets[set.name]?.result ?? {};\n accu[set.name] = {\n ...set,\n result: {\n ...emptyUiPermissions,\n ...result\n }\n };\n return accu;\n}, {});\n","// Copyright 2022 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nconst palette = {\n border: {\n main: '#e3e3e3'\n },\n tooltip: {\n tierTipBackground: '#f7fafb'\n }\n};\n\nexport const light = {\n palette\n};\n"],"mappings":"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","names":["import_react","React"]}
1
+ {"version":3,"sources":["../src/setupTests.tsx","../src/mockData.ts","../src/utils.tsx","../src/theme/light.ts"],"sourcesContent":["// Copyright 2025 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//@ts-nocheck\nimport React from 'react';\nimport { Provider } from 'react-redux';\nimport { MemoryRouter } from 'react-router-dom';\n\nimport { createSerializer } from '@emotion/jest';\nimport { ThemeProvider, createTheme } from '@mui/material/styles';\n\nimport { yes } from '@northern.tech/utils/helpers';\nimport { configureStore } from '@reduxjs/toolkit';\nimport { cleanup, render } from '@testing-library/react';\nimport { expect, vi } from 'vitest';\nimport { MessageChannel } from 'worker_threads';\n\nimport { menderEnvironment, mockDate, token as mockToken } from './mockData';\nimport { theme } from './utils';\n\nexpect.addSnapshotSerializer(createSerializer({ includeStyles: true }));\n\nexport const TEST_LOCATION = 'localhost';\n\nexport const mockAbortController: { abort: () => void; signal: { addEventListener: () => void; removeEventListener: () => void } } = {\n abort: vi.fn(),\n signal: { addEventListener: () => {}, removeEventListener: () => {} }\n};\n\nconst oldWindowLocalStorage = window.localStorage;\nconst oldWindowLocation = window.location;\nconst oldWindowSessionStorage = window.sessionStorage;\n\nvi.mock('uuid', () => ({ v4: () => 'mock-uuid' }));\n\nconst storage = {};\nglobal.HTMLCanvasElement.prototype.getContext = vi.fn();\n\nexport const beforeAll = async () => {\n // Temporarily workaround for bug in @testing-library/react when use user-event with `vi.useFakeTimers()`\n\n // Enable the mocking in tests.\n delete window.location;\n window.location = {\n ...oldWindowLocation,\n hostname: TEST_LOCATION,\n origin: 'http://localhost',\n assign: vi.fn(),\n replace: vi.fn(),\n reload: vi.fn()\n };\n delete window.sessionStorage;\n window.sessionStorage = {\n ...oldWindowSessionStorage,\n getItem: vi.fn(yes),\n setItem: vi.fn(),\n removeItem: vi.fn()\n };\n delete window.localStorage;\n window.localStorage = {\n ...oldWindowLocalStorage,\n getItem: vi.fn(name => {\n if (name === 'JWT') {\n return JSON.stringify({ token: mockToken });\n }\n return storage[name];\n }),\n setItem: vi.fn(name => storage[name]),\n removeItem: vi.fn()\n };\n window.mender_environment = menderEnvironment;\n window.ENV = 'test';\n global.AbortController = vi.fn().mockImplementation(function () {\n return mockAbortController;\n });\n global.MessageChannel = MessageChannel;\n global.ResizeObserver = vi.fn().mockImplementation(function () {\n return {\n observe: vi.fn(),\n unobserve: vi.fn(),\n disconnect: vi.fn()\n };\n });\n window.RTCPeerConnection = () => ({\n createOffer: () => {},\n setLocalDescription: () => {},\n createDataChannel: () => {}\n });\n\n Object.defineProperty(navigator, 'appVersion', { value: 'Test', writable: true });\n const intersectionObserverMock = function () {\n return {\n observe: vi.fn(),\n disconnect: vi.fn()\n };\n };\n window.prompt = vi.fn();\n window.IntersectionObserver = vi.fn().mockImplementation(intersectionObserverMock);\n vi.spyOn(React, 'useEffect').mockImplementation(React.useLayoutEffect);\n\n //TODO: remove, once https://github.com/testing-library/react-testing-library/issues/1197 resolved\n const _jest = globalThis.jest;\n\n globalThis.jest = {\n ...globalThis.jest\n };\n\n vi.stubGlobal('jest', {\n advanceTimersByTime: vi.advanceTimersByTime.bind(vi)\n });\n return () => void (globalThis.jest = _jest);\n};\n\nexport const beforeEach = () => {\n vi.useFakeTimers({ now: mockDate });\n vi.setSystemTime(mockDate);\n};\n\nexport const afterEach = async () => {\n cleanup();\n vi.runOnlyPendingTimers();\n vi.useRealTimers();\n};\n\nexport const afterAll = async () => {\n // restore `window.location` etc. to the original `jsdom` `Location` object\n window.localStorage = oldWindowLocalStorage;\n window.location = oldWindowLocation;\n window.sessionStorage = oldWindowSessionStorage;\n React.useEffect.mockRestore();\n vi.unstubAllGlobals();\n};\n\nconst customRender = (ui, options = {}) => {\n const { preloadedState = { users: { currentSession: { token: mockToken, expiresAt: undefined } } }, ...remainder } = options;\n const store = options.store ?? configureStore({ preloadedState });\n const AllTheProviders = ({ children }) => (\n <ThemeProvider theme={theme}>\n <MemoryRouter>\n <Provider store={store}>{children}</Provider>\n </MemoryRouter>\n </ThemeProvider>\n );\n return { store, ...render(ui, { wrapper: AllTheProviders, ...remainder }) };\n};\n\nexport * from '@testing-library/react';\n// override render method\n\nexport { customRender as render };\n","// Copyright 2020 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport {\n ALL_DEVICES,\n ALL_RELEASES,\n defaultPermissionSets,\n emptyRole,\n emptyUiPermissions,\n maxSessionAge,\n rolesById,\n scopedPermissionAreas,\n uiPermissionsById\n} from '@northern.tech/utils/constants';\n\nexport const undefineds = /undefined|\\[object Object\\]/;\nexport const menderEnvironment = {\n features: {\n hasMultitenancy: true\n },\n integrationVersion: 'saas-123.34',\n menderVersion: 'next',\n metaMenderVersion: 'saas-123.34',\n services: {\n deploymentsVersion: '1.2.3',\n deviceauthVersion: null,\n inventoryVersion: null\n }\n};\nexport const TEST_SESSION_DATETIME = '2019-01-13T13:00:00.000Z';\nconst testDate = new Date(TEST_SESSION_DATETIME);\nexport const mockDate = new Date(testDate.setMilliseconds(testDate.getMilliseconds() + maxSessionAge));\n\nexport const defaultPassword = 'mysecretpassword!123';\nexport const defaultCreationDate = '2019-01-13T06:25:00.000Z';\nexport const defaultMacAddress = 'dc:a6:32:12:ad:bf';\n\nexport const testSsoId = 'sso_id';\n\nconst permissionSetObjectTypes = {\n any: 'Any',\n artifacts: 'Artifacts',\n empty: '',\n groups: 'Device groups',\n releases: 'Releases',\n tenantManagement: 'Tenant management',\n userManagement: 'User management'\n};\n\nconst commonEndpoints = {\n artifacts: '^/api/management/v1/deployments/artifacts',\n artifactDetails: '^/api/management/v1/deployments/artifacts/[^/]+',\n deviceManagement: '^/api/management/(v[1-9])/(devauth|inventory)/'\n};\n\nexport const token =\n 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJjZTNkMGY4Yy1hZWRlLTQwMzAtYjM5MS03ZDUwMjBlYjg3M2UiLCJzdWIiOiJhMzBhNzgwYi1iODQzLTUzNDQtODBlMy0wZmQ5NWE0ZjZmYzMiLCJleHAiOjE2MDY4MTUzNjksImlhdCI6MTYwNjIxMDU2OSwibWVuZGVyLnRlbmFudCI6IjVmODVjMTdiY2U2MmI3ZmE3ZjVmNzA0MCIsIm1lbmRlci51c2VyIjp0cnVlLCJpc3MiOiJNZW5kZXIgVXNlcnMiLCJzY3AiOiJtZW5kZXIuKiIsIm1lbmRlci5wbGFuIjoicHJvZmVzc2lvbmFsIiwibmJmIjoxNjA2MjEwNTY5fQ.qVgYdCzLTf8OdK9uUctqqaY_HWkIiwpekuGvuGQAXCEgOv4bRNDlZRN_ZRSbxQoARG3pquhScbQrjBV9tcF4irTUPlTn3yrsXNO17DpcbTVeKRkb88RDtIKiRw3orVZ_GlIb-ckTQ5dS-Nqlyyf3Fmrhca-gwt6m_xv2UrmJK6eYYTMfggdRRWb-4u7mEkBI_pHPMTQrT8kJ2BeX-vHgazH9AoH0k85LHtFZQXD7pXHlDZRnLxJXukncwMGDmF17374gavYAIyDIzcC8sEBMDnVXgpikeA1sauzirqix6mAVs6XmxdQO7aF0wfXO1_PTYUA3Nk1oQfMYNlEI3U9uLRJRZIq2L8fmrrBryhstKd4y0KlBbGAQrx8NtRkgajjd1ljMfPBUEZrb7uSerVjneiO-aIBO76CuH0zdklphIjpGJeogkBhe8pAYNggp1XsZHgpZfl7IE5faKaDkMGnutaea--Czor6bhqUNCuY4tR0cpQJbNwy6LS9o1CFy4Log';\n\nexport const accessTokens = [\n { id: 'some-id-1', expiration_date: '2022-06-02T11:11:21.725Z', name: 'some-name-1' },\n { id: 'some-id-2', expiration_date: '2022-06-02T11:11:21.725Z', last_used: '2022-06-02T11:05:21.725Z', name: 'some-name-2' }\n];\n\nexport const webhookEvents = [\n {\n id: '1',\n type: 'device-status-changed',\n data: { id: '1', status: 'accepted' },\n time: '2020-09-01T12:00:00.000Z',\n delivery_statuses: [{ integration_id: '1', success: true, status_code: 200 }]\n },\n {\n id: '2',\n type: 'device-status-changed',\n data: { id: '3', status: 'accepted' },\n time: '2020-09-01T12:00:05.000Z',\n delivery_statuses: [{ integration_id: '1', success: true, status_code: 200 }]\n }\n];\nexport const tenants = [\n {\n id: '671a0f1dd58c813118fe8622',\n parent_tenant_id: '6718de64b42e08dea2a2065d',\n name: 'child2',\n tenant_token: 'mQDYRCr-tGbDuJhPp7fArbfTA5htVTWE9G204AzhDUM',\n status: 'active',\n additional_info: {\n marketing: false,\n campaign: ''\n },\n plan: 'enterprise',\n trial: false,\n trial_expiration: null,\n service_provider: false,\n created_at: '2024-10-24T09:10:53.281Z',\n cancelled_at: null,\n children_tenants: null,\n max_child_tenants: 0,\n device_count: 0,\n device_limit: 100,\n binary_delta: true\n }\n];\n\nexport const adminUserCapabilities = {\n canAuditlog: true,\n canConfigure: true,\n canDeploy: true,\n canManageDevices: true,\n canManageReleases: true,\n canManageUsers: true,\n canReadDeployments: true,\n canReadDevices: true,\n canReadReleases: true,\n canReadUsers: true,\n canTroubleshoot: true,\n canUploadReleases: true,\n canWriteDevices: true\n};\n\nexport const userId = 'a30a780b-b843-5344-80e3-0fd95a4f6fc3';\n\nconst defaultUser = {\n created_ts: '2019-01-01T10:30:00.000Z',\n email: 'a@b.com',\n id: 'a1',\n roles: ['RBAC_ROLE_PERMIT_ALL'],\n tfa_status: 'enabled',\n verified: true\n};\n\nconst deviceTypes = { qemu: 'qemux86-64' };\n\nconst checkInTimeRounded = '2019-01-01T00:00:00.000Z';\nconst checkInTimeExact = '2019-01-01T10:25:00.000Z';\n\nexport const mockApiResponses = {\n deployments: {\n byId: {\n d1: {\n id: 'd1',\n name: 'test deployment',\n created: '2019-01-01T12:30:00.000Z',\n devices: {\n a1: {\n id: 'a1',\n status: 'installing',\n attributes: {},\n image: { size: 123 }\n }\n },\n statistics: {\n status: {\n 'already-installed': 0,\n decommissioned: 0,\n downloading: 0,\n failure: 0,\n installing: 1,\n noartifact: 0,\n pending: 0,\n rebooting: 0,\n success: 0\n },\n total_size: 1234\n }\n },\n d2: {\n id: 'd2',\n name: 'test deployment 2',\n artifact_name: 'r1',\n artifacts: ['123'],\n created: '2019-01-01T12:25:00.000Z',\n device_count: 1,\n devices: {\n b1: {\n attributes: {},\n id: 'b1',\n status: 'pending'\n }\n },\n filter: undefined,\n group: undefined,\n statistics: {\n status: {\n downloading: 0,\n decommissioned: 0,\n failure: 0,\n installing: 0,\n noartifact: 0,\n pending: 1,\n rebooting: 0,\n success: 0,\n 'already-installed': 0\n }\n }\n },\n d3: {\n id: 'd3',\n name: 'Test',\n phases: [\n { id: '0', batch_size: 2, device_count: 2 },\n { id: '1', start_ts: '2019-02-04T11:45:10.002Z', batch_size: 3, device_count: 3 },\n { id: '2', start_ts: '2019-02-05T11:45:10.002Z', batch_size: 5, device_count: 5 },\n { id: '3', start_ts: '2019-02-06T11:45:10.002Z', batch_size: 5, device_count: 5 },\n { id: '4', start_ts: '2019-02-21T11:45:10.002Z', batch_size: 5, device_count: 0 }\n ],\n max_devices: 0,\n created: '2019-01-31T12:59:30.020Z',\n devices: {},\n filter: undefined,\n group: undefined,\n stats: {\n pending: 3,\n decommissioned: 0,\n failure: 23,\n pause_before_committing: 0,\n pause_before_rebooting: 0,\n installing: 0,\n rebooting: 0,\n 'already-installed': 0,\n pause_before_installing: 0,\n downloading: 0,\n success: 6,\n aborted: 0,\n noartifact: 0\n },\n statistics: { total_size: '1234' },\n status: 'inprogress',\n active: true,\n device_count: 100,\n retries: '0',\n type: 'software'\n }\n },\n byStatus: {\n pending: { deploymentIds: ['d2'] },\n inprogress: { deploymentIds: ['d3'] }\n }\n },\n devices: {\n byId: {\n a1: {\n id: 'a1',\n auth_sets: [\n {\n id: 'auth1',\n identity_data: { mac: defaultMacAddress },\n pubkey: '-----BEGIN PUBLIC KEY-----\\nMIIBojWELzgJ62hcXIhAfqfoNiaB1326XZByZwcnHr5BuSPAgMBAAE=\\n-----END PUBLIC KEY-----\\n',\n status: 'accepted',\n ts: defaultCreationDate\n }\n ],\n updated_ts: '2019-01-01T09:25:00.000Z'\n },\n b1: {\n id: 'b1',\n attributes: {\n ipv4_wlan0: '192.168.10.141/24',\n device_type: [deviceTypes.qemu]\n },\n system: {\n check_in_time: checkInTimeRounded\n },\n check_in_time: checkInTimeExact,\n check_in_time_exact: checkInTimeExact,\n check_in_time_rounded: checkInTimeRounded,\n identity_data: { mac: defaultMacAddress },\n status: 'accepted',\n decommissioning: false,\n created_ts: defaultCreationDate,\n updated_ts: '2019-01-01T09:25:00.000Z',\n auth_sets: [\n {\n id: 'auth1',\n identity_data: { mac: defaultMacAddress },\n pubkey: '-----BEGIN PUBLIC KEY-----\\nMIIBojWELzgJ62hcXIhAfqfoNiaB1326XZByZwcnHr5BuSPAgMBAAE=\\n-----END PUBLIC KEY-----\\n',\n ts: defaultCreationDate,\n status: 'accepted'\n }\n ]\n }\n },\n groups: {\n byId: {\n testGroup: {\n deviceIds: ['a1', 'b1'],\n filters: [],\n total: 2\n },\n testGroupDynamic: {\n id: 'filter1',\n name: 'filter1',\n filters: [{ scope: 'system', key: 'group', operator: '$eq', value: 'things' }]\n }\n }\n },\n limits: { standard: 500, micro: 0, system: 0 },\n byStatus: {\n accepted: { deviceIds: ['a1', 'b1'], total: 2 },\n active: { deviceIds: [], total: 0 },\n inactive: { deviceIds: [], total: 0 },\n pending: { deviceIds: ['c1'], total: 1 },\n preauthorized: { deviceIds: [], total: 0 },\n rejected: { deviceIds: [], total: 0 }\n }\n },\n organization: {\n organization: {\n id: '1',\n addons: [],\n name: 'test',\n plan: 'os',\n trial: false\n },\n intentId: 'testIntent',\n auditlog: {\n events: [\n {\n actor: {\n id: 'string',\n type: 'user',\n email: 'string@example.com'\n },\n time: '2019-01-01T12:10:22.667Z',\n action: 'create',\n object: {\n id: 'string',\n type: 'user',\n user: {\n email: 'user@acme.com'\n }\n },\n change: 'change1'\n },\n {\n actor: {\n id: 'string',\n type: 'user',\n email: 'string',\n identity_data: 'string'\n },\n time: '2019-01-01T12:16:22.667Z',\n action: 'create',\n object: {\n id: 'string',\n type: 'deployment',\n deployment: {\n name: 'production',\n artifact_name: 'Application 0.0.1'\n }\n },\n change: 'change2'\n },\n {\n actor: {\n id: 'string',\n type: 'user',\n email: 'string@example.com'\n },\n time: '2019-01-01T12:10:22.669Z',\n action: 'open_terminal',\n meta: {\n session_id: ['abd313a8-ee88-48ab-9c99-fbcd80048e6e']\n },\n object: {\n id: 'a1',\n type: 'device'\n },\n change: 'change3'\n }\n ]\n }\n },\n releases: {\n byId: {\n r1: {\n name: 'r1',\n artifacts: [\n {\n id: 'art1',\n description: 'test description',\n device_types_compatible: [deviceTypes.qemu],\n modified: '2020-09-10T12:16:22.667Z',\n updates: [{ type_info: { type: 'testtype' } }],\n artifact_depends: {\n device_type: [deviceTypes.qemu]\n },\n artifact_provides: {\n artifact_name: 'myapp',\n 'data-partition.myapp.version': 'v2020.10',\n list_of_fancy: [deviceTypes.qemu, 'x172']\n },\n clears_artifact_provides: ['data-partition.myapp.*']\n }\n ],\n device_types_compatible: [deviceTypes.qemu],\n modified: '2020-09-10T12:16:22.667Z',\n metaData: {}\n }\n }\n },\n users: {\n byId: {\n a1: defaultUser,\n [userId]: { ...defaultUser, id: userId, email: 'a2@b.com', created_ts: '2019-01-01T12:30:00.000Z' }\n },\n rolesById: {\n admin: {\n name: 'admin',\n description: 'Administrator role',\n permissions: []\n },\n test: { name: 'test', description: 'test description', permissions: [] }\n },\n globalSettings: {\n '2fa': 'enabled',\n id_attribute: undefined,\n previousFilters: []\n },\n userSettings: {\n '2fa': 'disabled',\n columnSelection: [],\n onboarding: { something: 'here' },\n tooltips: {},\n previousFilters: []\n }\n }\n};\n\nexport const releasesList = Array.from({ length: 5000 }, (x, i) => ({\n artifacts: [\n {\n id: 'art1',\n description: 'test description',\n device_types_compatible: [deviceTypes.qemu],\n modified: '2020-09-10T12:16:22.667Z',\n updates: [{ type_info: { type: 'testtype' } }],\n artifact_depends: {\n device_type: [deviceTypes.qemu]\n },\n artifact_provides: {\n artifact_name: 'myapp',\n 'data-partition.myapp.version': 'v2020.10',\n list_of_fancy: [deviceTypes.qemu, 'x172']\n },\n clears_artifact_provides: ['data-partition.myapp.*']\n }\n ],\n device_types_compatible: [deviceTypes.qemu],\n metaData: {},\n name: `release-${i + 1}`,\n modified: i\n}));\n\nexport const permissionSets = [\n {\n ...defaultPermissionSets.Basic,\n object: permissionSetObjectTypes.empty,\n description: 'Set containing basic permissions.',\n permissions: [\n { action: 'http', object: { type: 'any', value: '^/api/management/v1/useradm/settings$' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/v1/useradm/users/me$' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/1.0/auth/verify$' } },\n { action: 'http', object: { type: 'PUT', value: '^/api/management/v1/useradm/2faverify$' } },\n { action: 'http', object: { type: 'POST', value: '^/api/management/v1/useradm/users/me/2fa/(enable|disable)$' } },\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9])/useradm/roles' } },\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9])/tenantadm/user/tenant' } }\n ]\n },\n {\n ...defaultPermissionSets.ManageReleases,\n action: uiPermissionsById.manage.title,\n object: permissionSetObjectTypes.releases,\n description: 'Set of permissions which allows user to manage releases',\n permissions: [\n { action: 'http', object: { type: 'GET', value: commonEndpoints.artifacts } },\n { action: 'http', object: { type: 'GET', value: commonEndpoints.artifactDetails } },\n { action: 'http', object: { type: 'PUT', value: commonEndpoints.artifactDetails } },\n { action: 'http', object: { type: 'DELETE', value: commonEndpoints.artifactDetails } },\n { action: 'http', object: { type: 'GET', value: '^/api/management/v1/deployments/artifacts/[^/]+/download' } }\n ]\n },\n {\n ...defaultPermissionSets.ReadUsers,\n action: uiPermissionsById.read.title,\n object: permissionSetObjectTypes.userManagement,\n description: 'Set of permissions which allows user to view other users',\n permissions: [{ action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9])/useradm/' } }]\n },\n {\n ...defaultPermissionSets.ManageUsers,\n action: uiPermissionsById.manage.title,\n object: permissionSetObjectTypes.userManagement,\n description: 'Set of permissions which allows user manage other user accounts',\n permissions: [{ action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/useradm/' } }]\n },\n {\n ...defaultPermissionSets.ReadTenants,\n action: uiPermissionsById.read.title,\n object: permissionSetObjectTypes.tenantManagement,\n description: 'Set of permissions which allows user to list other tenants and their config',\n permissions: [\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9])/tenantadm/' } },\n { action: 'http', object: { type: 'POST', value: '^/api/management/(v[1-9])/tenantadm/' } }\n ]\n },\n {\n ...defaultPermissionSets.ManageTenants,\n action: uiPermissionsById.manage.title,\n object: permissionSetObjectTypes.tenantManagement,\n description: 'Set of permissions which allows user to manage other tenants and their config',\n permissions: [\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9])/tenantadm/' } },\n { action: 'http', object: { type: 'POST', value: '^/api/management/(v[1-9])/tenantadm/' } },\n { action: 'http', object: { type: 'PUT', value: '^/api/management/(v[1-9])/tenantadm/' } }\n ]\n },\n {\n ...defaultPermissionSets.ReadAuditLogs,\n action: uiPermissionsById.read.title,\n object: 'System Audit Log',\n description: 'Set of permissions which allows user to view system audit log',\n permissions: [{ action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9]|0.1.0)/auditlogs/logs' } }]\n },\n {\n ...defaultPermissionSets.DeployToDevices,\n action: 'Deploy',\n object: permissionSetObjectTypes.groups,\n description: 'Set of permissions which allows user to deploy to devices',\n permissions: [{ action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/(deployments|deviceconfig)/' } }],\n supported_scope_types: [scopedPermissionAreas.groups.scopeType]\n },\n {\n ...defaultPermissionSets.ConfigureDevices,\n action: 'Configure',\n object: permissionSetObjectTypes.groups,\n description: 'Set of permissions which allows user to manage configuration of the devices',\n permissions: [{ action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deviceconfig/' } }],\n supported_scope_types: [scopedPermissionAreas.groups.scopeType]\n },\n {\n ...defaultPermissionSets.ConnectToDevices,\n action: 'Connect',\n object: permissionSetObjectTypes.groups,\n description: 'Set of permissions which allows user to use remote terminal and file transfer',\n permissions: [\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9]|0.1.0)/deviceconnect/devices/[^/]+/connect$' } },\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9]|0.1.0)/deviceconnect/devices/[^/]+/download\\\\?path=[^\\u0026]+$' } },\n { action: 'http', object: { type: 'PUT', value: '^/api/management/(v[1-9]|0.1.0)/deviceconnect/devices/[^/]+/upload$' } }\n ],\n supported_scope_types: [scopedPermissionAreas.groups.scopeType]\n },\n {\n ...defaultPermissionSets.SuperUser,\n action: 'Any',\n object: permissionSetObjectTypes.any,\n description: 'Set of permissions which allows user to do anything',\n permissions: [{ action: 'any', object: { type: 'any', value: 'any' } }]\n },\n {\n ...defaultPermissionSets.UploadArtifacts,\n action: 'Upload',\n object: permissionSetObjectTypes.artifacts,\n description: 'Set of permissions which allows user to upload artifacts',\n permissions: [\n { action: 'http', object: { type: 'POST', value: commonEndpoints.artifacts } },\n { action: 'http', object: { type: 'POST', value: '^/api/management/v1/deployments/artifacts/generate' } }\n ]\n },\n {\n ...defaultPermissionSets.ReadDevices,\n action: uiPermissionsById.read.title,\n object: permissionSetObjectTypes.groups,\n description: 'Set of permissions which allows user to view devices',\n permissions: [\n { action: 'http', object: { type: 'POST', value: '^/api/management/v2/inventory/filters/search' } },\n { action: 'http', object: { type: 'POST', value: '^/api/management/v1/reporting/devices/search' } },\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9])/(deployments|devauth|inventory|deviceconfig|devicemonitor)/' } },\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9]|0.1.0)/deviceconnect/devices/[^/]+$' } }\n ],\n supported_scope_types: [scopedPermissionAreas.groups.scopeType]\n },\n {\n ...defaultPermissionSets.ManageDevices,\n action: uiPermissionsById.manage.title,\n object: permissionSetObjectTypes.groups,\n description: 'Set of permissions which allows user to manage devices',\n permissions: [\n { action: 'http', object: { type: 'POST', value: commonEndpoints.deviceManagement } },\n { action: 'http', object: { type: 'PUT', value: commonEndpoints.deviceManagement } },\n { action: 'http', object: { type: 'DELETE', value: commonEndpoints.deviceManagement } }\n ],\n supported_scope_types: [scopedPermissionAreas.groups.scopeType]\n },\n {\n ...defaultPermissionSets.ReadReleases,\n action: uiPermissionsById.read.title,\n object: permissionSetObjectTypes.releases,\n description: 'Set of permissions which allows user to view releases',\n permissions: [\n { action: 'http', object: { type: 'GET', value: commonEndpoints.artifacts } },\n { action: 'http', object: { type: 'GET', value: commonEndpoints.artifactDetails } },\n { action: 'http', object: { type: 'GET', value: '^/api/management/v1/deployments/artifacts/[^/]+/download' } }\n ]\n },\n {\n name: 'almostAdmin',\n object: permissionSetObjectTypes.empty,\n description: 'Set containing all the permissions.',\n permissions: [\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/auditlogs/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deployments/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deployments/config/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deployments/deployments/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deployments/deployments/releases/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/devauth/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deviceconfig/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deviceconnect/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deviceconnect/devices' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/inventory/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/iot-manager/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/monitor/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/useradm/.*' } }\n ]\n }\n];\n\nexport const rbacRoles = [\n {\n name: 'dyn',\n description: '',\n permissions: [\n { action: 'CREATE_DEPLOYMENT', object: { type: 'DEVICE_GROUP', value: 'dyn' } },\n { action: 'VIEW_DEVICE', object: { type: 'DEVICE_GROUP', value: 'dyn' } }\n ]\n },\n { name: 'asdasd', description: '123', permissions: [{ action: 'http', object: { type: 'any', value: '/api/management/v1/useradm/.*' } }] },\n {\n name: '141sasd',\n description: '1313adg',\n permission_sets_with_scope: [\n { ...defaultPermissionSets.ReadDevices, scope: { type: scopedPermissionAreas.groups.scopeType, value: ['bestgroup'] } },\n { ...defaultPermissionSets.ConnectToDevices, scope: { type: scopedPermissionAreas.groups.scopeType, value: ['bestgroup'] } },\n { ...defaultPermissionSets.ManageUsers }\n ]\n },\n {\n name: 'kljlkk',\n description: 'lkl',\n permission_sets_with_scope: [{ ...defaultPermissionSets.ConnectToDevices, scope: { type: scopedPermissionAreas.groups.scopeType, value: ['bestgroup'] } }]\n },\n {\n name: 'yyyyy',\n description: 'asd',\n permission_sets_with_scope: [\n { ...defaultPermissionSets.ManageDevices, scope: { type: scopedPermissionAreas.groups.scopeType, value: ['dockerclient'] } },\n { ...defaultPermissionSets.ManageReleases }\n ]\n },\n {\n name: 'RBAC_ROLE_DEPLOYMENTS_MANAGER',\n description: 'Intended for users responsible for managing deployments, this role can create and abort deployments',\n permission_sets_with_scope: [{ ...defaultPermissionSets.DeployToDevices }]\n },\n {\n name: 'RBAC_ROLE_REMOTE_TERMINAL',\n description: `Intended for tech support accounts, this role can access the devices' Remote Terminal.`,\n permission_sets_with_scope: [{ ...defaultPermissionSets.ConnectToDevices }]\n },\n { name: 'RBAC_ROLE_PERMIT_ALL', description: '', permission_sets_with_scope: [{ ...defaultPermissionSets.SuperUser }] },\n {\n name: 'RBAC_ROLE_OBSERVER',\n description:\n 'Intended for team leaders or limited tech support accounts, this role can see all Devices, Artifacts and Deployment reports but not make any changes.',\n permission_sets_with_scope: [{ ...defaultPermissionSets.ReadReleases }, { ...defaultPermissionSets.ReadDevices }]\n },\n {\n name: 'RBAC_ROLE_CI',\n description:\n 'Intended for automation accounts building software (e.g. CI/CD systems), this role can only manage Artifacts, including upload new Artifacts and delete Artifacts. It does not have access to Devices or Deployments.',\n permission_sets_with_scope: [\n { ...defaultPermissionSets.ReadReleases },\n { ...defaultPermissionSets.ManageReleases },\n { ...defaultPermissionSets.UploadArtifacts }\n ]\n },\n {\n name: 'almostAdmin',\n description: 'almost admin rights',\n permissions: permissionSets.find(item => item.name === 'almostAdmin')?.permissions\n },\n {\n name: 'almostAdminNew',\n description: 'almost admin rights',\n permission_sets_with_scope: Object.values(defaultPermissionSets)\n }\n];\n\nconst expectedParsedRoles = {\n '141sasd': {\n editable: true,\n isCustom: undefined,\n uiPermissions: {\n ...emptyUiPermissions,\n groups: { bestgroup: [uiPermissionsById.read.value, uiPermissionsById.connect.value] },\n userManagement: [uiPermissionsById.manage.value]\n }\n },\n asdasd: {\n editable: false,\n isCustom: true,\n uiPermissions: { ...emptyUiPermissions, userManagement: [uiPermissionsById.read.value, uiPermissionsById.manage.value] }\n },\n dyn: {\n editable: false,\n isCustom: true,\n uiPermissions: {\n ...emptyUiPermissions,\n deployments: [uiPermissionsById.deploy.value],\n groups: { dyn: [uiPermissionsById.read.value, uiPermissionsById.deploy.value] }\n }\n },\n kljlkk: {\n editable: true,\n isCustom: false,\n uiPermissions: { ...emptyUiPermissions, groups: { bestgroup: [uiPermissionsById.read.value, uiPermissionsById.connect.value] } }\n },\n yyyyy: {\n editable: true,\n isCustom: undefined,\n uiPermissions: {\n ...emptyUiPermissions,\n groups: { dockerclient: [uiPermissionsById.read.value, uiPermissionsById.manage.value] },\n releases: { [ALL_RELEASES]: [uiPermissionsById.manage.value] }\n }\n },\n almostAdmin: {\n editable: false,\n isCustom: true,\n uiPermissions: {\n ...emptyUiPermissions,\n auditlog: [uiPermissionsById.read.value],\n deployments: [uiPermissionsById.manage.value, uiPermissionsById.deploy.value, uiPermissionsById.read.value],\n groups: {\n [ALL_DEVICES]: [\n uiPermissionsById.read.value,\n // we can't assign deployment permissions to devices here, since the old path based rbac controls don't allow the scoped permissions\n // uiPermissionsById.deploy.value,\n uiPermissionsById.manage.value,\n uiPermissionsById.connect.value,\n uiPermissionsById.configure.value\n ]\n },\n releases: {\n [ALL_RELEASES]: [uiPermissionsById.read.value, uiPermissionsById.upload.value, uiPermissionsById.manage.value]\n },\n userManagement: [uiPermissionsById.read.value, uiPermissionsById.manage.value]\n }\n },\n almostAdminNew: {\n editable: true,\n isCustom: undefined,\n uiPermissions: {\n ...emptyUiPermissions,\n auditlog: [uiPermissionsById.read.value],\n deployments: [uiPermissionsById.read.value, uiPermissionsById.deploy.value, uiPermissionsById.manage.value],\n groups: {\n [ALL_DEVICES]: [\n uiPermissionsById.read.value,\n uiPermissionsById.manage.value,\n uiPermissionsById.deploy.value,\n uiPermissionsById.connect.value,\n uiPermissionsById.configure.value\n ]\n },\n releases: {\n [ALL_RELEASES]: [uiPermissionsById.manage.value, uiPermissionsById.upload.value, uiPermissionsById.read.value]\n },\n tenantManagement: [uiPermissionsById.read.value, uiPermissionsById.manage.value],\n userManagement: [uiPermissionsById.read.value, uiPermissionsById.manage.value]\n }\n }\n};\n\nconst defaultRolesById = {\n ...rolesById,\n test: {\n ...emptyRole,\n name: 'test',\n description: 'test description',\n editable: true,\n uiPermissions: {\n ...emptyUiPermissions,\n groups: { testGroup: [uiPermissionsById.read.value] },\n releases: { bar: [uiPermissionsById.read.value] }\n }\n }\n};\n\nexport const receivedRoles = rbacRoles.reduce(\n (accu, role) => {\n const { name, description, ...roleRemainder } = role;\n if (name.startsWith('RBAC')) {\n accu[name] = {\n ...defaultRolesById[name],\n ...roleRemainder,\n editable: false,\n isCustom: false,\n description: defaultRolesById[name].description ? defaultRolesById[name].description : description\n };\n } else {\n const result = expectedParsedRoles[name] ?? {};\n accu[name] = {\n ...emptyRole,\n ...role,\n ...result,\n name\n };\n }\n return accu;\n },\n { ...defaultRolesById }\n);\n\nexport const receivedPermissionSets = permissionSets.reduce((accu, set) => {\n const result = defaultPermissionSets[set.name]?.result ?? {};\n accu[set.name] = {\n ...set,\n result: {\n ...emptyUiPermissions,\n ...result\n }\n };\n return accu;\n}, {});\n","// Copyright 2025 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//@ts-nocheck\nimport React from 'react';\nimport { Provider } from 'react-redux';\nimport { MemoryRouter } from 'react-router-dom';\n\nimport { createSerializer } from '@emotion/jest';\nimport { ThemeProvider, createTheme } from '@mui/material/styles';\n\nimport { yes } from '@northern.tech/utils/helpers';\nimport { configureStore } from '@reduxjs/toolkit';\nimport { cleanup, render } from '@testing-library/react';\nimport { act, queryByRole, waitFor, within } from '@testing-library/react';\nimport { expect } from 'vitest';\n\nimport { light } from './theme/light';\n\nexport const selectMaterialUiSelectOption = async (element, optionText, user) => {\n // The button that opens the dropdown, which is a sibling of the input\n const selectButton = element.parentNode.querySelector('[role=combobox]');\n // Open the select dropdown\n await act(async () => await user.click(selectButton));\n // Get the dropdown element. We don't use getByRole() because it includes <select>s too.\n const listbox = queryByRole(document.documentElement, 'listbox');\n // Click the list item\n const listItem = within(listbox!).getByText(optionText);\n await user.click(listItem);\n // Wait for the listbox to be removed, so it isn't visible in subsequent calls\n await waitFor(() => expect(queryByRole(document.documentElement, 'listbox')).not.toBeInTheDocument());\n return Promise.resolve();\n};\n\nexport const theme = createTheme(light);\n\nexport const renderWithRouter = (ui: React.ReactElement, { route = '/', preloadedState } = {}) => {\n const store = getConfiguredStore({ preloadedState });\n const Wrapper = ({ children }) => (\n <ThemeProvider theme={theme}>\n <MemoryRouter initialEntries={[route]}>\n <Provider store={store}>{children}</Provider>\n </MemoryRouter>\n </ThemeProvider>\n );\n return { store, ...render(ui, { wrapper: Wrapper }) };\n};\n","// Copyright 2022 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nconst palette = {\n border: {\n main: '#e3e3e3'\n },\n tooltip: {\n tierTipBackground: '#f7fafb'\n }\n};\n\nexport const light = {\n palette\n};\n"],"mappings":"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","names":["import_react","import_react_redux","import_react_router_dom","import_styles","import_vitest","import_react","import_jsx_runtime","React"]}
@@ -6,6 +6,7 @@ export * from '@testing-library/react';
6
6
 
7
7
  declare const TEST_LOCATION = "localhost";
8
8
  declare const mockAbortController: {
9
+ abort: () => void;
9
10
  signal: {
10
11
  addEventListener: () => void;
11
12
  removeEventListener: () => void;
@@ -6,6 +6,7 @@ export * from '@testing-library/react';
6
6
 
7
7
  declare const TEST_LOCATION = "localhost";
8
8
  declare const mockAbortController: {
9
+ abort: () => void;
9
10
  signal: {
10
11
  addEventListener: () => void;
11
12
  removeEventListener: () => void;
@@ -1,6 +1,7 @@
1
1
  import {
2
- light
3
- } from "./chunk-HRGVXWMH.js";
2
+ theme
3
+ } from "./chunk-RG3ICJW5.js";
4
+ import "./chunk-HRGVXWMH.js";
4
5
  import {
5
6
  menderEnvironment,
6
7
  mockDate,
@@ -12,7 +13,7 @@ import React from "react";
12
13
  import { Provider } from "react-redux";
13
14
  import { MemoryRouter } from "react-router-dom";
14
15
  import { createSerializer } from "@emotion/jest";
15
- import { ThemeProvider, createTheme } from "@mui/material/styles";
16
+ import { ThemeProvider } from "@mui/material/styles";
16
17
  import { yes } from "@northern.tech/utils/helpers";
17
18
  import { configureStore } from "@reduxjs/toolkit";
18
19
  import { cleanup, render } from "@testing-library/react";
@@ -22,9 +23,12 @@ export * from "@testing-library/react";
22
23
  import { jsx } from "react/jsx-runtime";
23
24
  expect.addSnapshotSerializer(createSerializer({ includeStyles: true }));
24
25
  var TEST_LOCATION = "localhost";
25
- var mockAbortController = { signal: { addEventListener: () => {
26
- }, removeEventListener: () => {
27
- } } };
26
+ var mockAbortController = {
27
+ abort: vi.fn(),
28
+ signal: { addEventListener: () => {
29
+ }, removeEventListener: () => {
30
+ } }
31
+ };
28
32
  var oldWindowLocalStorage = window.localStorage;
29
33
  var oldWindowLocation = window.location;
30
34
  var oldWindowSessionStorage = window.sessionStorage;
@@ -116,7 +120,6 @@ var afterAll = async () => {
116
120
  React.useEffect.mockRestore();
117
121
  vi.unstubAllGlobals();
118
122
  };
119
- var theme = createTheme(light);
120
123
  var customRender = (ui, options = {}) => {
121
124
  const { preloadedState = { users: { currentSession: { token, expiresAt: void 0 } } }, ...remainder } = options;
122
125
  const store = options.store ?? configureStore({ preloadedState });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/setupTests.tsx"],"sourcesContent":["// Copyright 2025 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//@ts-nocheck\nimport React from 'react';\nimport { Provider } from 'react-redux';\nimport { MemoryRouter } from 'react-router-dom';\n\nimport { createSerializer } from '@emotion/jest';\nimport { ThemeProvider, createTheme } from '@mui/material/styles';\n\nimport { yes } from '@northern.tech/utils/helpers';\nimport { configureStore } from '@reduxjs/toolkit';\nimport { cleanup, render } from '@testing-library/react';\nimport { expect, vi } from 'vitest';\nimport { MessageChannel } from 'worker_threads';\n\nimport { menderEnvironment, mockDate, token as mockToken } from './mockData';\nimport { light } from './theme/light';\n\nexpect.addSnapshotSerializer(createSerializer({ includeStyles: true }));\n\nexport const TEST_LOCATION = 'localhost';\n\nexport const mockAbortController = { signal: { addEventListener: () => {}, removeEventListener: () => {} } };\n\nconst oldWindowLocalStorage = window.localStorage;\nconst oldWindowLocation = window.location;\nconst oldWindowSessionStorage = window.sessionStorage;\n\nvi.mock('uuid', () => ({ v4: () => 'mock-uuid' }));\n\nconst storage = {};\nglobal.HTMLCanvasElement.prototype.getContext = vi.fn();\n\nexport const beforeAll = async () => {\n // Temporarily workaround for bug in @testing-library/react when use user-event with `vi.useFakeTimers()`\n\n // Enable the mocking in tests.\n delete window.location;\n window.location = {\n ...oldWindowLocation,\n hostname: TEST_LOCATION,\n origin: 'http://localhost',\n assign: vi.fn(),\n replace: vi.fn(),\n reload: vi.fn()\n };\n delete window.sessionStorage;\n window.sessionStorage = {\n ...oldWindowSessionStorage,\n getItem: vi.fn(yes),\n setItem: vi.fn(),\n removeItem: vi.fn()\n };\n delete window.localStorage;\n window.localStorage = {\n ...oldWindowLocalStorage,\n getItem: vi.fn(name => {\n if (name === 'JWT') {\n return JSON.stringify({ token: mockToken });\n }\n return storage[name];\n }),\n setItem: vi.fn(name => storage[name]),\n removeItem: vi.fn()\n };\n window.mender_environment = menderEnvironment;\n window.ENV = 'test';\n global.AbortController = vi.fn().mockImplementation(function () {\n return mockAbortController;\n });\n global.MessageChannel = MessageChannel;\n global.ResizeObserver = vi.fn().mockImplementation(function () {\n return {\n observe: vi.fn(),\n unobserve: vi.fn(),\n disconnect: vi.fn()\n };\n });\n window.RTCPeerConnection = () => ({\n createOffer: () => {},\n setLocalDescription: () => {},\n createDataChannel: () => {}\n });\n\n Object.defineProperty(navigator, 'appVersion', { value: 'Test', writable: true });\n const intersectionObserverMock = function () {\n return {\n observe: vi.fn(),\n disconnect: vi.fn()\n };\n };\n window.prompt = vi.fn();\n window.IntersectionObserver = vi.fn().mockImplementation(intersectionObserverMock);\n vi.spyOn(React, 'useEffect').mockImplementation(React.useLayoutEffect);\n\n //TODO: remove, once https://github.com/testing-library/react-testing-library/issues/1197 resolved\n const _jest = globalThis.jest;\n\n globalThis.jest = {\n ...globalThis.jest\n };\n\n vi.stubGlobal('jest', {\n advanceTimersByTime: vi.advanceTimersByTime.bind(vi)\n });\n return () => void (globalThis.jest = _jest);\n};\n\nexport const beforeEach = () => {\n vi.useFakeTimers({ now: mockDate });\n vi.setSystemTime(mockDate);\n};\n\nexport const afterEach = async () => {\n cleanup();\n vi.runOnlyPendingTimers();\n vi.useRealTimers();\n};\n\nexport const afterAll = async () => {\n // restore `window.location` etc. to the original `jsdom` `Location` object\n window.localStorage = oldWindowLocalStorage;\n window.location = oldWindowLocation;\n window.sessionStorage = oldWindowSessionStorage;\n React.useEffect.mockRestore();\n vi.unstubAllGlobals();\n};\n\nconst theme = createTheme(light);\n\nconst customRender = (ui, options = {}) => {\n const { preloadedState = { users: { currentSession: { token: mockToken, expiresAt: undefined } } }, ...remainder } = options;\n const store = options.store ?? configureStore({ preloadedState });\n const AllTheProviders = ({ children }) => (\n <ThemeProvider theme={theme}>\n <MemoryRouter>\n <Provider store={store}>{children}</Provider>\n </MemoryRouter>\n </ThemeProvider>\n );\n return { store, ...render(ui, { wrapper: AllTheProviders, ...remainder }) };\n};\n\nexport * from '@testing-library/react';\n// override render method\n\nexport { customRender as render };\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/setupTests.tsx"],"sourcesContent":["// Copyright 2025 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//@ts-nocheck\nimport React from 'react';\nimport { Provider } from 'react-redux';\nimport { MemoryRouter } from 'react-router-dom';\n\nimport { createSerializer } from '@emotion/jest';\nimport { ThemeProvider, createTheme } from '@mui/material/styles';\n\nimport { yes } from '@northern.tech/utils/helpers';\nimport { configureStore } from '@reduxjs/toolkit';\nimport { cleanup, render } from '@testing-library/react';\nimport { expect, vi } from 'vitest';\nimport { MessageChannel } from 'worker_threads';\n\nimport { menderEnvironment, mockDate, token as mockToken } from './mockData';\nimport { theme } from './utils';\n\nexpect.addSnapshotSerializer(createSerializer({ includeStyles: true }));\n\nexport const TEST_LOCATION = 'localhost';\n\nexport const mockAbortController: { abort: () => void; signal: { addEventListener: () => void; removeEventListener: () => void } } = {\n abort: vi.fn(),\n signal: { addEventListener: () => {}, removeEventListener: () => {} }\n};\n\nconst oldWindowLocalStorage = window.localStorage;\nconst oldWindowLocation = window.location;\nconst oldWindowSessionStorage = window.sessionStorage;\n\nvi.mock('uuid', () => ({ v4: () => 'mock-uuid' }));\n\nconst storage = {};\nglobal.HTMLCanvasElement.prototype.getContext = vi.fn();\n\nexport const beforeAll = async () => {\n // Temporarily workaround for bug in @testing-library/react when use user-event with `vi.useFakeTimers()`\n\n // Enable the mocking in tests.\n delete window.location;\n window.location = {\n ...oldWindowLocation,\n hostname: TEST_LOCATION,\n origin: 'http://localhost',\n assign: vi.fn(),\n replace: vi.fn(),\n reload: vi.fn()\n };\n delete window.sessionStorage;\n window.sessionStorage = {\n ...oldWindowSessionStorage,\n getItem: vi.fn(yes),\n setItem: vi.fn(),\n removeItem: vi.fn()\n };\n delete window.localStorage;\n window.localStorage = {\n ...oldWindowLocalStorage,\n getItem: vi.fn(name => {\n if (name === 'JWT') {\n return JSON.stringify({ token: mockToken });\n }\n return storage[name];\n }),\n setItem: vi.fn(name => storage[name]),\n removeItem: vi.fn()\n };\n window.mender_environment = menderEnvironment;\n window.ENV = 'test';\n global.AbortController = vi.fn().mockImplementation(function () {\n return mockAbortController;\n });\n global.MessageChannel = MessageChannel;\n global.ResizeObserver = vi.fn().mockImplementation(function () {\n return {\n observe: vi.fn(),\n unobserve: vi.fn(),\n disconnect: vi.fn()\n };\n });\n window.RTCPeerConnection = () => ({\n createOffer: () => {},\n setLocalDescription: () => {},\n createDataChannel: () => {}\n });\n\n Object.defineProperty(navigator, 'appVersion', { value: 'Test', writable: true });\n const intersectionObserverMock = function () {\n return {\n observe: vi.fn(),\n disconnect: vi.fn()\n };\n };\n window.prompt = vi.fn();\n window.IntersectionObserver = vi.fn().mockImplementation(intersectionObserverMock);\n vi.spyOn(React, 'useEffect').mockImplementation(React.useLayoutEffect);\n\n //TODO: remove, once https://github.com/testing-library/react-testing-library/issues/1197 resolved\n const _jest = globalThis.jest;\n\n globalThis.jest = {\n ...globalThis.jest\n };\n\n vi.stubGlobal('jest', {\n advanceTimersByTime: vi.advanceTimersByTime.bind(vi)\n });\n return () => void (globalThis.jest = _jest);\n};\n\nexport const beforeEach = () => {\n vi.useFakeTimers({ now: mockDate });\n vi.setSystemTime(mockDate);\n};\n\nexport const afterEach = async () => {\n cleanup();\n vi.runOnlyPendingTimers();\n vi.useRealTimers();\n};\n\nexport const afterAll = async () => {\n // restore `window.location` etc. to the original `jsdom` `Location` object\n window.localStorage = oldWindowLocalStorage;\n window.location = oldWindowLocation;\n window.sessionStorage = oldWindowSessionStorage;\n React.useEffect.mockRestore();\n vi.unstubAllGlobals();\n};\n\nconst customRender = (ui, options = {}) => {\n const { preloadedState = { users: { currentSession: { token: mockToken, expiresAt: undefined } } }, ...remainder } = options;\n const store = options.store ?? configureStore({ preloadedState });\n const AllTheProviders = ({ children }) => (\n <ThemeProvider theme={theme}>\n <MemoryRouter>\n <Provider store={store}>{children}</Provider>\n </MemoryRouter>\n </ThemeProvider>\n );\n return { store, ...render(ui, { wrapper: AllTheProviders, ...remainder }) };\n};\n\nexport * from '@testing-library/react';\n// override render method\n\nexport { customRender as render };\n"],"mappings":"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","names":[]}
package/dist/utils.cjs CHANGED
@@ -17,25 +17,55 @@ var __copyProps = (to, from, except, desc) => {
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
 
20
- // src/utils.ts
20
+ // src/utils.tsx
21
21
  var utils_exports = {};
22
22
  __export(utils_exports, {
23
- selectMaterialUiSelectOption: () => selectMaterialUiSelectOption
23
+ renderWithRouter: () => renderWithRouter,
24
+ selectMaterialUiSelectOption: () => selectMaterialUiSelectOption,
25
+ theme: () => theme
24
26
  });
25
27
  module.exports = __toCommonJS(utils_exports);
28
+ var import_react_redux = require("react-redux");
29
+ var import_react_router_dom = require("react-router-dom");
30
+ var import_styles = require("@mui/material/styles");
26
31
  var import_react = require("@testing-library/react");
32
+ var import_react2 = require("@testing-library/react");
27
33
  var import_vitest = require("vitest");
34
+
35
+ // src/theme/light.ts
36
+ var palette = {
37
+ border: {
38
+ main: "#e3e3e3"
39
+ },
40
+ tooltip: {
41
+ tierTipBackground: "#f7fafb"
42
+ }
43
+ };
44
+ var light = {
45
+ palette
46
+ };
47
+
48
+ // src/utils.tsx
49
+ var import_jsx_runtime = require("react/jsx-runtime");
28
50
  var selectMaterialUiSelectOption = async (element, optionText, user) => {
29
51
  const selectButton = element.parentNode.querySelector("[role=combobox]");
30
- await (0, import_react.act)(async () => await user.click(selectButton));
31
- const listbox = (0, import_react.queryByRole)(document.documentElement, "listbox");
32
- const listItem = (0, import_react.within)(listbox).getByText(optionText);
52
+ await (0, import_react2.act)(async () => await user.click(selectButton));
53
+ const listbox = (0, import_react2.queryByRole)(document.documentElement, "listbox");
54
+ const listItem = (0, import_react2.within)(listbox).getByText(optionText);
33
55
  await user.click(listItem);
34
- await (0, import_react.waitFor)(() => (0, import_vitest.expect)((0, import_react.queryByRole)(document.documentElement, "listbox")).not.toBeInTheDocument());
56
+ await (0, import_react2.waitFor)(() => (0, import_vitest.expect)((0, import_react2.queryByRole)(document.documentElement, "listbox")).not.toBeInTheDocument());
35
57
  return Promise.resolve();
36
58
  };
59
+ var theme = (0, import_styles.createTheme)(light);
60
+ var renderWithRouter = (ui, { route = "/", preloadedState } = {}) => {
61
+ const store = getConfiguredStore({ preloadedState });
62
+ const Wrapper = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_styles.ThemeProvider, { theme, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_router_dom.MemoryRouter, { initialEntries: [route], children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_redux.Provider, { store, children }) }) });
63
+ return { store, ...(0, import_react.render)(ui, { wrapper: Wrapper }) };
64
+ };
37
65
  // Annotate the CommonJS export names for ESM import in node:
38
66
  0 && (module.exports = {
39
- selectMaterialUiSelectOption
67
+ renderWithRouter,
68
+ selectMaterialUiSelectOption,
69
+ theme
40
70
  });
41
71
  //# sourceMappingURL=utils.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts"],"sourcesContent":["// Copyright 2025 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//@ts-nocheck\nimport { act, queryByRole, waitFor, within } from '@testing-library/react';\nimport { expect } from 'vitest';\n\nexport const selectMaterialUiSelectOption = async (element, optionText, user) => {\n // The button that opens the dropdown, which is a sibling of the input\n const selectButton = element.parentNode.querySelector('[role=combobox]');\n // Open the select dropdown\n await act(async () => await user.click(selectButton));\n // Get the dropdown element. We don't use getByRole() because it includes <select>s too.\n const listbox = queryByRole(document.documentElement, 'listbox');\n // Click the list item\n const listItem = within(listbox!).getByText(optionText);\n await user.click(listItem);\n // Wait for the listbox to be removed, so it isn't visible in subsequent calls\n await waitFor(() => expect(queryByRole(document.documentElement, 'listbox')).not.toBeInTheDocument());\n return Promise.resolve();\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcA,mBAAkD;AAClD,oBAAuB;AAEhB,IAAM,+BAA+B,OAAO,SAAS,YAAY,SAAS;AAE/E,QAAM,eAAe,QAAQ,WAAW,cAAc,iBAAiB;AAEvE,YAAM,kBAAI,YAAY,MAAM,KAAK,MAAM,YAAY,CAAC;AAEpD,QAAM,cAAU,0BAAY,SAAS,iBAAiB,SAAS;AAE/D,QAAM,eAAW,qBAAO,OAAQ,EAAE,UAAU,UAAU;AACtD,QAAM,KAAK,MAAM,QAAQ;AAEzB,YAAM,sBAAQ,UAAM,0BAAO,0BAAY,SAAS,iBAAiB,SAAS,CAAC,EAAE,IAAI,kBAAkB,CAAC;AACpG,SAAO,QAAQ,QAAQ;AACzB;","names":[]}
1
+ {"version":3,"sources":["../src/utils.tsx","../src/theme/light.ts"],"sourcesContent":["// Copyright 2025 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//@ts-nocheck\nimport React from 'react';\nimport { Provider } from 'react-redux';\nimport { MemoryRouter } from 'react-router-dom';\n\nimport { createSerializer } from '@emotion/jest';\nimport { ThemeProvider, createTheme } from '@mui/material/styles';\n\nimport { yes } from '@northern.tech/utils/helpers';\nimport { configureStore } from '@reduxjs/toolkit';\nimport { cleanup, render } from '@testing-library/react';\nimport { act, queryByRole, waitFor, within } from '@testing-library/react';\nimport { expect } from 'vitest';\n\nimport { light } from './theme/light';\n\nexport const selectMaterialUiSelectOption = async (element, optionText, user) => {\n // The button that opens the dropdown, which is a sibling of the input\n const selectButton = element.parentNode.querySelector('[role=combobox]');\n // Open the select dropdown\n await act(async () => await user.click(selectButton));\n // Get the dropdown element. We don't use getByRole() because it includes <select>s too.\n const listbox = queryByRole(document.documentElement, 'listbox');\n // Click the list item\n const listItem = within(listbox!).getByText(optionText);\n await user.click(listItem);\n // Wait for the listbox to be removed, so it isn't visible in subsequent calls\n await waitFor(() => expect(queryByRole(document.documentElement, 'listbox')).not.toBeInTheDocument());\n return Promise.resolve();\n};\n\nexport const theme = createTheme(light);\n\nexport const renderWithRouter = (ui: React.ReactElement, { route = '/', preloadedState } = {}) => {\n const store = getConfiguredStore({ preloadedState });\n const Wrapper = ({ children }) => (\n <ThemeProvider theme={theme}>\n <MemoryRouter initialEntries={[route]}>\n <Provider store={store}>{children}</Provider>\n </MemoryRouter>\n </ThemeProvider>\n );\n return { store, ...render(ui, { wrapper: Wrapper }) };\n};\n","// Copyright 2022 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nconst palette = {\n border: {\n main: '#e3e3e3'\n },\n tooltip: {\n tierTipBackground: '#f7fafb'\n }\n};\n\nexport const light = {\n palette\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA,yBAAyB;AACzB,8BAA6B;AAG7B,oBAA2C;AAI3C,mBAAgC;AAChC,IAAAA,gBAAkD;AAClD,oBAAuB;;;ACXvB,IAAM,UAAU;AAAA,EACd,QAAQ;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,mBAAmB;AAAA,EACrB;AACF;AAEO,IAAM,QAAQ;AAAA,EACnB;AACF;;;AD0BQ;AAtBD,IAAM,+BAA+B,OAAO,SAAS,YAAY,SAAS;AAE/E,QAAM,eAAe,QAAQ,WAAW,cAAc,iBAAiB;AAEvE,YAAM,mBAAI,YAAY,MAAM,KAAK,MAAM,YAAY,CAAC;AAEpD,QAAM,cAAU,2BAAY,SAAS,iBAAiB,SAAS;AAE/D,QAAM,eAAW,sBAAO,OAAQ,EAAE,UAAU,UAAU;AACtD,QAAM,KAAK,MAAM,QAAQ;AAEzB,YAAM,uBAAQ,UAAM,0BAAO,2BAAY,SAAS,iBAAiB,SAAS,CAAC,EAAE,IAAI,kBAAkB,CAAC;AACpG,SAAO,QAAQ,QAAQ;AACzB;AAEO,IAAM,YAAQ,2BAAY,KAAK;AAE/B,IAAM,mBAAmB,CAAC,IAAwB,EAAE,QAAQ,KAAK,eAAe,IAAI,CAAC,MAAM;AAChG,QAAM,QAAQ,mBAAmB,EAAE,eAAe,CAAC;AACnD,QAAM,UAAU,CAAC,EAAE,SAAS,MAC1B,4CAAC,+BAAc,OACb,sDAAC,wCAAa,gBAAgB,CAAC,KAAK,GAClC,sDAAC,+BAAS,OAAe,UAAS,GACpC,GACF;AAEF,SAAO,EAAE,OAAO,OAAG,qBAAO,IAAI,EAAE,SAAS,QAAQ,CAAC,EAAE;AACtD;","names":["import_react"]}
package/dist/utils.d.cts CHANGED
@@ -1,3 +1,69 @@
1
+ import * as _testing_library_dom from '@testing-library/dom';
2
+ import * as pretty_format from 'pretty-format';
3
+ import * as react_dom_client from 'react-dom/client';
4
+ import * as _mui_material_styles from '@mui/material/styles';
5
+ import React from 'react';
6
+
1
7
  declare const selectMaterialUiSelectOption: (element: any, optionText: any, user: any) => Promise<void>;
8
+ declare const theme: _mui_material_styles.Theme;
9
+ declare const renderWithRouter: (ui: React.ReactElement, { route, preloadedState }?: {
10
+ route?: string | undefined;
11
+ }) => {
12
+ container: HTMLElement;
13
+ baseElement: HTMLElement;
14
+ debug: (baseElement?: react_dom_client.Container | (Element | Document) | Array<react_dom_client.Container | (Element | Document)> | undefined, maxLength?: number | undefined, options?: pretty_format.OptionsReceived | undefined) => void;
15
+ rerender: (ui: React.ReactNode) => void;
16
+ unmount: () => void;
17
+ asFragment: () => DocumentFragment;
18
+ getByLabelText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined) => HTMLElement;
19
+ getAllByLabelText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined) => HTMLElement[];
20
+ queryByLabelText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined) => HTMLElement | null;
21
+ queryAllByLabelText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined) => HTMLElement[];
22
+ findByLabelText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement>;
23
+ findAllByLabelText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement[]>;
24
+ getByPlaceholderText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement;
25
+ getAllByPlaceholderText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement[];
26
+ queryByPlaceholderText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement | null;
27
+ queryAllByPlaceholderText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement[];
28
+ findByPlaceholderText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement>;
29
+ findAllByPlaceholderText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement[]>;
30
+ getByText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined) => HTMLElement;
31
+ getAllByText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined) => HTMLElement[];
32
+ queryByText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined) => HTMLElement | null;
33
+ queryAllByText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined) => HTMLElement[];
34
+ findByText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement>;
35
+ findAllByText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement[]>;
36
+ getByAltText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement;
37
+ getAllByAltText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement[];
38
+ queryByAltText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement | null;
39
+ queryAllByAltText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement[];
40
+ findByAltText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement>;
41
+ findAllByAltText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement[]>;
42
+ getByTitle: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement;
43
+ getAllByTitle: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement[];
44
+ queryByTitle: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement | null;
45
+ queryAllByTitle: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement[];
46
+ findByTitle: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement>;
47
+ findAllByTitle: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement[]>;
48
+ getByDisplayValue: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement;
49
+ getAllByDisplayValue: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement[];
50
+ queryByDisplayValue: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement | null;
51
+ queryAllByDisplayValue: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement[];
52
+ findByDisplayValue: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement>;
53
+ findAllByDisplayValue: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement[]>;
54
+ getByRole: (role: _testing_library_dom.ByRoleMatcher, options?: _testing_library_dom.ByRoleOptions | undefined) => HTMLElement;
55
+ getAllByRole: (role: _testing_library_dom.ByRoleMatcher, options?: _testing_library_dom.ByRoleOptions | undefined) => HTMLElement[];
56
+ queryByRole: (role: _testing_library_dom.ByRoleMatcher, options?: _testing_library_dom.ByRoleOptions | undefined) => HTMLElement | null;
57
+ queryAllByRole: (role: _testing_library_dom.ByRoleMatcher, options?: _testing_library_dom.ByRoleOptions | undefined) => HTMLElement[];
58
+ findByRole: (role: _testing_library_dom.ByRoleMatcher, options?: _testing_library_dom.ByRoleOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement>;
59
+ findAllByRole: (role: _testing_library_dom.ByRoleMatcher, options?: _testing_library_dom.ByRoleOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement[]>;
60
+ getByTestId: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement;
61
+ getAllByTestId: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement[];
62
+ queryByTestId: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement | null;
63
+ queryAllByTestId: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement[];
64
+ findByTestId: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement>;
65
+ findAllByTestId: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement[]>;
66
+ store: any;
67
+ };
2
68
 
3
- export { selectMaterialUiSelectOption };
69
+ export { renderWithRouter, selectMaterialUiSelectOption, theme };
package/dist/utils.d.ts CHANGED
@@ -1,3 +1,69 @@
1
+ import * as _testing_library_dom from '@testing-library/dom';
2
+ import * as pretty_format from 'pretty-format';
3
+ import * as react_dom_client from 'react-dom/client';
4
+ import * as _mui_material_styles from '@mui/material/styles';
5
+ import React from 'react';
6
+
1
7
  declare const selectMaterialUiSelectOption: (element: any, optionText: any, user: any) => Promise<void>;
8
+ declare const theme: _mui_material_styles.Theme;
9
+ declare const renderWithRouter: (ui: React.ReactElement, { route, preloadedState }?: {
10
+ route?: string | undefined;
11
+ }) => {
12
+ container: HTMLElement;
13
+ baseElement: HTMLElement;
14
+ debug: (baseElement?: react_dom_client.Container | (Element | Document) | Array<react_dom_client.Container | (Element | Document)> | undefined, maxLength?: number | undefined, options?: pretty_format.OptionsReceived | undefined) => void;
15
+ rerender: (ui: React.ReactNode) => void;
16
+ unmount: () => void;
17
+ asFragment: () => DocumentFragment;
18
+ getByLabelText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined) => HTMLElement;
19
+ getAllByLabelText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined) => HTMLElement[];
20
+ queryByLabelText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined) => HTMLElement | null;
21
+ queryAllByLabelText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined) => HTMLElement[];
22
+ findByLabelText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement>;
23
+ findAllByLabelText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement[]>;
24
+ getByPlaceholderText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement;
25
+ getAllByPlaceholderText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement[];
26
+ queryByPlaceholderText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement | null;
27
+ queryAllByPlaceholderText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement[];
28
+ findByPlaceholderText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement>;
29
+ findAllByPlaceholderText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement[]>;
30
+ getByText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined) => HTMLElement;
31
+ getAllByText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined) => HTMLElement[];
32
+ queryByText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined) => HTMLElement | null;
33
+ queryAllByText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined) => HTMLElement[];
34
+ findByText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement>;
35
+ findAllByText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.SelectorMatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement[]>;
36
+ getByAltText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement;
37
+ getAllByAltText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement[];
38
+ queryByAltText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement | null;
39
+ queryAllByAltText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement[];
40
+ findByAltText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement>;
41
+ findAllByAltText: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement[]>;
42
+ getByTitle: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement;
43
+ getAllByTitle: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement[];
44
+ queryByTitle: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement | null;
45
+ queryAllByTitle: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement[];
46
+ findByTitle: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement>;
47
+ findAllByTitle: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement[]>;
48
+ getByDisplayValue: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement;
49
+ getAllByDisplayValue: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement[];
50
+ queryByDisplayValue: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement | null;
51
+ queryAllByDisplayValue: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement[];
52
+ findByDisplayValue: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement>;
53
+ findAllByDisplayValue: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement[]>;
54
+ getByRole: (role: _testing_library_dom.ByRoleMatcher, options?: _testing_library_dom.ByRoleOptions | undefined) => HTMLElement;
55
+ getAllByRole: (role: _testing_library_dom.ByRoleMatcher, options?: _testing_library_dom.ByRoleOptions | undefined) => HTMLElement[];
56
+ queryByRole: (role: _testing_library_dom.ByRoleMatcher, options?: _testing_library_dom.ByRoleOptions | undefined) => HTMLElement | null;
57
+ queryAllByRole: (role: _testing_library_dom.ByRoleMatcher, options?: _testing_library_dom.ByRoleOptions | undefined) => HTMLElement[];
58
+ findByRole: (role: _testing_library_dom.ByRoleMatcher, options?: _testing_library_dom.ByRoleOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement>;
59
+ findAllByRole: (role: _testing_library_dom.ByRoleMatcher, options?: _testing_library_dom.ByRoleOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement[]>;
60
+ getByTestId: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement;
61
+ getAllByTestId: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement[];
62
+ queryByTestId: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement | null;
63
+ queryAllByTestId: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined) => HTMLElement[];
64
+ findByTestId: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement>;
65
+ findAllByTestId: (id: _testing_library_dom.Matcher, options?: _testing_library_dom.MatcherOptions | undefined, waitForElementOptions?: _testing_library_dom.waitForOptions | undefined) => Promise<HTMLElement[]>;
66
+ store: any;
67
+ };
2
68
 
3
- export { selectMaterialUiSelectOption };
69
+ export { renderWithRouter, selectMaterialUiSelectOption, theme };
package/dist/utils.js CHANGED
@@ -1,16 +1,12 @@
1
- // src/utils.ts
2
- import { act, queryByRole, waitFor, within } from "@testing-library/react";
3
- import { expect } from "vitest";
4
- var selectMaterialUiSelectOption = async (element, optionText, user) => {
5
- const selectButton = element.parentNode.querySelector("[role=combobox]");
6
- await act(async () => await user.click(selectButton));
7
- const listbox = queryByRole(document.documentElement, "listbox");
8
- const listItem = within(listbox).getByText(optionText);
9
- await user.click(listItem);
10
- await waitFor(() => expect(queryByRole(document.documentElement, "listbox")).not.toBeInTheDocument());
11
- return Promise.resolve();
12
- };
1
+ import {
2
+ renderWithRouter,
3
+ selectMaterialUiSelectOption,
4
+ theme
5
+ } from "./chunk-RG3ICJW5.js";
6
+ import "./chunk-HRGVXWMH.js";
13
7
  export {
14
- selectMaterialUiSelectOption
8
+ renderWithRouter,
9
+ selectMaterialUiSelectOption,
10
+ theme
15
11
  };
16
12
  //# sourceMappingURL=utils.js.map
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts"],"sourcesContent":["// Copyright 2025 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//@ts-nocheck\nimport { act, queryByRole, waitFor, within } from '@testing-library/react';\nimport { expect } from 'vitest';\n\nexport const selectMaterialUiSelectOption = async (element, optionText, user) => {\n // The button that opens the dropdown, which is a sibling of the input\n const selectButton = element.parentNode.querySelector('[role=combobox]');\n // Open the select dropdown\n await act(async () => await user.click(selectButton));\n // Get the dropdown element. We don't use getByRole() because it includes <select>s too.\n const listbox = queryByRole(document.documentElement, 'listbox');\n // Click the list item\n const listItem = within(listbox!).getByText(optionText);\n await user.click(listItem);\n // Wait for the listbox to be removed, so it isn't visible in subsequent calls\n await waitFor(() => expect(queryByRole(document.documentElement, 'listbox')).not.toBeInTheDocument());\n return Promise.resolve();\n};\n"],"mappings":";AAcA,SAAS,KAAK,aAAa,SAAS,cAAc;AAClD,SAAS,cAAc;AAEhB,IAAM,+BAA+B,OAAO,SAAS,YAAY,SAAS;AAE/E,QAAM,eAAe,QAAQ,WAAW,cAAc,iBAAiB;AAEvE,QAAM,IAAI,YAAY,MAAM,KAAK,MAAM,YAAY,CAAC;AAEpD,QAAM,UAAU,YAAY,SAAS,iBAAiB,SAAS;AAE/D,QAAM,WAAW,OAAO,OAAQ,EAAE,UAAU,UAAU;AACtD,QAAM,KAAK,MAAM,QAAQ;AAEzB,QAAM,QAAQ,MAAM,OAAO,YAAY,SAAS,iBAAiB,SAAS,CAAC,EAAE,IAAI,kBAAkB,CAAC;AACpG,SAAO,QAAQ,QAAQ;AACzB;","names":[]}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@northern.tech/testing",
3
- "version": "0.5.1",
3
+ "version": "0.6.0",
4
4
  "license": "Apache-2.0",
5
5
  "private": false,
6
6
  "publishConfig": {