UNPKG

stitch-ui

Version:

262 lines (240 loc) 8.27 kB
/* global it, describe, beforeEach, expect, fail */ /* eslint-disable no-underscore-dangle */ import { testSetup, noConsoleErrorsAllowed } from "../../testutil"; import { loadAllowedRequestOrigins, addAllowedRequestOrigin, removeAllowedRequestOrigin, setAllowedRequestOriginInput, saveAllowedRequestOrigins, cancelEditingAllowedRequestOrigins } from "../actions"; import * as homeActions from "../../home/actions"; global.navigator = { userAgent: "node.js" }; describe("allowed request origins", () => { noConsoleErrorsAllowed(); let store; let testApp; beforeEach(async () => { const testHarness = await testSetup(); store = testHarness.store; testApp = await store.dispatch( homeActions.createApp(testHarness.groupId, "my-test-app") ); }); it("can list origins when empty", async () => { await store.dispatch( loadAllowedRequestOrigins(testApp.groupId, testApp._id) ); expect( store.getState().auth.security.allowedRequestOrigins.local.size ).toBe(0); expect( store.getState().auth.security.allowedRequestOrigins.remote.size ).toBe(0); expect( store .getState() .auth.security.allowedRequestOrigins.status.get("dirty", false) ).toBe(false); }); it("can add an origin, and see it appear in the list", async () => { store.dispatch(addAllowedRequestOrigin()); expect( store.getState().auth.security.allowedRequestOrigins.local.size ).toBe(1); expect( store.getState().auth.security.allowedRequestOrigins.remote.size ).toBe(0); expect( store.getState().auth.security.allowedRequestOrigins.status.get("dirty") ).toBe(true); expect( store.getState().auth.security.allowedRequestOrigins.local.get(0) ).toEqual(""); }); it("can update an origin, and see it appear in the list", async () => { await store.dispatch( setAllowedRequestOriginInput({ index: 0, input: "https://origin1.com" }) ); expect( store.getState().auth.security.allowedRequestOrigins.local.size ).toBe(1); expect( store.getState().auth.security.allowedRequestOrigins.remote.size ).toBe(0); expect( store.getState().auth.security.allowedRequestOrigins.status.get("dirty") ).toBe(true); expect( store.getState().auth.security.allowedRequestOrigins.local.get(0) ).toEqual("https://origin1.com"); }); it("can remove an origin, and see it disappear from the list", async () => { await store.dispatch(addAllowedRequestOrigin()); await store.dispatch(addAllowedRequestOrigin()); await store.dispatch( setAllowedRequestOriginInput({ index: 0, input: "https://origin2.com" }) ); await store.dispatch( setAllowedRequestOriginInput({ index: 1, input: "https://origin2.com" }) ); await store.dispatch(removeAllowedRequestOrigin({ index: 0 })); expect( store.getState().auth.security.allowedRequestOrigins.local.size ).toBe(1); expect( store.getState().auth.security.allowedRequestOrigins.remote.size ).toBe(0); expect( store.getState().auth.security.allowedRequestOrigins.local.get(0) ).toEqual("https://origin2.com"); expect( store.getState().auth.security.allowedRequestOrigins.status.get("dirty") ).toBe(true); await store.dispatch(removeAllowedRequestOrigin({ index: 0 })); expect( store.getState().auth.security.allowedRequestOrigins.local.size ).toBe(0); expect( store.getState().auth.security.allowedRequestOrigins.remote.size ).toBe(0); expect( store.getState().auth.security.allowedRequestOrigins.status.get("dirty") ).toBe(false); }); it("can cancel drafted changes", async () => { await store.dispatch(addAllowedRequestOrigin()); await store.dispatch(addAllowedRequestOrigin()); await store.dispatch(addAllowedRequestOrigin()); await store.dispatch( setAllowedRequestOriginInput({ index: 0, input: "https://origin1.com" }) ); await store.dispatch( setAllowedRequestOriginInput({ index: 1, input: "https://origin2.com" }) ); await store.dispatch( setAllowedRequestOriginInput({ index: 2, input: "https://origin3.com" }) ); expect( store.getState().auth.security.allowedRequestOrigins.local.size ).toBe(3); expect( store.getState().auth.security.allowedRequestOrigins.remote.size ).toBe(0); expect( store.getState().auth.security.allowedRequestOrigins.status.get("dirty") ).toBe(true); await store.dispatch(cancelEditingAllowedRequestOrigins()); expect( store.getState().auth.security.allowedRequestOrigins.local.size ).toBe(0); expect( store.getState().auth.security.allowedRequestOrigins.remote.size ).toBe(0); expect( store.getState().auth.security.allowedRequestOrigins.status.get("dirty") ).toBe(false); }); it("should save drafted changes, and should persist over loads", async () => { await store.dispatch(addAllowedRequestOrigin()); await store.dispatch(addAllowedRequestOrigin()); await store.dispatch(addAllowedRequestOrigin()); await store.dispatch( setAllowedRequestOriginInput({ index: 0, input: "https://origin1.com" }) ); await store.dispatch( setAllowedRequestOriginInput({ index: 1, input: "https://origin2.com" }) ); await store.dispatch( setAllowedRequestOriginInput({ index: 2, input: "https://origin3.com" }) ); expect( store.getState().auth.security.allowedRequestOrigins.local.size ).toBe(3); expect( store.getState().auth.security.allowedRequestOrigins.remote.size ).toBe(0); expect( store.getState().auth.security.allowedRequestOrigins.status.get("dirty") ).toBe(true); await store.dispatch( saveAllowedRequestOrigins( testApp.groupId, testApp._id, store.getState().auth.security.allowedRequestOrigins.local ) ); expect( store.getState().auth.security.allowedRequestOrigins.local.size ).toBe(3); expect( store.getState().auth.security.allowedRequestOrigins.remote.size ).toBe(3); expect( store .getState() .auth.security.allowedRequestOrigins.status.get("dirty", false) ).toBe(false); }); it("should store an error if an error saving occurs", async () => { await store.dispatch(addAllowedRequestOrigin()); await store.dispatch(addAllowedRequestOrigin()); await store.dispatch(addAllowedRequestOrigin()); await store.dispatch( setAllowedRequestOriginInput({ index: 0, input: "https://origin1.com" }) ); await store.dispatch( setAllowedRequestOriginInput({ index: 1, input: "origin2.com" }) ); await store.dispatch( setAllowedRequestOriginInput({ index: 2, input: "https://origin3.com" }) ); try { await store.dispatch( saveAllowedRequestOrigins( testApp.groupId, testApp._id, store.getState().auth.security.allowedRequestOrigins.local ) ); fail("expected save to fail"); } catch (err) { expect(err).not.toBe(undefined); } expect( store.getState().auth.security.allowedRequestOrigins.local.size ).toBe(3); expect( store.getState().auth.security.allowedRequestOrigins.remote.size ).toBe(0); expect( store .getState() .auth.security.allowedRequestOrigins.status.get("dirty", false) ).toBe(true); expect( store .getState() .auth.security.allowedRequestOrigins.status.get("saveError") ).toContain("invalid origin"); it("should clear the error when the issue is addressed and saved again", async () => { await store.dispatch( setAllowedRequestOriginInput({ index: 1, input: "http://origin2.com" }) ); expect( store.getState().auth.security.allowedRequestOrigins.local.size ).toBe(3); expect( store.getState().auth.security.allowedRequestOrigins.remote.size ).toBe(3); expect( store .getState() .auth.security.allowedRequestOrigins.status.get("dirty", false) ).toBe(false); }); }); });