const test = require('tap').test const QRCode = require('lib') const QRCodeBrowser = require('lib/browser') const { createCanvas } = require('canvas') const Helpers = require('test/helpers') test('toDataURL - no promise available', function (t) { Helpers.removeNativePromise() t.throw(function () { QRCode.toDataURL() }, 'Should throw if no arguments are provided') t.throw(function () { QRCode.toDataURL(function () {}) }, 'Should throw if text is not provided') t.throw(function () { QRCode.toDataURL('some text') }, 'Should throw if a callback is not provided') t.throw(function () { QRCode.toDataURL('some text', {}) }, 'Should throw if a callback is not a function') t.throw(function () { QRCodeBrowser.toDataURL() }, 'Should throw if no arguments are provided (browser)') t.throw(function () { QRCodeBrowser.toDataURL(function () {}) }, 'Should throw if text is not provided (browser)') t.throw(function () { QRCodeBrowser.toDataURL('some text') }, 'Should throw if a callback is not provided (browser)') t.throw(function () { QRCodeBrowser.toDataURL('some text', {}) }, 'Should throw if a callback is not a function (browser)') t.end() Helpers.restoreNativePromise() }) test('toDataURL - image/png', function (t) { const expectedDataURL = [ 'data:image/png;base64,', 'iVBORw0KGgoAAAANSUhEUgAAAHQAAAB0CAYAAABUmhYnAAAAAklEQVR4AewaftIAAAKzSU', 'RBVO3BQW7kQAwEwSxC//9y7h55akCQxvYQjIj/scYo1ijFGqVYoxRrlGKNUqxRijVKsUYp', '1ijFGqVYoxRrlGKNUqxRijXKxUNJ+EkqdyShU+mS0Kl0SfhJKk8Ua5RijVKsUS5epvKmJD', 'yh8iaVNyXhTcUapVijFGuUiw9Lwh0qdyShU+mS0Kl0Kk8k4Q6VTyrWKMUapVijXHw5lROV', 'kyR0Kt+sWKMUa5RijXIxTBI6lS4JkxVrlGKNUqxRLj5M5Tcl4UTlCZW/pFijFGuUYo1y8b', 'Ik/KQkdCpdEjqVLgmdykkS/rJijVKsUYo1ysVDKt9M5UTlmxRrlGKNUqxRLh5Kwh0qXRJ+', 'UxLuULkjCZ3KJxVrlGKNUqxRLh5S6ZLQqXRJ6FS6JHQqXRKeSEKn0iWhUzlJwolKl4QTlS', 'eKNUqxRinWKBe/LAmdSpeETuUkCZ1Kl4QTlS4Jd6h0SehUuiS8qVijFGuUYo1y8WFJ6FS6', 'JJyofFISOpVOpUtCp3KicqLypmKNUqxRijXKxYep3JGEE5UuCZ3KHSp3qHRJ6FR+U7FGKd', 'YoxRol/scXS8ITKidJeEKlS8KJyhPFGqVYoxRrlIuHkvCTVE5U7kjCicpJEk6S8JOKNUqx', 'RinWKBcvU3lTEu5IwolKp/KEyh1J6FTeVKxRijVKsUa5+LAk3KHyJpWTJHQqdyShU/lNxR', 'qlWKMUa5SLL6fSJaFLwhNJeCIJP6lYoxRrlGKNcvHlknCicpKEE5UuCSdJOFHpktCpPFGs', 'UYo1SrFGufgwlZ+k0iWhU+lUnlDpktCpdEnoVN5UrFGKNUqxRrl4WRL+EpU7ktCpdCpdEj', 'qVO5LQqTxRrFGKNUqxRon/scYo1ijFGqVYoxRrlGKNUqxRijVKsUYp1ijFGqVYoxRrlGKN', 'UqxRijXKP0OHEepgrecVAAAAAElFTkSuQmCC'].join('') t.plan(8) t.throw(function () { QRCode.toDataURL() }, 'Should throw if no arguments are provided') QRCode.toDataURL('i am a pony!', { errorCorrectionLevel: 'L', type: 'image/png' }, function (err, url) { t.ok(!err, 'there should be no error ' + err) t.equals(url, expectedDataURL, 'url should match expected value for error correction L') }) QRCode.toDataURL('i am a pony!', { version: 1, // force version=1 to trigger an error errorCorrectionLevel: 'H', type: 'image/png' }, function (err, url) { t.ok(err, 'there should be an error ') t.notOk(url, 'url should be null') }) t.equals(typeof QRCode.toDataURL('i am a pony!').then, 'function', 'Should return a promise') QRCode.toDataURL('i am a pony!', { errorCorrectionLevel: 'L', type: 'image/png' }).then(function (url) { t.equals(url, expectedDataURL, 'url should match expected value for error correction L (promise)') }) QRCode.toDataURL('i am a pony!', { version: 1, // force version=1 to trigger an error errorCorrectionLevel: 'H', type: 'image/png' }).catch(function (err) { t.ok(err, 'there should be an error (promise)') }) }) test('Canvas toDataURL - image/png', function (t) { const expectedDataURL = [ 'data:image/png;base64,', 'iVBORw0KGgoAAAANSUhEUgAAAIQAAACECAYAAABRRIOnAAAABmJLR0QA/wD/AP+gvaeTAA', 'AC20lEQVR4nO3dQY7jMAwEwM1i///lzGUurYtWEEknQNV1EidjNGhFpuTX+/1+/4Fff5/+', 'AnwWgSAIBEEgCAJBEAiCQBAEgiAQBIEgCARBIAgCQRAIgkAQ/t0e4PV6VXyP/7a2b6yff9', 'vecXq83eufPj+nVAiCQBAEgnA9hlhVt2jursGn1/hbt2OW6fNzSoUgCARBIAjlY4jV6TWu', 'ex7hdt7g6TFA9zIaFYIgEASBILSPIbrdjhlWt/civn2prApBEAiCQBC+fgzR3R8xfa/kaS', 'oEQSAIAkFoH0N82u/y03sVuzFJ9xhlmgpBEAiCQBDKxxDTv8u7+x9uP3/3+k+jQhAEgiAQ', 'hOsxxNO/o0/7G07/fuvp83NKhSAIBEEgCK/u52VUzwNUr6Ponkc4Pb3V+1OcUiEIAkEQCE', 'L5HlPT17zuPZ1ux0Dde2BVUyEIAkEQCEL5vYzTa271NfF2nUb1vMj097mlQhAEgiAQhPG1', 'nbf3IqbnBXZjnuq9sKfncVYqBEEgCAJBGL+XsTqdp6g+/qr7Gr2q/n/0Q1BKIAgCQSjvqa', 'z+3b07/qq6h3G6Z3P3/h1jCEoJBEEgCO3zEJ/ej3Cq+hlb3etSTqkQBIEgCATh4+YhqucF', 'nu5fmD7+LRWCIBAEgSA83g+xmu45nH4m1+3nd1MhCAJBEAhC+x5T3br7I05193d0P5tchS', 'AIBEEgCOXzEN1un3lV/Qyt6nUe3f0OOyoEQSAIAkEo3x+ielrj9Bq96h5z7Dx9b+eUCkEQ', 'CIJAENr3mJpemzjdU7l7/7dRIQgCQRAIwvg+ldWm13Wc6t4Hs5oKQRAIgkAQvn4MUb1WdP', 'q5nKevt08lowSCIBCE9jHE9F7R0/MGu7/f9lDqh+BRAkEQCML12s6n12Wcqp5n6N5X8/Tz', 'zENQSiAIAkH4+v0hqKVCEASCIBAEgSAIBEEgCAJBEAiCQBAEgiAQBIEgCARBIAgCQfgBlZ', '7HAm5AupgAAAAASUVORK5CYII='].join('') t.plan(11) t.throw(function () { QRCodeBrowser.toDataURL() }, 'Should throw if no arguments are provided') t.throw(function () { QRCodeBrowser.toDataURL(function () {}) }, 'Should throw if text is not provided') const canvas = createCanvas(200, 200) QRCodeBrowser.toDataURL(canvas, 'i am a pony!', { errorCorrectionLevel: 'H', type: 'image/png' }, function (err, url) { t.ok(!err, 'there should be no error ' + err) t.equals(url, expectedDataURL, 'url generated should match expected value') }) QRCodeBrowser.toDataURL(canvas, 'i am a pony!', { version: 1, // force version=1 to trigger an error errorCorrectionLevel: 'H', type: 'image/png' }, function (err, url) { t.ok(err, 'there should be an error ') t.notOk(url, 'url should be null') }) QRCodeBrowser.toDataURL(canvas, 'i am a pony!', { errorCorrectionLevel: 'H', type: 'image/png' }).then(function (url) { t.equals(url, expectedDataURL, 'url generated should match expected value (promise)') }) QRCodeBrowser.toDataURL(canvas, 'i am a pony!', { version: 1, // force version=1 to trigger an error errorCorrectionLevel: 'H', type: 'image/png' }).catch(function (err) { t.ok(err, 'there should be an error (promise)') }) // Mock document object global.document = { createElement: function (el) { if (el === 'canvas') { return createCanvas(200, 200) } } } QRCodeBrowser.toDataURL('i am a pony!', { errorCorrectionLevel: 'H', type: 'image/png' }, function (err, url) { t.ok(!err, 'there should be no error ' + err) t.equals(url, expectedDataURL, 'url generated should match expected value') }) QRCodeBrowser.toDataURL('i am a pony!', { errorCorrectionLevel: 'H', type: 'image/png' }).then(function (url) { t.equals(url, expectedDataURL, 'url generated should match expected value (promise)') }) })