stitch-ui
Version:
262 lines (240 loc) • 8.27 kB
JavaScript
/* 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);
});
});
});