import Cache from '~/lib/utils/cache';

describe('Cache', () => {
  const dummyKey = 'just some key';
  const dummyValue = 'more than a value';
  let cache;

  beforeEach(() => {
    cache = new Cache();
  });

  describe('get', () => {
    it('return cached data', () => {
      cache.internalStorage[dummyKey] = dummyValue;

      expect(cache.get(dummyKey)).toBe(dummyValue);
    });

    it('returns undefined for missing data', () => {
      expect(cache.internalStorage[dummyKey]).toBe(undefined);
      expect(cache.get(dummyKey)).toBe(undefined);
    });
  });

  describe('hasData', () => {
    it('return true for cached data', () => {
      cache.internalStorage[dummyKey] = dummyValue;

      expect(cache.hasData(dummyKey)).toBe(true);
    });

    it('returns false for missing data', () => {
      expect(cache.internalStorage[dummyKey]).toBe(undefined);
      expect(cache.hasData(dummyKey)).toBe(false);
    });
  });

  describe('remove', () => {
    it('removes data from cache', () => {
      cache.internalStorage[dummyKey] = dummyValue;

      cache.remove(dummyKey);

      expect(cache.internalStorage[dummyKey]).toBe(undefined);
    });

    it('does nothing for missing data', () => {
      expect(cache.internalStorage[dummyKey]).toBe(undefined);

      cache.remove(dummyKey);

      expect(cache.internalStorage[dummyKey]).toBe(undefined);
    });

    it('does not remove wrong data', () => {
      cache.internalStorage[dummyKey] = dummyValue;
      cache.internalStorage[dummyKey + dummyKey] = dummyValue + dummyValue;

      cache.remove(dummyKey);

      expect(cache.internalStorage[dummyKey]).toBe(undefined);
      expect(cache.internalStorage[dummyKey + dummyKey]).toBe(dummyValue + dummyValue);
    });
  });
});