From e9930667731efc32a436904845415b1d5695eef5 Mon Sep 17 00:00:00 2001 From: Huan LI Date: Mon, 23 Apr 2018 23:56:21 +0800 Subject: [PATCH] refactor file structor --- package.json | 1 + src/clone-class.spec.ts | 71 ------------- src/clone-class.ts | 21 ---- {tests => src}/contact.spec.ts | 0 src/puppet-web/bridge.spec.ts | 69 +++++++++++++ {tests => src}/puppet-web/event.spec.ts | 4 +- {tests => src}/puppet-web/puppet-web.spec.ts | 0 src/puppet-web/puppet-web.ts | 8 +- {tests => src}/room.spec.ts | 0 {tests => src}/wechaty.spec.ts | 0 src/wechaty.ts | 4 +- tests/puppet-web/bridge.spec.ts | 101 ------------------- 12 files changed, 78 insertions(+), 201 deletions(-) delete mode 100755 src/clone-class.spec.ts delete mode 100644 src/clone-class.ts rename {tests => src}/contact.spec.ts (100%) rename {tests => src}/puppet-web/event.spec.ts (94%) rename {tests => src}/puppet-web/puppet-web.spec.ts (100%) rename {tests => src}/room.spec.ts (100%) rename {tests => src}/wechaty.spec.ts (100%) delete mode 100755 tests/puppet-web/bridge.spec.ts diff --git a/package.json b/package.json index c617b451..dfa4a334 100644 --- a/package.json +++ b/package.json @@ -101,6 +101,7 @@ "@types/ws": "^4.0.1", "bl": "^1.2.0", "brolog": "^1.2.0", + "clone-class": "^0.4.1", "cuid": "^2.1.1", "hot-import": "^0.1.0", "mime": "^2.2.0", diff --git a/src/clone-class.spec.ts b/src/clone-class.spec.ts deleted file mode 100755 index 296c641a..00000000 --- a/src/clone-class.spec.ts +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env ts-node -/** - * Wechaty - https://github.com/chatie/wechaty - * - * @copyright 2016-2018 Huan LI - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -// tslint:disable:no-shadowed-variable -import * as test from 'blue-tape' -// import * as sinon from 'sinon' - -import cloneClass from './clone-class' - -class FixtureClass { - public static staticNumber: number - - public static staticMethod(n: number) { - this.staticNumber = n - } - - constructor( - public i: number, - public j: number, - ) { - // - } - - public sum() { - return this.i + this.j + (this.constructor as any).staticNumber - } -} - -const EXPECTED_NUMBER1 = 1 -const EXPECTED_NUMBER2 = 2 - -test('cloneClass smoke testing', async t => { - // tslint:disable-next-line:variable-name - const NewClass1 = cloneClass(FixtureClass) - // tslint:disable-next-line:variable-name - const NewClass2 = cloneClass(FixtureClass) - - t.notEqual(NewClass1, NewClass2, 'NewClass1 should different with NewClass2') - t.notEqual(NewClass1, FixtureClass, 'NewClass1 should different with FixtureClass') - - NewClass1.staticMethod(EXPECTED_NUMBER1) - t.equal(NewClass1.staticNumber, EXPECTED_NUMBER1, 'should set static number to EXPECTED_NUMBER1') - - NewClass2.staticMethod(EXPECTED_NUMBER2) - t.equal(NewClass2.staticNumber, EXPECTED_NUMBER2, 'should set static number to EXPECTED_NUMBER2') - - const nc1 = new NewClass1(EXPECTED_NUMBER1, EXPECTED_NUMBER2) - const nc2 = new NewClass2(EXPECTED_NUMBER1, EXPECTED_NUMBER2) - - t.ok(nc1 instanceof FixtureClass, 'nc1 should instanceof FixtureClass') - t.ok(nc1 instanceof NewClass1, 'nc1 should instanceof NewClass1') - - t.equal(nc1.sum(), EXPECTED_NUMBER1 + EXPECTED_NUMBER1 + EXPECTED_NUMBER2, 'should sum right for 1 + 1 + 2') - t.equal(nc2.sum(), EXPECTED_NUMBER2 + EXPECTED_NUMBER1 + EXPECTED_NUMBER2, 'should sum right for 2 + 1 + 2') -}) diff --git a/src/clone-class.ts b/src/clone-class.ts deleted file mode 100644 index e40ea742..00000000 --- a/src/clone-class.ts +++ /dev/null @@ -1,21 +0,0 @@ - -/** - * Clone Class for easy savig Information into Static Properties - * https://github.com/Chatie/wechaty/issues/518 - */ - -// https://github.com/Microsoft/TypeScript/issues/10262 -// https://github.com/Microsoft/TypeScript/pull/13743 -export type Constructor = new(...args: any[]) => T - -// tslint:disable-next-line:variable-name -export function cloneClass>(OrignalClass: T): T { - class NewClass extends OrignalClass { - constructor(...args: any[]) { - super(...arguments) - } - } - return NewClass as any as T -} - -export default cloneClass diff --git a/tests/contact.spec.ts b/src/contact.spec.ts similarity index 100% rename from tests/contact.spec.ts rename to src/contact.spec.ts diff --git a/src/puppet-web/bridge.spec.ts b/src/puppet-web/bridge.spec.ts index da39b084..5b8f2b16 100755 --- a/src/puppet-web/bridge.spec.ts +++ b/src/puppet-web/bridge.spec.ts @@ -26,6 +26,7 @@ import * as test from 'blue-tape' import { launch, } from 'puppeteer' +import { spy } from 'sinon' import Profile from '../profile' @@ -178,3 +179,71 @@ test('clickSwitchAccount()', async t => { t.equal(clicked, false, 'should no button found') }) }) + +test('retryPromise()', async t => { + const EXPECTED_RESOLVE = 'Okey' + const EXPECTED_REJECT = 'NotTheTime' + + function delayedFactory(timeout) { + const startTime = Date.now() + return function() { + const nowTime = Date.now() + if (nowTime - startTime > timeout) { + return Promise.resolve(EXPECTED_RESOLVE) + } + return Promise.reject(EXPECTED_REJECT) + } + } + + const thenSpy = spy() + + const retryPromise = require('retry-promise').default + + const delay500 = delayedFactory(500) + await retryPromise({ max: 1, backoff: 1 }, function() { + return delay500() + }).catch(e => { + thenSpy(e) + }) + t.true(thenSpy.withArgs(EXPECTED_REJECT).calledOnce, 'should got EXPECTED_REJECT when wait not enough') + + thenSpy.resetHistory() + const anotherDelay50 = delayedFactory(50) + await retryPromise({ max: 6, backoff: 10 }, function() { + return anotherDelay50() + }) + .then(r => { + thenSpy(r) + }) + t.true(thenSpy.withArgs(EXPECTED_RESOLVE).calledOnce, 'should got EXPECTED_RESOLVE when wait enough') +}) + +declare const WechatyBro +test('WechatyBro.ding()', async t => { + const profile = new Profile(Math.random().toString(36).substr(2, 5)) + const bridge = new Bridge({ + profile, + }) + t.ok(bridge, 'should instanciated a bridge') + + try { + await bridge.init() + t.pass('should init Bridge') + + const retDing = await bridge.evaluate(() => { + return WechatyBro.ding() + }) as any as string + + t.is(retDing, 'dong', 'should got dong after execute WechatyBro.ding()') + + const retCode = await bridge.proxyWechaty('loginState') + t.is(typeof retCode, 'boolean', 'should got a boolean after call proxyWechaty(loginState)') + + await bridge.quit() + t.pass('b.quit()') + } catch (err) { + t.fail('exception: ' + err.message) + } finally { + profile.destroy() + } +}) diff --git a/tests/puppet-web/event.spec.ts b/src/puppet-web/event.spec.ts similarity index 94% rename from tests/puppet-web/event.spec.ts rename to src/puppet-web/event.spec.ts index 845879a0..5c3c715f 100755 --- a/tests/puppet-web/event.spec.ts +++ b/src/puppet-web/event.spec.ts @@ -22,12 +22,12 @@ import * as test from 'blue-tape' // tslint:disable:no-shadowed-variable // import * as sinon from 'sinon' -import Profile from '../../src/profile' +import Profile from '../profile' import { // Event, PuppetWeb, -} from '../../src/puppet-web/' +} from './puppet-web' test('Puppet Web Event smoke testing', async t => { const pw = new PuppetWeb({ diff --git a/tests/puppet-web/puppet-web.spec.ts b/src/puppet-web/puppet-web.spec.ts similarity index 100% rename from tests/puppet-web/puppet-web.spec.ts rename to src/puppet-web/puppet-web.spec.ts diff --git a/src/puppet-web/puppet-web.ts b/src/puppet-web/puppet-web.ts index c9e602a4..a763730c 100644 --- a/src/puppet-web/puppet-web.ts +++ b/src/puppet-web/puppet-web.ts @@ -16,15 +16,15 @@ * limitations under the License. * */ +import cloneClass from 'clone-class' +import { + ThrottleQueue, +} from 'rx-queue' import { Watchdog, WatchdogFood, } from 'watchdog' -import { - ThrottleQueue, -} from 'rx-queue' -import cloneClass from '../clone-class' import { config, log, diff --git a/tests/room.spec.ts b/src/room.spec.ts similarity index 100% rename from tests/room.spec.ts rename to src/room.spec.ts diff --git a/tests/wechaty.spec.ts b/src/wechaty.spec.ts similarity index 100% rename from tests/wechaty.spec.ts rename to src/wechaty.spec.ts diff --git a/src/wechaty.ts b/src/wechaty.ts index 38534882..cd5507f3 100644 --- a/src/wechaty.ts +++ b/src/wechaty.ts @@ -20,13 +20,13 @@ import * as cuid from 'cuid' import * as os from 'os' -import StateSwitch from 'state-switch' +import cloneClass from 'clone-class' import { callerResolve, hotImport, } from 'hot-import' +import StateSwitch from 'state-switch' -import cloneClass from './clone-class' import { config, log, diff --git a/tests/puppet-web/bridge.spec.ts b/tests/puppet-web/bridge.spec.ts deleted file mode 100755 index bda0c4b5..00000000 --- a/tests/puppet-web/bridge.spec.ts +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env ts-node - -/** - * Wechaty - https://github.com/chatie/wechaty - * - * @copyright 2016-2018 Huan LI - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -// tslint:disable:no-shadowed-variable -import * as test from 'blue-tape' -// import * as sinon from 'sinon' - -// import { log } from '../../src/config' -// log.level('silly') - -import Profile from '../../src/profile' - -import Bridge from '../../src/puppet-web/bridge' - -import { spy } from 'sinon' - -test('retryPromise()', async t => { - const EXPECTED_RESOLVE = 'Okey' - const EXPECTED_REJECT = 'NotTheTime' - - function delayedFactory(timeout) { - const startTime = Date.now() - return function() { - const nowTime = Date.now() - if (nowTime - startTime > timeout) { - return Promise.resolve(EXPECTED_RESOLVE) - } - return Promise.reject(EXPECTED_REJECT) - } - } - - const thenSpy = spy() - - const retryPromise = require('retry-promise').default - - const delay500 = delayedFactory(500) - await retryPromise({ max: 1, backoff: 1 }, function() { - return delay500() - }).catch(e => { - thenSpy(e) - }) - t.true(thenSpy.withArgs(EXPECTED_REJECT).calledOnce, 'should got EXPECTED_REJECT when wait not enough') - - thenSpy.resetHistory() - const anotherDelay50 = delayedFactory(50) - await retryPromise({ max: 6, backoff: 10 }, function() { - return anotherDelay50() - }) - .then(r => { - thenSpy(r) - }) - t.true(thenSpy.withArgs(EXPECTED_RESOLVE).calledOnce, 'should got EXPECTED_RESOLVE when wait enough') -}) - -declare const WechatyBro - -test('WechatyBro.ding()', async t => { - const profile = new Profile(Math.random().toString(36).substr(2, 5)) - const bridge = new Bridge({ - profile, - }) - t.ok(bridge, 'should instanciated a bridge') - - try { - await bridge.init() - t.pass('should init Bridge') - - const retDing = await bridge.evaluate(() => { - return WechatyBro.ding() - }) as any as string - - t.is(retDing, 'dong', 'should got dong after execute WechatyBro.ding()') - - const retCode = await bridge.proxyWechaty('loginState') - t.is(typeof retCode, 'boolean', 'should got a boolean after call proxyWechaty(loginState)') - - await bridge.quit() - t.pass('b.quit()') - } catch (err) { - t.fail('exception: ' + err.message) - } finally { - profile.destroy() - } -}) -- GitLab