Skip to content

Commit

Permalink
[web] Add method to reset localStorage in tests
Browse files Browse the repository at this point in the history
Sometimes could be needed to reset the window.localStorage cache between
test examples, as it was the case for recently added tests for the space
policy section.

Thus, instead of having such utility hidden in and repeated in needed
tests, it has been moved to a test-utils.js file where, with a bit of
luck it will be more discoverable for others.

Additionally, that new helpers allows to set an initial cache too by
passing it an object with a collection of items compatible with Web
Storage API setItem method.
  • Loading branch information
dgdavid committed Feb 20, 2024
1 parent 9485f35 commit 8e247ff
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

import React from "react";
import { screen, within } from "@testing-library/react";
import { plainRender } from "~/test-utils";
import { plainRender, resetLocalStorage } from "~/test-utils";
import { ProposalSpacePolicySection } from "~/components/storage";

const sda = {
Expand Down Expand Up @@ -110,9 +110,7 @@ beforeEach(() => {
],
};

// Reset localStorage to avoid keeping the SpaceActionsTable state between
// examples.
window.localStorage.clear();
resetLocalStorage();
});

describe("ProposalSpacePolicySection", () => {
Expand Down
21 changes: 19 additions & 2 deletions web/src/test-utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import { render } from "@testing-library/react";

import { createClient } from "~/client/index";
import { InstallerClientProvider } from "~/context/installer";
import { noop } from "./utils";
import { noop, isObject } from "./utils";
import cockpit from "./lib/cockpit";
import { InstallerL10nProvider } from "./context/installerL10n";
import { L10nProvider } from "./context/l10n";
Expand Down Expand Up @@ -176,11 +176,28 @@ const mockGettext = () => {
cockpit.gettext.mockImplementation(gettextFn);
};

/**
* Helper for clearing window.localStorage and setting an initial state if needed.
*
* @param {Object.<string, string>} [initialState] - a collection of keys/values as
* expected by {@link https://developer.mozilla.org/en-US/docs/Web/API/Storage/setItem Web Storage API setItem method}
*/
const resetLocalStorage = (initialState) => {
window.localStorage.clear();

if (!isObject(initialState)) return;

Object.entries(initialState).forEach(([key, value]) => {
window.localStorage.setItem(key, value);
});
};

export {
plainRender,
installerRender,
createCallbackMock,
mockGettext,
mockNavigateFn,
mockRoutes
mockRoutes,
resetLocalStorage
};
57 changes: 57 additions & 0 deletions web/src/test-utils.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/*
* Copyright (c) [2024] SUSE LLC
*
* All Rights Reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as published
* by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, contact SUSE LLC.
*
* To contact SUSE LLC about this file by physical or electronic mail, you may
* find current contact information at www.suse.com.
*/

import {
resetLocalStorage
} from "./test-utils";

beforeAll(() => {
jest.spyOn(Storage.prototype, "clear");
jest.spyOn(Storage.prototype, "setItem");
});

afterAll(() => jest.clearAllMocks());

describe("resetLocalStorage", () => {
it("clears window.localStorage", () => {
resetLocalStorage();
expect(window.localStorage.clear).toHaveBeenCalled();
});

it("does not set an initial state if it is not given", () => {
resetLocalStorage();
expect(window.localStorage.setItem).not.toHaveBeenCalled();
});

it("does not set an initial state if given value is not an object", () => {
resetLocalStorage(["wrong", "initial state"]);
expect(window.localStorage.setItem).not.toHaveBeenCalled();
});

it("sets an initial state if given value is an object", () => {
resetLocalStorage({
storage: "something",
for: "later"
});
expect(window.localStorage.setItem).toHaveBeenCalledWith("storage", "something");
expect(window.localStorage.setItem).toHaveBeenCalledWith("for", "later");
});
});

0 comments on commit 8e247ff

Please sign in to comment.