wechaty-puppet-wechat
Version:
Puppet WeChat for Wechaty
187 lines • 7.73 kB
JavaScript
#!/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;">',
'<error>',
'<ret>1203</ret>',
'<message>当前登录环境异常。为了你的帐号安全,暂时不能登录web微信。你可以通过Windows微信、Mac微信或者手机客户端微信登录。</message>',
'</error>',
'</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;">',
'<error>',
'<ret>1203</ret>',
'<message>当前登录环境异常。为了你的帐号安全,暂时不能登录web微信。你可以通过手机客户端或者windows微信登录。</message>',
'</error>',
'</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 && !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