@lion/ui
Version:
A package of extendable web components
92 lines (78 loc) • 3.3 kB
JavaScript
import sinon from 'sinon';
import { expect, aTimeout } from '@open-wc/testing';
import { PhoneNumber, PhoneUtilManager } from '@lion/ui/input-tel.js';
import { mockPhoneUtilManager, restorePhoneUtilManager } from '@lion/ui/input-tel-test-helpers.js';
/**
* @typedef {* & import('awesome-phonenumber')} AwesomePhoneNumber
*/
// For enum output, see: https://www.npmjs.com/package/awesome-phonenumber
describe('PhoneNumber validation', () => {
beforeEach(async () => {
// Wait till PhoneUtilManager has been loaded
await PhoneUtilManager.loadComplete;
});
it('is invalid when no input is provided', () => {
const validator = new PhoneNumber();
expect(validator.execute('', 'NL')).to.equal('unknown');
});
it('is invalid when non digits are entered, returns "unknown"', () => {
const validator = new PhoneNumber();
expect(validator.execute('foo', 'NL')).to.equal('unknown');
});
// TODO: this changed after awesome-phonenumber v4. Skip for now, look into this later
it('is invalid when wrong country code is entered, returns "invalid-country-code"', () => {
const validator = new PhoneNumber();
// 32 is BE region code
expect(validator.execute('+32612345678', 'NL')).to.equal('invalid-country-code');
});
it('is invalid when number is too short, returns "too-short"', () => {
const validator = new PhoneNumber();
expect(validator.execute('+316123', 'NL')).to.equal('too-short');
});
it('is invalid when number is too long, returns "too-long"', () => {
const validator = new PhoneNumber();
expect(validator.execute('+31612345678901', 'NL')).to.equal('too-long');
});
it('is valid when a phone number is entered', () => {
const validator = new PhoneNumber();
expect(validator.execute('+31612345678', 'NL')).to.be.false;
});
it('handles validation via awesome-phonenumber', () => {
const validator = new PhoneNumber();
// @ts-ignore
const spy = sinon.spy(PhoneUtilManager.PhoneUtil, 'parsePhoneNumber');
validator.execute('0123456789', 'NL');
expect(spy).to.have.been.calledOnce;
expect(spy.lastCall.args[1]).to.eql({ regionCode: 'NL' });
validator.execute('0123456789', 'DE');
expect(spy.lastCall.args[1]).to.eql({ regionCode: 'DE' });
spy.restore();
});
describe('Lazy loading PhoneUtilManager', () => {
/** @type {(value:any) => void} */
let resolveLoaded;
beforeEach(() => {
({ resolveLoaded } = mockPhoneUtilManager());
});
afterEach(() => {
restorePhoneUtilManager();
});
it('behaves asynchronously when lib is still loading', () => {
expect(PhoneNumber.async).to.be.true;
resolveLoaded(undefined);
expect(PhoneNumber.async).to.be.false;
});
it('waits for the lib to be loaded before execution completes when still in async mode', async () => {
const validator = new PhoneNumber();
// @ts-ignore
const spy = sinon.spy(PhoneUtilManager.PhoneUtil, 'parsePhoneNumber');
const validationResult = validator.execute('061234', 'NL');
expect(validationResult).to.be.instanceOf(Promise);
expect(spy).to.not.have.been.called;
resolveLoaded(undefined);
await aTimeout(0);
expect(spy).to.have.been.calledOnce;
spy.restore();
});
});
});