import LazyFactory from '@superset-ui/core/src/dimension/svg/LazyFactory';

describe('LazyFactory', () => {
  describe('createInContainer()', () => {
    it('creates node in the specified container', () => {
      const factory = new LazyFactory(() => document.createElement('div'));
      const div = factory.createInContainer();
      const innerDiv = factory.createInContainer(div);
      expect(div.parentNode).toEqual(document.body);
      expect(innerDiv.parentNode).toEqual(div);
    });
    it('reuses existing', () => {
      const factoryFn = jest.fn(() => document.createElement('div'));
      const factory = new LazyFactory(factoryFn);
      const div1 = factory.createInContainer();
      const div2 = factory.createInContainer();
      expect(div1).toBe(div2);
      expect(factoryFn).toHaveBeenCalledTimes(1);
    });
  });
  describe('removeFromContainer', () => {
    it('removes node from container', () => {
      const factory = new LazyFactory(() => document.createElement('div'));
      const div = factory.createInContainer();
      const innerDiv = factory.createInContainer(div);
      expect(div.parentNode).toEqual(document.body);
      expect(innerDiv.parentNode).toEqual(div);
      factory.removeFromContainer();
      factory.removeFromContainer(div);
      expect(div.parentNode).toBeNull();
      expect(innerDiv.parentNode).toBeNull();
    });
    it('does not remove if others are using', () => {
      const factory = new LazyFactory(() => document.createElement('div'));
      const div1 = factory.createInContainer();
      factory.createInContainer();
      factory.removeFromContainer();
      expect(div1.parentNode).toEqual(document.body);
      factory.removeFromContainer();
      expect(div1.parentNode).toBeNull();
    });
    it('does not crash if try to remove already removed node', () => {
      const factory = new LazyFactory(() => document.createElement('div'));
      factory.createInContainer();
      factory.removeFromContainer();
      expect(() => factory.removeFromContainer()).not.toThrow();
    });
  });
});
