diff --git a/web/src/components/__tests__/ViewOption.test.jsx b/web/src/components/__tests__/ViewOption.test.jsx
new file mode 100644
index 000000000..5592aff41
--- /dev/null
+++ b/web/src/components/__tests__/ViewOption.test.jsx
@@ -0,0 +1,71 @@
+import { h } from 'preact';
+import { render, screen, waitFor } from '@testing-library/preact';
+import { set as setData } from 'idb-keyval';
+import ViewOption from '../ViewOption';
+import { ViewModeProvider } from '../../context';
+import { ViewModeTypes } from '../ViewOptionEnum';
+import * as WS from '../../api/ws';
+
+describe('ViewOption', () => {
+ beforeEach(() => {
+ vi.spyOn(WS, 'WsProvider').mockImplementation(({ children }) => children);
+ });
+
+ test('make sure children are visible with same modes', async () => {
+ const maxViewMode = (Object.keys(ViewModeTypes).filter(isNaN).length-1);
+ const maxViewModeHR = ViewModeTypes[maxViewMode];
+ setData('view-mode', maxViewMode);
+
+ render(
+
+
+ stuff
+
+
+ );
+
+ const el = await screen.findByTestId('children');
+ expect(el).toBeInTheDocument();
+ });
+
+ test('make sure children are visible with max viewmode, and a small requiredmode', async () => {
+ const maxViewMode = (Object.keys(ViewModeTypes).filter(isNaN).length-1);
+ const lowViewModeHR = ViewModeTypes[1];
+ setData('view-mode', maxViewMode);
+
+ render(
+
+
+ stuff
+
+
+ );
+
+ const el = await screen.findByTestId('children');
+ expect(el).toBeInTheDocument();
+ });
+
+ test('make sure children are hidden, due to failed requiredmode', async () => {
+ const maxViewMode = (Object.keys(ViewModeTypes).filter(isNaN).length-1);
+ const maxViewModeHR = ViewModeTypes[maxViewMode];
+ setData('view-mode', '0');
+
+ render(
+
+
+ stuff
+
+ bugfix
+
+ );
+
+ //without this, the test will always pass, even if setData('view-mode', '2') ... really strange behavior
+ await screen.findByText('bugfix');
+
+ await waitFor(() => {
+ expect(screen.queryByText('stuff')).not.toBeInTheDocument()
+ }, { timeout: 100 });
+
+ });
+
+});
\ No newline at end of file
diff --git a/web/src/context/__tests__/index.test.jsx b/web/src/context/__tests__/index.test.jsx
index a02383a16..3c13c2db5 100644
--- a/web/src/context/__tests__/index.test.jsx
+++ b/web/src/context/__tests__/index.test.jsx
@@ -1,6 +1,7 @@
import { h } from 'preact';
-import { set as setData } from 'idb-keyval';
-import { DarkModeProvider, useDarkMode, usePersistence } from '..';
+import { set as setData, get as getData } from 'idb-keyval';
+import { DarkModeProvider, useDarkMode, usePersistence, ViewModeProvider, useViewMode } from '..';
+import { ViewModeTypes } from '../../components/ViewOptionEnum'
import { fireEvent, render, screen } from 'testing-library';
import { useCallback } from 'preact/hooks';
import * as WS from '../../api/ws';
@@ -195,3 +196,79 @@ describe('usePersistence', () => {
`);
});
});
+
+function ViewModeChecker() {
+ const { currentViewMode } = useViewMode();
+ return
{currentViewMode}
;
+}
+
+describe('ViewMode', () => {
+ beforeEach(() => {
+ vi.spyOn(WS, 'WsProvider').mockImplementation(({ children }) => children);
+ });
+
+ test('uses admin mode (max of enum) due to invalid config', async () => {
+ setData('view-mode', null);
+
+ render(
+
+
+
+ );
+
+ const maxViewMode = (Object.keys(ViewModeTypes).filter(isNaN).length-1);
+ const el = await screen.findByTestId(maxViewMode);
+ expect(el).toBeInTheDocument();
+ });
+
+ Object.keys(ViewModeTypes).filter((v) => !isNaN(Number(v))).map(key =>
+ test(`uses a viewmode option that is stored in idb - ${ViewModeTypes[key]}`, async () => {
+ setData('view-mode', key);
+
+ render(
+
+
+
+ );
+
+ const el = await screen.findByTestId(key);
+ expect(el).toBeInTheDocument();
+ })
+ )
+
+ test('update viewmode live, using setViewMode from context and verify idb save', async () => {
+ setData('view-mode', null);
+
+ function Updater() {
+ const { setViewMode } = useViewMode();
+ const handleClick = useCallback((value) => {
+ setViewMode(value.button.toString());
+ }, [setViewMode]);
+ return click me
;
+ }
+
+ render(
+
+
+
+
+ );
+
+ const button = await screen.findByText('click me');
+ const maxViewMode = (Object.keys(ViewModeTypes).filter(isNaN).length-1);
+
+ fireEvent.click(button, {button: '0'});
+ const minmode = await screen.findByTestId('0');
+ expect(minmode).toBeInTheDocument();
+
+ const minmodeidb = await getData('view-mode');
+ expect(minmodeidb).toEqual('0')
+
+ fireEvent.click(button, {button: maxViewMode});
+ const maxmode = await screen.findByTestId(maxViewMode);
+ expect(maxmode).toBeInTheDocument();
+
+ const maxmodeidb = await getData('view-mode');
+ expect(maxmodeidb).toEqual(maxViewMode.toString());
+ });
+});
\ No newline at end of file