bot18
Version:
A high-frequency cryptocurrency trading bot by Zenbot creator @carlos8f
132 lines (103 loc) • 5.12 kB
JavaScript
var helper = require('../spec_helper'),
request = require('request');
describe('Cloudscraper', function() {
var sandbox,
url = 'http://example-site.dev/path/',
captchaPage = helper.getFixture('captcha.html'),
accessDenied = helper.getFixture('access_denied.html'),
invalidChallenge = helper.getFixture('invalid_js_challenge.html'),
headers = {'User-Agent': 'Chrome'},
// Since request.defaults returns new wrapper, create one global instance and then stub it in beforeEach
requestDefault = request.defaults({jar: true}),
cloudscraper;
before(function() {
helper.dropCache();
});
beforeEach(function () {
sandbox = sinon.sandbox.create();
sandbox.stub(request, 'defaults').returns(requestDefault);
cloudscraper = require('../../index');
// since cloudflare requires timeout, the module relies on setTimeout. It should be proprely stubbed to avoid ut running for too long
this.clock = sinon.useFakeTimers();
});
afterEach(function () {
sandbox.restore();
this.clock.restore();
});
it('should return error if it was thrown by request', function(done) {
var response = { statusCode: 500 },
fakeError = {fake: 'error'}; //not real request error, but it doesn't matter
sandbox.stub(requestDefault, 'get')
.withArgs({method: 'GET', url: url, headers: headers, encoding: null, realEncoding: 'utf8'})
.callsArgWith(1, fakeError, response, '');
cloudscraper.get(url, function(error) {
expect(error).to.be.eql({errorType: 0, error: fakeError}); // errorType 0, means it is some kind of system error
done();
}, headers);
});
it('should return error if captcha is served by cloudflare', function(done){
var response = { statusCode: 503 };
sandbox.stub(requestDefault, 'get')
.withArgs({method: 'GET', url: url, headers: headers, encoding: null, realEncoding: 'utf8'})
.callsArgWith(1, null, response, captchaPage);
cloudscraper.get(url, function(error, body) {
expect(error).to.be.eql({errorType: 1}); // errorType 1, means captcha is served
expect(body).to.be.eql(captchaPage);
done();
}, headers);
});
it('should return error if cloudflare returned some inner error', function(done){
//https://support.cloudflare.com/hc/en-us/sections/200038216-CloudFlare-Error-Messages error codes: 1012, 1011, 1002, 1000, 1004, 1010, 1006, 1007, 1008
var response = { statusCode: 500 };
sandbox.stub(requestDefault, 'get')
.withArgs({method:'GET', url: url, headers: headers, encoding: null, realEncoding: 'utf8'})
.callsArgWith(1, null, response, accessDenied);
cloudscraper.get(url, function(error, body) {
expect(error).to.be.eql({errorType: 2, error: 1006}); // errorType 2, means inner cloudflare error
expect(body).to.be.eql(accessDenied);
done();
}, headers);
});
it('should return error if body is undefined', function(done){
//https://support.cloudflare.com/hc/en-us/sections/200038216-CloudFlare-Error-Messages error codes: 1012, 1011, 1002, 1000, 1004, 1010, 1006, 1007, 1008
var response = { statusCode: 500 };
sandbox.stub(requestDefault, 'get')
.withArgs({method:'GET', url: url, headers: headers, encoding: null, realEncoding: 'utf8'})
.callsArgWith(1, null, response, undefined);
cloudscraper.get(url, function(error, body) {
expect(error).to.be.eql({errorType: 0, error: null}); // errorType 2, means inner cloudflare error
expect(body).to.be.eql(undefined);
done();
}, headers);
});
it('should return error if challenge page failed to be parsed', function(done) {
var response = helper.fakeResponseObject(200, headers, invalidChallenge, url);
sandbox.stub(requestDefault, 'get')
.withArgs({method: 'GET', url: url, headers: headers, encoding: null, realEncoding: 'utf8'})
.callsArgWith(1, null, response, invalidChallenge);
cloudscraper.get(url, function(error, body) {
expect(error.errorType).to.be.eql(3); // errorType 3, means parsing failed
expect(body).to.be.eql(invalidChallenge);
done();
}, headers);
this.clock.tick(7000); // tick the timeout
});
it('should return error if it was thrown by request when solving challenge', function(done) {
var jsChallengePage = helper.getFixture('js_challenge_21_05_2015.html'),
response = helper.fakeResponseObject(503, headers, jsChallengePage, url),
connectionError = {error: 'ECONNRESET'},
stubbed;
// Cloudflare is enabled for site. It returns a page with js challenge
stubbed = sandbox.stub(requestDefault, 'get')
.onCall(0)
.callsArgWith(1, null, response, jsChallengePage);
stubbed
.onCall(1)
.callsArgWith(1, connectionError);
cloudscraper.get(url, function(error) {
expect(error).to.be.eql({errorType: 0, error: connectionError}); // errorType 0, connection eror for example
done();
}, headers);
this.clock.tick(7000); // tick the timeout
});
});