From 644caf7dfb0689a90f8b87538e00f0efd5b2d69f Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sun, 7 Oct 2018 08:59:25 +0200 Subject: [PATCH] Ensured ColorGenerator matches keys in a case insensitive way --- src/utils/ColorGenerator.js | 14 +++++---- test/utils/ColorGenerator.test.js | 48 +++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 5 deletions(-) create mode 100644 test/utils/ColorGenerator.test.js diff --git a/src/utils/ColorGenerator.js b/src/utils/ColorGenerator.js index 859608a2..673eba3c 100644 --- a/src/utils/ColorGenerator.js +++ b/src/utils/ColorGenerator.js @@ -11,6 +11,7 @@ const buildRandomColor = () => .map(() => letters[floor(random() * letters.length)]) .join('') }`; +const normalizeKey = (key) => key.toLowerCase().trim(); export class ColorGenerator { constructor(storage) { @@ -19,21 +20,24 @@ export class ColorGenerator { } getColorForKey = (key) => { - const color = this.colors[key]; + const normalizedKey = normalizeKey(key); + const color = this.colors[normalizedKey]; // If a color has not been set yet, generate a random one and save it if (!color) { - this.setColorForKey(key, buildRandomColor()); - - return this.getColorForKey(key); + return this.setColorForKey(normalizedKey, buildRandomColor()); } return color; }; setColorForKey = (key, color) => { - this.colors[key] = color; + const normalizedKey = normalizeKey(key); + + this.colors[normalizedKey] = color; this.storage.set('colors', this.colors); + + return color; } } diff --git a/test/utils/ColorGenerator.test.js b/test/utils/ColorGenerator.test.js new file mode 100644 index 00000000..e0a359c6 --- /dev/null +++ b/test/utils/ColorGenerator.test.js @@ -0,0 +1,48 @@ +import * as sinon from 'sinon'; +import { ColorGenerator } from '../../src/utils/ColorGenerator'; + +describe('ColorGenerator', () => { + let colorGenerator; + const storageMock = { + set: sinon.fake(), + get: sinon.fake.returns(undefined), + }; + + beforeEach(() => { + storageMock.set.resetHistory(); + storageMock.get.resetHistory(); + + colorGenerator = new ColorGenerator(storageMock); + }); + + it('sets a color in the storage and makes it available after that', () => { + const color = '#ff0000'; + + colorGenerator.setColorForKey('foo', color); + + expect(colorGenerator.getColorForKey('foo')).toEqual(color); + expect(storageMock.set.callCount).toEqual(1); + expect(storageMock.get.callCount).toEqual(1); + }); + + it('generates a random color when none is available for requested key', () => { + expect(colorGenerator.getColorForKey('bar')).toEqual(expect.stringMatching(/^#(?:[0-9a-fA-F]{6})$/)); + expect(storageMock.set.callCount).toEqual(1); + expect(storageMock.get.callCount).toEqual(1); + }); + + it('trims and lower cases keys before trying to match', () => { + const color = '#ff0000'; + + colorGenerator.setColorForKey('foo', color); + + expect(colorGenerator.getColorForKey(' foo')).toEqual(color); + expect(colorGenerator.getColorForKey('foO')).toEqual(color); + expect(colorGenerator.getColorForKey('FoO')).toEqual(color); + expect(colorGenerator.getColorForKey('FOO')).toEqual(color); + expect(colorGenerator.getColorForKey('FOO ')).toEqual(color); + expect(colorGenerator.getColorForKey(' FoO ')).toEqual(color); + expect(storageMock.set.callCount).toEqual(1); + expect(storageMock.get.callCount).toEqual(1); + }); +});