[CORL-331] Better tests with types (#2270)

* feat: suspending, banning, now propogation

* feat: new mutation api with hooks support

* feat: better types in tests and refactor

* fix: lint
This commit is contained in:
Kiwi
2019-04-23 19:46:14 +00:00
committed by Wyatt Johnson
parent dbbc1af42e
commit 5150cdf60e
136 changed files with 2546 additions and 2465 deletions
@@ -1,8 +1,9 @@
import { get, merge } from "lodash";
import sinon from "sinon";
import { pureMerge } from "talk-common/utils";
import { GQLResolver } from "talk-framework/schema";
import {
createAccessToken,
createResolversStub,
CreateTestRendererParams,
replaceHistoryLocation,
wait,
waitForElement,
@@ -12,39 +13,37 @@ import {
import create from "../create";
import { emptyModerationQueues, settings, users } from "../fixtures";
const viewer = users.admins[0];
async function createTestRenderer(
customResolver: any = {},
options: { muteNetworkErrors?: boolean; logNetwork?: boolean } = {}
params: CreateTestRendererParams<GQLResolver> = {}
) {
replaceHistoryLocation("http://localhost/admin/login");
const resolvers = {
...customResolver,
Query: {
...customResolver.Query,
moderationQueues: sinon.stub().returns(emptyModerationQueues),
settings: sinon
.stub()
.returns(merge({}, settings, get(customResolver, "Query.settings"))),
viewer: sinon
.stub()
.returns(
merge(
{ ...users.admins[0], email: "", username: "", profiles: [] },
get(customResolver, "Query.viewer")
)
),
},
};
const { testRenderer, context } = create({
// Set this to true, to see graphql responses.
logNetwork: options.logNetwork,
muteNetworkErrors: options.muteNetworkErrors,
resolvers,
initLocalState: localRecord => {
...params,
resolvers: pureMerge(
createResolversStub<GQLResolver>({
Query: {
settings: () => settings,
viewer: () =>
pureMerge<typeof viewer>(viewer, {
email: "",
username: "",
profiles: [],
}),
moderationQueues: () => emptyModerationQueues,
},
}),
params.resolvers
),
initLocalState: (localRecord, source, environment) => {
localRecord.setValue("SIGN_IN", "authView");
localRecord.setValue(true, "loggedIn");
localRecord.setValue(createAccessToken(), "accessToken");
if (params.initLocalState) {
params.initLocalState(localRecord, source, environment);
}
},
});
@@ -62,44 +61,60 @@ it("renders addEmailAddress view", async () => {
it("renders createUsername view", async () => {
const { root } = await createTestRenderer({
Query: {
viewer: {
email: "hans@test.com",
resolvers: createResolversStub<GQLResolver>({
Query: {
viewer: () =>
pureMerge<typeof viewer>(viewer, {
email: "hans@test.com",
username: "",
profiles: [],
}),
},
},
}),
});
await waitForElement(() => within(root).queryByText("Create Username"));
});
it("renders createPassword view", async () => {
const { root } = await createTestRenderer({
Query: {
viewer: {
email: "hans@test.com",
username: "hans",
resolvers: createResolversStub<GQLResolver>({
Query: {
settings: () => settings,
moderationQueues: () => emptyModerationQueues,
viewer: () =>
pureMerge<typeof viewer>(viewer, {
email: "hans@test.com",
username: "hans",
profiles: [],
}),
},
},
}),
});
await waitForElement(() => within(root).queryByText("Create Password"));
});
it("do not render createPassword view when local auth is disabled", async () => {
await createTestRenderer({
Query: {
viewer: {
email: "hans@test.com",
username: "hans",
},
settings: {
auth: {
integrations: {
local: {
enabled: false,
resolvers: createResolversStub<GQLResolver>({
Query: {
viewer: () =>
pureMerge<typeof viewer>(viewer, {
email: "hans@test.com",
username: "hans",
profiles: [],
}),
settings: () =>
pureMerge<typeof settings>(settings, {
auth: {
integrations: {
local: {
enabled: false,
},
},
},
},
},
}),
},
},
}),
});
await wait(() =>
@@ -111,13 +126,16 @@ it("do not render createPassword view when local auth is disabled", async () =>
it("complete account", async () => {
await createTestRenderer({
Query: {
viewer: {
email: "hans@test.com",
username: "hans",
profiles: [{ __typename: "LocalProfile" }],
resolvers: createResolversStub<GQLResolver>({
Query: {
viewer: () =>
pureMerge<typeof viewer>(viewer, {
email: "hans@test.com",
username: "hans",
profiles: [{ __typename: "LocalProfile" }],
}),
},
},
}),
});
await wait(() =>
expect(window.location.toString()).toBe(
@@ -1,8 +1,9 @@
import { get, merge } from "lodash";
import sinon from "sinon";
import { pureMerge } from "talk-common/utils";
import { GQLResolver } from "talk-framework/schema";
import {
createAccessToken,
createResolversStub,
CreateTestRendererParams,
replaceHistoryLocation,
toJSON,
wait,
@@ -13,33 +14,37 @@ import {
import create from "../create";
import { settings, users } from "../fixtures";
const viewer = users.admins[0];
async function createTestRenderer(
customResolver: any = {},
options: { muteNetworkErrors?: boolean; logNetwork?: boolean } = {}
params: CreateTestRendererParams<GQLResolver> = {}
) {
replaceHistoryLocation("http://localhost/admin/login");
const resolvers = {
...customResolver,
Query: {
...customResolver.Query,
settings: sinon
.stub()
.returns(merge({}, settings, get(customResolver, "Query.settings"))),
viewer: sinon.stub().returns({ ...users.admins[0], email: "" }),
},
};
const { testRenderer, context } = create({
// Set this to true, to see graphql responses.
logNetwork: options.logNetwork,
muteNetworkErrors: options.muteNetworkErrors,
resolvers,
initLocalState: localRecord => {
...params,
resolvers: pureMerge(
createResolversStub<GQLResolver>({
Query: {
settings: () => settings,
viewer: () =>
pureMerge<typeof viewer>(viewer, {
email: "",
}),
},
}),
params.resolvers
),
initLocalState: (localRecord, source, environment) => {
localRecord.setValue("ADD_EMAIL_ADDRESS", "authView");
localRecord.setValue(true, "loggedIn");
localRecord.setValue(createAccessToken(), "accessToken");
if (params.initLocalState) {
params.initLocalState(localRecord, source, environment);
}
},
});
const container = await waitForElement(() =>
within(testRenderer.root).getByTestID("completeAccountBox")
);
@@ -94,21 +99,22 @@ it("accepts valid email", async () => {
it("shows server error", async () => {
const email = "hans@test.com";
const setEmail = sinon.stub().callsFake((_: any, data: any) => {
throw new Error("server error");
const resolvers = createResolversStub<GQLResolver>({
Mutation: {
setEmail: () => {
throw new Error("server error");
},
},
});
const {
form,
emailAddressField,
confirmEmailAddressField,
} = await createTestRenderer(
{
Mutation: {
setEmail,
},
},
{ muteNetworkErrors: true }
);
} = await createTestRenderer({
resolvers,
muteNetworkErrors: true,
});
const submitButton = form.find(
i => i.type === "button" && i.props.type === "submit"
);
@@ -130,27 +136,28 @@ it("shows server error", async () => {
it("successfully sets email", async () => {
const email = "hans@test.com";
const setEmail = sinon.stub().callsFake((_: any, data: any) => {
expectAndFail(data.input).toEqual({
email,
clientMutationId: data.input.clientMutationId,
});
return {
user: {
id: "me",
email,
const resolvers = createResolversStub<GQLResolver>({
Mutation: {
setEmail: ({ variables }) => {
expectAndFail(variables).toEqual({
email,
});
return {
user: {
id: "me",
email,
},
};
},
clientMutationId: data.input.clientMutationId,
};
},
});
const {
form,
emailAddressField,
confirmEmailAddressField,
} = await createTestRenderer({
Mutation: {
setEmail,
},
resolvers,
});
const submitButton = form.find(
i => i.type === "button" && i.props.type === "submit"
@@ -169,5 +176,5 @@ it("successfully sets email", async () => {
await wait(() => expect(submitButton.props.disabled).toBe(false));
expect(toJSON(form)).toMatchSnapshot();
expect(setEmail.called).toBe(true);
expect(resolvers.Mutation!.setEmail!.called).toBe(true);
});
@@ -1,8 +1,9 @@
import { get, merge } from "lodash";
import sinon from "sinon";
import { pureMerge } from "talk-common/utils";
import { GQLResolver } from "talk-framework/schema";
import {
createAccessToken,
createResolversStub,
CreateTestRendererParams,
replaceHistoryLocation,
toJSON,
wait,
@@ -13,33 +14,37 @@ import {
import create from "../create";
import { settings, users } from "../fixtures";
const viewer = users.admins[0];
async function createTestRenderer(
customResolver: any = {},
options: { muteNetworkErrors?: boolean; logNetwork?: boolean } = {}
params: CreateTestRendererParams<GQLResolver> = {}
) {
replaceHistoryLocation("http://localhost/admin/login");
const resolvers = {
...customResolver,
Query: {
...customResolver.Query,
settings: sinon
.stub()
.returns(merge({}, settings, get(customResolver, "Query.settings"))),
viewer: sinon.stub().returns({ ...users.admins[0], profiles: [] }),
},
};
const { testRenderer, context } = create({
// Set this to true, to see graphql responses.
logNetwork: options.logNetwork,
muteNetworkErrors: options.muteNetworkErrors,
resolvers,
initLocalState: localRecord => {
...params,
resolvers: pureMerge(
createResolversStub<GQLResolver>({
Query: {
settings: () => settings,
viewer: () =>
pureMerge<typeof viewer>(viewer, {
profiles: [],
}),
},
}),
params.resolvers
),
initLocalState: (localRecord, source, environment) => {
localRecord.setValue("CREATE_PASSWORD", "authView");
localRecord.setValue(true, "loggedIn");
localRecord.setValue(createAccessToken(), "accessToken");
if (params.initLocalState) {
params.initLocalState(localRecord, source, environment);
}
},
});
const container = await waitForElement(() =>
within(testRenderer.root).getByTestID("completeAccountBox")
);
@@ -76,17 +81,18 @@ it("checks for invalid password", async () => {
it("shows server error", async () => {
const password = "secretpassword";
const setPassword = sinon.stub().callsFake((_: any, data: any) => {
throw new Error("server error");
});
const { form, passwordField } = await createTestRenderer(
{
Mutation: {
setPassword,
const resolvers = createResolversStub<GQLResolver>({
Mutation: {
setPassword: () => {
throw new Error("server error");
},
},
{ muteNetworkErrors: true }
);
});
const { form, passwordField } = await createTestRenderer({
resolvers,
muteNetworkErrors: true,
});
const submitButton = form.find(
i => i.type === "button" && i.props.type === "submit"
);
@@ -104,23 +110,23 @@ it("shows server error", async () => {
it("successfully sets password", async () => {
const password = "secretpassword";
const setPassword = sinon.stub().callsFake((_: any, data: any) => {
expectAndFail(data.input).toEqual({
password,
clientMutationId: data.input.clientMutationId,
});
return {
user: {
id: "me",
profiles: [],
const resolvers = createResolversStub<GQLResolver>({
Mutation: {
setPassword: ({ variables }) => {
expectAndFail(variables).toEqual({
password,
});
return {
user: {
id: "me",
profiles: [],
},
};
},
clientMutationId: data.input.clientMutationId,
};
},
});
const { form, passwordField } = await createTestRenderer({
Mutation: {
setPassword,
},
resolvers,
});
const submitButton = form.find(
i => i.type === "button" && i.props.type === "submit"
@@ -135,5 +141,5 @@ it("successfully sets password", async () => {
await wait(() => expect(submitButton.props.disabled).toBe(false));
expect(toJSON(form)).toMatchSnapshot();
expect(setPassword.called).toBe(true);
expect(resolvers.Mutation!.setPassword!.called).toBe(true);
});
@@ -1,8 +1,9 @@
import { get, merge } from "lodash";
import sinon from "sinon";
import { pureMerge } from "talk-common/utils";
import { GQLResolver } from "talk-framework/schema";
import {
createAccessToken,
createResolversStub,
CreateTestRendererParams,
replaceHistoryLocation,
toJSON,
wait,
@@ -14,29 +15,27 @@ import create from "../create";
import { settings } from "../fixtures";
async function createTestRenderer(
customResolver: any = {},
options: { muteNetworkErrors?: boolean; logNetwork?: boolean } = {}
params: CreateTestRendererParams<GQLResolver> = {}
) {
replaceHistoryLocation("http://localhost/admin/login");
const resolvers = {
...customResolver,
Query: {
...customResolver.Query,
settings: sinon
.stub()
.returns(merge({}, settings, get(customResolver, "Query.settings"))),
},
};
const { testRenderer, context } = create({
// Set this to true, to see graphql responses.
logNetwork: options.logNetwork,
muteNetworkErrors: options.muteNetworkErrors,
resolvers,
initLocalState: localRecord => {
...params,
resolvers: pureMerge(
createResolversStub<GQLResolver>({
Query: {
settings: () => settings,
},
}),
params.resolvers
),
initLocalState: (localRecord, source, environment) => {
localRecord.setValue("CREATE_USERNAME", "authView");
localRecord.setValue(true, "loggedIn");
localRecord.setValue(createAccessToken(), "accessToken");
if (params.initLocalState) {
params.initLocalState(localRecord, source, environment);
}
},
});
const container = await waitForElement(() =>
@@ -75,17 +74,17 @@ it("checks for invalid username", async () => {
it("shows server error", async () => {
const username = "hans";
const setUsername = sinon.stub().callsFake((_: any, data: any) => {
throw new Error("server error");
});
const { form, usernameField } = await createTestRenderer(
{
Mutation: {
setUsername,
const resolvers = createResolversStub<GQLResolver>({
Mutation: {
setUsername: () => {
throw new Error("server error");
},
},
{ muteNetworkErrors: true }
);
});
const { form, usernameField } = await createTestRenderer({
resolvers,
muteNetworkErrors: true,
});
const submitButton = form.find(
i => i.type === "button" && i.props.type === "submit"
);
@@ -103,24 +102,25 @@ it("shows server error", async () => {
it("successfully sets username", async () => {
const username = "hans";
const setUsername = sinon.stub().callsFake((_: any, data: any) => {
expectAndFail(data.input).toEqual({
username,
clientMutationId: data.input.clientMutationId,
});
return {
user: {
id: "me",
username,
},
clientMutationId: data.input.clientMutationId,
};
});
const { form, usernameField } = await createTestRenderer({
const resolvers = createResolversStub<GQLResolver>({
Mutation: {
setUsername,
setUsername: ({ variables }) => {
expectAndFail(variables).toEqual({
username,
});
return {
user: {
id: "me",
username,
},
};
},
},
});
const { form, usernameField } = await createTestRenderer({
resolvers,
});
const submitButton = form.find(
i => i.type === "button" && i.props.type === "submit"
);
@@ -134,5 +134,5 @@ it("successfully sets username", async () => {
await wait(() => expect(submitButton.props.disabled).toBe(false));
expect(toJSON(form)).toMatchSnapshot();
expect(setUsername.called).toBe(true);
expect(resolvers.Mutation!.setUsername!.called).toBe(true);
});
@@ -1,10 +1,17 @@
import sinon from "sinon";
import {
GQLResolver,
QueryToModerationQueuesResolver,
} from "talk-framework/schema";
import {
createAccessToken,
createQueryResolverStub,
createResolversStub,
CreateTestRendererParams,
replaceHistoryLocation,
wait,
} from "talk-framework/testHelpers";
import { pureMerge } from "talk-common/utils";
import create from "../create";
import {
emptyModerationQueues,
@@ -13,26 +20,41 @@ import {
users,
} from "../fixtures";
const resolvers = {
Query: {
settings: sinon.stub().returns(settings),
moderationQueues: sinon.stub().returns(emptyModerationQueues),
comments: sinon.stub().returns(emptyRejectedComments),
viewer: sinon.stub().returns(users.admins[0]),
},
};
const viewer = users.admins[0];
it("redirect when already logged in", async () => {
async function createTestRenderer(
params: CreateTestRendererParams<GQLResolver> = {}
) {
replaceHistoryLocation("http://localhost/admin/login");
create({
resolvers,
// Set this to true, to see graphql responses.
logNetwork: false,
initLocalState: localRecord => {
const { testRenderer, context } = create({
...params,
resolvers: pureMerge(
createResolversStub<GQLResolver>({
Query: {
settings: () => settings,
moderationQueues: createQueryResolverStub<
QueryToModerationQueuesResolver
>(() => emptyModerationQueues),
comments: () => emptyRejectedComments,
viewer: () => viewer,
},
}),
params.resolvers
),
initLocalState: (localRecord, source, environment) => {
localRecord.setValue(true, "loggedIn");
localRecord.setValue(createAccessToken(), "accessToken");
localRecord.setValue("SIGN_IN", "authView");
if (params.initLocalState) {
params.initLocalState(localRecord, source, environment);
}
},
});
return { testRenderer, context };
}
it("redirect when already logged in", async () => {
await createTestRenderer();
await wait(() =>
expect(window.location.toString()).toBe(
"http://localhost/admin/moderate/reported"
@@ -41,14 +63,8 @@ it("redirect when already logged in", async () => {
});
it("redirect to redirectPath when already logged in", async () => {
replaceHistoryLocation("http://localhost/admin/login");
create({
resolvers,
// Set this to true, to see graphql responses.
logNetwork: false,
await createTestRenderer({
initLocalState: localRecord => {
localRecord.setValue(true, "loggedIn");
localRecord.setValue(createAccessToken(), "accessToken");
localRecord.setValue("/admin/moderate/pending", "redirectPath");
},
});
@@ -1,9 +1,16 @@
import { ReactTestRenderer } from "react-test-renderer";
import sinon from "sinon";
import { TalkContext } from "talk-framework/lib/bootstrap";
import { LOCAL_ID } from "talk-framework/lib/relay";
import { replaceHistoryLocation, wait } from "talk-framework/testHelpers";
import { pureMerge } from "talk-common/utils";
import { LOCAL_ID, lookup } from "talk-framework/lib/relay";
import {
GQLResolver,
QueryToModerationQueuesResolver,
} from "talk-framework/schema";
import {
createQueryResolverStub,
createResolversStub,
CreateTestRendererParams,
replaceHistoryLocation,
wait,
} from "talk-framework/testHelpers";
import create from "../create";
import {
@@ -12,39 +19,41 @@ import {
settings,
} from "../fixtures";
function createTestRenderer(): {
testRenderer: ReactTestRenderer;
context: TalkContext;
} {
async function createTestRenderer(
params: CreateTestRendererParams<GQLResolver> = {}
) {
replaceHistoryLocation("http://localhost/admin/moderate");
const resolvers = {
Query: {
settings: sinon.stub().returns(settings),
moderationQueues: sinon.stub().returns(emptyModerationQueues),
comments: sinon.stub().returns(emptyRejectedComments),
},
};
const { testRenderer, context } = create({
resolvers,
// Set this to true, to see graphql responses.
logNetwork: false,
initLocalState: localRecord => {
...params,
resolvers: pureMerge(
createResolversStub<GQLResolver>({
Query: {
settings: () => settings,
moderationQueues: createQueryResolverStub<
QueryToModerationQueuesResolver
>(() => emptyModerationQueues),
comments: () => emptyRejectedComments,
},
}),
params.resolvers
),
initLocalState: (localRecord, source, environment) => {
localRecord.setValue(false, "loggedIn");
localRecord.setValue("SIGN_IN", "authView");
if (params.initLocalState) {
params.initLocalState(localRecord, source, environment);
}
},
});
return { testRenderer, context };
}
it("redirect when not logged in", async () => {
const { context } = createTestRenderer();
const { context } = await createTestRenderer();
await wait(() => {
expect(
context.relayEnvironment
.getStore()
.getSource()
.get(LOCAL_ID)!.redirectPath
).toBe("/admin/moderate/reported");
expect(lookup(context.relayEnvironment, LOCAL_ID)!.redirectPath).toBe(
"/admin/moderate/reported"
);
expect(window.location.toString()).toBe("http://localhost/admin/login");
});
});
@@ -1,11 +1,12 @@
import { ReactTestRenderer } from "react-test-renderer";
import sinon from "sinon";
import { TalkContext } from "talk-framework/lib/bootstrap";
import { LOCAL_ID } from "talk-framework/lib/relay";
import { GQLUSER_ROLE } from "talk-framework/schema";
import { pureMerge } from "talk-common/utils";
import { LOCAL_ID, lookup } from "talk-framework/lib/relay";
import { GQLResolver, GQLUSER_ROLE } from "talk-framework/schema";
import {
createAccessToken,
createResolversStub,
CreateTestRendererParams,
replaceHistoryLocation,
wait,
waitForElement,
@@ -20,29 +21,32 @@ import {
users,
} from "../fixtures";
function createTestRenderer(
userDiff: any = {}
): {
testRenderer: ReactTestRenderer;
context: TalkContext;
} {
const viewer = users.admins[0];
async function createTestRenderer(
params: CreateTestRendererParams<GQLResolver> = {}
) {
replaceHistoryLocation("http://localhost/admin/moderate/reported");
const resolvers = {
Query: {
settings: sinon.stub().returns(settings),
moderationQueues: sinon.stub().returns(emptyModerationQueues),
comments: sinon.stub().returns(emptyRejectedComments),
viewer: sinon.stub().returns({ ...users.admins[0], ...userDiff }),
},
};
const { testRenderer, context } = create({
resolvers,
// Set this to true, to see graphql responses.
logNetwork: false,
initLocalState: localRecord => {
...params,
resolvers: pureMerge(
createResolversStub<GQLResolver>({
Query: {
settings: () => settings,
moderationQueues: () => emptyModerationQueues,
comments: () => emptyRejectedComments,
viewer: () => viewer,
},
}),
params.resolvers
),
initLocalState: (localRecord, source, environment) => {
localRecord.setValue(true, "loggedIn");
localRecord.setValue(createAccessToken(), "accessToken");
localRecord.setValue("SIGN_IN", "authView");
if (params.initLocalState) {
params.initLocalState(localRecord, source, environment);
}
},
});
return { testRenderer, context };
@@ -51,7 +55,16 @@ function createTestRenderer(
it("show restricted screen for commenters and staff", async () => {
const restrictedRoles = [GQLUSER_ROLE.COMMENTER, GQLUSER_ROLE.STAFF];
for (const role of restrictedRoles) {
const { testRenderer } = createTestRenderer({ role });
const { testRenderer } = await createTestRenderer({
resolvers: createResolversStub<GQLResolver>({
Query: {
viewer: () =>
pureMerge<typeof viewer>(viewer, {
role,
}),
},
}),
});
const authBox = await waitForElement(() =>
within(testRenderer.root).getByTestID("authBox")
);
@@ -60,8 +73,15 @@ it("show restricted screen for commenters and staff", async () => {
});
it("sign out when clicking on sign in as", async () => {
const { context, testRenderer } = createTestRenderer({
role: GQLUSER_ROLE.COMMENTER,
const { testRenderer, context } = await createTestRenderer({
resolvers: createResolversStub<GQLResolver>({
Query: {
viewer: () =>
pureMerge<typeof viewer>(viewer, {
role: GQLUSER_ROLE.COMMENTER,
}),
},
}),
});
const authBox = await waitForElement(() =>
within(testRenderer.root).getByTestID("authBox")
@@ -81,18 +101,10 @@ it("sign out when clicking on sign in as", async () => {
.props.onClick();
await wait(() => {
expect(
context.relayEnvironment
.getStore()
.getSource()
.get(LOCAL_ID)!.redirectPath
).toBe("/admin/moderate/reported");
expect(lookup(context.relayEnvironment, LOCAL_ID)!.redirectPath).toBe(
"/admin/moderate/reported"
);
});
expect(
context.relayEnvironment
.getStore()
.getSource()
.get(LOCAL_ID)!.loggedIn
).toBeFalsy();
expect(lookup(context.relayEnvironment, LOCAL_ID)!.loggedIn).toBeFalsy();
});
@@ -1,8 +1,11 @@
import { ReactTestInstance } from "react-test-renderer";
import sinon from "sinon";
import { pureMerge } from "talk-common/utils";
import { GQLResolver } from "talk-framework/schema";
import {
createAccessToken,
createResolversStub,
CreateTestRendererParams,
replaceHistoryLocation,
wait,
waitForElement,
@@ -16,32 +19,34 @@ import {
settings,
} from "../fixtures";
const resolvers = {
Query: {
settings: sinon.stub().returns(settings),
moderationQueues: sinon.stub().returns(emptyModerationQueues),
comments: sinon.stub().returns(emptyRejectedComments),
},
};
const inputPredicate = (name: string) => (n: ReactTestInstance) => {
return n.props.name === name && n.props.onChange;
};
async function createTestRenderer() {
async function createTestRenderer(
params: CreateTestRendererParams<GQLResolver> = {}
) {
// deliberately setting to a different route,
// it should be smart enough to reroute to /admin/login.
replaceHistoryLocation("http://localhost/admin/moderate");
const { testRenderer, context } = create({
resolvers,
// Set this to true, to see graphql responses.
logNetwork: false,
initLocalState: localRecord => {
...params,
resolvers: pureMerge(
createResolversStub<GQLResolver>({
Query: {
settings: () => settings,
moderationQueues: () => emptyModerationQueues,
comments: () => emptyRejectedComments,
},
}),
params.resolvers
),
initLocalState: (localRecord, source, environment) => {
localRecord.setValue(false, "loggedIn");
localRecord.setValue("SIGN_IN", "authView");
if (params.initLocalState) {
params.initLocalState(localRecord, source, environment);
}
},
});
const form = await waitForElement(() =>
within(testRenderer.root).getByType("form")
);
@@ -121,11 +126,11 @@ it("shows server error", async () => {
it("submits form successfully", async () => {
const { form, context } = await createTestRenderer();
form
.find(inputPredicate("email"))
within(form)
.getByLabelText("Email Address")
.props.onChange({ target: { value: "hans@test.com" } });
form
.find(inputPredicate("password"))
within(form)
.getByLabelText("Password")
.props.onChange({ target: { value: "testtest" } });
const accessToken = createAccessToken();
@@ -1,7 +1,11 @@
import sinon from "sinon";
import { LOCAL_ID } from "talk-framework/lib/relay";
import { pureMerge } from "talk-common/utils";
import { LOCAL_ID, lookup } from "talk-framework/lib/relay";
import { GQLResolver } from "talk-framework/schema";
import {
createResolversStub,
CreateTestRendererParams,
replaceHistoryLocation,
wait,
waitForElement,
@@ -16,26 +20,39 @@ import {
users,
} from "../fixtures";
const resolvers = {
Query: {
settings: sinon.stub().returns(settings),
moderationQueues: sinon.stub().returns(emptyModerationQueues),
comments: sinon.stub().returns(emptyRejectedComments),
viewer: sinon.stub().returns(users.admins[0]),
},
};
const viewer = users.admins[0];
async function createTestRenderer(
params: CreateTestRendererParams<GQLResolver> = {}
) {
replaceHistoryLocation("http://localhost/admin/moderate/reported");
const { testRenderer, context } = create({
...params,
resolvers: pureMerge(
createResolversStub<GQLResolver>({
Query: {
settings: () => settings,
moderationQueues: () => emptyModerationQueues,
comments: () => emptyRejectedComments,
viewer: () => viewer,
},
}),
params.resolvers
),
initLocalState: (localRecord, source, environment) => {
localRecord.setValue(true, "loggedIn");
if (params.initLocalState) {
params.initLocalState(localRecord, source, environment);
}
},
});
return { testRenderer, context };
}
it("logs out", async () => {
replaceHistoryLocation("http://localhost/admin/moderate");
const { testRenderer, context } = create({
resolvers,
// Set this to true, to see graphql responses.
logNetwork: false,
initLocalState: localRecord => {
localRecord.setValue(true, "loggedIn");
},
});
const { testRenderer, context } = await createTestRenderer();
const restMock = sinon.mock(context.rest);
restMock
@@ -60,11 +77,6 @@ it("logs out", async () => {
signOutButton.props.onClick();
await wait(() => {
expect(
context.relayEnvironment
.getStore()
.getSource()
.get(LOCAL_ID)!.loggedIn
).toBeFalsy();
expect(lookup(context.relayEnvironment, LOCAL_ID)!.loggedIn).toBeFalsy();
});
});