cordova-plugin-qrscanner
Version:
Fast, energy-efficient, highly-configurable QR code scanner.
288 lines (264 loc) • 11.3 kB
JavaScript
exports.defineAutoTests = function() {
describe('QRScanner (window.QRScanner)', function() {
it('should exist', function() {
expect(window.QRScanner).toBeDefined();
});
describe('Methods exist', function() {
it('`prepare` method should exist', function() {
expect(typeof window.QRScanner.prepare).toBe('function');
});
it('`scan` method should exist', function() {
expect(typeof window.QRScanner.scan).toBe('function');
});
it('`cancelScan` method should exist', function() {
expect(typeof window.QRScanner.cancelScan).toBe('function');
});
it('`show` method should exist', function() {
expect(typeof window.QRScanner.show).toBe('function');
});
it('`hide` method should exist', function() {
expect(typeof window.QRScanner.hide).toBe('function');
});
it('`pausePreview` method should exist', function() {
expect(typeof window.QRScanner.pausePreview).toBe('function');
});
it('`resumePreview` method should exist', function() {
expect(typeof window.QRScanner.resumePreview).toBe('function');
});
it('`enableLight` method should exist', function() {
expect(typeof window.QRScanner.enableLight).toBe('function');
});
it('`disableLight` method should exist', function() {
expect(typeof window.QRScanner.disableLight).toBe('function');
});
it('`useCamera` method should exist', function() {
expect(typeof window.QRScanner.useCamera).toBe('function');
});
it('`useFrontCamera` method should exist', function() {
expect(typeof window.QRScanner.useFrontCamera).toBe('function');
});
it('`useBackCamera` method should exist', function() {
expect(typeof window.QRScanner.useBackCamera).toBe('function');
});
it('`openSettings` method should exist', function() {
expect(typeof window.QRScanner.openSettings).toBe('function');
});
it('`getStatus` method should exist', function() {
expect(typeof window.QRScanner.openSettings).toBe('function');
});
});
describe('QRScanner `status` object', function() {
it('Should be valid', function(done) {
window.QRScanner.getStatus(function(status) {
expect(typeof status.authorized).toBe('boolean');
expect(typeof status.denied).toBe('boolean');
expect(typeof status.restricted).toBe('boolean');
expect(typeof status.prepared).toBe('boolean');
expect(typeof status.scanning).toBe('boolean');
expect(typeof status.previewing).toBe('boolean');
expect(typeof status.showing).toBe('boolean');
expect(typeof status.lightEnabled).toBe('boolean');
expect(typeof status.canOpenSettings).toBe('boolean');
expect(typeof status.canEnableLight).toBe('boolean');
expect(typeof status.canChangeCamera).toBe('boolean');
expect(typeof status.currentCamera).toBe('number');
done();
});
});
});
});
};
exports.defineManualTests = function(contentEl, createActionButton) {
function log(button, err, status, focusProp) {
if (err) {
console.log(button + ' callback returned. QRScannerError:');
console.error(JSON.stringify(err));
} else {
console.log(button + ' callback returned.');
if(focusProp){
console.log('status.' + focusProp + ': ' + status[focusProp]);
} else {
console.log('status: ' + JSON.stringify(status, null, 2));
}
}
}
var qrscanner_tests = '';
var portraitBtn = 'Portrait';
var landscapeBtn = 'Landscape';
var unlockBtn = 'Unlock Orientation';
qrscanner_tests += '<h3>Screen Orientation</h3>' +
'<div id="portraitBtn"></div><div id="landscapeBtn"></div><div id="unlockBtn"></div>' +
'Manual tests should be completed in each screen orientation mode. (This section uses <code>cordova-plugin-screen-orientation</code>.)';
var portrait = function() {
window.screen.lockOrientation('portrait');
};
var landscape = function() {
window.screen.lockOrientation('landscape');
};
var unlock = function() {
window.screen.unlockOrientation();
};
// log when orientation changes
window.addEventListener("orientationchange", function(){
console.log('Screen orientation changed to: ' + screen.orientation);
});
var prepareBtn = 'QRScanner.prepare()';
qrscanner_tests += '<h1>QRScanner Tests</h1>' +
'<h3>Prepare QRScanner</h3>' +
'<div id="prepareBtn"></div>' +
'Expected result: Will request Camera access (if needed) and prepare the video preview UI layer. Runs callback(err, status), even if already prepared.';
var prepare = function() {
window.QRScanner.prepare(function(err, status) {
log(prepareBtn, err, status, 'prepared');
});
};
var showBtn = 'QRScanner.show()';
qrscanner_tests += '<h3>Show QRScanner</h3>' +
'<div id="showBtn"></div>' +
'Expected result: Should make the video preview layer visible.';
var show = function() {
window.QRScanner.show(function(status) {
log(showBtn, null, status, 'showing');
});
};
var hideBtn = 'QRScanner.hide()';
qrscanner_tests += '<h3>Hide QRScanner</h3>' +
'<div id="hideBtn"></div>' +
'Expected result: Should hide the video preview layer (returning the background to the default – opaque and white).';
var hide = function() {
window.QRScanner.hide(function(status) {
log(hideBtn, null, status, 'showing');
});
};
var scanBtn = 'QRScanner.scan()';
var scanWithPauseBtn = 'QRScanner.scan() (with pause)';
var scanWithPauseAndVibrateBtn = 'QRScanner.scan() (pause, vibrate)';
var cancelScanBtn = 'QRScanner.cancelScan()';
qrscanner_tests += '<h2>Scan</h2>' +
'<div id="scanBtn"></div><div id="scanWithPauseBtn"></div><div id="scanWithPauseAndVibrateBtn"></div><div id="cancelScanBtn"></div>' +
'Expected result: Should scan QR codes and log the contents. Scanning can also be stopped. If QRScanner.prepare() has not yet been run, scan also performs any native actions needed.';
var startScan = function(pause, vibrate){
console.log('scanning...');
window.QRScanner.scan(function(err, result) {
console.log('QRScanner.scan() callback returned.');
if(err){
console.error(err);
} else {
console.log('Scan result:');
console.log(result);
if(pause){
window.QRScanner.pausePreview();
}
if(vibrate){
// 80ms vibration
window.navigator.vibrate(80);
}
}
});
};
var cancelScan = function() {
window.QRScanner.cancelScan();
console.log('Canceled scanning.');
};
var scan = function() {
startScan(false, false);
};
var scanWithPause = function(){
startScan(true, false);
};
var scanWithPauseAndVibrate = function(){
startScan(true, true);
};
var pausePreviewBtn = 'QRScanner.pausePreview()';
var resumePreviewBtn = 'QRScanner.resumePreview()';
qrscanner_tests += '<h3>Video Preview</h3>' +
'<div id="pausePreviewBtn"></div><div id="resumePreviewBtn"></div>' +
'Expected result: Should pause and resume the preview, respectively.';
var pausePreview = function() {
window.QRScanner.pausePreview(function(status) {
log(pausePreviewBtn, null, status, 'previewing');
});
};
var resumePreview = function() {
window.QRScanner.resumePreview(function(status) {
log(resumePreviewBtn, null, status, 'previewing');
});
};
var enableLightBtn = 'QRScanner.enableLight()';
var disableLightBtn = 'QRScanner.disableLight()';
qrscanner_tests += '<h3>Enable & Disable Light</h3>' +
'<div id="enableLightBtn"></div><div id="disableLightBtn"></div>' +
'Expected result: Should enable and disable the light, respectively.';
var enableLight = function() {
window.QRScanner.enableLight(function(err, status) {
log(enableLightBtn, err, status, 'lightEnabled');
});
};
var disableLight = function() {
window.QRScanner.disableLight(function(err, status) {
log(disableLightBtn, err, status, 'lightEnabled');
});
};
var useFrontCameraBtn = 'QRScanner.useFrontCamera()';
var useBackCameraBtn = 'QRScanner.useBackCamera()';
qrscanner_tests += '<h3>Active Camera</h3>' +
'<div id="useFrontCameraBtn"></div><div id="useBackCameraBtn"></div>' +
'Expected result: Should switch the direction of the camera. The plugin should default to the back camera.';
var useFrontCamera = function() {
window.QRScanner.useFrontCamera(function(err, status) {
log(useFrontCameraBtn, err, status, 'currentCamera');
});
};
var useBackCamera = function() {
window.QRScanner.useBackCamera(function(err, status) {
log(useBackCameraBtn, err, status, 'currentCamera');
});
};
var openSettingsBtn = 'QRScanner.openSettings()';
qrscanner_tests += '<h3>Open Settings (App Permissions)</h3>' +
'<div id="openSettingsBtn"></div>' +
'Expected result: Should open app-specific permission settings on iOS 8.0+.';
var openSettings = function() {
window.QRScanner.openSettings(function(err, status) {
log(openSettingsBtn, err, status, 'canOpenSettings');
});
};
var statusBtn = 'QRScanner.getStatus()';
qrscanner_tests += '<h3>Get QRScanner Status</h3>' +
'<div id="statusBtn"></div>' +
'Expected result: Should log the current status.';
var getStatus = function() {
window.QRScanner.getStatus(function(status) {
log(statusBtn, null, status);
});
};
var destroyBtn = 'QRScanner.destroy()';
qrscanner_tests += '<h3>Destroy QRScanner</h3>' +
'<div id="destroyBtn"></div>' +
'Expected result: Should "unprepare" and clean up all native functionality prepared by QRScanner.';
var destroy = function() {
window.QRScanner.destroy(function(status) {
log(destroyBtn, null, status, 'prepared');
});
};
contentEl.innerHTML = qrscanner_tests;
createActionButton(portraitBtn, portrait, 'portraitBtn');
createActionButton(landscapeBtn, landscape, 'landscapeBtn');
createActionButton(unlockBtn, unlock, 'unlockBtn');
createActionButton(prepareBtn, prepare, 'prepareBtn');
createActionButton(showBtn, show, 'showBtn');
createActionButton(hideBtn, hide, 'hideBtn');
createActionButton(scanBtn, scan, 'scanBtn');
createActionButton(scanWithPauseBtn, scanWithPause, 'scanWithPauseBtn');
createActionButton(scanWithPauseAndVibrateBtn, scanWithPauseAndVibrate, 'scanWithPauseAndVibrateBtn');
createActionButton(cancelScanBtn, cancelScan, 'cancelScanBtn');
createActionButton(pausePreviewBtn, pausePreview, 'pausePreviewBtn');
createActionButton(resumePreviewBtn, resumePreview, 'resumePreviewBtn');
createActionButton(enableLightBtn, enableLight, 'enableLightBtn');
createActionButton(disableLightBtn, disableLight, 'disableLightBtn');
createActionButton(openSettingsBtn, openSettings, 'openSettingsBtn');
createActionButton(useFrontCameraBtn, useFrontCamera, 'useFrontCameraBtn');
createActionButton(useBackCameraBtn, useBackCamera, 'useBackCameraBtn');
createActionButton(statusBtn, getStatus, 'statusBtn');
createActionButton(destroyBtn, destroy, 'destroyBtn');
};