@equinor/fusion-framework-plugin-context-navigation 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/ContextNavigationConfigurator.js +178 -0
- package/dist/esm/ContextNavigationConfigurator.js.map +1 -0
- package/dist/esm/__tests__/active-app-navigation-events.test.js +115 -0
- package/dist/esm/__tests__/active-app-navigation-events.test.js.map +1 -0
- package/dist/esm/__tests__/apply-navigation.test.js +152 -0
- package/dist/esm/__tests__/apply-navigation.test.js.map +1 -0
- package/dist/esm/__tests__/enable.test.js +91 -0
- package/dist/esm/__tests__/enable.test.js.map +1 -0
- package/dist/esm/__tests__/guard-handlers.test.js +82 -0
- package/dist/esm/__tests__/guard-handlers.test.js.map +1 -0
- package/dist/esm/__tests__/plugin.test.js +483 -0
- package/dist/esm/__tests__/plugin.test.js.map +1 -0
- package/dist/esm/__tests__/reconcile.test.js +164 -0
- package/dist/esm/__tests__/reconcile.test.js.map +1 -0
- package/dist/esm/adapters/create-path-adapter.js +96 -0
- package/dist/esm/adapters/create-path-adapter.js.map +1 -0
- package/dist/esm/adapters/create-query-adapter.js +83 -0
- package/dist/esm/adapters/create-query-adapter.js.map +1 -0
- package/dist/esm/adapters/custom-adapter/create-custom-adapter.js +116 -0
- package/dist/esm/adapters/custom-adapter/create-custom-adapter.js.map +1 -0
- package/dist/esm/adapters/custom-adapter/index.js +5 -0
- package/dist/esm/adapters/custom-adapter/index.js.map +1 -0
- package/dist/esm/adapters/custom-adapter/normalize-string-result.js +37 -0
- package/dist/esm/adapters/custom-adapter/normalize-string-result.js.map +1 -0
- package/dist/esm/adapters/custom-adapter/to-app-relative.js +34 -0
- package/dist/esm/adapters/custom-adapter/to-app-relative.js.map +1 -0
- package/dist/esm/adapters/custom-adapter/to-full-path.js +28 -0
- package/dist/esm/adapters/custom-adapter/to-full-path.js.map +1 -0
- package/dist/esm/adapters/index.js +4 -0
- package/dist/esm/adapters/index.js.map +1 -0
- package/dist/esm/adapters/types.js +2 -0
- package/dist/esm/adapters/types.js.map +1 -0
- package/dist/esm/apply-navigation.js +102 -0
- package/dist/esm/apply-navigation.js.map +1 -0
- package/dist/esm/constants/context-query-param-key.js +8 -0
- package/dist/esm/constants/context-query-param-key.js.map +1 -0
- package/dist/esm/constants/index.js +3 -0
- package/dist/esm/constants/index.js.map +1 -0
- package/dist/esm/constants/uuid-pattern.js +8 -0
- package/dist/esm/constants/uuid-pattern.js.map +1 -0
- package/dist/esm/create-context-navigation-plugin.js +124 -0
- package/dist/esm/create-context-navigation-plugin.js.map +1 -0
- package/dist/esm/enable-context-navigation.js +40 -0
- package/dist/esm/enable-context-navigation.js.map +1 -0
- package/dist/esm/events.js +2 -0
- package/dist/esm/events.js.map +1 -0
- package/dist/esm/guard-handlers/consume-own-nav-token.js +29 -0
- package/dist/esm/guard-handlers/consume-own-nav-token.js.map +1 -0
- package/dist/esm/guard-handlers/guard-tick-deps.js +2 -0
- package/dist/esm/guard-handlers/guard-tick-deps.js.map +1 -0
- package/dist/esm/guard-handlers/guard-tick-payload.js +2 -0
- package/dist/esm/guard-handlers/guard-tick-payload.js.map +1 -0
- package/dist/esm/guard-handlers/handle-push-mode-guard.js +44 -0
- package/dist/esm/guard-handlers/handle-push-mode-guard.js.map +1 -0
- package/dist/esm/guard-handlers/handle-replace-mode-guard.js +40 -0
- package/dist/esm/guard-handlers/handle-replace-mode-guard.js.map +1 -0
- package/dist/esm/guard-handlers/index.js +5 -0
- package/dist/esm/guard-handlers/index.js.map +1 -0
- package/dist/esm/guard-handlers/is-in-app-scope.js +19 -0
- package/dist/esm/guard-handlers/is-in-app-scope.js.map +1 -0
- package/dist/esm/helpers/get-current-url.js +11 -0
- package/dist/esm/helpers/get-current-url.js.map +1 -0
- package/dist/esm/helpers/index.js +6 -0
- package/dist/esm/helpers/index.js.map +1 -0
- package/dist/esm/helpers/normalize-path-from-url.js +14 -0
- package/dist/esm/helpers/normalize-path-from-url.js.map +1 -0
- package/dist/esm/helpers/normalize-path.js +30 -0
- package/dist/esm/helpers/normalize-path.js.map +1 -0
- package/dist/esm/helpers/resolve-adapter.js +23 -0
- package/dist/esm/helpers/resolve-adapter.js.map +1 -0
- package/dist/esm/helpers/strip-query-params.js +14 -0
- package/dist/esm/helpers/strip-query-params.js.map +1 -0
- package/dist/esm/index.js +13 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/operators/active-app-navigation-events.js +52 -0
- package/dist/esm/operators/active-app-navigation-events.js.map +1 -0
- package/dist/esm/reconcile.js +76 -0
- package/dist/esm/reconcile.js.map +1 -0
- package/dist/esm/sources/app-first-source.js +41 -0
- package/dist/esm/sources/app-first-source.js.map +1 -0
- package/dist/esm/sources/context-first-source.js +47 -0
- package/dist/esm/sources/context-first-source.js.map +1 -0
- package/dist/esm/sources/index.js +4 -0
- package/dist/esm/sources/index.js.map +1 -0
- package/dist/esm/sources/types.js +16 -0
- package/dist/esm/sources/types.js.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/utils/has-custom-context-generators.js +14 -0
- package/dist/esm/utils/has-custom-context-generators.js.map +1 -0
- package/dist/esm/utils/legacy-app-navigation-fix.js +45 -0
- package/dist/esm/utils/legacy-app-navigation-fix.js.map +1 -0
- package/dist/esm/utils/resolve-context-from-url.js +37 -0
- package/dist/esm/utils/resolve-context-from-url.js.map +1 -0
- package/dist/esm/utils/url/build-app-route.js +20 -0
- package/dist/esm/utils/url/build-app-route.js.map +1 -0
- package/dist/esm/utils/url/build-context-url-for-strategy.js +43 -0
- package/dist/esm/utils/url/build-context-url-for-strategy.js.map +1 -0
- package/dist/esm/utils/url/index.js +7 -0
- package/dist/esm/utils/url/index.js.map +1 -0
- package/dist/esm/utils/url/parse-app-route.js +47 -0
- package/dist/esm/utils/url/parse-app-route.js.map +1 -0
- package/dist/esm/utils/url/resolve-context-id-from-url.js +29 -0
- package/dist/esm/utils/url/resolve-context-id-from-url.js.map +1 -0
- package/dist/esm/utils/url/strip-context-query-param.js +20 -0
- package/dist/esm/utils/url/strip-context-query-param.js.map +1 -0
- package/dist/esm/version.js +3 -0
- package/dist/esm/version.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/ContextNavigationConfigurator.d.ts +125 -0
- package/dist/types/ContextNavigationConfigurator.d.ts.map +1 -0
- package/dist/types/__tests__/active-app-navigation-events.test.d.ts +2 -0
- package/dist/types/__tests__/active-app-navigation-events.test.d.ts.map +1 -0
- package/dist/types/__tests__/apply-navigation.test.d.ts +2 -0
- package/dist/types/__tests__/apply-navigation.test.d.ts.map +1 -0
- package/dist/types/__tests__/enable.test.d.ts +2 -0
- package/dist/types/__tests__/enable.test.d.ts.map +1 -0
- package/dist/types/__tests__/guard-handlers.test.d.ts +2 -0
- package/dist/types/__tests__/guard-handlers.test.d.ts.map +1 -0
- package/dist/types/__tests__/plugin.test.d.ts +2 -0
- package/dist/types/__tests__/plugin.test.d.ts.map +1 -0
- package/dist/types/__tests__/reconcile.test.d.ts +2 -0
- package/dist/types/__tests__/reconcile.test.d.ts.map +1 -0
- package/dist/types/adapters/create-path-adapter.d.ts +27 -0
- package/dist/types/adapters/create-path-adapter.d.ts.map +1 -0
- package/dist/types/adapters/create-query-adapter.d.ts +34 -0
- package/dist/types/adapters/create-query-adapter.d.ts.map +1 -0
- package/dist/types/adapters/custom-adapter/create-custom-adapter.d.ts +29 -0
- package/dist/types/adapters/custom-adapter/create-custom-adapter.d.ts.map +1 -0
- package/dist/types/adapters/custom-adapter/index.d.ts +5 -0
- package/dist/types/adapters/custom-adapter/index.d.ts.map +1 -0
- package/dist/types/adapters/custom-adapter/normalize-string-result.d.ts +21 -0
- package/dist/types/adapters/custom-adapter/normalize-string-result.d.ts.map +1 -0
- package/dist/types/adapters/custom-adapter/to-app-relative.d.ts +25 -0
- package/dist/types/adapters/custom-adapter/to-app-relative.d.ts.map +1 -0
- package/dist/types/adapters/custom-adapter/to-full-path.d.ts +22 -0
- package/dist/types/adapters/custom-adapter/to-full-path.d.ts.map +1 -0
- package/dist/types/adapters/index.d.ts +5 -0
- package/dist/types/adapters/index.d.ts.map +1 -0
- package/dist/types/adapters/types.d.ts +73 -0
- package/dist/types/adapters/types.d.ts.map +1 -0
- package/dist/types/apply-navigation.d.ts +88 -0
- package/dist/types/apply-navigation.d.ts.map +1 -0
- package/dist/types/constants/context-query-param-key.d.ts +8 -0
- package/dist/types/constants/context-query-param-key.d.ts.map +1 -0
- package/dist/types/constants/index.d.ts +3 -0
- package/dist/types/constants/index.d.ts.map +1 -0
- package/dist/types/constants/uuid-pattern.d.ts +8 -0
- package/dist/types/constants/uuid-pattern.d.ts.map +1 -0
- package/dist/types/create-context-navigation-plugin.d.ts +58 -0
- package/dist/types/create-context-navigation-plugin.d.ts.map +1 -0
- package/dist/types/enable-context-navigation.d.ts +21 -0
- package/dist/types/enable-context-navigation.d.ts.map +1 -0
- package/dist/types/events.d.ts +16 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/guard-handlers/consume-own-nav-token.d.ts +21 -0
- package/dist/types/guard-handlers/consume-own-nav-token.d.ts.map +1 -0
- package/dist/types/guard-handlers/guard-tick-deps.d.ts +20 -0
- package/dist/types/guard-handlers/guard-tick-deps.d.ts.map +1 -0
- package/dist/types/guard-handlers/guard-tick-payload.d.ts +15 -0
- package/dist/types/guard-handlers/guard-tick-payload.d.ts.map +1 -0
- package/dist/types/guard-handlers/handle-push-mode-guard.d.ts +24 -0
- package/dist/types/guard-handlers/handle-push-mode-guard.d.ts.map +1 -0
- package/dist/types/guard-handlers/handle-replace-mode-guard.d.ts +19 -0
- package/dist/types/guard-handlers/handle-replace-mode-guard.d.ts.map +1 -0
- package/dist/types/guard-handlers/index.d.ts +7 -0
- package/dist/types/guard-handlers/index.d.ts.map +1 -0
- package/dist/types/guard-handlers/is-in-app-scope.d.ts +15 -0
- package/dist/types/guard-handlers/is-in-app-scope.d.ts.map +1 -0
- package/dist/types/helpers/get-current-url.d.ts +10 -0
- package/dist/types/helpers/get-current-url.d.ts.map +1 -0
- package/dist/types/helpers/index.d.ts +6 -0
- package/dist/types/helpers/index.d.ts.map +1 -0
- package/dist/types/helpers/normalize-path-from-url.d.ts +11 -0
- package/dist/types/helpers/normalize-path-from-url.d.ts.map +1 -0
- package/dist/types/helpers/normalize-path.d.ts +14 -0
- package/dist/types/helpers/normalize-path.d.ts.map +1 -0
- package/dist/types/helpers/resolve-adapter.d.ts +14 -0
- package/dist/types/helpers/resolve-adapter.d.ts.map +1 -0
- package/dist/types/helpers/strip-query-params.d.ts +12 -0
- package/dist/types/helpers/strip-query-params.d.ts.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/operators/active-app-navigation-events.d.ts +47 -0
- package/dist/types/operators/active-app-navigation-events.d.ts.map +1 -0
- package/dist/types/reconcile.d.ts +43 -0
- package/dist/types/reconcile.d.ts.map +1 -0
- package/dist/types/sources/app-first-source.d.ts +14 -0
- package/dist/types/sources/app-first-source.d.ts.map +1 -0
- package/dist/types/sources/context-first-source.d.ts +15 -0
- package/dist/types/sources/context-first-source.d.ts.map +1 -0
- package/dist/types/sources/index.d.ts +4 -0
- package/dist/types/sources/index.d.ts.map +1 -0
- package/dist/types/sources/types.d.ts +61 -0
- package/dist/types/sources/types.d.ts.map +1 -0
- package/dist/types/types.d.ts +126 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/utils/has-custom-context-generators.d.ts +13 -0
- package/dist/types/utils/has-custom-context-generators.d.ts.map +1 -0
- package/dist/types/utils/legacy-app-navigation-fix.d.ts +33 -0
- package/dist/types/utils/legacy-app-navigation-fix.d.ts.map +1 -0
- package/dist/types/utils/resolve-context-from-url.d.ts +20 -0
- package/dist/types/utils/resolve-context-from-url.d.ts.map +1 -0
- package/dist/types/utils/url/build-app-route.d.ts +11 -0
- package/dist/types/utils/url/build-app-route.d.ts.map +1 -0
- package/dist/types/utils/url/build-context-url-for-strategy.d.ts +14 -0
- package/dist/types/utils/url/build-context-url-for-strategy.d.ts.map +1 -0
- package/dist/types/utils/url/index.d.ts +8 -0
- package/dist/types/utils/url/index.d.ts.map +1 -0
- package/dist/types/utils/url/parse-app-route.d.ts +20 -0
- package/dist/types/utils/url/parse-app-route.d.ts.map +1 -0
- package/dist/types/utils/url/resolve-context-id-from-url.d.ts +8 -0
- package/dist/types/utils/url/resolve-context-id-from-url.d.ts.map +1 -0
- package/dist/types/utils/url/strip-context-query-param.d.ts +12 -0
- package/dist/types/utils/url/strip-context-query-param.d.ts.map +1 -0
- package/dist/types/version.d.ts +2 -0
- package/dist/types/version.d.ts.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard-handlers.test.js","sourceRoot":"","sources":["../../../src/__tests__/guard-handlers.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,483 @@
|
|
|
1
|
+
import { BehaviorSubject, EMPTY, Subject } from 'rxjs';
|
|
2
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
3
|
+
import { createContextNavigationPlugin, } from '../create-context-navigation-plugin';
|
|
4
|
+
// ── Test Helpers ────────────────────────────────────────────────────────
|
|
5
|
+
function makeContext(id) {
|
|
6
|
+
// Test double — only id and title are read by the code under test
|
|
7
|
+
return { id, title: `Context ${id}` };
|
|
8
|
+
}
|
|
9
|
+
function makeAdapter(overrides = {}) {
|
|
10
|
+
return {
|
|
11
|
+
id: 'test-adapter',
|
|
12
|
+
canHandle: () => true,
|
|
13
|
+
encode: ({ context, currentURL }) => {
|
|
14
|
+
// Guard — adapter cannot encode without a context item
|
|
15
|
+
if (!context)
|
|
16
|
+
return null;
|
|
17
|
+
return new URL(`/apps/my-app/${context.id}${currentURL.search}`, currentURL.origin);
|
|
18
|
+
},
|
|
19
|
+
decode: (url) => {
|
|
20
|
+
const match = url.pathname.match(/\/apps\/my-app\/([^/]+)/);
|
|
21
|
+
return match?.[1] ?? null;
|
|
22
|
+
},
|
|
23
|
+
...overrides,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function createHarness(configOverrides = {}) {
|
|
27
|
+
const source$ = new Subject();
|
|
28
|
+
const navigationState$ = new BehaviorSubject({});
|
|
29
|
+
// Test double — only path, navigate, and state$ are accessed by the plugin under test
|
|
30
|
+
const navigation = {
|
|
31
|
+
path: { pathname: '/apps/my-app', search: '' },
|
|
32
|
+
navigate: vi.fn(),
|
|
33
|
+
state$: navigationState$,
|
|
34
|
+
};
|
|
35
|
+
// Test double — only dispatchEvent is called by the plugin under test
|
|
36
|
+
const event = {
|
|
37
|
+
dispatchEvent: vi.fn(async () => ({ canceled: false })),
|
|
38
|
+
};
|
|
39
|
+
// Test double — only currentContext$ and setCurrentContextByIdAsync are accessed
|
|
40
|
+
const context = {
|
|
41
|
+
currentContext$: EMPTY,
|
|
42
|
+
setCurrentContextByIdAsync: vi.fn(async () => undefined),
|
|
43
|
+
};
|
|
44
|
+
// Test double — only current$ is accessed by the plugin under test
|
|
45
|
+
const app = {
|
|
46
|
+
current$: EMPTY,
|
|
47
|
+
};
|
|
48
|
+
const config = {
|
|
49
|
+
portalName: 'TestPortal',
|
|
50
|
+
origin: 'https://example.com',
|
|
51
|
+
adapters: [makeAdapter()],
|
|
52
|
+
enableUrlGuard: false,
|
|
53
|
+
debug: false,
|
|
54
|
+
sourceFactory: () => source$,
|
|
55
|
+
navigationOptions: { replace: true },
|
|
56
|
+
...configOverrides,
|
|
57
|
+
};
|
|
58
|
+
const teardown = createContextNavigationPlugin({ app, navigation, context, event, config });
|
|
59
|
+
return { source$, navigation, event, context, app, config, teardown };
|
|
60
|
+
}
|
|
61
|
+
// ── Tests ───────────────────────────────────────────────────────────────
|
|
62
|
+
describe('createContextNavigationPlugin', () => {
|
|
63
|
+
let harness;
|
|
64
|
+
afterEach(() => {
|
|
65
|
+
harness?.teardown();
|
|
66
|
+
});
|
|
67
|
+
// ─── Adapter Resolution ───────────────────────────────────────────
|
|
68
|
+
describe('adapter resolution', () => {
|
|
69
|
+
it('selects the first adapter whose canHandle returns true', async () => {
|
|
70
|
+
const adapterA = makeAdapter({ id: 'adapter-a', canHandle: () => false });
|
|
71
|
+
const adapterB = makeAdapter({ id: 'adapter-b', canHandle: () => true });
|
|
72
|
+
harness = createHarness({ adapters: [adapterA, adapterB] });
|
|
73
|
+
// Test double — only the context property is accessed by the plugin under test
|
|
74
|
+
const appModules = { context: { currentContext: null } };
|
|
75
|
+
const ctx = makeContext('ctx-1');
|
|
76
|
+
harness.source$.next({ appKey: 'my-app', appModules, contextState: ctx });
|
|
77
|
+
await vi.waitFor(() => {
|
|
78
|
+
expect(harness.event.dispatchEvent).toHaveBeenCalledWith('onContextNavigationAdapterResolved', expect.objectContaining({
|
|
79
|
+
detail: { appKey: 'my-app', adapterId: 'adapter-b' },
|
|
80
|
+
}));
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
it('dispatches no-adapter skip when no adapter matches', () => {
|
|
84
|
+
const adapterA = makeAdapter({ id: 'never', canHandle: () => false });
|
|
85
|
+
harness = createHarness({ adapters: [adapterA] });
|
|
86
|
+
// Test double — only the context property is accessed by the plugin under test
|
|
87
|
+
const appModules = { context: { currentContext: null } };
|
|
88
|
+
harness.source$.next({ appKey: 'my-app', appModules, contextState: makeContext('x') });
|
|
89
|
+
expect(harness.event.dispatchEvent).toHaveBeenCalledWith('onContextNavigationSkipped', expect.objectContaining({
|
|
90
|
+
detail: { appKey: 'my-app', reason: 'no-adapter' },
|
|
91
|
+
}));
|
|
92
|
+
});
|
|
93
|
+
it('supports factory-style adapters', async () => {
|
|
94
|
+
const factoryAdapter = makeAdapter({ id: 'factory-based' });
|
|
95
|
+
const factory = vi.fn(() => factoryAdapter);
|
|
96
|
+
harness = createHarness({ adapters: [factory] });
|
|
97
|
+
// Test double — only the context property is accessed by the plugin under test
|
|
98
|
+
const appModules = { context: { currentContext: null } };
|
|
99
|
+
harness.source$.next({ appKey: 'my-app', appModules, contextState: makeContext('c1') });
|
|
100
|
+
await vi.waitFor(() => {
|
|
101
|
+
expect(factory).toHaveBeenCalledWith(expect.objectContaining({ appKey: 'my-app' }));
|
|
102
|
+
expect(harness.event.dispatchEvent).toHaveBeenCalledWith('onContextNavigationAdapterResolved', expect.objectContaining({ detail: { appKey: 'my-app', adapterId: 'factory-based' } }));
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
// ─── Skip Reasons ─────────────────────────────────────────────────
|
|
107
|
+
describe('skip reasons', () => {
|
|
108
|
+
it('skips with no-context when contextState is undefined', () => {
|
|
109
|
+
harness = createHarness();
|
|
110
|
+
// Test double — only the context property is accessed by the plugin under test
|
|
111
|
+
const appModules = { context: { currentContext: null } };
|
|
112
|
+
harness.source$.next({ appKey: 'my-app', appModules, contextState: undefined });
|
|
113
|
+
expect(harness.event.dispatchEvent).toHaveBeenCalledWith('onContextNavigationSkipped', expect.objectContaining({
|
|
114
|
+
detail: { appKey: 'my-app', reason: 'no-context' },
|
|
115
|
+
}));
|
|
116
|
+
});
|
|
117
|
+
it('skips with url-matches when target URL equals current URL', () => {
|
|
118
|
+
// Adapter encodes to /apps/my-app/<id>. Set current path to match.
|
|
119
|
+
harness = createHarness();
|
|
120
|
+
Object.assign(harness.navigation, {
|
|
121
|
+
path: { pathname: '/apps/my-app/ctx-1', search: '' },
|
|
122
|
+
});
|
|
123
|
+
// Test double — only the context property is accessed by the plugin under test
|
|
124
|
+
const appModules = { context: { currentContext: null } };
|
|
125
|
+
harness.source$.next({ appKey: 'my-app', appModules, contextState: makeContext('ctx-1') });
|
|
126
|
+
expect(harness.event.dispatchEvent).toHaveBeenCalledWith('onContextNavigationSkipped', expect.objectContaining({
|
|
127
|
+
detail: { appKey: 'my-app', reason: 'url-matches' },
|
|
128
|
+
}));
|
|
129
|
+
});
|
|
130
|
+
it('skips with encode-returned-null when adapter encode returns null', () => {
|
|
131
|
+
const nullEncoder = makeAdapter({
|
|
132
|
+
id: 'null-encoder',
|
|
133
|
+
encode: () => null,
|
|
134
|
+
});
|
|
135
|
+
harness = createHarness({ adapters: [nullEncoder] });
|
|
136
|
+
// Test double — only the context property is accessed by the plugin under test
|
|
137
|
+
const appModules = { context: { currentContext: null } };
|
|
138
|
+
harness.source$.next({ appKey: 'my-app', appModules, contextState: makeContext('x') });
|
|
139
|
+
expect(harness.event.dispatchEvent).toHaveBeenCalledWith('onContextNavigationSkipped', expect.objectContaining({
|
|
140
|
+
detail: { appKey: 'my-app', reason: 'encode-returned-null' },
|
|
141
|
+
}));
|
|
142
|
+
});
|
|
143
|
+
it('skips with canceled when navigation event is canceled', async () => {
|
|
144
|
+
harness = createHarness();
|
|
145
|
+
vi.mocked(harness.event.dispatchEvent).mockImplementation(async (name) => {
|
|
146
|
+
// Mock conditional — simulate cancel only for the navigate event
|
|
147
|
+
if (name === 'onContextNavigationNavigate')
|
|
148
|
+
return { canceled: true };
|
|
149
|
+
return { canceled: false };
|
|
150
|
+
});
|
|
151
|
+
// Test double — only the context property is accessed by the plugin under test
|
|
152
|
+
const appModules = { context: { currentContext: null } };
|
|
153
|
+
harness.source$.next({ appKey: 'my-app', appModules, contextState: makeContext('ctx-2') });
|
|
154
|
+
await vi.waitFor(() => {
|
|
155
|
+
expect(harness.event.dispatchEvent).toHaveBeenCalledWith('onContextNavigationSkipped', expect.objectContaining({
|
|
156
|
+
detail: { appKey: 'my-app', reason: 'canceled' },
|
|
157
|
+
}));
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
// ─── Navigation Behavior ──────────────────────────────────────────
|
|
162
|
+
describe('navigation behavior', () => {
|
|
163
|
+
it('navigates with config.navigationOptions', async () => {
|
|
164
|
+
harness = createHarness({ navigationOptions: { replace: true } });
|
|
165
|
+
// Test double — only the context property is accessed by the plugin under test
|
|
166
|
+
const appModules = { context: { currentContext: null } };
|
|
167
|
+
harness.source$.next({ appKey: 'my-app', appModules, contextState: makeContext('ctx-1') });
|
|
168
|
+
await vi.waitFor(() => {
|
|
169
|
+
expect(harness.navigation.navigate).toHaveBeenCalledWith(expect.any(URL), {
|
|
170
|
+
replace: true,
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
it('dispatches onContextNavigationNavigated after successful navigation', async () => {
|
|
175
|
+
harness = createHarness();
|
|
176
|
+
// Test double — only the context property is accessed by the plugin under test
|
|
177
|
+
const appModules = { context: { currentContext: null } };
|
|
178
|
+
const ctx = makeContext('ctx-1');
|
|
179
|
+
harness.source$.next({ appKey: 'my-app', appModules, contextState: ctx });
|
|
180
|
+
await vi.waitFor(() => {
|
|
181
|
+
expect(harness.event.dispatchEvent).toHaveBeenCalledWith('onContextNavigationNavigated', expect.objectContaining({
|
|
182
|
+
detail: expect.objectContaining({
|
|
183
|
+
appKey: 'my-app',
|
|
184
|
+
adapterId: 'test-adapter',
|
|
185
|
+
context: ctx,
|
|
186
|
+
}),
|
|
187
|
+
}));
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
it('calls onTransition callback after navigation', async () => {
|
|
191
|
+
const onTransition = vi.fn();
|
|
192
|
+
harness = createHarness({ onTransition });
|
|
193
|
+
// Test double — only the context property is accessed by the plugin under test
|
|
194
|
+
const appModules = { context: { currentContext: null } };
|
|
195
|
+
harness.source$.next({ appKey: 'my-app', appModules, contextState: makeContext('ctx-1') });
|
|
196
|
+
await vi.waitFor(() => {
|
|
197
|
+
expect(onTransition).toHaveBeenCalledWith(expect.objectContaining({ appKey: 'my-app', adapterId: 'test-adapter' }));
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
// ─── Hash/Query Preservation ──────────────────────────────────────
|
|
202
|
+
describe('hash and query preservation', () => {
|
|
203
|
+
it('preserves query parameters from the current URL', async () => {
|
|
204
|
+
const adapter = makeAdapter({
|
|
205
|
+
encode: ({ context, currentURL }) => {
|
|
206
|
+
// Guard — adapter cannot encode without a context item
|
|
207
|
+
if (!context)
|
|
208
|
+
return null;
|
|
209
|
+
const target = new URL(`/apps/my-app/${context.id}`, currentURL.origin);
|
|
210
|
+
target.search = currentURL.search;
|
|
211
|
+
return target;
|
|
212
|
+
},
|
|
213
|
+
});
|
|
214
|
+
harness = createHarness({ adapters: [adapter] });
|
|
215
|
+
Object.assign(harness.navigation, {
|
|
216
|
+
path: { pathname: '/apps/my-app', search: '?view=grid&page=2' },
|
|
217
|
+
});
|
|
218
|
+
// Test double — only the context property is accessed by the plugin under test
|
|
219
|
+
const appModules = { context: { currentContext: null } };
|
|
220
|
+
harness.source$.next({ appKey: 'my-app', appModules, contextState: makeContext('ctx-5') });
|
|
221
|
+
await vi.waitFor(() => {
|
|
222
|
+
const navigateCall = vi.mocked(harness.navigation.navigate).mock.calls[0];
|
|
223
|
+
const targetURL = navigateCall?.[0];
|
|
224
|
+
expect(targetURL.search).toBe('?view=grid&page=2');
|
|
225
|
+
expect(targetURL.pathname).toBe('/apps/my-app/ctx-5');
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
it('clears hash fragment on context change to avoid inconsistent app state', async () => {
|
|
229
|
+
const adapter = makeAdapter({
|
|
230
|
+
encode: ({ context, currentURL }) => {
|
|
231
|
+
// Guard — adapter cannot encode without a context item
|
|
232
|
+
if (!context)
|
|
233
|
+
return null;
|
|
234
|
+
const target = new URL(`/apps/my-app/${context.id}`, currentURL.origin);
|
|
235
|
+
target.search = currentURL.search;
|
|
236
|
+
// Hash intentionally not preserved — context change resets app to root view
|
|
237
|
+
return target;
|
|
238
|
+
},
|
|
239
|
+
});
|
|
240
|
+
harness = createHarness({ adapters: [adapter] });
|
|
241
|
+
Object.assign(harness.navigation, {
|
|
242
|
+
path: { pathname: '/apps/my-app', search: '', hash: '#section-2' },
|
|
243
|
+
});
|
|
244
|
+
// Test double — only the context property is accessed by the plugin under test
|
|
245
|
+
const appModules = { context: { currentContext: null } };
|
|
246
|
+
harness.source$.next({ appKey: 'my-app', appModules, contextState: makeContext('ctx-6') });
|
|
247
|
+
await vi.waitFor(() => {
|
|
248
|
+
const navigateCall = vi.mocked(harness.navigation.navigate).mock.calls[0];
|
|
249
|
+
const targetURL = navigateCall?.[0];
|
|
250
|
+
// Hash should be empty — dropped when context changes
|
|
251
|
+
expect(targetURL.hash).toBe('');
|
|
252
|
+
expect(targetURL.pathname).toBe('/apps/my-app/ctx-6');
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
// ─── Null Context URL ─────────────────────────────────────────────
|
|
257
|
+
describe('null context handling', () => {
|
|
258
|
+
it('navigates to nullContextUrl when context is null', () => {
|
|
259
|
+
const nullContextUrl = vi.fn(() => '/apps/my-app');
|
|
260
|
+
harness = createHarness({ nullContextUrl });
|
|
261
|
+
Object.assign(harness.navigation, {
|
|
262
|
+
path: { pathname: '/apps/my-app/some-context', search: '' },
|
|
263
|
+
});
|
|
264
|
+
// Test double — only the context property is accessed by the plugin under test
|
|
265
|
+
const appModules = { context: { currentContext: null } };
|
|
266
|
+
harness.source$.next({ appKey: 'my-app', appModules, contextState: null });
|
|
267
|
+
expect(nullContextUrl).toHaveBeenCalledWith(expect.objectContaining({ appKey: 'my-app' }));
|
|
268
|
+
expect(harness.navigation.navigate).toHaveBeenCalledWith(expect.objectContaining({ pathname: '/apps/my-app' }), expect.anything());
|
|
269
|
+
});
|
|
270
|
+
it('does not navigate when nullContextUrl produces same path', () => {
|
|
271
|
+
const nullContextUrl = vi.fn(() => '/apps/my-app');
|
|
272
|
+
harness = createHarness({ nullContextUrl });
|
|
273
|
+
Object.assign(harness.navigation, {
|
|
274
|
+
path: { pathname: '/apps/my-app', search: '' },
|
|
275
|
+
});
|
|
276
|
+
// Test double — only the context property is accessed by the plugin under test
|
|
277
|
+
const appModules = { context: { currentContext: null } };
|
|
278
|
+
harness.source$.next({ appKey: 'my-app', appModules, contextState: null });
|
|
279
|
+
expect(harness.navigation.navigate).not.toHaveBeenCalled();
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
// ─── URL Guard (Push Mode) ────────────────────────────────────────
|
|
283
|
+
describe('URL guard — push mode', () => {
|
|
284
|
+
it('sets context from URL when URL has different context ID in push mode', async () => {
|
|
285
|
+
const adapter = makeAdapter();
|
|
286
|
+
const navigationState$ = new Subject();
|
|
287
|
+
// Test double — only the context property is accessed by the URL guard
|
|
288
|
+
const appModules = {
|
|
289
|
+
context: { currentContext: makeContext('active-ctx') },
|
|
290
|
+
};
|
|
291
|
+
const currentApp$ = new BehaviorSubject({
|
|
292
|
+
appKey: 'my-app',
|
|
293
|
+
instance$: new BehaviorSubject(appModules),
|
|
294
|
+
manifest$: new BehaviorSubject(null),
|
|
295
|
+
});
|
|
296
|
+
// Test double — only current$ is accessed by the URL guard
|
|
297
|
+
const app = { current$: currentApp$ };
|
|
298
|
+
// Test double — only path, navigate, and state$ are accessed by the URL guard
|
|
299
|
+
const navigation = {
|
|
300
|
+
path: { pathname: '/apps/my-app/url-ctx', search: '' },
|
|
301
|
+
navigate: vi.fn(),
|
|
302
|
+
state$: navigationState$,
|
|
303
|
+
};
|
|
304
|
+
// Test double — only setCurrentContextByIdAsync is called by the URL guard
|
|
305
|
+
const context = {
|
|
306
|
+
setCurrentContextByIdAsync: vi.fn(async () => undefined),
|
|
307
|
+
};
|
|
308
|
+
// Test double — only dispatchEvent is called by the plugin
|
|
309
|
+
const event = {
|
|
310
|
+
dispatchEvent: vi.fn(async () => ({ canceled: false })),
|
|
311
|
+
};
|
|
312
|
+
const config = {
|
|
313
|
+
portalName: 'TestPortal',
|
|
314
|
+
origin: 'https://example.com',
|
|
315
|
+
adapters: [adapter],
|
|
316
|
+
enableUrlGuard: true,
|
|
317
|
+
debug: false,
|
|
318
|
+
sourceFactory: () => EMPTY,
|
|
319
|
+
navigationOptions: { replace: false },
|
|
320
|
+
};
|
|
321
|
+
const teardown = createContextNavigationPlugin({ app, navigation, context, event, config });
|
|
322
|
+
// Trigger URL guard by emitting a navigation state change
|
|
323
|
+
navigationState$.next({});
|
|
324
|
+
await vi.waitFor(() => {
|
|
325
|
+
expect(context.setCurrentContextByIdAsync).toHaveBeenCalledWith('url-ctx');
|
|
326
|
+
});
|
|
327
|
+
teardown();
|
|
328
|
+
});
|
|
329
|
+
it('re-asserts active context when URL context resolution fails in push mode', async () => {
|
|
330
|
+
const adapter = makeAdapter();
|
|
331
|
+
const navigationState$ = new Subject();
|
|
332
|
+
const activeContext = makeContext('active-ctx');
|
|
333
|
+
// Test double — only the context property is accessed by the URL guard
|
|
334
|
+
const appModules = {
|
|
335
|
+
context: { currentContext: activeContext },
|
|
336
|
+
};
|
|
337
|
+
const currentApp$ = new BehaviorSubject({
|
|
338
|
+
appKey: 'my-app',
|
|
339
|
+
instance$: new BehaviorSubject(appModules),
|
|
340
|
+
manifest$: new BehaviorSubject(null),
|
|
341
|
+
});
|
|
342
|
+
// Test double — only current$ is accessed by the URL guard
|
|
343
|
+
const app = { current$: currentApp$ };
|
|
344
|
+
// Test double — only path, navigate, and state$ are accessed by the URL guard
|
|
345
|
+
const navigation = {
|
|
346
|
+
path: { pathname: '/apps/my-app/stale-ctx', search: '' },
|
|
347
|
+
navigate: vi.fn(),
|
|
348
|
+
state$: navigationState$,
|
|
349
|
+
};
|
|
350
|
+
// Test double — only setCurrentContextByIdAsync is called; throws to trigger fallback
|
|
351
|
+
const context = {
|
|
352
|
+
setCurrentContextByIdAsync: vi.fn(async () => {
|
|
353
|
+
throw new Error('Context not found');
|
|
354
|
+
}),
|
|
355
|
+
};
|
|
356
|
+
// Test double — only dispatchEvent is called by the plugin
|
|
357
|
+
const event = {
|
|
358
|
+
dispatchEvent: vi.fn(async () => ({ canceled: false })),
|
|
359
|
+
};
|
|
360
|
+
const config = {
|
|
361
|
+
portalName: 'TestPortal',
|
|
362
|
+
origin: 'https://example.com',
|
|
363
|
+
adapters: [adapter],
|
|
364
|
+
enableUrlGuard: true,
|
|
365
|
+
debug: false,
|
|
366
|
+
sourceFactory: () => EMPTY,
|
|
367
|
+
navigationOptions: { replace: false },
|
|
368
|
+
};
|
|
369
|
+
const teardown = createContextNavigationPlugin({ app, navigation, context, event, config });
|
|
370
|
+
navigationState$.next({});
|
|
371
|
+
await vi.waitFor(() => {
|
|
372
|
+
expect(navigation.navigate).toHaveBeenCalledWith(expect.objectContaining({ pathname: '/apps/my-app/active-ctx' }), expect.anything());
|
|
373
|
+
});
|
|
374
|
+
teardown();
|
|
375
|
+
});
|
|
376
|
+
});
|
|
377
|
+
// ─── URL Guard (Replace Mode) ────────────────────────────────────
|
|
378
|
+
describe('URL guard — replace mode', () => {
|
|
379
|
+
it('re-asserts active context when URL diverges in replace mode', async () => {
|
|
380
|
+
const adapter = makeAdapter();
|
|
381
|
+
const navigationState$ = new Subject();
|
|
382
|
+
const activeContext = makeContext('active-ctx');
|
|
383
|
+
// Test double — only the context property is accessed by the URL guard
|
|
384
|
+
const appModules = {
|
|
385
|
+
context: { currentContext: activeContext },
|
|
386
|
+
};
|
|
387
|
+
const currentApp$ = new BehaviorSubject({
|
|
388
|
+
appKey: 'my-app',
|
|
389
|
+
instance$: new BehaviorSubject(appModules),
|
|
390
|
+
manifest$: new BehaviorSubject(null),
|
|
391
|
+
});
|
|
392
|
+
// Test double — only current$ is accessed by the URL guard
|
|
393
|
+
const app = { current$: currentApp$ };
|
|
394
|
+
// Test double — only path, navigate, and state$ are accessed by the URL guard
|
|
395
|
+
const navigation = {
|
|
396
|
+
path: { pathname: '/apps/my-app/wrong-ctx', search: '' },
|
|
397
|
+
navigate: vi.fn(),
|
|
398
|
+
state$: navigationState$,
|
|
399
|
+
};
|
|
400
|
+
// Test double — only setCurrentContextByIdAsync is called by the URL guard
|
|
401
|
+
const context = {
|
|
402
|
+
setCurrentContextByIdAsync: vi.fn(async () => undefined),
|
|
403
|
+
};
|
|
404
|
+
// Test double — only dispatchEvent is called by the plugin
|
|
405
|
+
const event = {
|
|
406
|
+
dispatchEvent: vi.fn(async () => ({ canceled: false })),
|
|
407
|
+
};
|
|
408
|
+
const config = {
|
|
409
|
+
portalName: 'TestPortal',
|
|
410
|
+
origin: 'https://example.com',
|
|
411
|
+
adapters: [adapter],
|
|
412
|
+
enableUrlGuard: true,
|
|
413
|
+
debug: false,
|
|
414
|
+
sourceFactory: () => EMPTY,
|
|
415
|
+
navigationOptions: { replace: true },
|
|
416
|
+
};
|
|
417
|
+
const teardown = createContextNavigationPlugin({ app, navigation, context, event, config });
|
|
418
|
+
navigationState$.next({});
|
|
419
|
+
await vi.waitFor(() => {
|
|
420
|
+
expect(navigation.navigate).toHaveBeenCalledWith(expect.objectContaining({ pathname: '/apps/my-app/active-ctx' }), { replace: true });
|
|
421
|
+
});
|
|
422
|
+
teardown();
|
|
423
|
+
});
|
|
424
|
+
it('ignores navigation state changes for URLs outside the app base path', async () => {
|
|
425
|
+
const adapter = makeAdapter();
|
|
426
|
+
const navigationState$ = new Subject();
|
|
427
|
+
// Test double — only the context property is accessed by the URL guard
|
|
428
|
+
const appModules = {
|
|
429
|
+
context: { currentContext: makeContext('active-ctx') },
|
|
430
|
+
};
|
|
431
|
+
const currentApp$ = new BehaviorSubject({
|
|
432
|
+
appKey: 'my-app',
|
|
433
|
+
instance$: new BehaviorSubject(appModules),
|
|
434
|
+
manifest$: new BehaviorSubject(null),
|
|
435
|
+
});
|
|
436
|
+
// Test double — only current$ is accessed by the URL guard
|
|
437
|
+
const app = { current$: currentApp$ };
|
|
438
|
+
// Test double — only path, navigate, and state$ are accessed by the URL guard
|
|
439
|
+
const navigation = {
|
|
440
|
+
path: { pathname: '/apps/other-app/something', search: '' },
|
|
441
|
+
navigate: vi.fn(),
|
|
442
|
+
state$: navigationState$,
|
|
443
|
+
};
|
|
444
|
+
// Test double — only dispatchEvent is called by the plugin
|
|
445
|
+
const event = {
|
|
446
|
+
dispatchEvent: vi.fn(async () => ({ canceled: false })),
|
|
447
|
+
};
|
|
448
|
+
// Test double — only setCurrentContextByIdAsync is called by the URL guard
|
|
449
|
+
const context = {
|
|
450
|
+
setCurrentContextByIdAsync: vi.fn(async () => undefined),
|
|
451
|
+
};
|
|
452
|
+
const config = {
|
|
453
|
+
portalName: 'TestPortal',
|
|
454
|
+
origin: 'https://example.com',
|
|
455
|
+
adapters: [adapter],
|
|
456
|
+
enableUrlGuard: true,
|
|
457
|
+
debug: false,
|
|
458
|
+
sourceFactory: () => EMPTY,
|
|
459
|
+
navigationOptions: { replace: true },
|
|
460
|
+
};
|
|
461
|
+
const teardown = createContextNavigationPlugin({ app, navigation, context, event, config });
|
|
462
|
+
navigationState$.next({});
|
|
463
|
+
// Wait a tick and verify no navigation occurred
|
|
464
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
465
|
+
expect(navigation.navigate).not.toHaveBeenCalled();
|
|
466
|
+
expect(context.setCurrentContextByIdAsync).not.toHaveBeenCalled();
|
|
467
|
+
teardown();
|
|
468
|
+
});
|
|
469
|
+
});
|
|
470
|
+
// ─── Teardown ─────────────────────────────────────────────────────
|
|
471
|
+
describe('teardown', () => {
|
|
472
|
+
it('unsubscribes from source on teardown', () => {
|
|
473
|
+
harness = createHarness();
|
|
474
|
+
// Test double — only the context property is accessed by the plugin under test
|
|
475
|
+
const appModules = { context: { currentContext: null } };
|
|
476
|
+
harness.teardown();
|
|
477
|
+
// After teardown, emitting should not cause dispatches
|
|
478
|
+
harness.source$.next({ appKey: 'my-app', appModules, contextState: makeContext('x') });
|
|
479
|
+
expect(harness.event.dispatchEvent).not.toHaveBeenCalled();
|
|
480
|
+
});
|
|
481
|
+
});
|
|
482
|
+
});
|
|
483
|
+
//# sourceMappingURL=plugin.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.test.js","sourceRoot":"","sources":["../../../src/__tests__/plugin.test.ts"],"names":[],"mappings":"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"}
|