From b51f4704fd0e8ba0f4c6fade4e127c9e186a08d5 Mon Sep 17 00:00:00 2001 From: liuwenzhe Date: Thu, 2 Jan 2020 16:29:55 +0800 Subject: [PATCH 1/3] add tests for receiver --- __tests__/mock/storage.ts | 32 ++++++ __tests__/receiver-spec.ts | 110 +++++++++++++++++++++ package-lock.json | 177 +++++++++++++++++++++++++++------- package.json | 1 + src/bufferSupport/receiver.ts | 2 +- 5 files changed, 286 insertions(+), 36 deletions(-) create mode 100644 __tests__/mock/storage.ts create mode 100644 __tests__/receiver-spec.ts diff --git a/__tests__/mock/storage.ts b/__tests__/mock/storage.ts new file mode 100644 index 0000000..19d9ccd --- /dev/null +++ b/__tests__/mock/storage.ts @@ -0,0 +1,32 @@ +export default class Storage { + private map: Map + + constructor() { + this.map = new Map(); + } + + public async getAsBuffer(key: string): Promise<{content: Buffer} | undefined> { + const data = this.map.get(key); + if (!data) { + return undefined; + } + + return { + content: data + } + } + + public async del(key: string) { + this.map.delete(key) + } + + public async put(key: string, data: Buffer | string) { + if (data instanceof Buffer) { + this.map.set(key, data); + return + } + + const buffer = Buffer.from(data); + this.map.set(key, buffer); + } +} diff --git a/__tests__/receiver-spec.ts b/__tests__/receiver-spec.ts new file mode 100644 index 0000000..db7f08e --- /dev/null +++ b/__tests__/receiver-spec.ts @@ -0,0 +1,110 @@ +const sinon = require('sinon'); +const uuid = require('uuid'); + +import * as fs from 'fs'; +import * as path from 'path'; + +import * as Receiver from '../src/bufferSupport/receiver'; +import * as storage from '../src/storage'; +import FakeStorage from './mock/storage'; + +const sandbox = sinon.createSandbox(); +const fakeStorage = new FakeStorage(); + +describe('receiver test cases', () => { + beforeAll(() => { + const cwd = process.cwd(); + fs.writeFileSync(path.join(cwd, './.fc-config.json'), '{}') + sandbox.stub(storage, 'getClientByType').callsFake(() => fakeStorage) + }) + + describe('should receive works normally', () => { + describe('when storeType is direct', () => { + it('when the type of event is string', async () => { + const { receive } = Receiver.initReceiver() + const resp = await receive(JSON.stringify({ + body: 'test message', + ossType: 'oss', + storeType: 'direct' + })) + expect(resp.body).toBe('test message') + }) + + it('when the type of event is object', async () => { + const { receive } = Receiver.initReceiver() + const resp = await receive({ + body: 'test message', + ossType: 'oss', + storeType: 'direct' + }) + expect(resp.body).toBe('test message') + }) + + it('when the type of event is Buffer', async () => { + const { receive } = Receiver.initReceiver() + const bufferEvent = Buffer.from(JSON.stringify({ + body: 'test message', + ossType: 'oss', + storeType: 'direct' + })) + const resp = await receive(bufferEvent) + expect(resp.body.toString()).toBe('test message') + }) + + it('should the type of resp.body be Buffer, when event.isBuffer is true', async () => { + const { receive } = Receiver.initReceiver() + const resp = await receive({ + body: Buffer.from('test message').toString('base64'), + ossType: 'oss', + storeType: 'direct', + isBuffer: true, + }) + expect(Buffer.isBuffer(resp.body)).toBeTruthy() + expect(resp.body.toString()).toBe('test message') + }) + }) + + describe('when storeType is oss', () => { + beforeEach(async () => { + this.key = uuid.v4(); + this.content = 'aaa'; + await fakeStorage.put(this.key, this.content) + }) + + afterEach(async () => { + const data = await fakeStorage.getAsBuffer(this.key) + expect(data).toBeFalsy() + }) + + it('should get content from oss works normally', async () => { + const { receive } = Receiver.initReceiver() + const resp = await receive({ + body: '', + ossType: 'oss', + storeType: 'oss', + ossKey: this.key, + }) + expect(resp.body).toBe(this.content) + }) + + it('should the type of resp.body be Buffer, when event.isBuffer is true', async () => { + const { receive } = Receiver.initReceiver() + const resp = await receive({ + body: '', + ossType: 'oss', + storeType: 'oss', + ossKey: this.key, + isBuffer: true, + }) + expect(Buffer.isBuffer(resp.body)).toBeTruthy() + expect(resp.body.toString()).toBe(this.content) + }) + }) + }) + + afterAll(() => { + sandbox.reset(); + const cwd = process.cwd(); + fs.unlinkSync(path.join(cwd, './.fc-config.json')) + }) +}) diff --git a/package-lock.json b/package-lock.json index 48105ec..88bc715 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "fc-toolkit", - "version": "1.1.0-alpha.1", + "version": "1.1.0-alpha.2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -35,6 +35,42 @@ "js-tokens": "^3.0.0" } }, + "@sinonjs/commons": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.0.tgz", + "integrity": "sha512-qbk9AP+cZUsKdW1GJsBpxPKFmCJ0T8swwzVje3qFd+AkQb74Q/tiuzrdfFg8AD2g5HH/XbE/I8Uc1KYHVYWfhg==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/formatio": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-4.0.1.tgz", + "integrity": "sha512-asIdlLFrla/WZybhm0C8eEzaDNNrzymiTqHMeJl6zPW2881l3uuVRpm0QlRQEjqYWv6CcKMGYME3LbrLJsORBw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^4.2.0" + } + }, + "@sinonjs/samsam": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-4.2.1.tgz", + "integrity": "sha512-7+5S4C4wpug5pzHS+z/63+XUwsH7dtyYELDafoT1QnfruFh7eFjlDWwZXltUB0GLk6y5eMeAt34Bjx8wJ4KfSA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, "@snyk/cli-interface": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@snyk/cli-interface/-/cli-interface-2.3.0.tgz", @@ -233,12 +269,14 @@ "@types/lodash": { "version": "4.14.149", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.149.tgz", - "integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ==" + "integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ==", + "dev": true }, "@types/lodash.omitby": { "version": "4.6.6", "resolved": "https://registry.npmjs.org/@types/lodash.omitby/-/lodash.omitby-4.6.6.tgz", "integrity": "sha512-bHkWp4YyTlqPtHgUwEhExcMQNb8V+HjTUzhxgdnw0UhuT0i61aff6RuSlXt4MbQVPJhB/24tb4WBZJQ+LYIQgw==", + "dev": true, "requires": { "@types/lodash": "*" } @@ -372,7 +410,6 @@ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, - "optional": true, "requires": { "kind-of": "^3.0.2", "longest": "^1.0.1", @@ -2605,8 +2642,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -2627,14 +2663,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2649,20 +2683,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -2779,8 +2810,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -2792,7 +2822,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2807,7 +2836,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2815,14 +2843,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -2841,7 +2867,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -2922,8 +2947,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -2935,7 +2959,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -3021,8 +3044,7 @@ "safe-buffer": { "version": "5.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -3058,7 +3080,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -3078,7 +3099,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -3122,14 +3142,12 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "yallist": { "version": "3.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, @@ -4679,6 +4697,12 @@ "set-immediate-shim": "~1.0.1" } }, + "just-extend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", + "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", + "dev": true + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -4859,12 +4883,20 @@ "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", "dev": true }, + "lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true, - "optional": true + "dev": true }, "loose-envify": { "version": "1.4.0", @@ -5294,6 +5326,20 @@ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, + "nise": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-3.0.1.tgz", + "integrity": "sha512-fYcH9y0drBGSoi88kvhpbZEsenX58Yr+wOJ4/Mi1K4cy+iGP/a73gNoyNhu5E9QxPdgTlVChfIaAlnyOy/gHUA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0", + "@sinonjs/formatio": "^4.0.1", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "lolex": "^5.0.1", + "path-to-regexp": "^1.7.0" + } + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -5718,6 +5764,23 @@ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", "dev": true }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, "path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", @@ -6729,6 +6792,44 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, + "sinon": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-8.0.2.tgz", + "integrity": "sha512-8W1S7BnCyvk7SK+Xi15B1QAVLuS81G/NGmWefPb31+ly6xI3fXaug/g5oUdfc8+7ruC4Ay51AxuLlYm8diq6kA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0", + "@sinonjs/formatio": "^4.0.1", + "@sinonjs/samsam": "^4.2.1", + "diff": "^4.0.1", + "lolex": "^5.1.2", + "nise": "^3.0.1", + "supports-color": "^7.1.0" + }, + "dependencies": { + "diff": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -8472,6 +8573,12 @@ "prelude-ls": "~1.1.2" } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, "typescript": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", diff --git a/package.json b/package.json index e464802..2e30df7 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "jest": "^22.0.4", "prettier": "^1.5.2", "rimraf": "^2.0.0", + "sinon": "^8.0.2", "ts-jest": "^22.0.1", "ts-node": "^3.2.0", "tslint": "^5.0.0", diff --git a/src/bufferSupport/receiver.ts b/src/bufferSupport/receiver.ts index bd2c1d9..3dd2dbc 100644 --- a/src/bufferSupport/receiver.ts +++ b/src/bufferSupport/receiver.ts @@ -31,7 +31,7 @@ export function initReceiver( ossThreshold: number = 0 ): { receive: ( - event: string | IReceiveParsedPayload + event: Buffer | string | IReceiveParsedPayload ) => Promise<{ headers?: any; body: string | Buffer }>; reply: ( callback: AliyunCallback From 549a4a277663952c87c35c01302a36f0e4557def Mon Sep 17 00:00:00 2001 From: liuwenzhe Date: Thu, 2 Jan 2020 16:34:35 +0800 Subject: [PATCH 2/3] [fix] jest should ignore files in "__tests__/mock/" --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index 2e30df7..58f27cd 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,9 @@ ".(ts)": "/node_modules/ts-jest/preprocessor.js" }, "testRegex": "(/__tests__/.*|\\.(test|spec))\\.(ts|js)$", + "testPathIgnorePatterns" : [ + "/__tests__/mock/" + ], "moduleFileExtensions": [ "ts", "js" From da99607b5134f7d0060e28467ea2b85336510b03 Mon Sep 17 00:00:00 2001 From: liuwenzhe Date: Thu, 2 Jan 2020 17:01:09 +0800 Subject: [PATCH 3/3] add tests for reply function --- __tests__/receiver-spec.ts | 43 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/__tests__/receiver-spec.ts b/__tests__/receiver-spec.ts index db7f08e..15bd70c 100644 --- a/__tests__/receiver-spec.ts +++ b/__tests__/receiver-spec.ts @@ -102,6 +102,49 @@ describe('receiver test cases', () => { }) }) + describe('should reply works normally', () => { + it('when return value is string', done => { + const { reply } = Receiver.initReceiver() + const cb = (err, data) => { + expect(err).toBeFalsy() + expect(data).toEqual({ + storeType: 'direct', + isBuffer: false, + body: 'foooo' + }) + done() + } + reply(cb)('foooo') + }) + + it('when return value is Buffer', done => { + const { reply } = Receiver.initReceiver() + const cb = (err, data) => { + expect(err).toBeFalsy() + expect(data).toEqual({ + storeType: 'direct', + isBuffer: true, + body: Buffer.from('foooo').toString('base64') + }) + done() + } + reply(cb)(Buffer.from('foooo')) + }) + + it('when return value is oss key', done => { + const { reply } = Receiver.initReceiver(false, 'oss', 10) + const cb = (err, data) => { + expect(err).toBeFalsy() + expect(data.storeType).toBe('oss') + fakeStorage.getAsBuffer(data.body).then(resp => { + expect(resp.content.toString()).toBe('fooooooooooooo') + done() + }) + } + reply(cb)('fooooooooooooo') + }) + }) + afterAll(() => { sandbox.reset(); const cwd = process.cwd();