fix: Remove the unnecessary item limit from folder media (#2688)

- Fixed: #2573
This commit is contained in:
Dermot Duffy
2026-08-17 21:49:11 -07:00
committed by GitHub
parent 858c5d0610
commit 84b90bcc7e
12 changed files with 41 additions and 146 deletions
@@ -238,12 +238,11 @@ describe('HAFoldersEngine', () => {
expect(await engine.expandFolder(createHASS(), query)).toBeNull();
});
it('should early exit when limit is reached', async () => {
it('should return every matching media item without a cap', async () => {
const query: FolderQuery = {
source: QuerySource.Folder,
folder: { type: 'ha', id: 'test' },
path: [{ ha: { id: 'media-source://id' } }],
limit: 1,
};
vi.mocked(homeAssistantWSRequest).mockResolvedValueOnce(
@@ -266,8 +265,7 @@ describe('HAFoldersEngine', () => {
const engine = new HAFoldersEngine(templateManager);
const results = await engine.expandFolder(createHASS(), query);
// Even though there are 2 children, the limit of 1 should trigger earlyExit.
expect(results?.length).toBe(1);
expect(results?.length).toBe(2);
});
// See additional matcher testing in media-matcher.test.ts .
-54
View File
@@ -157,35 +157,6 @@ describe('navigateUp', () => {
path: [{ ha: { id: 'one' } }, { ha: { id: 'two' } }],
});
});
it('should go up in the folder hierarchy with limit', () => {
const api = createCardAPI();
const folder = createFolder();
const view = createView({
query: createFolderQuery(folder, [{ ha: { id: 'one' } }, { ha: { id: 'two' } }]),
});
vi.mocked(api.getViewManager().getView).mockReturnValue(view);
const epoch: ViewManagerEpoch = {
manager: api.getViewManager(),
};
const builder = new UnifiedQueryBuilder(
mock<CameraManager>(),
mock<FoldersManager>(),
);
const options: FolderNavigationParamaters = {
builder,
viewManagerEpoch: epoch,
limit: 50,
};
navigateUp(options);
const query = vi.mocked(api.getViewManager().setViewByParametersWithExistingQuery)
.mock.calls[0][0]?.params?.query as UnifiedQuery;
expect(query.getNodes()[0].limit).toBe(50);
});
});
describe('navigateToFolder', () => {
@@ -241,31 +212,6 @@ describe('navigateToFolder', () => {
expect(nodes?.[0]).toHaveProperty('path');
expect((nodes?.[0] as { path: readonly unknown[] }).path).toHaveLength(2);
});
it('should navigate into folder with limit', () => {
const api = createCardAPI();
const folder = createFolder();
const epoch: ViewManagerEpoch = {
manager: api.getViewManager(),
};
const builder = new UnifiedQueryBuilder(
mock<CameraManager>(),
mock<FoldersManager>(),
);
const options: FolderNavigationParamaters = {
builder,
viewManagerEpoch: epoch,
limit: 100,
};
const item = new ViewFolder(folder, [{ ha: { id: 'root' } }]);
navigateToFolder(item, options);
const query = vi.mocked(api.getViewManager().setViewByParametersWithExistingQuery)
.mock.calls[0][0]?.params?.query;
expect(query?.getNodes()[0].limit).toBe(100);
});
});
describe('getUpFolderItem', () => {
+25 -36
View File
@@ -499,22 +499,7 @@ describe('UnifiedQueryBuilder', () => {
});
});
it('should apply limit option', () => {
const { cameraManager, foldersManager } = createMocks();
const builder = new UnifiedQueryBuilder(cameraManager, foldersManager);
const folder = createFolder({ id: 'folder1', title: 'Test' });
const path: [FolderPathComponent] = [{ ha: { id: 'Root' } }];
const query = builder.buildFolderQueryWithPath(folder, path, {
limit: 10,
});
expect(query.getNodes()[0]).toMatchObject({
source: QuerySource.Folder,
limit: 10,
});
});
it('should not include limit when not provided', () => {
it('should not limit the number of items', () => {
const { cameraManager, foldersManager } = createMocks();
const builder = new UnifiedQueryBuilder(cameraManager, foldersManager);
const folder = createFolder({ id: 'folder1', title: 'Test' });
@@ -568,26 +553,6 @@ describe('UnifiedQueryBuilder', () => {
expect(query).toBeNull();
});
it('should apply limit option', () => {
const { cameraManager, foldersManager } = createMocks();
const folder = createFolder({ id: 'folder1', title: 'Test' });
const path: [FolderPathComponent] = [{ ha: { id: 'Root' } }];
foldersManager.getFolder.mockReturnValue(folder);
foldersManager.getDefaultQueryParameters.mockReturnValue(
createFolderQueryParams(folder, path),
);
const builder = new UnifiedQueryBuilder(cameraManager, foldersManager);
const query = builder.buildDefaultFolderQuery('folder1', { limit: 20 });
assert(query);
expect(query.getNodes()[0]).toMatchObject({
source: QuerySource.Folder,
limit: 20,
});
});
it('should use default folder when no ID provided', () => {
const { cameraManager, foldersManager } = createMocks();
foldersManager.getFolder.mockReturnValue(null);
@@ -1010,6 +975,30 @@ describe('UnifiedQueryBuilder', () => {
});
});
it('should not limit a folder query built for folder media type', () => {
const { cameraManager, foldersManager, store } = createMocks();
store.getCameraIDs.mockReturnValue(new Set(['camera.office']));
store.getCameraConfig.mockReturnValue(
createCameraConfig({ media: { type: 'folder', folders: ['folder1'] } }),
);
cameraManager.getCameraCapabilities.mockReturnValue(createCapabilities());
const folder = createFolder({ id: 'folder1', title: 'Test Folder' });
const path: [FolderPathComponent] = [{ ha: { id: 'Root' } }];
foldersManager.getFolder.mockReturnValue(folder);
foldersManager.getDefaultQueryParameters.mockReturnValue(
createFolderQueryParams(folder, path),
);
const builder = new UnifiedQueryBuilder(cameraManager, foldersManager);
const query = builder.buildDefaultCameraQuery(undefined, { limit: 50 });
assert(query);
expect(query.getNodes()[0]).not.toHaveProperty('limit');
});
it('should build default folder query for folder media type without specific folders', () => {
const { cameraManager, foldersManager, store } = createMocks();
store.getCameraIDs.mockReturnValue(new Set(['camera.office']));