@cheprasov/qrcode
Version:
The library is for generating QR codes like SVG, HTML5 Canvas, PNG and JPG files, or text.
228 lines (200 loc) • 8.07 kB
JavaScript
// @flow
/*
* This file is part of QR code library
* git: https://github.com/cheprasov/js-qrcode
*
* (C) Alexander Cheprasov <acheprasov84@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
import QRCodeRaw from './QRCodeRaw';
let mockQRCode = {};
jest.mock('qr.js/lib/QRCode', () => {
return function () {
Object.assign(this, mockQRCode);
};
});
describe('QRCodeRaw', () => {
describe('constructor', () => {
it('should use default params if nothing is provided', () => {
const qrCode = new QRCodeRaw();
expect(qrCode.value).toBeUndefined();
expect(qrCode.padding).toEqual(1);
expect(qrCode.level).toEqual('L');
expect(qrCode.typeNumber).toEqual(0);
expect(qrCode.errorsEnabled).toBeFalsy();
expect(qrCode.invert).toBeFalsy();
});
it('should default params for not specified params', () => {
const qrCode = new QRCodeRaw('test 42', { level: 'Q' });
expect(qrCode.value).toEqual('test 42');
expect(qrCode.padding).toEqual(1);
expect(qrCode.level).toEqual('Q');
expect(qrCode.typeNumber).toEqual(0);
expect(qrCode.errorsEnabled).toBeFalsy();
expect(qrCode.invert).toBeFalsy();
});
it('should use specified params', () => {
const qrCode = new QRCodeRaw(
'test 84',
{
level: 'H',
padding: 0,
typeNumber: 20,
invert: true,
errorsEnabled: true,
},
);
expect(qrCode.value).toEqual('test 84');
expect(qrCode.padding).toEqual(0);
expect(qrCode.level).toEqual('H');
expect(qrCode.typeNumber).toEqual(20);
expect(qrCode.errorsEnabled).toBeTruthy();
expect(qrCode.invert).toBeTruthy();
});
});
describe('setValue', () => {
it('should set new value and clear cache', () => {
const qrCode = new QRCodeRaw('test');
qrCode._clearCache = jest.fn();
qrCode.setValue('foo 42');
expect(qrCode.value).toEqual('foo 42');
expect(qrCode._clearCache).toHaveBeenCalled();
});
});
describe('getDataSize', () => {
it('should return 0 if data is empty', () => {
const qrCode = new QRCodeRaw('test');
qrCode.getData = jest.fn(() => null);
expect(qrCode.getDataSize()).toEqual(0);
});
it('should return length of data', () => {
const qrCode = new QRCodeRaw('test');
qrCode.getData = jest.fn(() => [1, 2, 3, 4]);
expect(qrCode.getDataSize()).toEqual(4);
});
});
describe('_clearCache', () => {
it('should clear qrCodeData', () => {
const qrCode = new QRCodeRaw('test');
qrCode.qrCodeData = [1, 2, 3, 4];
qrCode._clearCache();
expect(qrCode.qrCodeData).toBeNull();
});
});
describe('_getQrCodeData', () => {
let qrCode;
beforeEach(() => {
qrCode = new QRCodeRaw('test', { padding: 0 });
});
it('should return deep cloned arrays', () => {
const source = [
[true, true, true],
[true, false, true],
[true, true, true],
];
const result = qrCode._getQrCodeData(source);
expect(result).toEqual(source);
expect(result).not.toBe(source);
source[1][1] = true;
expect(result).not.toEqual(source);
});
it('should invert data if the param is enabled', () => {
const source = [
[false, true, true],
[true, false, true],
[false, true, true],
];
qrCode.invert = true;
const result = qrCode._getQrCodeData(source);
expect(result).toEqual([
[true, false, false],
[false, true, false],
[true, false, false],
]);
});
it('should add padding to data', () => {
const source = [
[false, true, true],
[true, false, true],
[false, true, true],
];
qrCode.padding = 1;
expect(qrCode._getQrCodeData(source)).toEqual([
[false, false, false, false, false],
[false, false, true, true, false],
[false, true, false, true, false],
[false, false, true, true, false],
[false, false, false, false, false],
]);
qrCode.padding = 3;
expect(qrCode._getQrCodeData(source)).toEqual([
[false, false, false, false, false, false, false, false, false],
[false, false, false, false, false, false, false, false, false],
[false, false, false, false, false, false, false, false, false],
[false, false, false, false, true, true, false, false, false],
[false, false, false, true, false, true, false, false, false],
[false, false, false, false, true, true, false, false, false],
[false, false, false, false, false, false, false, false, false],
[false, false, false, false, false, false, false, false, false],
[false, false, false, false, false, false, false, false, false],
]);
});
it('should invert data with padding', () => {
const source = [
[false, true, true],
[true, false, true],
[false, true, true],
];
qrCode.invert = true;
qrCode.padding = 3;
expect(qrCode._getQrCodeData(source)).toEqual([
[true, true, true, true, true, true, true, true, true],
[true, true, true, true, true, true, true, true, true],
[true, true, true, true, true, true, true, true, true],
[true, true, true, true, false, false, true, true, true],
[true, true, true, false, true, false, true, true, true],
[true, true, true, true, false, false, true, true, true],
[true, true, true, true, true, true, true, true, true],
[true, true, true, true, true, true, true, true, true],
[true, true, true, true, true, true, true, true, true],
]);
});
});
describe('getData', () => {
let qrCode;
beforeEach(() => {
qrCode = new QRCodeRaw('test', { padding: 0 });
});
it('should return cached data', () => {
qrCode.qrCodeData = [1, 2, 3, 4];
expect(qrCode.getData()).toEqual([1, 2, 3, 4]);
});
it('should throw an error on error if errorsEnable is true', () => {
qrCode.errorsEnabled = true;
mockQRCode = {
addData: () => {
throw new Error('Some error');
},
};
expect(() => { qrCode.getData(); }).toThrowError();
});
it('should return null on error if errorsEnable is false', () => {
mockQRCode = {
addData: () => {
throw new Error('Some error');
},
};
expect(qrCode.getData()).toBeNull();
});
it('should return data of QR code', () => {
mockQRCode = {
addData: jest.fn(),
make: jest.fn(),
modules: [[true, true, true], [true, false, true], [true, true, true]],
};
expect(qrCode.getData()).toEqual([[true, true, true], [true, false, true], [true, true, true]]);
});
});
});