diff --git a/src/components/SaveButton/SaveButton.test.js b/src/components/SaveButton/SaveButton.test.js index 146720e0d..6ee83cd4f 100644 --- a/src/components/SaveButton/SaveButton.test.js +++ b/src/components/SaveButton/SaveButton.test.js @@ -1,8 +1,6 @@ import React from "react"; -import { fireEvent, render, screen } from "@testing-library/react"; -import { Provider } from "react-redux"; -import configureStore from "redux-mock-store"; -import { triggerSave } from "../../redux/EditorSlice"; +import { fireEvent, screen } from "@testing-library/react"; +import renderWithProviders from "../../utils/renderWithProviders"; import SaveButton from "./SaveButton"; const logInHandler = jest.fn(); @@ -17,9 +15,7 @@ describe("When project is loaded", () => { describe("who doesn't own the project", () => { beforeEach(() => { - const middlewares = []; - const mockStore = configureStore(middlewares); - const initialState = { + const preloadedState = { editor: { loading: "success", webComponent: true, @@ -36,12 +32,9 @@ describe("When project is loaded", () => { }, }, }; - store = mockStore(initialState); - render( - - - , - ); + ({ store } = renderWithProviders(, { + preloadedState, + })); }); test("Save button renders", () => { @@ -54,10 +47,10 @@ describe("When project is loaded", () => { ).not.toBeInTheDocument(); }); - test("Clicking save dispatches trigger save action", () => { + test("Clicking save updates the save-triggered state", () => { const saveButton = screen.queryByText("header.save"); fireEvent.click(saveButton); - expect(store.getActions()).toEqual([triggerSave()]); + expect(store.getState().editor.saveTriggered).toBe(true); }); test("Clicking save triggers a logInHandler event", () => { @@ -69,9 +62,7 @@ describe("When project is loaded", () => { describe("who does own the project", () => { beforeEach(() => { - const middlewares = []; - const mockStore = configureStore(middlewares); - const initialState = { + const preloadedState = { editor: { loading: "success", webComponent: true, @@ -88,12 +79,9 @@ describe("When project is loaded", () => { }, }, }; - store = mockStore(initialState); - render( - - - , - ); + ({ store } = renderWithProviders(, { + preloadedState, + })); }); test("Does not render save button", () => { @@ -112,21 +100,16 @@ describe("When project is loaded", () => { let store; beforeEach(() => { - const middlewares = []; - const mockStore = configureStore(middlewares); - const initialState = { + const preloadedState = { editor: { loading: "success", webComponent: false, }, auth: {}, }; - store = mockStore(initialState); - render( - - - , - ); + ({ store } = renderWithProviders(, { + preloadedState, + })); }); test("Login to save button renders", () => { @@ -137,10 +120,10 @@ describe("When project is loaded", () => { expect(screen.queryByText("header.save")).not.toBeInTheDocument(); }); - test("Clicking save dispatches trigger save action", () => { + test("Clicking save updates the save-triggered state", () => { const saveButton = screen.queryByText("header.loginToSave"); fireEvent.click(saveButton); - expect(store.getActions()).toEqual([triggerSave()]); + expect(store.getState().editor.saveTriggered).toBe(true); }); test("Clicking save triggers a logInHandler event", () => { @@ -151,24 +134,17 @@ describe("When project is loaded", () => { }); describe("with webComponent=false", () => { - let store; - beforeEach(() => { - const middlewares = []; - const mockStore = configureStore(middlewares); - const initialState = { + const preloadedState = { editor: { loading: "success", webComponent: false, }, auth: {}, }; - store = mockStore(initialState); - render( - - - , - ); + renderWithProviders(, { + preloadedState, + }); }); test("Renders a secondary button", () => { @@ -178,24 +154,17 @@ describe("When project is loaded", () => { }); describe("with webComponent=true", () => { - let store; - beforeEach(() => { - const middlewares = []; - const mockStore = configureStore(middlewares); - const initialState = { + const preloadedState = { editor: { loading: "success", webComponent: true, }, auth: {}, }; - store = mockStore(initialState); - render( - - - , - ); + renderWithProviders(, { + preloadedState, + }); }); test("Renders a primary button", () => { @@ -211,17 +180,12 @@ describe("When project is loaded", () => { describe("When project is not loaded", () => { beforeEach(() => { - const middlewares = []; - const mockStore = configureStore(middlewares); - const store = mockStore({ - editor: {}, - auth: {}, + renderWithProviders(, { + preloadedState: { + editor: {}, + auth: {}, + }, }); - render( - - - , - ); }); test("Does not render a login to save button", () => { diff --git a/src/utils/renderWithProviders.js b/src/utils/renderWithProviders.js new file mode 100644 index 000000000..067bb4a28 --- /dev/null +++ b/src/utils/renderWithProviders.js @@ -0,0 +1,23 @@ +import React from "react"; +import { render } from "@testing-library/react"; +import { Provider } from "react-redux"; +import { configureStore } from "@reduxjs/toolkit"; +import rootReducer from "../redux/RootSlice"; + +const renderWithProviders = ( + ui, + { preloadedState, store, reducer = rootReducer, ...renderOptions } = {}, +) => { + const testStore = store || configureStore({ reducer, preloadedState }); + + const Wrapper = ({ children }) => ( + {children} + ); + + return { + store: testStore, + ...render(ui, { wrapper: Wrapper, ...renderOptions }), + }; +}; + +export default renderWithProviders;