const co = require('co') const test = require('tap').test const log = require('npmlog') // log.level = 'verbose' // log.level = 'silly' const PuppetWeb = require('../src/puppet-web') const PORT = 58788 const NAME = 'tmp-chatbot-name-for-unit-testing.wechaty' function dingSocket(server) { const maxTime = 9000 const waitTime = 500 let totalTime = 0 return new Promise((resolve, reject) => { log.verbose('TestingPuppetWeb', 'dingSocket()') return testDing() function testDing() { // log.silly('TestingPuppetWeb', server.socketio) if (!server.socketClient) { totalTime += waitTime if (totalTime > maxTime) { return reject('timeout after ' + totalTime + 'ms') } log.silly('TestingPuppetWeb', 'waiting socketClient to connect for ' + totalTime + '/' + maxTime + ' ms...') setTimeout(testDing, waitTime) return } //log.silly('TestingPuppetWebServer', server.socketClient) server.socketClient.once('dong', data => { log.verbose('TestingPuppetWeb', 'socket recv event dong: ' + data) return resolve(data) }) server.socketClient.emit('ding') } }) } false && test('PuppetWeb smoke testing', function(t) { let pw co(function* () { pw = new PuppetWeb({port: PORT}) t.ok(pw, 'new PuppetWeb') yield pw.init() t.pass('pw full inited') t.equal(pw.isLogined() , false , 'instance not logined') // XXX find a better way to mock... pw.bridge.getUserName = function () { return Promise.resolve('mockedUserName') } const p1 = new Promise((resolve) => { pw.once('login', r => { t.equal(pw.isLogined() , true , 'logined after login event') resolve() }) }) pw.server.emit('login') yield p1 const p2 = new Promise((resolve) => { pw.once('logout', r => { t.equal(pw.isLogined() , false , 'logouted after logout event') resolve() }) }) pw.server.emit('logout') yield p2 }) .catch(e => t.fail(e)) // Reject .then(r => { // Finally 1 log.warn('TestingPuppetWeb', 'finally()') return pw.quit() }) .then(r => { t.end() }) // Finally 2 .catch(e => t.fail(e)) // Exception }) // WTF? false && test('Puppet Web server/browser communication', function(t) { let pw2 co(function* () { pw2 = new PuppetWeb({port: PORT}) t.ok(pw2, 'new PuppetWeb') yield Promise.resolve() yield pw2.init() t.pass('pw2 inited') const retSocket = yield dingSocket(pw2.server) t.equal(retSocket, 'dong', 'dingSocket got dong') }) .catch(e => { log.warn('TestingPuppetWeb', 'error: %s', e) t.fail(e) }) // Reject .then(r => { // Finally pw2.quit() t.end() }) .catch(e => { t.fail(e) }) // Exception }) test('Puppet Web WTF server/browser communication', function(t) { const pw = new PuppetWeb({port: PORT}) t.ok(pw, 'new PuppetWeb') pw.init() .then(r => { t.pass('pw inited') return dingSocket(pw.server) }) .then(retSocket => { t.equal(retSocket, 'dong', 'dingSocket got dong') return true }) .catch(e => { // Reject log.warn('TestingPuppetWeb', 'error: %s', e) t.fail(e) throw e }) .then(r => { // Finally 1 t.pass('dingSocket resolved') return pw.quit() }) .then(r => { // Finally 2 t.pass('pw.quit() resolved') t.end() }) .catch(e => { t.fail(e) throw e }) // Exception }) test('Puppet Web browser session save & load', function(t) { let pw pw = new PuppetWeb({port: PORT, name: NAME}) t.ok(pw, 'create PuppetWeb') co(function* () { yield pw.init() t.pass('pw inited') const EXPECTED_COOKIE = { name: 'wechaty' , value: '8788' , path: '/' , domain: '.qq.com' , secure: false , expiry: 99999999999999 } pw.browser.setCookies(EXPECTED_COOKIE) const cookies = yield pw.saveSession() t.ok(cookies, 'saveSession should resolve cookies') t.ok(cookies.length, 'cookies length should more than 0') const cookiesLoad = yield pw.loadSession() const cookiesFiltered = cookiesLoad.filter(c => /wechaty/i.test(c.name)) t.ok(cookiesLoad.length, 'pw session loaded') yield pw.quit() pw = new PuppetWeb({port: PORT, name: NAME}) yield pw.init() const cookiesAfterQuit = yield pw.loadSession() const cookiesFiltered2 = cookiesLoad.filter(c => /wechaty/i.test(c.name)) t.ok(cookiesFiltered2.length, 'should get old cookie after browser re-opened') }) .catch(e => { // Reject log.warn('TestingPuppetWeb', 'error: %s', e) t.fail(e) }) .then(r => { // Finally pw.quit() t.end() }) .catch(e => { t.fail(e) }) // Exception })