From cc071a2d35f52ce680efec4a744d50cb7d8187e0 Mon Sep 17 00:00:00 2001 From: cudr Date: Tue, 22 Oct 2019 00:05:46 +0300 Subject: [PATCH] feat: add ci and op convert insert test --- .travis.yml | 17 +++++++++++ package.json | 1 + packages/bridge/package.json | 19 ++++++++++-- packages/bridge/src/apply/annotation.ts | 8 +++-- packages/bridge/src/convert/convert.spec.ts | 34 +++++++++++++++++++++ packages/bridge/src/convert/set.ts | 1 + packages/bridge/src/cursor/index.ts | 2 +- packages/bridge/src/utils/index.ts | 2 ++ packages/bridge/src/utils/testUtils.ts | 24 +++++++++++++++ packages/example/package.json | 1 - 10 files changed, 101 insertions(+), 8 deletions(-) create mode 100644 .travis.yml create mode 100644 packages/bridge/src/convert/convert.spec.ts create mode 100644 packages/bridge/src/utils/testUtils.ts diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..b7e788a --- /dev/null +++ b/.travis.yml @@ -0,0 +1,17 @@ +language: node_js + +node_js: + - '12' + +env: + - workerCount=3 timeout=600000 + +script: + - npm run test + +install: + - npm run bootstrap + +cache: + directories: + - node_modules \ No newline at end of file diff --git a/package.json b/package.json index 3f6231b..114024e 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "build": "lerna run build --stream", "watch": "lerna run --parallel watch", "prebuild": "rm -rf ./packages/**/lib/", + "test": "lerna run test --stream", "format": "prettier --write" }, "workspaces": [ diff --git a/packages/bridge/package.json b/packages/bridge/package.json index 9f6eaf7..ae6b788 100644 --- a/packages/bridge/package.json +++ b/packages/bridge/package.json @@ -21,7 +21,8 @@ "build": "yarn run build:types && yarn run build:js", "build:types": "tsc --emitDeclarationOnly", "build:js": "babel src --out-dir lib --extensions \".ts,.tsx\" --source-maps inline", - "watch": "yarn build:js -w" + "watch": "yarn build:js -w", + "test": "jest" }, "dependencies": { "typescript": "^3.6.3" @@ -32,7 +33,10 @@ "@babel/plugin-proposal-class-properties": "^7.5.5", "@babel/plugin-proposal-object-rest-spread": "^7.5.5", "@babel/preset-env": "^7.6.0", - "@babel/preset-typescript": "^7.6.0" + "@babel/preset-typescript": "^7.6.0", + "@types/jest": "^24.0.19", + "jest": "^24.9.0", + "ts-jest": "^24.1.0" }, "directories": { "lib": "lib" @@ -41,5 +45,14 @@ "slate", "automerge", "bridge" - ] + ], + "jest": { + "roots": [ + "/src" + ], + "transform": { + "^.+\\.ts?$": "ts-jest" + }, + "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$" + } } diff --git a/packages/bridge/src/apply/annotation.ts b/packages/bridge/src/apply/annotation.ts index dd7326a..b31b595 100644 --- a/packages/bridge/src/apply/annotation.ts +++ b/packages/bridge/src/apply/annotation.ts @@ -1,17 +1,19 @@ import { Operation, SyncDoc } from '../model/index' +// TODO: handle annotation ops + export const addAnnotation = (doc: SyncDoc, op: Operation): SyncDoc => { - console.log('addAnnotation!!!', op.toJS()) + // console.log('addAnnotation!!!', op.toJS()) return doc } export const removeAnnotation = (doc: SyncDoc, op: Operation): SyncDoc => { - console.log('removeAnnotation!!!', op.toJS()) + // console.log('removeAnnotation!!!', op.toJS()) return doc } export const setAnnotation = (doc: SyncDoc, op: Operation): SyncDoc => { - console.log('setAnnotation!!!', op.toJS()) + // console.log('setAnnotation!!!', op.toJS()) return doc } diff --git a/packages/bridge/src/convert/convert.spec.ts b/packages/bridge/src/convert/convert.spec.ts new file mode 100644 index 0000000..a2636d8 --- /dev/null +++ b/packages/bridge/src/convert/convert.spec.ts @@ -0,0 +1,34 @@ +import * as Automerge from 'automerge' +import { toSlateOp } from './index' +import { createDoc, cloneDoc, createParagraphJSON } from '../utils' + +describe('convert operations to slatejs model', () => { + it('convert insert operations', () => { + const doc1 = createDoc() + const doc2 = cloneDoc(doc1) + + const change = Automerge.change(doc1, 'change', (d: any) => { + d.document.nodes.push(createParagraphJSON('hello!')) + d.document.nodes[1].nodes[0].text = 'hello!' + }) + + const operations = Automerge.diff(doc2, change) + + const slateOps = toSlateOp(operations, change) + + const expectedOps = [ + { + type: 'insert_node', + path: [1], + node: { object: 'block', type: 'paragraph', nodes: [] } + }, + { + type: 'insert_node', + path: [1, 0], + node: { object: 'text', marks: [], text: 'hello!' } + } + ] + + expect(slateOps).toStrictEqual(expectedOps) + }) +}) diff --git a/packages/bridge/src/convert/set.ts b/packages/bridge/src/convert/set.ts index 8927b33..25451a0 100644 --- a/packages/bridge/src/convert/set.ts +++ b/packages/bridge/src/convert/set.ts @@ -20,6 +20,7 @@ const AnnotationSetOp = ({ key, value }: Automerge.Diff) => (map, doc) => { /** * Looks like set_annotation option is broken, temporary disabled */ + // if (!doc.annotations[key]) { op = { type: 'add_annotation', diff --git a/packages/bridge/src/cursor/index.ts b/packages/bridge/src/cursor/index.ts index c8d7087..878902d 100644 --- a/packages/bridge/src/cursor/index.ts +++ b/packages/bridge/src/cursor/index.ts @@ -51,7 +51,7 @@ export const removeCursor = (doc: SyncDoc, key: CursorKey) => { return doc } -export const cursorOpFilter = (ops: Immutable.List, type: string) => +export const cursorOpFilter = (ops: any, type: string): any => ops.filter(op => { if (op.type === 'set_annotation') { return !( diff --git a/packages/bridge/src/utils/index.ts b/packages/bridge/src/utils/index.ts index f2e6e69..d0368fd 100644 --- a/packages/bridge/src/utils/index.ts +++ b/packages/bridge/src/utils/index.ts @@ -1,6 +1,8 @@ import toSync from './toSync' import hexGen from './hexGen' +export * from './testUtils' + const toJS = node => { try { return JSON.parse(JSON.stringify(node)) diff --git a/packages/bridge/src/utils/testUtils.ts b/packages/bridge/src/utils/testUtils.ts new file mode 100644 index 0000000..28ca52a --- /dev/null +++ b/packages/bridge/src/utils/testUtils.ts @@ -0,0 +1,24 @@ +import * as Automerge from 'automerge' +import { ValueJSON, TextJSON, NodeJSON } from 'slate' + +export const createTextJSON = (text: string = ''): TextJSON => ({ + object: 'text', + marks: [], + text +}) + +export const createParagraphJSON = (text: string = ''): NodeJSON => ({ + object: 'block', + type: 'paragraph', + nodes: [createTextJSON(text)] +}) + +export const createValueJSON = (): ValueJSON => ({ + document: { + nodes: [createParagraphJSON()] + } +}) + +export const createDoc = () => Automerge.from(createValueJSON()) + +export const cloneDoc = doc => Automerge.change(doc, '', d => d) diff --git a/packages/example/package.json b/packages/example/package.json index ff8b3b3..d5bc7e3 100644 --- a/packages/example/package.json +++ b/packages/example/package.json @@ -27,7 +27,6 @@ }, "scripts": { "start": "react-scripts start", - "build": "react-scripts build", "dev": "concurrently \"yarn start\" \"yarn serve\"", "serve": "nodemon --watch ../backend/lib --inspect server.js" },