mirror of
https://github.com/callumalpass/tasknotes.git
synced 2026-07-22 12:50:26 +00:00
- Add HierarchicalGroupingService sorting tests * Test "No <field>" positioning for ascending and descending order * Verify type-aware sorting behavior for user fields * Validate subgroup key ordering consistency - Add FilterBar subgroup menu integration tests * Test subgroup header and options in sort/group context menu * Verify subgroup reset behavior when primary group changes * Use dependency injection approach for reliable test execution - Enhance test infrastructure for subgroup testing * Implement direct method testing instead of DOM manipulation * Add mock resolver functions for user field value resolution * Create reusable test helpers for subgroup scenarios Provides robust test coverage for subgroup sorting logic, menu integration, and cross-view consistency to ensure reliable hierarchical grouping behavior.
87 lines
3.8 KiB
TypeScript
87 lines
3.8 KiB
TypeScript
import { GroupingUtils } from '../../src/utils/GroupingUtils';
|
|
|
|
// Minimal mock of plugin view state manager used by GroupingUtils
|
|
const createMockPlugin = () => {
|
|
let prefs: any = {
|
|
taskList: { collapsedGroups: {} },
|
|
agenda: { collapsedGroups: {} },
|
|
};
|
|
return {
|
|
viewStateManager: {
|
|
getViewPreferences: jest.fn().mockImplementation((viewType: string) => {
|
|
if (viewType === 'agenda') return prefs.agenda;
|
|
return prefs.taskList;
|
|
}),
|
|
setViewPreferences: jest.fn().mockImplementation((viewType: string, next: any) => {
|
|
if (viewType === 'agenda') prefs.agenda = next; else prefs.taskList = next;
|
|
}),
|
|
},
|
|
} as any;
|
|
};
|
|
|
|
describe('GroupingUtils - subgroup collapsed state helpers', () => {
|
|
const viewType = 'task-list';
|
|
const subgroupKey = 'priority';
|
|
const primary = 'Open';
|
|
const subgroupA = 'high';
|
|
const subgroupB = 'low';
|
|
|
|
test('isSubgroupCollapsed defaults to false when no state', () => {
|
|
const plugin = createMockPlugin();
|
|
const collapsed = GroupingUtils.isSubgroupCollapsed(viewType, subgroupKey, primary, subgroupA, plugin);
|
|
expect(collapsed).toBe(false);
|
|
});
|
|
|
|
test('setSubgroupCollapsed sets nested state and isSubgroupCollapsed reflects it', () => {
|
|
const plugin = createMockPlugin();
|
|
|
|
GroupingUtils.setSubgroupCollapsed(viewType, subgroupKey, primary, subgroupA, true, plugin);
|
|
|
|
expect(plugin.viewStateManager.setViewPreferences).toHaveBeenCalled();
|
|
|
|
const collapsed = GroupingUtils.isSubgroupCollapsed(viewType, subgroupKey, primary, subgroupA, plugin);
|
|
expect(collapsed).toBe(true);
|
|
|
|
// Toggling back to expanded
|
|
GroupingUtils.setSubgroupCollapsed(viewType, subgroupKey, primary, subgroupA, false, plugin);
|
|
const expandedNow = GroupingUtils.isSubgroupCollapsed(viewType, subgroupKey, primary, subgroupA, plugin);
|
|
expect(expandedNow).toBe(false);
|
|
});
|
|
|
|
test('expandAllSubgroups and collapseAllSubgroups within a primary group', () => {
|
|
const plugin = createMockPlugin();
|
|
|
|
// Collapse two subgroups explicitly
|
|
GroupingUtils.setSubgroupCollapsed(viewType, subgroupKey, primary, subgroupA, true, plugin);
|
|
GroupingUtils.setSubgroupCollapsed(viewType, subgroupKey, primary, subgroupB, true, plugin);
|
|
|
|
// Expand all within primary
|
|
GroupingUtils.expandAllSubgroups(viewType, primary, subgroupKey, plugin);
|
|
expect(GroupingUtils.isSubgroupCollapsed(viewType, subgroupKey, primary, subgroupA, plugin)).toBe(false);
|
|
expect(GroupingUtils.isSubgroupCollapsed(viewType, subgroupKey, primary, subgroupB, plugin)).toBe(false);
|
|
|
|
// Collapse a given set
|
|
GroupingUtils.collapseAllSubgroups(viewType, primary, subgroupKey, [subgroupA, subgroupB], plugin);
|
|
expect(GroupingUtils.isSubgroupCollapsed(viewType, subgroupKey, primary, subgroupA, plugin)).toBe(true);
|
|
expect(GroupingUtils.isSubgroupCollapsed(viewType, subgroupKey, primary, subgroupB, plugin)).toBe(true);
|
|
});
|
|
|
|
test('global expand/collapse subgroup helpers', () => {
|
|
const plugin = createMockPlugin();
|
|
|
|
// Collapse various primaries/subgroups via global API
|
|
GroupingUtils.collapseAllSubgroupsGlobally(viewType, subgroupKey, [
|
|
{ primaryGroup: primary, subgroupName: subgroupA },
|
|
{ primaryGroup: 'Done', subgroupName: 'blocked' },
|
|
], plugin);
|
|
|
|
expect(GroupingUtils.isSubgroupCollapsed(viewType, subgroupKey, primary, subgroupA, plugin)).toBe(true);
|
|
expect(GroupingUtils.isSubgroupCollapsed(viewType, subgroupKey, 'Done', 'blocked', plugin)).toBe(true);
|
|
|
|
// Expand all globally for this subgroupKey
|
|
GroupingUtils.expandAllSubgroupsGlobally(viewType, subgroupKey, plugin);
|
|
expect(GroupingUtils.isSubgroupCollapsed(viewType, subgroupKey, primary, subgroupA, plugin)).toBe(false);
|
|
expect(GroupingUtils.isSubgroupCollapsed(viewType, subgroupKey, 'Done', 'blocked', plugin)).toBe(false);
|
|
});
|
|
});
|
|
|