Skip to content

Commit 2242d4c

Browse files
committed
Init test, fix types
1 parent ff78253 commit 2242d4c

File tree

4 files changed

+116
-7
lines changed

4 files changed

+116
-7
lines changed

package.json

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
"postinstall": "node -r @babel/register .erb/scripts/CheckNativeDep.js && electron-builder install-app-deps && yarn cross-env NODE_ENV=development webpack --config ./.erb/configs/webpack.config.renderer.dev.dll.babel.js && opencollective-postinstall && yarn-deduplicate yarn.lock",
1414
"start": "node -r @babel/register ./.erb/scripts/CheckPortInUse.js && cross-env yarn start:renderer",
1515
"start:main": "cross-env NODE_ENV=development electron -r ./.erb/scripts/BabelRegister ./src/main.dev.ts",
16-
"start:renderer": "cross-env NODE_ENV=development webpack serve --config ./.erb/configs/webpack.config.renderer.dev.babel.js"
16+
"start:renderer": "cross-env NODE_ENV=development webpack serve --config ./.erb/configs/webpack.config.renderer.dev.babel.js",
17+
"test": "jest"
1718
},
1819
"lint-staged": {
1920
"*.{js,jsx,ts,tsx}": [
@@ -112,6 +113,27 @@
112113
"hot",
113114
"reload"
114115
],
116+
"jest": {
117+
"testURL": "http://localhost/",
118+
"moduleNameMapper": {
119+
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/.erb/mocks/fileMock.js",
120+
"\\.(css|less|sass|scss)$": "identity-obj-proxy"
121+
},
122+
"moduleFileExtensions": [
123+
"js",
124+
"jsx",
125+
"ts",
126+
"tsx",
127+
"json"
128+
],
129+
"moduleDirectories": [
130+
"node_modules",
131+
"src/node_modules"
132+
],
133+
"setupFiles": [
134+
"./.erb/scripts/CheckBuildsExist.js"
135+
]
136+
},
115137
"devDependencies": {
116138
"@babel/core": "^7.12.9",
117139
"@babel/plugin-proposal-class-properties": "^7.12.1",
@@ -139,6 +161,7 @@
139161
"@pmmmwh/react-refresh-webpack-plugin": "^0.4.3",
140162
"@teamsupercell/typings-for-css-modules-loader": "^2.4.0",
141163
"@types/history": "4.7.6",
164+
"@types/jest": "^26.0.24",
142165
"@types/node": "14.14.10",
143166
"@types/react": "^16.9.44",
144167
"@types/react-dom": "^16.9.9",
@@ -147,6 +170,7 @@
147170
"@typescript-eslint/eslint-plugin": "^4.8.1",
148171
"@typescript-eslint/parser": "^4.8.1",
149172
"babel-eslint": "^10.1.0",
173+
"babel-jest": "^26.1.0",
150174
"babel-loader": "^8.2.2",
151175
"babel-plugin-dev-expression": "^0.2.2",
152176
"babel-plugin-transform-react-remove-prop-types": "^0.4.24",
@@ -172,13 +196,16 @@
172196
"eslint-import-resolver-webpack": "^0.13.0",
173197
"eslint-plugin-compat": "^3.8.0",
174198
"eslint-plugin-import": "^2.22.0",
199+
"eslint-plugin-jest": "^24.1.3",
175200
"eslint-plugin-jsx-a11y": "6.4.1",
176201
"eslint-plugin-prettier": "^3.1.4",
177202
"eslint-plugin-promise": "^4.2.1",
178203
"eslint-plugin-react": "^7.20.6",
179204
"eslint-plugin-react-hooks": "^4.0.8",
180205
"file-loader": "^6.0.0",
181206
"husky": "^4.2.5",
207+
"identity-obj-proxy": "^3.0.0",
208+
"jest": "^27.0.6",
182209
"lint-staged": "^10.2.11",
183210
"mini-css-extract-plugin": "^1.3.1",
184211
"node-sass": "^5.0.0",
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import TreeModelHelper from './TreeModelHelper';
2+
import TaskFactory from '../modules/tasks/TaskFactory';
3+
import { IJsonTaskModel } from '../modules/tasks/models/TaskModel';
4+
import TasksByProject from '../modules/tasks/models/TasksByProject';
5+
import { ITreeItemWithParent } from '../types/ITreeItem';
6+
7+
describe('TreeModelHelper', () => {
8+
let testTasks: TasksByProject | undefined;
9+
beforeEach(() => {
10+
const factory = new TaskFactory();
11+
const task111: Partial<IJsonTaskModel> = {
12+
key: '111',
13+
title: 'task1-1-1',
14+
parent: null,
15+
children: [],
16+
};
17+
const task11: Partial<IJsonTaskModel> = {
18+
key: '11',
19+
title: 'task1-1',
20+
parent: null,
21+
children: [task111 as IJsonTaskModel],
22+
};
23+
const task1: Partial<IJsonTaskModel> = {
24+
key: '1',
25+
title: 'task1',
26+
parent: null,
27+
children: [task11 as IJsonTaskModel],
28+
};
29+
30+
task111.parent = task11 as IJsonTaskModel;
31+
task11.parent = task1 as IJsonTaskModel;
32+
33+
const task21: Partial<IJsonTaskModel> = {
34+
key: '21',
35+
title: 'task21',
36+
parent: null,
37+
children: [],
38+
};
39+
const task22: Partial<IJsonTaskModel> = {
40+
key: '22',
41+
title: 'task22',
42+
parent: null,
43+
children: [],
44+
};
45+
const task2: Partial<IJsonTaskModel> = {
46+
key: '2',
47+
title: 'task2',
48+
parent: null,
49+
children: [task21, task22] as IJsonTaskModel[],
50+
};
51+
task21.parent = task2 as IJsonTaskModel;
52+
task22.parent = task2 as IJsonTaskModel;
53+
54+
testTasks = factory.createTasks(({
55+
proj: [task1, task2],
56+
} as unknown) as TasksByProject);
57+
});
58+
59+
test('getPathToNode #1', () => {
60+
if (!testTasks) {
61+
throw new Error();
62+
}
63+
const task111 = testTasks.proj[0].children[0].children[0];
64+
expect(TreeModelHelper.getPathToNode(task111)).toStrictEqual([
65+
'1',
66+
'11',
67+
'111',
68+
]);
69+
});
70+
test('getPathToNode #2', () => {
71+
if (!testTasks) {
72+
throw new Error();
73+
}
74+
const task22 = testTasks.proj[1].children[0];
75+
expect(TreeModelHelper.getPathToNode(task22)).toStrictEqual(['2', '21']);
76+
});
77+
78+
test('');
79+
});

src/modules/tasks/models/TaskModel.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { action, computed, makeObservable, observable } from 'mobx';
22
import { isSameDay, startOfDay } from 'date-fns';
33

44
import AbstractModel from '../../../base/AbstractModel';
5-
import { ITreeItem } from '../../../types/ITreeItem';
5+
import { ITreeItem, ITreeItemWithParent } from '../../../types/ITreeItem';
66

77
export interface IJsonTimeRangeModel {
88
start: string;
@@ -16,7 +16,7 @@ export interface ITimeRangeModel {
1616
description?: string;
1717
}
1818

19-
interface IJsonTaskModel extends ITreeItem<IJsonTaskModel> {
19+
export interface IJsonTaskModel extends ITreeItemWithParent {
2020
projectId?: string;
2121
checked?: boolean;
2222
active?: boolean;
@@ -49,11 +49,12 @@ const parseTimeRageItems = (
4949
);
5050
};
5151

52-
export default class TaskModel extends AbstractModel {
52+
export default class TaskModel extends AbstractModel
53+
implements ITreeItemWithParent<TaskModel> {
5354
key: string = '';
5455
title: string = '';
5556
children: TaskModel[] = [];
56-
parent: TaskModel | null = null;
57+
parent: TaskModel | null = null; // update parent on drug&drop
5758
projectId: string = '';
5859
checked: boolean = false;
5960
active: boolean = false;

src/types/ITreeItem.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ export interface ITreeItem<T extends ITreeItem<any> = ITreeItem<any>> {
44
children?: T[];
55
}
66

7-
export interface ITreeItemWithParent extends ITreeItem<ITreeItemWithParent> {
8-
parent: ITreeItemWithParent | undefined;
7+
export interface ITreeItemWithParent<
8+
T extends ITreeItemWithParent<any> = ITreeItemWithParent<any>
9+
> extends ITreeItem<T> {
10+
parent: T | null;
911
}

0 commit comments

Comments
 (0)