feat: Implement basic general folder support (#2051)

- Related: #1748
This commit is contained in:
Dermot Duffy
2025-05-21 19:59:21 -07:00
committed by GitHub
parent 2eb0d9e35e
commit c6a4c8aea2
350 changed files with 12837 additions and 4509 deletions
@@ -2,11 +2,17 @@ import Panzoom, { PanzoomEventDetail, PanzoomObject } from '@dermotduffy/panzoom
import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest';
import { mock, mockClear } from 'vitest-mock-extended';
import { ZoomController } from '../../../src/components-lib/zoom/zoom-controller';
import { ResizeObserverMock, requestAnimationFrameMock } from '../../test-utils';
import {
ResizeObserverMock,
createTouch,
createTouchEvent,
requestAnimationFrameMock,
} from '../../test-utils';
vi.mock('@dermotduffy/panzoom');
vi.mock('lodash-es/throttle', () => ({
default: vi.fn((fn) => fn),
vi.mock('lodash-es', () => ({
round: vi.fn((fn) => fn),
throttle: vi.fn((fn) => fn),
}));
// https://github.com/jsdom/jsdom/issues/2527
@@ -42,23 +48,6 @@ describe('ZoomController', () => {
return zoom;
};
const createTouch = (target: HTMLElement): Touch => {
return {
clientX: 0,
clientY: 0,
force: 0,
identifier: 0,
pageX: 0,
pageY: 0,
radiusX: 0,
radiusY: 0,
rotationAngle: 0,
screenX: 0,
screenY: 0,
target: target,
};
};
beforeAll(() => {
vi.stubGlobal('ResizeObserver', ResizeObserverMock);
window.requestAnimationFrame = requestAnimationFrameMock;
@@ -144,24 +133,23 @@ describe('ZoomController', () => {
createAndRegisterZoom(element);
const ev_1 = new TouchEvent('touchstart', {
bubbles: false,
touches: [createTouch(element), createTouch(element)],
const ev_1 = createTouchEvent('touchstart', {
touches: [createTouch({ target: element }), createTouch({ target: element })],
});
element.dispatchEvent(ev_1);
expect(panzoom.handleDown).toBeCalledWith(ev_1);
panzoom.getScale = vi.fn().mockReturnValue(1.2);
const ev_3 = new TouchEvent('touchstart');
const ev_3 = createTouchEvent('touchstart');
element.dispatchEvent(ev_3);
expect(panzoom.handleDown).toBeCalledWith(ev_3);
const ev_4 = new TouchEvent('touchmove');
const ev_4 = createTouchEvent('touchmove');
element.dispatchEvent(ev_4);
expect(panzoom.handleMove).toBeCalledWith(ev_4);
const ev_5 = new TouchEvent('touchend');
const ev_5 = createTouchEvent('touchend');
element.dispatchEvent(ev_5);
expect(panzoom.handleUp).toBeCalledWith(ev_5);
});
@@ -57,33 +57,68 @@ describe('generateViewContextForZoom', () => {
});
// @vitest-environment jsdom
it('handleZoomSettingsObservedEvent', () => {
const viewManager = mock<ViewManager>();
describe('handleZoomSettingsObservedEvent', () => {
it('should reject observed zoom settings without viewManager ', () => {
handleZoomSettingsObservedEvent(
new CustomEvent('advanced-camera-card:zoom:change', {
detail: {
pan: { x: 1, y: 2 },
zoom: 3,
isDefault: true,
unzoomed: true,
},
}),
);
handleZoomSettingsObservedEvent(
new CustomEvent('advanced-camera-card:zoom:change', {
detail: {
pan: { x: 1, y: 2 },
zoom: 3,
isDefault: true,
unzoomed: true,
},
}),
viewManager,
'target',
);
expect(viewManager.setViewByParameters).toBeCalledWith(
expect.objectContaining({
modifiers: [expect.any(MergeContextViewModifier)],
}),
);
// No observable effect.
});
expect(MergeContextViewModifier).toBeCalledWith({
zoom: {
target: {
observed: { pan: { x: 1, y: 2 }, zoom: 3, isDefault: true, unzoomed: true },
requested: null,
it('should reject observed zoom settings without target ', () => {
const viewManager = mock<ViewManager>();
handleZoomSettingsObservedEvent(
new CustomEvent('advanced-camera-card:zoom:change', {
detail: {
pan: { x: 1, y: 2 },
zoom: 3,
isDefault: true,
unzoomed: true,
},
}),
viewManager,
);
expect(viewManager.setViewByParameters).not.toBeCalled();
});
it('should handle observed zoom settings ', () => {
const viewManager = mock<ViewManager>();
handleZoomSettingsObservedEvent(
new CustomEvent('advanced-camera-card:zoom:change', {
detail: {
pan: { x: 1, y: 2 },
zoom: 3,
isDefault: true,
unzoomed: true,
},
}),
viewManager,
'target',
);
expect(viewManager.setViewByParameters).toBeCalledWith(
expect.objectContaining({
modifiers: [expect.any(MergeContextViewModifier)],
}),
);
expect(MergeContextViewModifier).toBeCalledWith({
zoom: {
target: {
observed: { pan: { x: 1, y: 2 }, zoom: 3, isDefault: true, unzoomed: true },
requested: null,
},
},
},
});
});
});