From 845fbc1b1bebfb0306d763cb1223347f49435231 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Fri, 7 Sep 2018 00:34:17 +0200 Subject: [PATCH] Move uuid generation to TalkContext --- src/core/client/auth/test/create.tsx | 57 +++++++++++++++++++ src/core/client/auth/test/signIn.spec.tsx | 40 +++---------- src/core/client/auth/test/signUp.spec.tsx | 41 +++---------- .../framework/lib/bootstrap/TalkContext.tsx | 3 + .../testHelpers/createUUIDGenerator.ts | 4 ++ .../client/framework/testHelpers/index.ts | 1 + .../stream/mutations/CreateCommentMutation.ts | 10 +++- .../__snapshots__/postComment.spec.tsx.snap | 2 +- .../__snapshots__/postReply.spec.tsx.snap | 2 +- src/core/client/stream/test/create.tsx | 2 + .../client/stream/test/postComment.spec.tsx | 7 --- .../client/stream/test/postReply.spec.tsx | 7 --- src/core/client/test/mocks.ts | 16 ------ 13 files changed, 92 insertions(+), 100 deletions(-) create mode 100644 src/core/client/auth/test/create.tsx create mode 100644 src/core/client/framework/testHelpers/createUUIDGenerator.ts diff --git a/src/core/client/auth/test/create.tsx b/src/core/client/auth/test/create.tsx new file mode 100644 index 000000000..a0b9d9da9 --- /dev/null +++ b/src/core/client/auth/test/create.tsx @@ -0,0 +1,57 @@ +import { IResolvers } from "graphql-tools"; +import React from "react"; +import TestRenderer from "react-test-renderer"; +import { Environment, RecordProxy, RecordSourceProxy } from "relay-runtime"; + +import AppContainer from "talk-auth/containers/AppContainer"; +import { TalkContext, TalkContextProvider } from "talk-framework/lib/bootstrap"; +import { PostMessageService } from "talk-framework/lib/postMessage"; +import { RestClient } from "talk-framework/lib/rest"; +import { createPromisifiedStorage } from "talk-framework/lib/storage"; +import { createUUIDGenerator } from "talk-framework/testHelpers"; + +import createEnvironment from "./createEnvironment"; +import createFluentBundle from "./createFluentBundle"; + +interface CreateParams { + logNetwork?: boolean; + resolvers?: IResolvers; + initLocalState?: ( + local: RecordProxy, + source: RecordSourceProxy, + environment: Environment + ) => void; +} + +export default function create(params: CreateParams) { + const environment = createEnvironment({ + // Set this to true, to see graphql responses. + logNetwork: params.logNetwork, + resolvers: params.resolvers, + initLocalState: (localRecord, source, env) => { + localRecord.setValue(0, "authRevision"); + if (params.initLocalState) { + params.initLocalState(localRecord, source, env); + } + }, + }); + + const context: TalkContext = { + relayEnvironment: environment, + localeBundles: [createFluentBundle()], + localStorage: createPromisifiedStorage(), + sessionStorage: createPromisifiedStorage(), + rest: new RestClient("http://localhost/api"), + postMessage: new PostMessageService(), + browserInfo: { ios: false }, + uuidGenerator: createUUIDGenerator(), + }; + + const testRenderer = TestRenderer.create( + + + + ); + + return { context, testRenderer }; +} diff --git a/src/core/client/auth/test/signIn.spec.tsx b/src/core/client/auth/test/signIn.spec.tsx index 2aaa46e72..cde0e748e 100644 --- a/src/core/client/auth/test/signIn.spec.tsx +++ b/src/core/client/auth/test/signIn.spec.tsx @@ -1,20 +1,10 @@ -import React from "react"; -import TestRenderer, { - ReactTestInstance, - ReactTestRenderer, -} from "react-test-renderer"; -import { RecordProxy } from "relay-runtime"; +import { ReactTestInstance, ReactTestRenderer } from "react-test-renderer"; import sinon from "sinon"; -import AppContainer from "talk-auth/containers/AppContainer"; import { animationFrame, timeout } from "talk-common/utils"; -import { TalkContext, TalkContextProvider } from "talk-framework/lib/bootstrap"; -import { PostMessageService } from "talk-framework/lib/postMessage"; -import { RestClient } from "talk-framework/lib/rest"; -import { createPromisifiedStorage } from "talk-framework/lib/storage"; +import { TalkContext } from "talk-framework/lib/bootstrap"; -import createEnvironment from "./createEnvironment"; -import createFluentBundle from "./createFluentBundle"; +import create from "./create"; const inputPredicate = (name: string) => (n: ReactTestInstance) => { return n.props.name === name && n.props.onChange; @@ -24,27 +14,13 @@ let context: TalkContext; let testRenderer: ReactTestRenderer; let form: ReactTestInstance; beforeEach(() => { - const environment = createEnvironment({ - initLocalState: (localRecord: RecordProxy) => { + ({ testRenderer, context } = create({ + // Set this to true, to see graphql responses. + logNetwork: false, + initLocalState: localRecord => { localRecord.setValue("SIGN_IN", "view"); }, - }); - - context = { - relayEnvironment: environment, - localeBundles: [createFluentBundle()], - localStorage: createPromisifiedStorage(), - sessionStorage: createPromisifiedStorage(), - rest: new RestClient("http://localhost/api"), - postMessage: new PostMessageService(), - browserInfo: { ios: false }, - }; - - testRenderer = TestRenderer.create( - - - - ); + })); form = testRenderer.root.findByType("form"); }); diff --git a/src/core/client/auth/test/signUp.spec.tsx b/src/core/client/auth/test/signUp.spec.tsx index 20304dd28..cf7ef5b89 100644 --- a/src/core/client/auth/test/signUp.spec.tsx +++ b/src/core/client/auth/test/signUp.spec.tsx @@ -1,20 +1,10 @@ -import React from "react"; -import TestRenderer, { - ReactTestInstance, - ReactTestRenderer, -} from "react-test-renderer"; -import { RecordProxy } from "relay-runtime"; +import { ReactTestInstance, ReactTestRenderer } from "react-test-renderer"; import sinon from "sinon"; -import AppContainer from "talk-auth/containers/AppContainer"; import { animationFrame, timeout } from "talk-common/utils"; -import { TalkContext, TalkContextProvider } from "talk-framework/lib/bootstrap"; -import { PostMessageService } from "talk-framework/lib/postMessage"; -import { RestClient } from "talk-framework/lib/rest"; -import { createPromisifiedStorage } from "talk-framework/lib/storage"; +import { TalkContext } from "talk-framework/lib/bootstrap"; -import createEnvironment from "./createEnvironment"; -import createFluentBundle from "./createFluentBundle"; +import create from "./create"; const inputPredicate = (name: string) => (n: ReactTestInstance) => { return n.props.name === name && n.props.onChange; @@ -24,28 +14,13 @@ let context: TalkContext; let testRenderer: ReactTestRenderer; let form: ReactTestInstance; beforeEach(() => { - const environment = createEnvironment({ - initLocalState: (localRecord: RecordProxy) => { + ({ testRenderer, context } = create({ + // Set this to true, to see graphql responses. + logNetwork: false, + initLocalState: localRecord => { localRecord.setValue("SIGN_UP", "view"); }, - }); - - context = { - relayEnvironment: environment, - localeBundles: [createFluentBundle()], - localStorage: createPromisifiedStorage(), - sessionStorage: createPromisifiedStorage(), - rest: new RestClient("http://localhost/api"), - postMessage: new PostMessageService(), - browserInfo: { ios: false }, - }; - - testRenderer = TestRenderer.create( - - - - ); - + })); form = testRenderer.root.findByType("form"); }); diff --git a/src/core/client/framework/lib/bootstrap/TalkContext.tsx b/src/core/client/framework/lib/bootstrap/TalkContext.tsx index 404910f16..d855a884e 100644 --- a/src/core/client/framework/lib/bootstrap/TalkContext.tsx +++ b/src/core/client/framework/lib/bootstrap/TalkContext.tsx @@ -49,6 +49,9 @@ export interface TalkContext { /** Browser detection. */ browserInfo: BrowserInfo; + + /** Generates uuids. */ + uuidGenerator: () => string; } const { Provider, Consumer } = React.createContext({} as any); diff --git a/src/core/client/framework/testHelpers/createUUIDGenerator.ts b/src/core/client/framework/testHelpers/createUUIDGenerator.ts new file mode 100644 index 000000000..c654f4116 --- /dev/null +++ b/src/core/client/framework/testHelpers/createUUIDGenerator.ts @@ -0,0 +1,4 @@ +export default function createUUIDGenerator() { + let counter = 0; + return () => `uuid-${counter++}`; +} diff --git a/src/core/client/framework/testHelpers/index.ts b/src/core/client/framework/testHelpers/index.ts index 345e7be68..811e1ba19 100644 --- a/src/core/client/framework/testHelpers/index.ts +++ b/src/core/client/framework/testHelpers/index.ts @@ -8,3 +8,4 @@ export { default as removeFragmentRefs, NoFragmentRefs, } from "./removeFragmentRefs"; +export { default as createUUIDGenerator } from "./createUUIDGenerator"; diff --git a/src/core/client/stream/mutations/CreateCommentMutation.ts b/src/core/client/stream/mutations/CreateCommentMutation.ts index 670784753..a293a58e7 100644 --- a/src/core/client/stream/mutations/CreateCommentMutation.ts +++ b/src/core/client/stream/mutations/CreateCommentMutation.ts @@ -1,8 +1,8 @@ import { graphql } from "react-relay"; import { Environment, RelayMutationConfig } from "relay-runtime"; -import uuid from "uuid/v4"; import { getMe } from "talk-framework/helpers"; +import { TalkContext } from "talk-framework/lib/bootstrap"; import { commitMutationPromiseNormalized, createMutationContainer, @@ -65,7 +65,11 @@ function getConfig(input: CreateCommentInput): RelayMutationConfig[] { ]; } -function commit(environment: Environment, input: CreateCommentInput) { +function commit( + environment: Environment, + input: CreateCommentInput, + { uuidGenerator }: TalkContext +) { const me = getMe(environment)!; const currentDate = new Date().toISOString(); return commitMutationPromiseNormalized(environment, { @@ -81,7 +85,7 @@ function commit(environment: Environment, input: CreateCommentInput) { edge: { cursor: currentDate, node: { - id: uuid(), + id: uuidGenerator(), createdAt: currentDate, author: { id: me.id, diff --git a/src/core/client/stream/test/__snapshots__/postComment.spec.tsx.snap b/src/core/client/stream/test/__snapshots__/postComment.spec.tsx.snap index c8a653b05..892210408 100644 --- a/src/core/client/stream/test/__snapshots__/postComment.spec.tsx.snap +++ b/src/core/client/stream/test/__snapshots__/postComment.spec.tsx.snap @@ -213,7 +213,7 @@ exports[`post a comment: optimistic response 1`] = ` >