提交 e9930667 编写于 作者: Huan (李卓桓)'s avatar Huan (李卓桓)

refactor file structor

上级 a9775b22
......@@ -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",
......
#!/usr/bin/env ts-node
/**
* Wechaty - https://github.com/chatie/wechaty
*
* @copyright 2016-2018 Huan LI <zixia@zixia.net>
*
* 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')
})
/**
* 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<T> = new(...args: any[]) => T
// tslint:disable-next-line:variable-name
export function cloneClass<T extends Constructor<{}>>(OrignalClass: T): T {
class NewClass extends OrignalClass {
constructor(...args: any[]) {
super(...arguments)
}
}
return NewClass as any as T
}
export default cloneClass
......@@ -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()
}
})
......@@ -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({
......
......@@ -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,
......
......@@ -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,
......
#!/usr/bin/env ts-node
/**
* Wechaty - https://github.com/chatie/wechaty
*
* @copyright 2016-2018 Huan LI <zixia@zixia.net>
*
* 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()
}
})
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册