Skip to content

Commit 00030d1

Browse files
committed
[optimize] upgrade Test cases
[fix] some detail bugs
1 parent a94d2cd commit 00030d1

File tree

11 files changed

+134
-115
lines changed

11 files changed

+134
-115
lines changed

.npmignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ docs/
99
.husky/
1010
.github/
1111
.vscode/
12+
.gitpod.yml
1213
.vercel/

jest.config.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@ import { Config } from '@jest/types';
33
const options: Config.InitialOptions = {
44
testEnvironment: 'jsdom',
55
preset: 'ts-jest',
6-
globals: {
7-
'ts-jest': {
8-
tsconfig: 'test/tsconfig.json'
9-
}
6+
transform: {
7+
'.+\\.spec\\.tsx?$': ['ts-jest', { tsconfig: 'test/tsconfig.json' }]
108
}
119
};
1210
export default options;

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "web-cell",
3-
"version": "3.0.0-rc.17",
3+
"version": "3.0.0-rc.18",
44
"description": "Web Components engine based on VDOM, JSX, MobX & TypeScript",
55
"keywords": [
66
"web",
@@ -51,7 +51,7 @@
5151
"element-internals-polyfill": "^1.3.11",
5252
"eslint": "^8.57.0",
5353
"eslint-config-prettier": "^9.1.0",
54-
"husky": "^9.1.2",
54+
"husky": "^9.1.3",
5555
"jest": "^29.7.0",
5656
"jest-environment-jsdom": "^29.7.0",
5757
"jsdom": "^24.1.1",
@@ -70,7 +70,7 @@
7070
},
7171
"scripts": {
7272
"prepare": "husky",
73-
"test": "lint-staged",
73+
"test": "lint-staged && jest",
7474
"clean": "rimraf .parcel-cache/ dist/ docs/",
7575
"preview": "npm run clean && cd preview/ && parcel --dist-dir=../docs/preview/ --open",
7676
"pack-preview": "rimraf .parcel-cache/ docs/preview/ && cd preview/ && parcel build --public-url=. --dist-dir=../docs/preview/",

pnpm-lock.yaml

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

source/WebCell.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,19 +56,21 @@ export function component(meta: ComponentMeta) {
5656
{
5757
declare props: WebCellProps;
5858

59-
internals = this.attachInternals();
59+
internals = this.tagName.includes('-')
60+
? this.attachInternals()
61+
: undefined;
6062
renderer = new DOMRenderer();
6163

6264
get root(): ParentNode {
63-
return this.internals.shadowRoot || this;
65+
return (this.internals || this).shadowRoot || this;
6466
}
6567
mounted = false;
6668
declare mountedCallback?: () => any;
6769

6870
constructor() {
6971
super();
7072

71-
if (meta.mode && !this.internals.shadowRoot)
73+
if (meta.mode && !this.internals?.shadowRoot)
7274
this.attachShadow(meta as ShadowRootInit);
7375
}
7476

test/Async.spec.tsx

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,33 @@
11
import 'element-internals-polyfill';
22
import { sleep } from 'web-utility';
3+
import { configure } from 'mobx';
34

4-
import { WebCellProps } from '../source/utility/vDOM';
5-
import { createCell, render } from '../source/renderer';
5+
import { WebCellProps } from '../source/WebCell';
6+
import { DOMRenderer } from 'dom-renderer';
7+
import { FC } from '../source/decorator';
68
import { lazy } from '../source/Async';
79

10+
configure({ enforceActions: 'never' });
11+
812
describe('Async Box component', () => {
13+
const renderer = new DOMRenderer();
14+
915
it('should render an Async Component', async () => {
10-
const Async = lazy(async () => ({
11-
default: ({
12-
defaultSlot,
13-
...props
14-
}: WebCellProps<HTMLAnchorElement>) => (
15-
<a {...props}>{defaultSlot}</a>
16-
)
17-
}));
18-
render(<Async href="test">Test</Async>);
19-
20-
expect(document.body.innerHTML).toBe('<async-box></async-box>');
16+
const Sync: FC<WebCellProps<HTMLAnchorElement>> = ({
17+
children,
18+
...props
19+
}) => <a {...props}>{children}</a>;
20+
21+
const Async = lazy(async () => ({ default: Sync }));
22+
23+
renderer.render(<Async href="test">Test</Async>);
24+
25+
expect(document.body.innerHTML).toBe('<async-cell></async-cell>');
2126

2227
await sleep();
2328

24-
// expect(document.body.innerHTML).toBe(
25-
// '<async-box><a href="test">Test</a></async-box>'
26-
// );
29+
expect(document.body.innerHTML).toBe(
30+
'<async-cell><a href="test">Test</a></async-cell>'
31+
);
2732
});
2833
});

test/MobX.spec.tsx

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,27 @@
11
import 'element-internals-polyfill';
2+
23
import { sleep } from 'web-utility';
3-
import { observable } from 'mobx';
4+
import { configure, observable } from 'mobx';
5+
6+
import { observer, reaction } from '../source/decorator';
7+
import { component } from '../source/WebCell';
8+
import { DOMRenderer } from 'dom-renderer';
49

5-
import { component, observer, reaction } from '../source/decorator';
6-
import { WebCell } from '../source/WebCell';
7-
import { createCell, render } from '../source/renderer';
10+
configure({ enforceActions: 'never' });
811

912
class Test {
1013
@observable
11-
count = 0;
14+
accessor count = 0;
1215
}
1316

1417
describe('Observer decorator', () => {
15-
const model = new Test();
18+
const model = new Test(),
19+
renderer = new DOMRenderer();
1620

1721
it('should re-render Function Component', () => {
1822
const InlineTag = observer(() => <i>{model.count}</i>);
1923

20-
render(<InlineTag />);
24+
renderer.render(<InlineTag />);
2125

2226
expect(document.body.textContent.trim()).toBe('0');
2327

@@ -27,22 +31,18 @@ describe('Observer decorator', () => {
2731
});
2832

2933
it('should re-render Class Component', () => {
30-
@component({
31-
tagName: 'test-tag'
32-
})
34+
@component({ tagName: 'test-tag' })
3335
@observer
34-
class TestTag extends WebCell() {
36+
class TestTag extends HTMLElement {
3537
render() {
3638
return <i>{model.count}</i>;
3739
}
3840
}
39-
40-
render(<TestTag />);
41+
renderer.render(<TestTag />);
4142

4243
expect(document.querySelector('test-tag i').textContent.trim()).toBe(
4344
'1'
4445
);
45-
4646
model.count++;
4747

4848
expect(document.querySelector('test-tag i').textContent.trim()).toBe(
@@ -53,31 +53,29 @@ describe('Observer decorator', () => {
5353
it('should register a Reaction with MobX', async () => {
5454
const handler = jest.fn();
5555

56-
@component({
57-
tagName: 'reaction-cell'
58-
})
56+
@component({ tagName: 'reaction-cell' })
5957
@observer
60-
class ReactionCell extends WebCell() {
58+
class ReactionCell extends HTMLElement {
6159
@observable
62-
test = '';
60+
accessor test = '';
6361

64-
@reaction((element: ReactionCell) => element.test)
62+
@reaction(({ test }) => test)
6563
handleReaction(value: string) {
6664
handler(value);
6765
}
6866
}
69-
render(<ReactionCell />);
67+
renderer.render(<ReactionCell />);
68+
69+
await sleep();
7070

7171
const tag = document.querySelector<ReactionCell>('reaction-cell');
7272
tag.test = 'a';
7373

7474
await sleep();
7575

76-
expect(handler).toBeCalledTimes(1);
77-
expect(handler).toBeCalledWith('a');
76+
expect(handler).toHaveBeenCalledTimes(1);
77+
expect(handler).toHaveBeenCalledWith('a');
7878

7979
document.body.innerHTML = '';
80-
81-
expect(tag.disposers).toHaveLength(0);
8280
});
8381
});

0 commit comments

Comments
 (0)