From de7e8443c8178c2c737d8c5c5a735832c5a39635 Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Mon, 16 Feb 2026 17:22:36 -0500 Subject: [PATCH] Making the Debug Menu not always shown as easily. --- src/lib/ae_utils/perm_checks.test.ts | 56 ++++++++++++++++ src/routes/+layout.svelte | 6 +- .../journals/journal_entry_visibility.test.ts | 64 +++++++++++++++++++ 3 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 src/lib/ae_utils/perm_checks.test.ts create mode 100644 src/routes/journals/journal_entry_visibility.test.ts diff --git a/src/lib/ae_utils/perm_checks.test.ts b/src/lib/ae_utils/perm_checks.test.ts new file mode 100644 index 00000000..f90bdc4f --- /dev/null +++ b/src/lib/ae_utils/perm_checks.test.ts @@ -0,0 +1,56 @@ +import { describe, it, expect } from 'vitest'; +import { compare_access_levels, process_permission_checks, access_level_order } from './ae_utils__perm_checks'; + +describe('Permission Hierarchy Tests', () => { + describe('compare_access_levels', () => { + it('should correctly identify upgrades', () => { + // High to Low should return 1 (Upgrade if target is high, current is low) + expect(compare_access_levels('super', 'manager')).toBe(1); + expect(compare_access_levels('manager', 'administrator')).toBe(1); + expect(compare_access_levels('administrator', 'trusted')).toBe(1); + expect(compare_access_levels('trusted', 'authenticated')).toBe(1); + expect(compare_access_levels('authenticated', 'anonymous')).toBe(1); + }); + + it('should correctly identify downgrades', () => { + // Low to High should return -1 + expect(compare_access_levels('manager', 'super')).toBe(-1); + expect(compare_access_levels('anonymous', 'authenticated')).toBe(-1); + }); + + it('should return 0 for equal levels', () => { + expect(compare_access_levels('manager', 'manager')).toBe(0); + expect(compare_access_levels('anonymous', 'anonymous')).toBe(0); + }); + + it('should handle null/empty as anonymous', () => { + expect(compare_access_levels('trusted', '')).toBe(1); + expect(compare_access_levels(null as any, 'authenticated')).toBe(-1); + }); + }); + + describe('process_permission_checks hierarchy', () => { + it('manager should imply administrator and trusted', () => { + const perms = process_permission_checks('manager'); + expect(perms.manager_access).toBe(true); + expect(perms.administrator_access).toBe(true); + expect(perms.trusted_access).toBe(true); + expect(perms.authenticated_access).toBe(true); + expect(perms.super_access).toBe(false); + }); + + it('administrator should imply trusted', () => { + const perms = process_permission_checks('administrator'); + expect(perms.administrator_access).toBe(true); + expect(perms.trusted_access).toBe(true); + expect(perms.manager_access).toBe(false); + }); + + it('anonymous should imply nothing but anonymous_access', () => { + const perms = process_permission_checks('anonymous'); + expect(perms.anonymous_access).toBe(true); + expect(perms.authenticated_access).toBe(false); + expect(perms.trusted_access).toBe(false); + }); + }); +}); diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index e3e45067..8ea0a959 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -257,5 +257,9 @@ {#if browser && (!$ae_loc?.iframe || $ae_loc?.trusted_access)} - + + + {#if $ae_loc.edit_mode || $ae_loc.debug_menu.expand} + + {/if} {/if} diff --git a/src/routes/journals/journal_entry_visibility.test.ts b/src/routes/journals/journal_entry_visibility.test.ts new file mode 100644 index 00000000..14be4fe0 --- /dev/null +++ b/src/routes/journals/journal_entry_visibility.test.ts @@ -0,0 +1,64 @@ +import { describe, it, expect } from 'vitest'; + +// Simulating the filter logic from ae_comp__journal_entry_obj_li.svelte +function filterEntries(list: any[], ae_loc: any) { + if (!list) return null; + return list.filter((item: any) => { + if (!item) return false; + + const is_hidden = item.hide === true || item.hide === 1; + const is_disabled = item.enable === false || item.enable === 0; + + // Standard Visibility: Filter out hidden/disabled if not in Edit Mode + if (!ae_loc.edit_mode) { + return !is_hidden && !is_disabled; + } + + // Edit Mode Gating: + // - To see Hidden: Must have Trusted Access or higher + if (is_hidden && !ae_loc.trusted_access) return false; + + // - To see Disabled: Must have Administrator Access or higher + if (is_disabled && !ae_loc.administrator_access) return false; + + return true; + }); +} + +describe('Journal Entry Visibility Filtering', () => { + const mockEntries = [ + { id: '1', name: 'Normal Entry', hide: false, enable: true }, + { id: '2', name: 'Hidden Entry', hide: true, enable: true }, + { id: '3', name: 'Disabled Entry', hide: false, enable: false }, + { id: '4', name: 'Hidden & Disabled', hide: true, enable: false }, + ]; + + it('should show only normal entries when Edit Mode is OFF (Manager)', () => { + const ae_loc = { edit_mode: false, trusted_access: true, administrator_access: true }; + const result = filterEntries(mockEntries, ae_loc); + expect(result?.length).toBe(1); + expect(result?.[0].id).toBe('1'); + }); + + it('should show hidden entries to Trusted users when Edit Mode is ON', () => { + const ae_loc = { edit_mode: true, trusted_access: true, administrator_access: false }; + const result = filterEntries(mockEntries, ae_loc); + // Should see Normal (1) and Hidden (2). Should NOT see Disabled (3, 4) + expect(result?.length).toBe(2); + expect(result?.map(r => r.id)).toContain('1'); + expect(result?.map(r => r.id)).toContain('2'); + }); + + it('should show everything to Administrators when Edit Mode is ON', () => { + const ae_loc = { edit_mode: true, trusted_access: true, administrator_access: true }; + const result = filterEntries(mockEntries, ae_loc); + expect(result?.length).toBe(4); + }); + + it('should hide everything sensitive to Public users even if Edit Mode is ON (Safety Check)', () => { + const ae_loc = { edit_mode: true, trusted_access: false, administrator_access: false }; + const result = filterEntries(mockEntries, ae_loc); + expect(result?.length).toBe(1); + expect(result?.[0].id).toBe('1'); + }); +});