microui-wc 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/AGENTS.md +71 -71
- package/CHANGELOG.md +1 -1
- package/README.md +14 -9
- package/dist/AGENTS.md +116 -116
- package/dist/README.md +21 -16
- package/dist/components.css +1 -1
- package/dist/microui.css +1 -1
- package/dist/microui.esm.js.map +1 -1
- package/dist/microui.min.js.map +1 -1
- package/dist/styles/components/switch.css +1 -1
- package/docs/getting-started.md +3 -3
- package/package.json +38 -10
- package/src/components/mu-schema-form.js +1 -1
- package/src/styles/components/switch.css +7 -8
- package/src/styles/components.css +6 -6
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -40
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -33
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -28
- package/.github/workflows/ci.yml +0 -42
- package/.github/workflows/deploy-pages.yml +0 -112
- package/CODE_OF_CONDUCT.md +0 -59
- package/CONTRIBUTING.md +0 -156
- package/SECURITY.md +0 -58
- package/app/.generated/routes/alerts.js +0 -8
- package/app/.generated/routes/avatars.js +0 -8
- package/app/.generated/routes/badges.js +0 -8
- package/app/.generated/routes/buttons.js +0 -10
- package/app/.generated/routes/cards.js +0 -10
- package/app/.generated/routes/checkboxes.js +0 -9
- package/app/.generated/routes/chips.js +0 -8
- package/app/.generated/routes/dropdowns.js +0 -9
- package/app/.generated/routes/home.js +0 -7
- package/app/.generated/routes/icons.js +0 -9
- package/app/.generated/routes/inputs.js +0 -10
- package/app/.generated/routes/installation.js +0 -7
- package/app/.generated/routes/layout.js +0 -9
- package/app/.generated/routes/modals.js +0 -9
- package/app/.generated/routes/navbar.js +0 -7
- package/app/.generated/routes/progress.js +0 -9
- package/app/.generated/routes/radios.js +0 -9
- package/app/.generated/routes/switches.js +0 -9
- package/app/.generated/routes/tabs.js +0 -8
- package/app/.generated/routes/toasts.js +0 -9
- package/app/index.html +0 -67
- package/app/pages/alerts.html +0 -23
- package/app/pages/avatars.html +0 -22
- package/app/pages/badges.html +0 -22
- package/app/pages/buttons.html +0 -71
- package/app/pages/cards.html +0 -54
- package/app/pages/checkboxes.html +0 -39
- package/app/pages/chips.html +0 -23
- package/app/pages/dropdowns.html +0 -41
- package/app/pages/home.html +0 -59
- package/app/pages/icons.html +0 -29
- package/app/pages/inputs.html +0 -66
- package/app/pages/installation.html +0 -34
- package/app/pages/layout.html +0 -30
- package/app/pages/modals.html +0 -21
- package/app/pages/navbar.html +0 -22
- package/app/pages/progress.html +0 -35
- package/app/pages/radios.html +0 -40
- package/app/pages/switches.html +0 -39
- package/app/pages/tabs.html +0 -30
- package/app/pages/toasts.html +0 -22
- package/app-dist/index.html +0 -67
- package/app-dist/pages/alerts.html +0 -23
- package/app-dist/pages/avatars.html +0 -22
- package/app-dist/pages/badges.html +0 -22
- package/app-dist/pages/buttons.html +0 -71
- package/app-dist/pages/cards.html +0 -54
- package/app-dist/pages/checkboxes.html +0 -39
- package/app-dist/pages/chips.html +0 -23
- package/app-dist/pages/dropdowns.html +0 -41
- package/app-dist/pages/home.html +0 -59
- package/app-dist/pages/icons.html +0 -29
- package/app-dist/pages/inputs.html +0 -66
- package/app-dist/pages/installation.html +0 -34
- package/app-dist/pages/layout.html +0 -30
- package/app-dist/pages/modals.html +0 -21
- package/app-dist/pages/navbar.html +0 -22
- package/app-dist/pages/progress.html +0 -35
- package/app-dist/pages/radios.html +0 -40
- package/app-dist/pages/switches.html +0 -39
- package/app-dist/pages/tabs.html +0 -30
- package/app-dist/pages/toasts.html +0 -22
- package/app-dist/pages.json +0 -217
- package/app-dist/routes/alerts.js +0 -5
- package/app-dist/routes/avatars.js +0 -1
- package/app-dist/routes/badges.js +0 -1
- package/app-dist/routes/buttons.js +0 -1
- package/app-dist/routes/cards.js +0 -1
- package/app-dist/routes/checkboxes.js +0 -9
- package/app-dist/routes/chips.js +0 -4
- package/app-dist/routes/chunk-019e5e2f.js +0 -5
- package/app-dist/routes/chunk-0m4j19yd.js +0 -2
- package/app-dist/routes/chunk-0tmmp5q0.js +0 -1
- package/app-dist/routes/chunk-10xn709r.js +0 -1
- package/app-dist/routes/chunk-15m2qcda.js +0 -2
- package/app-dist/routes/chunk-1bh8g23n.js +0 -1
- package/app-dist/routes/chunk-1vg0v937.js +0 -1
- package/app-dist/routes/chunk-1zvcgy3j.js +0 -1
- package/app-dist/routes/chunk-2afb0861.js +0 -1
- package/app-dist/routes/chunk-2c6ttpzt.js +0 -5
- package/app-dist/routes/chunk-3dy30fhs.js +0 -1
- package/app-dist/routes/chunk-426dnces.js +0 -13
- package/app-dist/routes/chunk-44kgxery.js +0 -1
- package/app-dist/routes/chunk-47fdnejd.js +0 -33
- package/app-dist/routes/chunk-49a6t2vq.js +0 -1
- package/app-dist/routes/chunk-4fe1rm5b.js +0 -1
- package/app-dist/routes/chunk-4ggmvkta.js +0 -33
- package/app-dist/routes/chunk-4vkz81q7.js +0 -33
- package/app-dist/routes/chunk-4w4tmj8f.js +0 -31
- package/app-dist/routes/chunk-532s62kr.js +0 -31
- package/app-dist/routes/chunk-5hm3bssy.js +0 -33
- package/app-dist/routes/chunk-5vrh24hc.js +0 -1
- package/app-dist/routes/chunk-61pcg25a.js +0 -1
- package/app-dist/routes/chunk-6nfhygvf.js +0 -1
- package/app-dist/routes/chunk-700e7je6.js +0 -33
- package/app-dist/routes/chunk-7fsn17kg.js +0 -1
- package/app-dist/routes/chunk-7k789b32.js +0 -1
- package/app-dist/routes/chunk-7r46q0ys.js +0 -36
- package/app-dist/routes/chunk-86fmc1fr.js +0 -5
- package/app-dist/routes/chunk-8qth37vw.js +0 -1
- package/app-dist/routes/chunk-924wv8n0.js +0 -1
- package/app-dist/routes/chunk-9mbhgxk9.js +0 -1
- package/app-dist/routes/chunk-a216hyd9.js +0 -1
- package/app-dist/routes/chunk-akzxykh9.js +0 -33
- package/app-dist/routes/chunk-b3dcvy8c.js +0 -1
- package/app-dist/routes/chunk-b74zahz5.js +0 -31
- package/app-dist/routes/chunk-bftj53p2.js +0 -5
- package/app-dist/routes/chunk-c01hnz3e.js +0 -1
- package/app-dist/routes/chunk-d8pvv5km.js +0 -1
- package/app-dist/routes/chunk-dev0aezr.js +0 -2
- package/app-dist/routes/chunk-dh6vnv0e.js +0 -1
- package/app-dist/routes/chunk-dn2cbpva.js +0 -36
- package/app-dist/routes/chunk-dvn0my90.js +0 -1
- package/app-dist/routes/chunk-dvq8mnve.js +0 -36
- package/app-dist/routes/chunk-e8c2gc4d.js +0 -5
- package/app-dist/routes/chunk-ejf9ak2x.js +0 -1
- package/app-dist/routes/chunk-f083m55s.js +0 -1
- package/app-dist/routes/chunk-fnrj28s1.js +0 -31
- package/app-dist/routes/chunk-fvg3yjdp.js +0 -31
- package/app-dist/routes/chunk-g7k381n1.js +0 -1
- package/app-dist/routes/chunk-h01kq2ae.js +0 -13
- package/app-dist/routes/chunk-h4dk761v.js +0 -5
- package/app-dist/routes/chunk-hmx91z2x.js +0 -5
- package/app-dist/routes/chunk-hxbg4m42.js +0 -36
- package/app-dist/routes/chunk-jbjnfp2b.js +0 -2
- package/app-dist/routes/chunk-jxtz5vv6.js +0 -36
- package/app-dist/routes/chunk-jxzcs0ey.js +0 -36
- package/app-dist/routes/chunk-kt7wwhcx.js +0 -1
- package/app-dist/routes/chunk-kzptszyc.js +0 -33
- package/app-dist/routes/chunk-mhgca4w4.js +0 -2
- package/app-dist/routes/chunk-mhswxa20.js +0 -1
- package/app-dist/routes/chunk-n8zfeex6.js +0 -1
- package/app-dist/routes/chunk-pee47b2r.js +0 -1
- package/app-dist/routes/chunk-pesmw829.js +0 -1
- package/app-dist/routes/chunk-pgc4c6f3.js +0 -36
- package/app-dist/routes/chunk-q8egegm1.js +0 -1
- package/app-dist/routes/chunk-q9mn2qyq.js +0 -36
- package/app-dist/routes/chunk-qh0rtaf3.js +0 -5
- package/app-dist/routes/chunk-qqhmk6ye.js +0 -2
- package/app-dist/routes/chunk-qrxygmf7.js +0 -33
- package/app-dist/routes/chunk-r46yzksx.js +0 -36
- package/app-dist/routes/chunk-rgpbw2w0.js +0 -5
- package/app-dist/routes/chunk-rnpzv3d8.js +0 -2
- package/app-dist/routes/chunk-s5v8cv05.js +0 -2
- package/app-dist/routes/chunk-sbwn5bpc.js +0 -1
- package/app-dist/routes/chunk-sqbg8jbt.js +0 -33
- package/app-dist/routes/chunk-sv8dqnf7.js +0 -1
- package/app-dist/routes/chunk-t67sw3za.js +0 -1
- package/app-dist/routes/chunk-tjdpqwdf.js +0 -31
- package/app-dist/routes/chunk-tq2mfghg.js +0 -1
- package/app-dist/routes/chunk-ttn10vt6.js +0 -1
- package/app-dist/routes/chunk-v2hzpjxr.js +0 -1
- package/app-dist/routes/chunk-wfjjkw9y.js +0 -1
- package/app-dist/routes/chunk-wt8cxzmf.js +0 -31
- package/app-dist/routes/chunk-x45d372k.js +0 -5
- package/app-dist/routes/chunk-y3wsazkt.js +0 -1
- package/app-dist/routes/chunk-y7pmgc7t.js +0 -33
- package/app-dist/routes/chunk-zefdt2q3.js +0 -31
- package/app-dist/routes/dropdowns.js +0 -6
- package/app-dist/routes/home.js +0 -1
- package/app-dist/routes/icons.js +0 -1
- package/app-dist/routes/inputs.js +0 -12
- package/app-dist/routes/installation.js +0 -1
- package/app-dist/routes/layout.js +0 -1
- package/app-dist/routes/modals.js +0 -7
- package/app-dist/routes/navbar.js +0 -1
- package/app-dist/routes/progress.js +0 -1
- package/app-dist/routes/radios.js +0 -6
- package/app-dist/routes/switches.js +0 -6
- package/app-dist/routes/tabs.js +0 -1
- package/app-dist/routes/toasts.js +0 -16
- package/assets/fonts/material-symbols-mini.woff2 +0 -0
- package/assets/fonts/material-symbols.woff2 +0 -0
- package/assets/fonts/roboto-400.woff2 +0 -0
- package/assets/fonts/roboto-500.woff2 +0 -0
- package/assets/fonts/roboto-700.woff2 +0 -0
- package/assets/logo-banner-400.jpg +0 -0
- package/assets/logo-banner-400.webp +0 -0
- package/assets/logo-banner-800.webp +0 -0
- package/assets/logo-banner.jpg +0 -0
- package/assets/logo-icon-64.jpg +0 -0
- package/assets/logo-icon-64.webp +0 -0
- package/assets/logo-icon.jpg +0 -0
- package/assets/logo-square.jpg +0 -0
- package/bun.lock +0 -312
- package/bunfig.toml +0 -4
- package/custom-elements.json +0 -1916
- package/demo/api/sample-data.json +0 -38
- package/demo/content/alerts.html +0 -115
- package/demo/content/avatars.html +0 -70
- package/demo/content/badges.html +0 -65
- package/demo/content/buttons.html +0 -188
- package/demo/content/callouts.html +0 -91
- package/demo/content/cards.html +0 -121
- package/demo/content/checkboxes.html +0 -178
- package/demo/content/chips.html +0 -67
- package/demo/content/codeblocks.html +0 -101
- package/demo/content/confirms.html +0 -115
- package/demo/content/datatables.html +0 -149
- package/demo/content/dividers.html +0 -119
- package/demo/content/dropdowns.html +0 -89
- package/demo/content/enterprise.html +0 -252
- package/demo/content/home.html +0 -149
- package/demo/content/icons.html +0 -89
- package/demo/content/inputs.html +0 -135
- package/demo/content/installation.html +0 -16
- package/demo/content/layout.html +0 -136
- package/demo/content/modals.html +0 -141
- package/demo/content/navbar.html +0 -70
- package/demo/content/progress.html +0 -119
- package/demo/content/radios.html +0 -88
- package/demo/content/skeletons.html +0 -109
- package/demo/content/spinners.html +0 -96
- package/demo/content/switches.html +0 -84
- package/demo/content/tables.html +0 -124
- package/demo/content/tabs.html +0 -85
- package/demo/content/toasts.html +0 -116
- package/demo/content/tooltips.html +0 -107
- package/demo/content/virtual-lists.html +0 -233
- package/demo/favicon.ico +0 -0
- package/demo/favicon.png +0 -0
- package/demo/full.html +0 -52
- package/demo/iife.html +0 -46
- package/demo/manifest.json +0 -34
- package/demo/pages/datatable-demo.html +0 -237
- package/demo/pages/prompt-ui-demo.html +0 -218
- package/demo/pages/responsive-demo.html +0 -122
- package/demo/pages/schema-form-demo.html +0 -270
- package/demo/robots.txt +0 -6
- package/demo/shell.html +0 -712
- package/demo/sw.js +0 -387
- package/lighthouse-audit.mjs +0 -113
- package/scripts/analyze-components.js +0 -105
- package/scripts/build-app.js +0 -193
- package/scripts/build-framework.js +0 -444
- package/scripts/build-utils.js +0 -101
- package/scripts/test-isolated.js +0 -151
- package/server.js +0 -256
- package/tests/agents/agent-integration.test.js +0 -76
- package/tests/benchmark.html +0 -296
- package/tests/build/scan-components.test.js +0 -173
- package/tests/components/all-components.test.js +0 -245
- package/tests/components/all-missing-components.test.js +0 -574
- package/tests/components/mu-alert.test.js +0 -113
- package/tests/components/mu-avatar.test.js +0 -148
- package/tests/components/mu-badge.test.js +0 -92
- package/tests/components/mu-button.test.js +0 -112
- package/tests/components/mu-card.test.js +0 -89
- package/tests/components/mu-checkbox.test.js +0 -158
- package/tests/components/mu-chip.test.js +0 -118
- package/tests/components/mu-container.test.js +0 -120
- package/tests/components/mu-divider.test.js +0 -98
- package/tests/components/mu-drawer-item.test.js +0 -199
- package/tests/components/mu-drawer.test.js +0 -96
- package/tests/components/mu-dropdown.test.js +0 -125
- package/tests/components/mu-form.test.js +0 -138
- package/tests/components/mu-grid.test.js +0 -135
- package/tests/components/mu-icon.test.js +0 -110
- package/tests/components/mu-input.test.js +0 -131
- package/tests/components/mu-lazy.test.js +0 -103
- package/tests/components/mu-modal.test.js +0 -275
- package/tests/components/mu-navbar.test.js +0 -101
- package/tests/components/mu-progress.test.js +0 -115
- package/tests/components/mu-radio.test.js +0 -114
- package/tests/components/mu-repeat.test.js +0 -106
- package/tests/components/mu-sidebar.test.js +0 -126
- package/tests/components/mu-skeleton.test.js +0 -162
- package/tests/components/mu-stack.test.js +0 -143
- package/tests/components/mu-switch.test.js +0 -292
- package/tests/components/mu-table.test.js +0 -124
- package/tests/components/mu-tabs.test.js +0 -104
- package/tests/components/mu-textarea.test.js +0 -115
- package/tests/components/mu-toast.test.js +0 -321
- package/tests/components/mu-tooltip.test.js +0 -133
- package/tests/components/mu-virtual-list.test.js +0 -109
- package/tests/core/MuElement.test.js +0 -120
- package/tests/core/agent-api.test.js +0 -125
- package/tests/core/all-core-modules.test.js +0 -442
- package/tests/core/bus.test.js +0 -364
- package/tests/core/component-schema.test.js +0 -160
- package/tests/core/feature-registry.test.js +0 -198
- package/tests/core/form-state.test.js +0 -167
- package/tests/core/http.test.js +0 -119
- package/tests/core/keyboard.test.js +0 -319
- package/tests/core/layers.test.js +0 -129
- package/tests/core/namespaced-stores.test.js +0 -114
- package/tests/core/render.test.js +0 -121
- package/tests/core/ripple.test.js +0 -131
- package/tests/core/router.test.js +0 -89
- package/tests/core/scheduler.test.js +0 -121
- package/tests/core/signals.test.js +0 -128
- package/tests/core/store.test.js +0 -171
- package/tests/core/transitions.test.js +0 -82
- package/tests/e2e/accessibility-harness.html +0 -58
- package/tests/e2e/accessibility.test.js +0 -401
- package/tests/e2e/agent-features.test.js +0 -372
- package/tests/e2e/card-spacing.test.js +0 -287
- package/tests/e2e/components.test.js +0 -439
- package/tests/e2e/demo-routes.test.js +0 -478
- package/tests/e2e/layout-css-fallback.test.js +0 -334
- package/tests/e2e/mu-alert.e2e.test.js +0 -111
- package/tests/e2e/mu-checkbox.test.js +0 -489
- package/tests/e2e/mu-chip.test.js +0 -347
- package/tests/e2e/mu-form.test.js +0 -499
- package/tests/e2e/mu-icon.test.js +0 -114
- package/tests/e2e/mu-radio.test.js +0 -113
- package/tests/e2e/mu-skeleton.test.js +0 -140
- package/tests/e2e/mu-switch.test.js +0 -415
- package/tests/e2e/mu-tabs.test.js +0 -494
- package/tests/e2e/mu-textarea.test.js +0 -242
- package/tests/e2e/mu-virtual-list.test.js +0 -427
- package/tests/e2e/perf-memory.test.js +0 -161
- package/tests/e2e/puppeteer-helper.js +0 -137
- package/tests/e2e/puppeteer.test.js +0 -226
- package/tests/e2e/pwa.test.js +0 -261
- package/tests/e2e/test-harness.html +0 -319
- package/tests/manual/test-components.html +0 -120
- package/tests/memory-test.html +0 -309
- package/tests/setup-dom.js +0 -93
- package/tests/visual-test.html +0 -301
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Unit Tests for ripple.js Module
|
|
3
|
-
* Target: 72% → 95% coverage
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { describe, test, expect, beforeAll, beforeEach } from 'bun:test';
|
|
7
|
-
import { parseHTML } from 'linkedom';
|
|
8
|
-
|
|
9
|
-
let document, body;
|
|
10
|
-
let createRipple, attachRipple, RippleMixin;
|
|
11
|
-
|
|
12
|
-
describe('ripple Module Unit Tests', () => {
|
|
13
|
-
|
|
14
|
-
beforeAll(async () => {
|
|
15
|
-
const dom = parseHTML('<!DOCTYPE html><html><body></body></html>');
|
|
16
|
-
document = dom.document;
|
|
17
|
-
body = document.body;
|
|
18
|
-
|
|
19
|
-
globalThis.window = dom.window;
|
|
20
|
-
globalThis.document = document;
|
|
21
|
-
globalThis.HTMLElement = dom.HTMLElement;
|
|
22
|
-
|
|
23
|
-
// Mock Web Animations API (not supported in linkedom)
|
|
24
|
-
if (!dom.HTMLElement.prototype.animate) {
|
|
25
|
-
dom.HTMLElement.prototype.animate = function (keyframes, options) {
|
|
26
|
-
return {
|
|
27
|
-
finished: Promise.resolve(),
|
|
28
|
-
cancel: () => { },
|
|
29
|
-
play: () => { },
|
|
30
|
-
pause: () => { },
|
|
31
|
-
onfinish: null
|
|
32
|
-
};
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const module = await import('../../src/core/ripple.js');
|
|
37
|
-
createRipple = module.createRipple;
|
|
38
|
-
attachRipple = module.attachRipple;
|
|
39
|
-
RippleMixin = module.RippleMixin;
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
beforeEach(() => { body.innerHTML = ''; });
|
|
43
|
-
|
|
44
|
-
// CREATE RIPPLE
|
|
45
|
-
test('createRipple should be a function', () => {
|
|
46
|
-
expect(typeof createRipple).toBe('function');
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
test('createRipple should create ripple element', () => {
|
|
50
|
-
const el = document.createElement('div');
|
|
51
|
-
el.style.width = '100px';
|
|
52
|
-
el.style.height = '100px';
|
|
53
|
-
body.appendChild(el);
|
|
54
|
-
|
|
55
|
-
// Mock getBoundingClientRect
|
|
56
|
-
el.getBoundingClientRect = () => ({ left: 0, top: 0, width: 100, height: 100 });
|
|
57
|
-
// Mock getComputedStyle
|
|
58
|
-
globalThis.getComputedStyle = () => ({ position: 'static', overflow: 'visible' });
|
|
59
|
-
|
|
60
|
-
const event = { clientX: 50, clientY: 50 };
|
|
61
|
-
const ripple = createRipple(el, event);
|
|
62
|
-
expect(ripple).toBeDefined();
|
|
63
|
-
expect(ripple.className).toBe('mu-ripple-wave');
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
test('createRipple should work centered', () => {
|
|
67
|
-
const el = document.createElement('div');
|
|
68
|
-
body.appendChild(el);
|
|
69
|
-
el.getBoundingClientRect = () => ({ left: 0, top: 0, width: 100, height: 100 });
|
|
70
|
-
globalThis.getComputedStyle = () => ({ position: 'relative', overflow: 'hidden' });
|
|
71
|
-
|
|
72
|
-
const ripple = createRipple(el, null, { centered: true });
|
|
73
|
-
expect(ripple).toBeDefined();
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
test('createRipple should handle touch events', () => {
|
|
77
|
-
const el = document.createElement('div');
|
|
78
|
-
body.appendChild(el);
|
|
79
|
-
el.getBoundingClientRect = () => ({ left: 0, top: 0, width: 100, height: 100 });
|
|
80
|
-
globalThis.getComputedStyle = () => ({ position: 'relative', overflow: 'hidden' });
|
|
81
|
-
|
|
82
|
-
const event = { touches: [{ clientX: 50, clientY: 50 }] };
|
|
83
|
-
const ripple = createRipple(el, event);
|
|
84
|
-
expect(ripple).toBeDefined();
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
// ATTACH RIPPLE
|
|
88
|
-
test('attachRipple should be a function', () => {
|
|
89
|
-
expect(typeof attachRipple).toBe('function');
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
test('attachRipple should return cleanup function', () => {
|
|
93
|
-
const el = document.createElement('div');
|
|
94
|
-
body.appendChild(el);
|
|
95
|
-
const cleanup = attachRipple(el);
|
|
96
|
-
expect(typeof cleanup).toBe('function');
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
test('attachRipple cleanup should work', () => {
|
|
100
|
-
const el = document.createElement('div');
|
|
101
|
-
body.appendChild(el);
|
|
102
|
-
const cleanup = attachRipple(el);
|
|
103
|
-
cleanup();
|
|
104
|
-
expect(true).toBe(true);
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
// RIPPLE MIXIN
|
|
108
|
-
test('RippleMixin should be a function', () => {
|
|
109
|
-
expect(typeof RippleMixin).toBe('function');
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
test('RippleMixin should return a class', () => {
|
|
113
|
-
class Base { }
|
|
114
|
-
const Mixed = RippleMixin(Base);
|
|
115
|
-
expect(typeof Mixed).toBe('function');
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
test('RippleMixin class should have initRipple method', () => {
|
|
119
|
-
class Base { }
|
|
120
|
-
const Mixed = RippleMixin(Base);
|
|
121
|
-
const instance = new Mixed();
|
|
122
|
-
expect(typeof instance.initRipple).toBe('function');
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
test('RippleMixin class should have disconnectedCallback', () => {
|
|
126
|
-
class Base { }
|
|
127
|
-
const Mixed = RippleMixin(Base);
|
|
128
|
-
const instance = new Mixed();
|
|
129
|
-
expect(typeof instance.disconnectedCallback).toBe('function');
|
|
130
|
-
});
|
|
131
|
-
});
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Unit Tests for router.js Core Module
|
|
3
|
-
* Target: 20.34% → 90% coverage
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { describe, test, expect, beforeAll, beforeEach } from 'bun:test';
|
|
7
|
-
import { parseHTML } from 'linkedom';
|
|
8
|
-
|
|
9
|
-
let Router;
|
|
10
|
-
|
|
11
|
-
describe('router.js Unit Tests', () => {
|
|
12
|
-
|
|
13
|
-
beforeAll(async () => {
|
|
14
|
-
const dom = parseHTML('<!DOCTYPE html><html><body></body></html>');
|
|
15
|
-
|
|
16
|
-
globalThis.window = {
|
|
17
|
-
location: { hash: '' },
|
|
18
|
-
addEventListener: () => { },
|
|
19
|
-
removeEventListener: () => { }
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
// Fresh import for each test suite
|
|
23
|
-
const module = await import('../../src/core/router.js');
|
|
24
|
-
Router = module.Router;
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
beforeEach(() => {
|
|
28
|
-
globalThis.window.location.hash = '';
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
// ========================================
|
|
32
|
-
// Route Registration
|
|
33
|
-
// ========================================
|
|
34
|
-
|
|
35
|
-
test('Router should exist', () => {
|
|
36
|
-
expect(Router).toBeDefined();
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
test('on() should register route and return this', () => {
|
|
40
|
-
const result = Router.on('/test-path', () => { });
|
|
41
|
-
expect(result).toBe(Router);
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
test('on() should accept path with params', () => {
|
|
45
|
-
const result = Router.on('/user/:id', () => { });
|
|
46
|
-
expect(result).toBe(Router);
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
test('on() should accept multiple params', () => {
|
|
50
|
-
const result = Router.on('/org/:org/repo/:repo', () => { });
|
|
51
|
-
expect(result).toBe(Router);
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
// ========================================
|
|
55
|
-
// notFound Handler
|
|
56
|
-
// ========================================
|
|
57
|
-
|
|
58
|
-
test('notFound() should set handler and return this', () => {
|
|
59
|
-
const result = Router.notFound(() => { });
|
|
60
|
-
expect(result).toBe(Router);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
// ========================================
|
|
64
|
-
// Navigate
|
|
65
|
-
// ========================================
|
|
66
|
-
|
|
67
|
-
test('navigate() should set window.location.hash', () => {
|
|
68
|
-
Router.navigate('/dashboard');
|
|
69
|
-
expect(globalThis.window.location.hash).toBe('/dashboard');
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
// ========================================
|
|
73
|
-
// Current Path
|
|
74
|
-
// ========================================
|
|
75
|
-
|
|
76
|
-
test('current should return current path', () => {
|
|
77
|
-
// After initialization, current might be empty or /
|
|
78
|
-
expect(typeof Router.current).toBe('string');
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
// ========================================
|
|
82
|
-
// Start
|
|
83
|
-
// ========================================
|
|
84
|
-
|
|
85
|
-
test('start() should return this', () => {
|
|
86
|
-
const result = Router.start();
|
|
87
|
-
expect(result).toBe(Router);
|
|
88
|
-
});
|
|
89
|
-
});
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Unit Tests for scheduler.js (Task Scheduler)
|
|
3
|
-
* Target: 56% → 90% coverage
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { describe, test, expect, beforeAll, beforeEach } from 'bun:test';
|
|
7
|
-
|
|
8
|
-
let supportsScheduler, scheduleTask, yieldToMain, processWithYield;
|
|
9
|
-
let runBackground, runImmediate;
|
|
10
|
-
|
|
11
|
-
describe('scheduler.js Unit Tests', () => {
|
|
12
|
-
|
|
13
|
-
beforeAll(async () => {
|
|
14
|
-
globalThis.setTimeout = (cb, delay) => { cb(); return 0; };
|
|
15
|
-
|
|
16
|
-
const module = await import('../../src/core/scheduler.js');
|
|
17
|
-
supportsScheduler = module.supportsScheduler;
|
|
18
|
-
scheduleTask = module.scheduleTask;
|
|
19
|
-
yieldToMain = module.yieldToMain;
|
|
20
|
-
processWithYield = module.processWithYield;
|
|
21
|
-
runBackground = module.runBackground;
|
|
22
|
-
runImmediate = module.runImmediate;
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
// ========================================
|
|
26
|
-
// supportsScheduler
|
|
27
|
-
// ========================================
|
|
28
|
-
|
|
29
|
-
test('supportsScheduler should be boolean', () => {
|
|
30
|
-
expect(typeof supportsScheduler).toBe('boolean');
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
// ========================================
|
|
34
|
-
// scheduleTask
|
|
35
|
-
// ========================================
|
|
36
|
-
|
|
37
|
-
test('scheduleTask should execute callback', async () => {
|
|
38
|
-
let called = false;
|
|
39
|
-
await scheduleTask(() => { called = true; });
|
|
40
|
-
expect(called).toBe(true);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
test('scheduleTask should return result', async () => {
|
|
44
|
-
const result = await scheduleTask(() => 42);
|
|
45
|
-
expect(result).toBe(42);
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
test('scheduleTask with user-blocking priority', async () => {
|
|
49
|
-
const result = await scheduleTask(() => 'fast', 'user-blocking');
|
|
50
|
-
expect(result).toBe('fast');
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
test('scheduleTask with background priority', async () => {
|
|
54
|
-
const result = await scheduleTask(() => 'slow', 'background');
|
|
55
|
-
expect(result).toBe('slow');
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
// ========================================
|
|
59
|
-
// yieldToMain
|
|
60
|
-
// ========================================
|
|
61
|
-
|
|
62
|
-
test('yieldToMain should resolve', async () => {
|
|
63
|
-
await yieldToMain();
|
|
64
|
-
expect(true).toBe(true);
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
// ========================================
|
|
68
|
-
// processWithYield
|
|
69
|
-
// ========================================
|
|
70
|
-
|
|
71
|
-
test('processWithYield should process all items', async () => {
|
|
72
|
-
const items = [1, 2, 3, 4, 5];
|
|
73
|
-
const processed = [];
|
|
74
|
-
await processWithYield(items, (item) => { processed.push(item); }, 2);
|
|
75
|
-
expect(processed.length).toBe(5);
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
test('processWithYield with large chunk', async () => {
|
|
79
|
-
const items = [1, 2, 3];
|
|
80
|
-
const processed = [];
|
|
81
|
-
await processWithYield(items, (item) => { processed.push(item); }, 100);
|
|
82
|
-
expect(processed.length).toBe(3);
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
// ========================================
|
|
86
|
-
// runBackground / runImmediate
|
|
87
|
-
// ========================================
|
|
88
|
-
|
|
89
|
-
test('runBackground should execute callback', async () => {
|
|
90
|
-
const result = await runBackground(() => 'bg');
|
|
91
|
-
expect(result).toBe('bg');
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
test('runImmediate should execute callback', async () => {
|
|
95
|
-
const result = await runImmediate(() => 'imm');
|
|
96
|
-
expect(result).toBe('imm');
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
// ========================================
|
|
100
|
-
// afterPaint (double-rAF pattern)
|
|
101
|
-
// ========================================
|
|
102
|
-
|
|
103
|
-
test('afterPaint should resolve after two animation frames', async () => {
|
|
104
|
-
// In test environment, rAF is mocked
|
|
105
|
-
const { afterPaint } = await import('../../src/core/scheduler.js');
|
|
106
|
-
|
|
107
|
-
let resolved = false;
|
|
108
|
-
afterPaint().then(() => { resolved = true; });
|
|
109
|
-
|
|
110
|
-
// Should resolve eventually
|
|
111
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
112
|
-
expect(resolved).toBe(true);
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
test('afterPaint should return a Promise', async () => {
|
|
116
|
-
const { afterPaint } = await import('../../src/core/scheduler.js');
|
|
117
|
-
const result = afterPaint();
|
|
118
|
-
expect(result).toBeInstanceOf(Promise);
|
|
119
|
-
await result;
|
|
120
|
-
});
|
|
121
|
-
});
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Unit Tests for signals.js (Reactive Signals)
|
|
3
|
-
* Target: 82% → 95% coverage
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { describe, test, expect, beforeAll } from 'bun:test';
|
|
7
|
-
|
|
8
|
-
let signal, computed, effect, batch;
|
|
9
|
-
|
|
10
|
-
describe('signals.js Unit Tests', () => {
|
|
11
|
-
|
|
12
|
-
beforeAll(async () => {
|
|
13
|
-
globalThis.window = globalThis;
|
|
14
|
-
const module = await import('../../src/core/signals.js');
|
|
15
|
-
signal = module.signal;
|
|
16
|
-
computed = module.computed;
|
|
17
|
-
effect = module.effect;
|
|
18
|
-
batch = module.batch;
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
// ========================================
|
|
22
|
-
// signal
|
|
23
|
-
// ========================================
|
|
24
|
-
|
|
25
|
-
test('signal should return function', () => {
|
|
26
|
-
const s = signal(0);
|
|
27
|
-
expect(typeof s).toBe('function');
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
test('signal should return initial value', () => {
|
|
31
|
-
const s = signal(42);
|
|
32
|
-
expect(s()).toBe(42);
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
test('signal.set should update value', () => {
|
|
36
|
-
const s = signal(0);
|
|
37
|
-
s.set(10);
|
|
38
|
-
expect(s()).toBe(10);
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
test('signal.update should update with function', () => {
|
|
42
|
-
const s = signal(5);
|
|
43
|
-
s.update(v => v * 2);
|
|
44
|
-
expect(s()).toBe(10);
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
test('signal.peek should return value', () => {
|
|
48
|
-
const s = signal(100);
|
|
49
|
-
expect(s.peek()).toBe(100);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
test('signal should have signalName', () => {
|
|
53
|
-
const s = signal(0, 'mySignal');
|
|
54
|
-
expect(s.signalName).toBe('mySignal');
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
test('signal.subscribe should work', () => {
|
|
58
|
-
let received = null;
|
|
59
|
-
const s = signal(0, 'sub-test');
|
|
60
|
-
const unsub = s.subscribe((v) => { received = v; });
|
|
61
|
-
s.set(99);
|
|
62
|
-
expect(received).toBe(99);
|
|
63
|
-
unsub();
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
test('signal.dispose should be callable', () => {
|
|
67
|
-
const s = signal(0);
|
|
68
|
-
s.dispose();
|
|
69
|
-
expect(true).toBe(true);
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
// ========================================
|
|
73
|
-
// computed
|
|
74
|
-
// ========================================
|
|
75
|
-
|
|
76
|
-
test('computed should return function', () => {
|
|
77
|
-
const c = computed(() => 10);
|
|
78
|
-
expect(typeof c).toBe('function');
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
test('computed should return computed value', () => {
|
|
82
|
-
const s = signal(3);
|
|
83
|
-
const c = computed(() => s() * 2);
|
|
84
|
-
expect(c()).toBe(6);
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
test('computed should have signalName', () => {
|
|
88
|
-
const c = computed(() => 1, 'myComputed');
|
|
89
|
-
expect(c.signalName).toBe('myComputed');
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
test('computed.subscribe should work', () => {
|
|
93
|
-
let received = null;
|
|
94
|
-
const s = signal(1, 'comp-sub');
|
|
95
|
-
const c = computed(() => s() + 1, 'comp-sub-c');
|
|
96
|
-
const unsub = c.subscribe((v) => { received = v; });
|
|
97
|
-
c(); // Trigger initial computation
|
|
98
|
-
s.set(5);
|
|
99
|
-
expect(c()).toBe(6);
|
|
100
|
-
unsub();
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
// ========================================
|
|
104
|
-
// effect
|
|
105
|
-
// ========================================
|
|
106
|
-
|
|
107
|
-
test('effect should run immediately', () => {
|
|
108
|
-
let ran = false;
|
|
109
|
-
const dispose = effect(() => { ran = true; });
|
|
110
|
-
expect(ran).toBe(true);
|
|
111
|
-
dispose();
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
test('effect should return dispose function', () => {
|
|
115
|
-
const dispose = effect(() => { });
|
|
116
|
-
expect(typeof dispose).toBe('function');
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
// ========================================
|
|
120
|
-
// batch
|
|
121
|
-
// ========================================
|
|
122
|
-
|
|
123
|
-
test('batch should execute function', () => {
|
|
124
|
-
let called = false;
|
|
125
|
-
batch(() => { called = true; });
|
|
126
|
-
expect(called).toBe(true);
|
|
127
|
-
});
|
|
128
|
-
});
|
package/tests/core/store.test.js
DELETED
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Unit Tests for store.js (Reactive Store)
|
|
3
|
-
* Target: 50% → 90% coverage
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { describe, test, expect, beforeAll, beforeEach } from 'bun:test';
|
|
7
|
-
|
|
8
|
-
let createStore, appStore, createNamespacedStore, getStore, getAllStores;
|
|
9
|
-
let captureAppState, restoreAppState, enableObservability, disableObservability;
|
|
10
|
-
let clearStateHistory, clearStoreRegistry, getStateHistory;
|
|
11
|
-
|
|
12
|
-
describe('store.js Unit Tests', () => {
|
|
13
|
-
|
|
14
|
-
beforeAll(async () => {
|
|
15
|
-
const module = await import('../../src/core/store.js');
|
|
16
|
-
createStore = module.createStore;
|
|
17
|
-
appStore = module.appStore;
|
|
18
|
-
createNamespacedStore = module.createNamespacedStore;
|
|
19
|
-
getStore = module.getStore;
|
|
20
|
-
getAllStores = module.getAllStores;
|
|
21
|
-
captureAppState = module.captureAppState;
|
|
22
|
-
restoreAppState = module.restoreAppState;
|
|
23
|
-
enableObservability = module.enableObservability;
|
|
24
|
-
disableObservability = module.disableObservability;
|
|
25
|
-
clearStateHistory = module.clearStateHistory;
|
|
26
|
-
clearStoreRegistry = module.clearStoreRegistry;
|
|
27
|
-
getStateHistory = module.getStateHistory;
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
beforeEach(() => {
|
|
31
|
-
clearStoreRegistry();
|
|
32
|
-
disableObservability();
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
// ========================================
|
|
36
|
-
// createStore
|
|
37
|
-
// ========================================
|
|
38
|
-
|
|
39
|
-
test('createStore should return store object', () => {
|
|
40
|
-
const store = createStore({ count: 0 });
|
|
41
|
-
expect(store).toBeDefined();
|
|
42
|
-
expect(typeof store.get).toBe('function');
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
test('store.get should return state', () => {
|
|
46
|
-
const store = createStore({ count: 5 });
|
|
47
|
-
expect(store.get().count).toBe(5);
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
test('store.set should update state', () => {
|
|
51
|
-
const store = createStore({ count: 0 });
|
|
52
|
-
store.set({ count: 10 });
|
|
53
|
-
expect(store.get().count).toBe(10);
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
test('store.update should update with function', () => {
|
|
57
|
-
const store = createStore({ count: 5 });
|
|
58
|
-
store.update(s => ({ count: s.count + 5 }));
|
|
59
|
-
expect(store.get().count).toBe(10);
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
test('store.subscribe should call listener immediately', () => {
|
|
63
|
-
const store = createStore({ value: 'hello' });
|
|
64
|
-
let received = null;
|
|
65
|
-
store.subscribe(state => { received = state.value; });
|
|
66
|
-
expect(received).toBe('hello');
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
test('store.subscribe should return unsubscribe', () => {
|
|
70
|
-
const store = createStore({});
|
|
71
|
-
const unsub = store.subscribe(() => { });
|
|
72
|
-
expect(typeof unsub).toBe('function');
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
test('store.reset should restore initial state', () => {
|
|
76
|
-
const store = createStore({ count: 0 });
|
|
77
|
-
store.set({ count: 100 });
|
|
78
|
-
store.reset();
|
|
79
|
-
expect(store.get().count).toBe(0);
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
// ========================================
|
|
83
|
-
// appStore singleton
|
|
84
|
-
// ========================================
|
|
85
|
-
|
|
86
|
-
test('appStore should exist', () => {
|
|
87
|
-
expect(appStore).toBeDefined();
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
// ========================================
|
|
91
|
-
// Namespaced stores
|
|
92
|
-
// ========================================
|
|
93
|
-
|
|
94
|
-
test('createNamespacedStore should create store', () => {
|
|
95
|
-
const store = createNamespacedStore('user', { name: 'John' });
|
|
96
|
-
expect(store.get().name).toBe('John');
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
test('createNamespacedStore should return existing for same namespace', () => {
|
|
100
|
-
const store1 = createNamespacedStore('cart', { items: [] });
|
|
101
|
-
const store2 = createNamespacedStore('cart', { items: [1] });
|
|
102
|
-
expect(store1).toBe(store2);
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
test('getStore should return store by namespace', () => {
|
|
106
|
-
createNamespacedStore('settings', { theme: 'dark' });
|
|
107
|
-
const store = getStore('settings');
|
|
108
|
-
expect(store.get().theme).toBe('dark');
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
test('getAllStores should return all stores', () => {
|
|
112
|
-
createNamespacedStore('ns1', {});
|
|
113
|
-
createNamespacedStore('ns2', {});
|
|
114
|
-
const all = getAllStores();
|
|
115
|
-
expect(all.ns1).toBeDefined();
|
|
116
|
-
expect(all.ns2).toBeDefined();
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
// ========================================
|
|
120
|
-
// Capture/Restore
|
|
121
|
-
// ========================================
|
|
122
|
-
|
|
123
|
-
test('captureAppState should return snapshot', () => {
|
|
124
|
-
createNamespacedStore('test', { val: 1 });
|
|
125
|
-
const snapshot = captureAppState();
|
|
126
|
-
expect(snapshot.stores.test.val).toBe(1);
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
test('restoreAppState should restore state', () => {
|
|
130
|
-
const store = createNamespacedStore('restore-test', { x: 1 });
|
|
131
|
-
const snapshot = { stores: { 'restore-test': { x: 99 } } };
|
|
132
|
-
restoreAppState(snapshot);
|
|
133
|
-
expect(store.get().x).toBe(99);
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
test('restoreAppState should handle invalid snapshot', () => {
|
|
137
|
-
restoreAppState(null); // Should not throw
|
|
138
|
-
expect(true).toBe(true);
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
test('restoreAppState with createMissing should create stores', () => {
|
|
142
|
-
const snapshot = { stores: { 'newstore': { foo: 'bar' } } };
|
|
143
|
-
restoreAppState(snapshot, { createMissing: true });
|
|
144
|
-
const store = getStore('newstore');
|
|
145
|
-
expect(store.get().foo).toBe('bar');
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
// ========================================
|
|
149
|
-
// Observability
|
|
150
|
-
// ========================================
|
|
151
|
-
|
|
152
|
-
test('enableObservability should enable tracking', () => {
|
|
153
|
-
enableObservability();
|
|
154
|
-
const store = createNamespacedStore('obs-test', { v: 1 });
|
|
155
|
-
store.set({ v: 2 });
|
|
156
|
-
store.set({ v: 3 });
|
|
157
|
-
const history = getStateHistory('obs-test');
|
|
158
|
-
expect(history.length).toBeGreaterThanOrEqual(1);
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
test('clearStateHistory should clear history', () => {
|
|
162
|
-
enableObservability();
|
|
163
|
-
createNamespacedStore('clear-test', {});
|
|
164
|
-
clearStateHistory();
|
|
165
|
-
expect(getStateHistory('clear-test').length).toBe(0);
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
test('getStateHistory returns empty for unknown namespace', () => {
|
|
169
|
-
expect(getStateHistory('unknown').length).toBe(0);
|
|
170
|
-
});
|
|
171
|
-
});
|