From 3166478ec32d91ffdcb6139be1a1f924d65820b8 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Mon, 6 Aug 2018 22:21:44 +0200 Subject: [PATCH] Add and refactor tests --- .../testHelpers/createRelayEnvironment.ts | 78 +++++++++++++++++++ .../client/framework/testHelpers/index.ts | 4 + .../mutations/SetCommentIDMutation.spec.ts | 54 +++++++++++++ .../stream/mutations/SetCommentIDMutation.ts | 2 +- .../SetNetworkStatusMutation.spec.ts | 26 +++++++ .../mutations/SetNetworkStatusMutation.ts | 5 +- .../client/stream/test/createEnvironment.ts | 49 ------------ src/core/client/stream/test/loadMore.spec.tsx | 13 ++-- .../client/stream/test/permalinkView.spec.tsx | 13 ++-- .../test/permalinkViewAssetNotFound.spec.tsx | 14 ++-- .../permalinkViewCommentNotFound.spec.tsx | 13 ++-- .../client/stream/test/renderReplies.spec.tsx | 13 ++-- .../client/stream/test/renderStream.spec.tsx | 13 ++-- .../stream/test/showAllReplies.spec.tsx | 13 ++-- 14 files changed, 223 insertions(+), 87 deletions(-) create mode 100644 src/core/client/framework/testHelpers/createRelayEnvironment.ts create mode 100644 src/core/client/framework/testHelpers/index.ts create mode 100644 src/core/client/stream/mutations/SetCommentIDMutation.spec.ts create mode 100644 src/core/client/stream/mutations/SetNetworkStatusMutation.spec.ts delete mode 100644 src/core/client/stream/test/createEnvironment.ts diff --git a/src/core/client/framework/testHelpers/createRelayEnvironment.ts b/src/core/client/framework/testHelpers/createRelayEnvironment.ts new file mode 100644 index 000000000..717c037ad --- /dev/null +++ b/src/core/client/framework/testHelpers/createRelayEnvironment.ts @@ -0,0 +1,78 @@ +import { IResolvers } from "graphql-tools"; +import { createFetch } from "relay-local-schema"; +import { + commitLocalUpdate, + Environment, + Network, + RecordProxy, + RecordSource, + RecordSourceProxy, + Store, +} from "relay-runtime"; + +import { + createAndRetain, + LOCAL_ID, + LOCAL_TYPE, + wrapFetchWithLogger, +} from "talk-framework/lib/relay"; + +import { loadSchema } from "talk-common/graphql"; + +export interface CreateRelayEnvironmentNetworkParams { + /** project name of graphql-config */ + projectName: string; + /** graphql resolvers */ + resolvers: IResolvers; + /** If enabled, graphql responses will be logged to the console */ + logNetwork?: boolean; +} + +export interface CreateRelayEnvironmentParams { + /** If set, creates a network to a local graphql server with a local schema */ + network?: CreateRelayEnvironmentNetworkParams; + /** Allows to set initial state for Local state */ + initLocalState?: ( + local: RecordProxy, + source: RecordSourceProxy, + environment: Environment + ) => void; + /** Use this source for creating the environment */ + source?: RecordSource; +} + +/** + * create Relay environment for tests environments. + */ +export default function createRelayEnvironment( + params: CreateRelayEnvironmentParams = {} +) { + let network: Network = null as any; + if (params.network) { + const schema = loadSchema( + params.network.projectName, + params.network.resolvers + ); + network = Network.create( + wrapFetchWithLogger(createFetch({ schema }), params.network.logNetwork) + ); + } + const environment = new Environment({ + network, + store: new Store(params.source || new RecordSource()), + }); + commitLocalUpdate(environment, sourceProxy => { + const root = sourceProxy.getRoot(); + const localRecord = createAndRetain( + environment, + sourceProxy, + LOCAL_ID, + LOCAL_TYPE + ); + root.setLinkedRecord(localRecord, "local"); + if (params.initLocalState) { + params.initLocalState!(localRecord, sourceProxy, environment); + } + }); + return environment; +} diff --git a/src/core/client/framework/testHelpers/index.ts b/src/core/client/framework/testHelpers/index.ts new file mode 100644 index 000000000..9cbc97018 --- /dev/null +++ b/src/core/client/framework/testHelpers/index.ts @@ -0,0 +1,4 @@ +export { + default as createRelayEnvironment, + CreateRelayEnvironmentParams, +} from "./createRelayEnvironment"; diff --git a/src/core/client/stream/mutations/SetCommentIDMutation.spec.ts b/src/core/client/stream/mutations/SetCommentIDMutation.spec.ts new file mode 100644 index 000000000..8f296c79d --- /dev/null +++ b/src/core/client/stream/mutations/SetCommentIDMutation.spec.ts @@ -0,0 +1,54 @@ +import { Environment, RecordSource } from "relay-runtime"; +import sinon from "sinon"; + +import { timeout } from "talk-common/utils"; +import { LOCAL_ID } from "talk-framework/lib/relay"; +import { createRelayEnvironment } from "talk-framework/testHelpers"; + +import { commit } from "./SetCommentIDMutation"; + +let environment: Environment; +const source: RecordSource = new RecordSource(); + +beforeAll(() => { + environment = createRelayEnvironment({ + source, + }); +}); + +it("Sets comment id", () => { + const id = "comment1-id"; + commit(environment, { id }, {} as any); + expect(source.get(LOCAL_ID)!.commentID).toEqual(id); +}); + +it("Should call setCommentID in pym", async () => { + const id = "comment2-id"; + const context = { + pym: { + sendMessage: sinon + .mock() + .once() + .withArgs("setCommentID", id), + }, + }; + commit(environment, { id }, context as any); + await timeout(); + expect(source.get(LOCAL_ID)!.commentID).toEqual(id); + context.pym.sendMessage.verify(); +}); + +it("Should call setCommentID in pym with empty id", async () => { + const context = { + pym: { + sendMessage: sinon + .mock() + .once() + .withArgs("setCommentID", ""), + }, + }; + commit(environment, { id: null }, context as any); + await timeout(); + expect(source.get(LOCAL_ID)!.commentID).toEqual(null); + context.pym.sendMessage.verify(); +}); diff --git a/src/core/client/stream/mutations/SetCommentIDMutation.ts b/src/core/client/stream/mutations/SetCommentIDMutation.ts index ce4eb9eb1..4bacb1181 100644 --- a/src/core/client/stream/mutations/SetCommentIDMutation.ts +++ b/src/core/client/stream/mutations/SetCommentIDMutation.ts @@ -10,7 +10,7 @@ export interface SetCommentIDInput { export type SetCommentIDMutation = (input: SetCommentIDInput) => Promise; -async function commit( +export async function commit( environment: Environment, input: SetCommentIDInput, { pym }: TalkContext diff --git a/src/core/client/stream/mutations/SetNetworkStatusMutation.spec.ts b/src/core/client/stream/mutations/SetNetworkStatusMutation.spec.ts new file mode 100644 index 000000000..1a6196c45 --- /dev/null +++ b/src/core/client/stream/mutations/SetNetworkStatusMutation.spec.ts @@ -0,0 +1,26 @@ +import { Environment, RecordSource } from "relay-runtime"; + +import { createRelayEnvironment } from "talk-framework/testHelpers"; + +import { NETWORK_ID, NETWORK_TYPE } from "../local"; + +import { commit } from "./SetNetworkStatusMutation"; + +let environment: Environment; +const source: RecordSource = new RecordSource(); + +beforeAll(() => { + environment = createRelayEnvironment({ + source, + initLocalState: (localRecord, sourceProxy) => { + const networkRecord = sourceProxy.create(NETWORK_ID, NETWORK_TYPE); + networkRecord.setValue(false, "isOffline"); + localRecord.setLinkedRecord(networkRecord, "network"); + }, + }); +}); + +it("Sets comment id", () => { + commit(environment, { isOffline: true }); + expect(source.get(NETWORK_ID)!.isOffline).toEqual(true); +}); diff --git a/src/core/client/stream/mutations/SetNetworkStatusMutation.ts b/src/core/client/stream/mutations/SetNetworkStatusMutation.ts index 87d15e83f..5f2fa6486 100644 --- a/src/core/client/stream/mutations/SetNetworkStatusMutation.ts +++ b/src/core/client/stream/mutations/SetNetworkStatusMutation.ts @@ -12,7 +12,10 @@ export type SetNetworkStatusMutation = ( input: SetNetworkStatusInput ) => Promise; -async function commit(environment: Environment, input: SetNetworkStatusInput) { +export async function commit( + environment: Environment, + input: SetNetworkStatusInput +) { return commitLocalUpdate(environment, store => { const record = store.get(NETWORK_ID)!; record.setValue(input.isOffline, "isOffline"); diff --git a/src/core/client/stream/test/createEnvironment.ts b/src/core/client/stream/test/createEnvironment.ts deleted file mode 100644 index 0276c0b4e..000000000 --- a/src/core/client/stream/test/createEnvironment.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { IResolvers } from "graphql-tools"; -import { createFetch } from "relay-local-schema"; -import { - commitLocalUpdate, - Environment, - Network, - RecordProxy, - RecordSource, - Store, -} from "relay-runtime"; - -import { loadSchema } from "talk-common/graphql"; -import { - createAndRetain, - LOCAL_ID, - LOCAL_TYPE, - wrapFetchWithLogger, -} from "talk-framework/lib/relay"; - -export interface CreateEnvironmentParams { - /** graphql resolvers */ - resolvers: IResolvers; - /** Allows to set initial state for Local state */ - initLocalState?: (local: RecordProxy) => void; - /** If enabled, graphql responses will be logged to the console */ - logNetwork?: boolean; -} - -/** - * create Relay environment for integration tests. - */ -export default function createEnvironment(params: CreateEnvironmentParams) { - const schema = loadSchema("tenant", params.resolvers); - const environment = new Environment({ - network: Network.create( - wrapFetchWithLogger(createFetch({ schema }), params.logNetwork) - ), - store: new Store(new RecordSource()), - }); - if (params.initLocalState) { - commitLocalUpdate(environment, s => { - const root = s.getRoot(); - const localRecord = createAndRetain(environment, s, LOCAL_ID, LOCAL_TYPE); - root.setLinkedRecord(localRecord, "local"); - params.initLocalState!(localRecord); - }); - } - return environment; -} diff --git a/src/core/client/stream/test/loadMore.spec.tsx b/src/core/client/stream/test/loadMore.spec.tsx index b168a66d2..0f2c1642d 100644 --- a/src/core/client/stream/test/loadMore.spec.tsx +++ b/src/core/client/stream/test/loadMore.spec.tsx @@ -5,9 +5,9 @@ import sinon from "sinon"; import { timeout } from "talk-common/utils"; import { TalkContext, TalkContextProvider } from "talk-framework/lib/bootstrap"; +import { createRelayEnvironment } from "talk-framework/testHelpers"; import AppContainer from "talk-stream/containers/AppContainer"; -import createEnvironment from "./createEnvironment"; import { assets, comments } from "./fixtures"; const connectionStub = sinon.stub().throws(); @@ -61,10 +61,13 @@ const resolvers = { }, }; -const environment = createEnvironment({ - // Set this to true, to see graphql responses. - logNetwork: false, - resolvers, +const environment = createRelayEnvironment({ + network: { + // Set this to true, to see graphql responses. + logNetwork: false, + resolvers, + projectName: "tenant", + }, initLocalState: (localRecord: RecordProxy) => { localRecord.setValue(assetStub.id, "assetID"); }, diff --git a/src/core/client/stream/test/permalinkView.spec.tsx b/src/core/client/stream/test/permalinkView.spec.tsx index c056ef4aa..09b0c05fe 100644 --- a/src/core/client/stream/test/permalinkView.spec.tsx +++ b/src/core/client/stream/test/permalinkView.spec.tsx @@ -5,9 +5,9 @@ import sinon from "sinon"; import { timeout } from "talk-common/utils"; import { TalkContext, TalkContextProvider } from "talk-framework/lib/bootstrap"; +import { createRelayEnvironment } from "talk-framework/testHelpers"; import AppContainer from "talk-stream/containers/AppContainer"; -import createEnvironment from "./createEnvironment"; import { assets, comments } from "./fixtures"; const commentStub = { @@ -44,10 +44,13 @@ const resolvers = { }, }; -const environment = createEnvironment({ - // Set this to true, to see graphql responses. - logNetwork: false, - resolvers, +const environment = createRelayEnvironment({ + network: { + // Set this to true, to see graphql responses. + logNetwork: false, + resolvers, + projectName: "tenant", + }, initLocalState: (localRecord: RecordProxy) => { localRecord.setValue(assetStub.id, "assetID"); localRecord.setValue(commentStub.id, "commentID"); diff --git a/src/core/client/stream/test/permalinkViewAssetNotFound.spec.tsx b/src/core/client/stream/test/permalinkViewAssetNotFound.spec.tsx index 17be1416e..4ee8ebb5c 100644 --- a/src/core/client/stream/test/permalinkViewAssetNotFound.spec.tsx +++ b/src/core/client/stream/test/permalinkViewAssetNotFound.spec.tsx @@ -4,10 +4,9 @@ import { RecordProxy } from "relay-runtime"; import { timeout } from "talk-common/utils"; import { TalkContext, TalkContextProvider } from "talk-framework/lib/bootstrap"; +import { createRelayEnvironment } from "talk-framework/testHelpers"; import AppContainer from "talk-stream/containers/AppContainer"; -import createEnvironment from "./createEnvironment"; - const resolvers = { Query: { comment: () => null, @@ -15,10 +14,13 @@ const resolvers = { }, }; -const environment = createEnvironment({ - // Set this to true, to see graphql responses. - logNetwork: false, - resolvers, +const environment = createRelayEnvironment({ + network: { + // Set this to true, to see graphql responses. + logNetwork: false, + resolvers, + projectName: "tenant", + }, initLocalState: (localRecord: RecordProxy) => { localRecord.setValue("unknown-asset-id", "assetID"); localRecord.setValue("unknown-comment-id", "commentID"); diff --git a/src/core/client/stream/test/permalinkViewCommentNotFound.spec.tsx b/src/core/client/stream/test/permalinkViewCommentNotFound.spec.tsx index 3f905ce4b..473e6d510 100644 --- a/src/core/client/stream/test/permalinkViewCommentNotFound.spec.tsx +++ b/src/core/client/stream/test/permalinkViewCommentNotFound.spec.tsx @@ -5,9 +5,9 @@ import sinon from "sinon"; import { timeout } from "talk-common/utils"; import { TalkContext, TalkContextProvider } from "talk-framework/lib/bootstrap"; +import { createRelayEnvironment } from "talk-framework/testHelpers"; import AppContainer from "talk-stream/containers/AppContainer"; -import createEnvironment from "./createEnvironment"; import { assets, comments } from "./fixtures"; const commentStub = { @@ -40,10 +40,13 @@ const resolvers = { }, }; -const environment = createEnvironment({ - // Set this to true, to see graphql responses. - logNetwork: false, - resolvers, +const environment = createRelayEnvironment({ + network: { + // Set this to true, to see graphql responses. + logNetwork: false, + resolvers, + projectName: "tenant", + }, initLocalState: (localRecord: RecordProxy) => { localRecord.setValue(assetStub.id, "assetID"); localRecord.setValue("unknown-comment-id", "commentID"); diff --git a/src/core/client/stream/test/renderReplies.spec.tsx b/src/core/client/stream/test/renderReplies.spec.tsx index 468317624..221dc19c0 100644 --- a/src/core/client/stream/test/renderReplies.spec.tsx +++ b/src/core/client/stream/test/renderReplies.spec.tsx @@ -5,9 +5,9 @@ import sinon from "sinon"; import { timeout } from "talk-common/utils"; import { TalkContext, TalkContextProvider } from "talk-framework/lib/bootstrap"; +import { createRelayEnvironment } from "talk-framework/testHelpers"; import AppContainer from "talk-stream/containers/AppContainer"; -import createEnvironment from "./createEnvironment"; import { assetWithReplies } from "./fixtures"; const resolvers = { @@ -20,10 +20,13 @@ const resolvers = { }, }; -const environment = createEnvironment({ - // Set this to true, to see graphql responses. - logNetwork: false, - resolvers, +const environment = createRelayEnvironment({ + network: { + // Set this to true, to see graphql responses. + logNetwork: false, + resolvers, + projectName: "tenant", + }, initLocalState: (localRecord: RecordProxy) => { localRecord.setValue(assetWithReplies.id, "assetID"); }, diff --git a/src/core/client/stream/test/renderStream.spec.tsx b/src/core/client/stream/test/renderStream.spec.tsx index 361f6e2c2..3c31c1080 100644 --- a/src/core/client/stream/test/renderStream.spec.tsx +++ b/src/core/client/stream/test/renderStream.spec.tsx @@ -5,9 +5,9 @@ import sinon from "sinon"; import { timeout } from "talk-common/utils"; import { TalkContext, TalkContextProvider } from "talk-framework/lib/bootstrap"; +import { createRelayEnvironment } from "talk-framework/testHelpers"; import AppContainer from "talk-stream/containers/AppContainer"; -import createEnvironment from "./createEnvironment"; import { assets } from "./fixtures"; const resolvers = { @@ -20,10 +20,13 @@ const resolvers = { }, }; -const environment = createEnvironment({ - // Set this to true, to see graphql responses. - logNetwork: false, - resolvers, +const environment = createRelayEnvironment({ + network: { + // Set this to true, to see graphql responses. + logNetwork: false, + resolvers, + projectName: "tenant", + }, initLocalState: (localRecord: RecordProxy) => { localRecord.setValue(assets[0].id, "assetID"); }, diff --git a/src/core/client/stream/test/showAllReplies.spec.tsx b/src/core/client/stream/test/showAllReplies.spec.tsx index 7bf111990..71f857331 100644 --- a/src/core/client/stream/test/showAllReplies.spec.tsx +++ b/src/core/client/stream/test/showAllReplies.spec.tsx @@ -5,9 +5,9 @@ import sinon from "sinon"; import { timeout } from "talk-common/utils"; import { TalkContext, TalkContextProvider } from "talk-framework/lib/bootstrap"; +import { createRelayEnvironment } from "talk-framework/testHelpers"; import AppContainer from "talk-stream/containers/AppContainer"; -import createEnvironment from "./createEnvironment"; import { assets, comments } from "./fixtures"; const connectionStub = sinon.stub().throws(); @@ -77,10 +77,13 @@ const resolvers = { }, }; -const environment = createEnvironment({ - // Set this to true, to see graphql responses. - logNetwork: false, - resolvers, +const environment = createRelayEnvironment({ + network: { + // Set this to true, to see graphql responses. + logNetwork: false, + resolvers, + projectName: "tenant", + }, initLocalState: (localRecord: RecordProxy) => { localRecord.setValue(assetStub.id, "assetID"); },