Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tests fix imodel react hooks #763

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "patch",
"comment": "Fixing tests for imodel-react-hooks that were being skipped",
"packageName": "@itwin/imodel-react-hooks",
"email": "[email protected]",
"dependentChangeType": "patch"
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,46 +3,48 @@
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/

import { IModelApp, Viewport } from "@itwin/core-frontend";
import { render } from "@testing-library/react";
import type { FeatureOverrideProvider } from "@itwin/core-frontend";
import { IModelApp } from "@itwin/core-frontend";
import { cleanup, render } from "@testing-library/react";
import React from "react";

import { FeatureOverrideReactProvider, FeatureSymbologyContext, useFeatureOverrides } from "./useFeatureOverrides";

jest.mock("@itwin/core-frontend", () => ({
IModelApp: {
viewManager: {
__vp: {
featureOverrideProvider: {},
onFeatureOverrideProviderChanged: {
addListener: jest.fn(),
},
setFeatureOverrideProviderChanged: jest.fn(),
},
forEachViewport(func: (vp: Viewport) => void) {
func((this.__vp as any) as Viewport);
},
__viewports: [{
featureOverrideProviders: new Array<FeatureOverrideProvider>(),
onFeatureOverrideProviderChanged: {
addListener: jest.fn(),
},
setFeatureOverrideProviderChanged: jest.fn(),
addFeatureOverrideProvider(provider: FeatureOverrideProvider){
this.featureOverrideProviders.push(provider);
}
}
],
invalidateViewportScenes: jest.fn(),
onViewOpen: {
addListener: jest.fn(),
},
[Symbol.iterator]() {
return this.__viewports[Symbol.iterator]();
}
},
},
FeatureOverrideProvider: class FeatureOverrideProvider { },
}));

const register = jest.fn();
const unregister = jest.fn();
const invalidate = jest.fn();

describe("Hook useFeatureOverrides", () => {
beforeEach(() => {
register.mockClear();
unregister.mockClear();
invalidate.mockClear();
});
afterEach(() => {
cleanup();
})

it("children are registered in tree order", () => {
const unregister = jest.fn();
const register = jest.fn();
const invalidate = jest.fn();

const a = { overrider: jest.fn() };
const A = () => {
useFeatureOverrides(a, []);
Expand Down Expand Up @@ -75,25 +77,29 @@ describe("Hook useFeatureOverrides", () => {
expect(register.mock.calls[2][0].current).toEqual(c);
});

it.skip("children unregistered on unmount", () => {
it("children unregistered on unmount", async () => {

const [unregister, unregistered] = getAwaitableMock();
const register = jest.fn();
const invalidate = jest.fn();

const A = () => {
useFeatureOverrides({ overrider: jest.fn() }, []);
return <></>;
};
const wrapper = render(
<FeatureSymbologyContext.Provider
value={{ register, unregister, invalidate }}
>
<FeatureSymbologyContext.Provider value={{ register, unregister, invalidate }}>
<A />
</FeatureSymbologyContext.Provider>
</FeatureSymbologyContext.Provider>,
);
expect(register).toBeCalledTimes(1);
expect(unregister).toBeCalledTimes(0);
wrapper.unmount();
await unregistered;
expect(unregister).toBeCalledTimes(1);
});

it.skip("should ignore components above in the tree when there is a 'complete override'", async () => {
it("should ignore components above in the tree when there is a 'complete override'", async () => {
const override = jest.fn((arg) => {
const test = arg;
return test as any;
Expand All @@ -112,10 +118,7 @@ describe("Hook useFeatureOverrides", () => {
return null;
};
const C = () => {
useFeatureOverrides(
{ overrider: () => override("C"), completeOverride: true },
[]
);
useFeatureOverrides({ overrider: () => override("C"), completeOverride: true }, []);
return <D />;
};
const D = () => {
Expand All @@ -125,12 +128,22 @@ describe("Hook useFeatureOverrides", () => {
render(
<FeatureOverrideReactProvider>
<A />
</FeatureOverrideReactProvider>
</FeatureOverrideReactProvider>,
);
await new Promise((resolve) => setTimeout(resolve, 10));
for (const vp of IModelApp.viewManager) {
vp.addFeatureOverrideProvider(undefined!);
for (const provider of vp.featureOverrideProviders) {
provider.addFeatureOverrides(undefined!, vp);
}
}
expect(override.mock.calls).toEqual([["C"], ["D"]]);
});
});

function getAwaitableMock(): [jest.Mock<void>, Promise<void>] {
let resolve: (() => void) | undefined;
const promise = new Promise<void>((_resolve) => {resolve = _resolve});
const callback = jest.fn(resolve);

return [callback, promise];
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,8 @@
*--------------------------------------------------------------------------------------------*/

import type { FeatureOverrideProvider, FeatureSymbology, Viewport } from "@itwin/core-frontend";
import React, { useCallback, useContext, useEffect, useMemo, useRef } from "react";
import { IModelApp } from "@itwin/core-frontend";
import React, { useContext, useEffect, useMemo, useRef } from "react";
import { useCallback } from "react";

import { useOnMountInRenderOrder } from "../utils/basic-hooks";
import { makeContextWithProviderRequired } from "../utils/react-context";

Expand Down Expand Up @@ -116,14 +114,14 @@ export const FeatureOverrideReactProvider = ({
};
attach();

IModelApp.viewManager.onViewOpen.addListener(attach);
const removeListener = IModelApp.viewManager.onViewOpen.addListener(attach);
return () => {
for (const vp of IModelApp.viewManager) {
if (!viewFilter || viewFilter(vp)) {
vp.dropFeatureOverrideProvider(impl);
}
}
IModelApp.viewManager.onViewOpen.removeListener(attach);
removeListener();
};
}, [impl, viewFilter]);

Expand All @@ -147,7 +145,7 @@ export const FeatureOverrideReactProvider = ({
},
invalidate,
}),
[providers, viewFilter]
[providers, invalidate]
);

return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/

import { useEffect, useMemo, useRef } from "react";
import { useEffect, useRef } from "react";

/** perform code on mount, executing in render order, which
* effects cannot do.
Expand Down
Loading