import { useEffectHook } from "./useEffectHook"; import { ElementState } from "../ElementState"; import { IElementState } from "../types"; describe("useEffectHook tests", () => { describe("when first tick", () => { let state: IElementState; beforeEach(() => { state = new ElementState({ args: ["arg1", "arg2"], func: jest.fn(), }); state.isFirstTick = true; }); it("when isFirstTick true, should call effect and push to effects", () => { const dispose = jest.fn(); const effect = jest.fn().mockReturnValue(dispose); const deps = ["dep1", "dep2"]; useEffectHook(state, effect, deps); expect(effect.mock.calls.length).toBe(1); expect(state.effects.length).toBe(1); expect(state.effects[0]).toEqual({ deps, dispose, }); }); it("when isFirstTick true and effect throw error, should set state.error to it", () => { useEffectHook( state, () => { throw new Error("error1"); }, [], ); expect(state.error).toEqual(new Error("error1")); }); }); describe("when not first tick", () => { let state: IElementState; const currentEffectNumber = 15; beforeEach(() => { state = new ElementState({ args: ["arg1", "arg2"], func: jest.fn(), }); state.isFirstTick = false; state.tickState.currentEffectNumber = currentEffectNumber; }); it("when not found effect with currentEffectNumber, should throw error", () => { expect(() => useEffectHook(state, jest.fn(), [])).toThrowError( "Expected effect with number " + currentEffectNumber, ); }); it("when existing args.length not equal to new args length, should throw error", () => { state.effects[currentEffectNumber] = { deps: ["dep1", "dep2"] }; expect(() => useEffectHook(state, jest.fn(), ["dep3"])).toThrowError( "Dependencies not equal, old version of effect has dependencies and new version not has", ); }); it("when existing args and new args is equal, should do nothing", () => { state.effects[currentEffectNumber] = { deps: ["dep1", "dep2"] }; const newFunc = jest.fn(); useEffectHook(state, newFunc, ["dep1", "dep2"]); expect(state.effects[currentEffectNumber]); }); }); });