ionicons
Version:
Premium icons for Ionic.
116 lines (115 loc) • 4.34 kB
JavaScript
import { Icon } from "../icon";
import { addIcons, getIconMap, getName, getSrc, getUrl } from "../utils";
describe('getUrl', () => {
let i;
beforeEach(() => {
i = new Icon();
});
it('use icon prop, as name', () => {
i.icon = 'some-name';
expect(getUrl(i)).toBe('/svg/some-name.svg');
});
it('use icon prop, as url', () => {
i.icon = './some.svg';
expect(getUrl(i)).toBe('./some.svg');
});
it('use name prop', () => {
i.name = 'some-name';
expect(getUrl(i)).toBe('/svg/some-name.svg');
});
it('use src prop', () => {
i.src = './some.svg';
i.name = 'some-name';
i.icon = 'some-icon';
expect(getUrl(i)).toBe('./some.svg');
});
});
describe('getSrc', () => {
it('both . and /', () => {
expect(getSrc('./somefile.svg')).toBe('./somefile.svg');
});
it('url', () => {
expect(getSrc('https://ionicons/somefile.svg')).toBe('https://ionicons/somefile.svg');
});
it('just a .', () => {
expect(getSrc('somefile.svg')).toBe('somefile.svg');
});
it('just a /', () => {
expect(getSrc('/somesvg')).toBe('/somesvg');
});
it('no . or /', () => {
expect(getSrc('some-name')).toBe(null);
});
});
describe('getName', () => {
it('not allow special chars', () => {
expect(getName('some\\name', '', 'io', '', '')).toBe(null);
expect(getName('some$name', '', 'io', '', '')).toBe(null);
expect(getName('some:name', '', 'io', '', '')).toBe(null);
expect(getName('some.name', '', 'io', '', '')).toBe(null);
expect(getName('some/name', '', 'io', '', '')).toBe(null);
});
it('use ios mode prefixed', () => {
expect(getName('ios-some-name', '', '', '', '')).toBe('ios-some-name');
});
it('use md mode prefixed', () => {
expect(getName('md-some-name', '', '', '', '')).toBe('md-some-name');
});
it('should not use name if no name, ios or md', () => {
expect(getName(undefined, undefined, '', '', '')).toBe(null);
});
});
describe('addIcons', () => {
it('should add an svg to the icon cache', () => {
const testData = 'stubbed data';
expect(getIconMap().get('logo-ionic')).toEqual(undefined);
addIcons({ 'logo-ionic': 'stubbed data' });
expect(getIconMap().get('logo-ionic')).toEqual(testData);
});
it('should add kebab and camel case names to the icon cache', () => {
const logoIonitron = 'stubbed data';
expect(getIconMap().get('logo-ionitron')).toEqual(undefined);
expect(getIconMap().get('logoIonitron')).toEqual(undefined);
addIcons({ logoIonitron });
expect(getIconMap().get('logo-ionitron')).toEqual(logoIonitron);
expect(getIconMap().get('logoIonitron')).toEqual(logoIonitron);
const logoIonitron0 = 'stubbed data 0';
expect(getIconMap().get('logo-ionitron-0')).toEqual(undefined);
expect(getIconMap().get('logoIonitron0')).toEqual(undefined);
addIcons({ logoIonitron0 });
expect(getIconMap().get('logo-ionitron-0')).toEqual(logoIonitron0);
expect(getIconMap().get('logoIonitron0')).toEqual(logoIonitron0);
});
it('should map to a name that does not match the svg', () => {
const logoIonitron = 'stubbed data';
expect(getIconMap().get('my-fun-icon')).toEqual(undefined);
addIcons({ 'my-fun-icon': logoIonitron });
expect(getIconMap().get('my-fun-icon')).toEqual(logoIonitron);
});
it('should map to an explicit camel case name', () => {
const logoIonitron = 'stubbed data';
expect(getIconMap().get('myCoolIcon')).toEqual(undefined);
addIcons({ 'myCoolIcon': logoIonitron });
expect(getIconMap().get('myCoolIcon')).toEqual(logoIonitron);
});
it('should not warn when mapping the same icon twice', () => {
const spy = jest.spyOn(console, 'warn');
const myIcon = 'my-icon';
expect(spy).not.toHaveBeenCalled();
addIcons({ myIcon });
expect(spy).not.toHaveBeenCalled();
addIcons({ myIcon });
expect(spy).not.toHaveBeenCalled();
});
it('should not overwrite icons', () => {
const spy = jest.spyOn(console, 'warn');
const logoA = 'logo a';
const logoB = 'logo b';
expect(spy).not.toHaveBeenCalled();
expect(getIconMap().get('logo-a')).toEqual(undefined);
addIcons({ 'logo-a': logoB, logoA });
expect(getIconMap().get('logo-a')).toEqual(logoB);
expect(getIconMap().get('logoA')).toEqual(logoA);
expect(spy).toHaveBeenCalled();
});
});