UNPKG

wechaty-puppet-wechat

Version:
187 lines 7.73 kB
#!/usr/bin/env -S node --no-warnings --loader ts-node/esm /** * 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. * */ import { test } from 'tstest'; // import sinon from 'sinon' import puppeteer from 'puppeteer'; // import { spy } from 'sinon' import { MemoryCard, } from 'memory-card'; // import { // log, // } from './config' // log.silly('BridgeTesting', 'import typings for Brolog') import Bridge from './bridge.js'; const PUPPETEER_LAUNCH_OPTIONS = { args: [ '--disable-gpu', '--disable-setuid-sandbox', '--no-sandbox', ], headless: true, }; test('PuppetWeChatBridge restart', async (t) => { const memory = new MemoryCard(); await memory.load(); let bridge; let ttl = 3; while (ttl-- > 0) { try { bridge = new Bridge({ memory }); await bridge.start(); await bridge.stop(); t.pass('Bridge instnace restart ttl #' + ttl); } catch (e) { t.fail('Bridge instance: ' + e); } } }); /* eslint indent: off */ test('preHtmlToXml()', async (t) => { const BLOCKED_HTML_ZH = [ '<pre style="word-wrap: break-word; white-space: pre-wrap;">', '&lt;error&gt;', '&lt;ret&gt;1203&lt;/ret&gt;', '&lt;message&gt;当前登录环境异常。为了你的帐号安全,暂时不能登录web微信。你可以通过Windows微信、Mac微信或者手机客户端微信登录。&lt;/message&gt;', '&lt;/error&gt;', '</pre>', ].join(''); const BLOCKED_XML_ZH = [ '<error>', '<ret>1203</ret>', '<message>当前登录环境异常。为了你的帐号安全,暂时不能登录web微信。你可以通过Windows微信、Mac微信或者手机客户端微信登录。</message>', '</error>', ].join(''); const memory = new MemoryCard(); const bridge = new Bridge({ memory }); const xml = bridge.preHtmlToXml(BLOCKED_HTML_ZH); t.equal(xml, BLOCKED_XML_ZH, 'should parse html to xml'); }); test('testBlockedMessage()', async (t) => { const BLOCKED_HTML_ZH = [ '<pre style="word-wrap: break-word; white-space: pre-wrap;">', '&lt;error&gt;', '&lt;ret&gt;1203&lt;/ret&gt;', '&lt;message&gt;当前登录环境异常。为了你的帐号安全,暂时不能登录web微信。你可以通过手机客户端或者windows微信登录。&lt;/message&gt;', '&lt;/error&gt;', '</pre>', ].join(''); const BLOCKED_XML_ZH = ` <error> <ret>1203</ret> <message>当前登录环境异常。为了你的帐号安全,暂时不能登录web微信。你可以通过手机客户端或者windows微信登录。</message> </error> `; const BLOCKED_TEXT_ZH = [ '当前登录环境异常。为了你的帐号安全,暂时不能登录web微信。', '你可以通过手机客户端或者windows微信登录。', ].join(''); const BLOCKED_XML_EN = ` <error> <ret>1203</ret> <message>For account security, newly registered WeChat accounts are unable to log in to Web WeChat. To use WeChat on a computer, use Windows WeChat or Mac WeChat at http://wechat.com</message> </error> `; const BLOCKED_TEXT_EN = [ 'For account security, newly registered WeChat accounts are unable to log in to Web WeChat.', ' To use WeChat on a computer, use Windows WeChat or Mac WeChat at http://wechat.com', ].join(''); void t.test('not blocked', async (t) => { const memory = new MemoryCard(); const bridge = new Bridge({ memory }); const msg = await bridge.testBlockedMessage('this is not xml'); t.equal(msg, false, 'should return false when no block message'); }); void t.test('html', async (t) => { const memory = new MemoryCard(); const bridge = new Bridge({ memory }); const msg = await bridge.testBlockedMessage(BLOCKED_HTML_ZH); t.equal(msg, BLOCKED_TEXT_ZH, 'should get zh blocked message'); }); void t.test('zh', async (t) => { const memory = new MemoryCard(); const bridge = new Bridge({ memory }); const msg = await bridge.testBlockedMessage(BLOCKED_XML_ZH); t.equal(msg, BLOCKED_TEXT_ZH, 'should get zh blocked message'); }); test('en', async (t) => { const memory = new MemoryCard(); const bridge = new Bridge({ memory }); const msg = await bridge.testBlockedMessage(BLOCKED_XML_EN); t.equal(msg, BLOCKED_TEXT_EN, 'should get en blocked message'); }); }); test('clickSwitchAccount()', async (t) => { const SWITCH_ACCOUNT_HTML = ` <div class="association show" ng-class="{show: isAssociationLogin &amp;&amp; !isBrokenNetwork}"> <img class="img" mm-src="" alt="" src="//res.wx.qq.com/a/wx_fed/webwx/res/static/img/2KriyDK.png"> <p ng-show="isWaitingAsConfirm" class="waiting_confirm ng-hide">Confirm login on mobile WeChat</p> <a href="javascript:;" ng-show="!isWaitingAsConfirm" ng-click="associationLogin()" class="button button_primary">Log in</a> <a href="javascript:;" ng-click="qrcodeLogin()" class="button button_default">Switch Account</a> </div> `; const memory = new MemoryCard(); const bridge = new Bridge({ memory }); void t.test('switch account needed', async (t) => { const browser = await puppeteer.launch(PUPPETEER_LAUNCH_OPTIONS); const page = await browser.newPage(); await page.setContent(SWITCH_ACCOUNT_HTML); const clicked = await bridge.clickSwitchAccount(page); await page.close(); await browser.close(); t.equal(clicked, true, 'should click the switch account button'); }); void t.test('switch account not needed', async (t) => { const browser = await puppeteer.launch(PUPPETEER_LAUNCH_OPTIONS); const page = await browser.newPage(); await page.setContent('<h1>ok</h1>'); const clicked = await bridge.clickSwitchAccount(page); await page.close(); await browser.close(); t.equal(clicked, false, 'should no button found'); }); }); test('WechatyBro.ding()', async (t) => { const memory = new MemoryCard(Math.random().toString(36).substr(2, 5)); await memory.load(); const bridge = new Bridge({ memory, }); t.ok(bridge, 'should instanciated a bridge'); try { await bridge.start(); t.pass('should init Bridge'); const retDing = await bridge.evaluate(() => { // eslint-disable-next-line return WechatyBro.ding(); }); t.equal(retDing, 'dong', 'should got dong after execute WechatyBro.ding()'); const retCode = await bridge.proxyWechaty('loginState'); t.equal(typeof retCode, 'boolean', 'should got a boolean after call proxyWechaty(loginState)'); await bridge.stop(); t.pass('b.quit()'); } catch (err) { t.fail('exception: ' + err.message); } finally { await memory.destroy(); } }); //# sourceMappingURL=bridge.spec.js.map