ledger.test.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. /**
  2. * 标段--台账 模型 单元测试
  3. *
  4. * @author Mai
  5. * @date 2017/12/1
  6. * @version
  7. */
  8. 'use strict';
  9. /* const testNodeData = [
  10. { ledger_id: 1, ledger_pid: -1, order: 1, level: 1, full_path: '1', code: '1' },
  11. { ledger_id: 2, ledger_pid: 1, order: 1, level: 2, full_path: '1.2', code: '1-1' },
  12. { ledger_id: 6, ledger_pid: 2, order: 1, level: 3, full_path: '1.2.6', code: '1-1-1' },
  13. { ledger_id: 7, ledger_pid: 6, order: 1, level: 4, full_path: '1.2.6.7', code: '202-1' },
  14. { ledger_id: 10, ledger_pid: 7, order: 2, level: 5, full_path: '1.2.6.7.10', code: '202-1-a' },
  15. { ledger_id: 9, ledger_pid: 7, order: 1, level: 5, full_path: '1.2.6.7.9', code: '202-1-b' },
  16. { ledger_id: 8, ledger_pid: 6, order: 2, level: 4, full_path: '1.2.6.8', code: '202-2' },
  17. { ledger_id: 11, ledger_pid: 8, order: 1, level: 5, full_path: '1.2.6.8.11', code: '202-2-c' },
  18. { ledger_id: 12, ledger_pid: 8, order: 2, level: 5, full_path: '1.2.6.8.12', code: '202-2-e' },
  19. { ledger_id: 13, ledger_pid: 2, order: 2, level: 3, full_path: '1.2.13', code: '1-1-2' },
  20. { ledger_id: 14, ledger_pid: 2, order: 3, level: 3, full_path: '1.2.14', code: '1-1-3' },
  21. { ledger_id: 3, ledger_pid: 1, order: 2, level: 2, full_path: '1.3', code: '1-2' },
  22. { ledger_id: 4, ledger_pid: 1, order: 3, level: 2, full_path: '1.4', code: '1-3' },
  23. { ledger_id: 5, ledger_pid: 1, order: 4, level: 2, full_path: '1.5', code: '1-4' },
  24. ];*/
  25. const testNodeData = [
  26. { ledger_id: 1, ledger_pid: -1, order: 1, level: 1, full_path: '1', code: '1', is_leaf: false },
  27. { ledger_id: 2, ledger_pid: 1, order: 1, level: 2, full_path: '1.2', code: '1-1', is_leaf: false },
  28. { ledger_id: 6, ledger_pid: 2, order: 1, level: 3, full_path: '1.2.6', code: '1-1-1', is_leaf: false },
  29. { ledger_id: 7, ledger_pid: 6, order: 1, level: 4, full_path: '1.2.6.7', code: '202-1', is_leaf: false },
  30. { ledger_id: 10, ledger_pid: 7, order: 2, level: 5, full_path: '1.2.6.7.10', code: '202-1-a', is_leaf: true },
  31. { ledger_id: 9, ledger_pid: 7, order: 1, level: 5, full_path: '1.2.6.7.9', code: '202-1-b', is_leaf: true },
  32. { ledger_id: 8, ledger_pid: 6, order: 2, level: 4, full_path: '1.2.6.8', code: '202-2', is_leaf: false },
  33. { ledger_id: 11, ledger_pid: 8, order: 1, level: 5, full_path: '1.2.6.8.11', code: '202-2-c', is_leaf: true },
  34. { ledger_id: 12, ledger_pid: 8, order: 2, level: 5, full_path: '1.2.6.8.12', code: '202-2-e', is_leaf: true },
  35. { ledger_id: 13, ledger_pid: 2, order: 2, level: 3, full_path: '1.2.13', code: '1-1-2', is_leaf: true },
  36. { ledger_id: 14, ledger_pid: 2, order: 3, level: 3, full_path: '1.2.14', code: '1-1-3', is_leaf: true },
  37. { ledger_id: 3, ledger_pid: 1, order: 2, level: 2, full_path: '1.3', code: '1-2', is_leaf: false },
  38. { ledger_id: 15, ledger_pid: 3, order: 1, level: 3, full_path: '1.3.15', code: '1-2-1', is_leaf: true },
  39. { ledger_id: 4, ledger_pid: 1, order: 3, level: 2, full_path: '1.4', code: '1-3', is_leaf: false },
  40. { ledger_id: 16, ledger_pid: 4, order: 1, level: 3, full_path: '1.4.16', code: '1-3-1', is_leaf: true },
  41. { ledger_id: 5, ledger_pid: 1, order: 4, level: 2, full_path: '1.5', code: '1-4', is_leaf: true },
  42. ];
  43. const testTenderId = 3;
  44. const { app, assert } = require('egg-mock/bootstrap');
  45. const findById = function(nodes, Id) {
  46. const filters = nodes.filter(function(x) {
  47. return x.ledger_id === Id;
  48. });
  49. return filters.length > 0 ? filters[0] : undefined;
  50. };
  51. describe('test/app/service/ledger.test.js', () => {
  52. // 准备测试数据
  53. it('clear history test data', function* () {
  54. const ctx = app.mockContext();
  55. const result = yield ctx.service.ledger.db.delete(ctx.service.ledger.tableName, { tender_id: testTenderId });
  56. assert(result.affectedRows >= 0);
  57. });
  58. it('add test data', function* () {
  59. const ctx = app.mockContext();
  60. for (const data of testNodeData) {
  61. data.tender_id = testTenderId;
  62. }
  63. const result = yield ctx.service.ledger.db.insert(ctx.service.ledger.tableName, testNodeData);
  64. assert(result.affectedRows === testNodeData.length);
  65. ctx.service.ledger.cache.set('tender_node_maxId:' + testTenderId, 16, 'EX', ctx.app.config.cacheTime);
  66. });
  67. /* 期望运行结果:
  68. 1
  69. ├── 1-1
  70. │ ├── 1-1-1
  71. │ │ ├── 202-1
  72. │ │ │ ├── 202-1-a
  73. │ │ │ └── 202-1-b
  74. │ │ └── 202-2
  75. │ │ ├── 202-2-c
  76. │ │ └── 202-1-3
  77. │ ├── 1-1-2
  78. │ └── 1-1-3
  79. ├── 1-2
  80. │ └── 1-2-1
  81. ├── 1-3
  82. │ └── 1-3-1
  83. └── 1-4
  84. */
  85. // 测试R类方法
  86. it('test getDataByTenderId', function* () {
  87. const ctx = app.mockContext();
  88. // 查询前4层节点
  89. const result1 = yield ctx.service.ledger.getDataByTenderId(testTenderId);
  90. assert(result1.length === 12);
  91. // 查询前3层节点
  92. const result2 = yield ctx.service.ledger.getDataByTenderId(testTenderId, 3);
  93. assert(result2.length === 10);
  94. });
  95. it('test getDataByNodeId', function* () {
  96. const ctx = app.mockContext();
  97. // 查询节点202-1
  98. const node = yield ctx.service.ledger.getDataByNodeId(testTenderId, 7);
  99. assert(node);
  100. assert(node.code === '202-1');
  101. assert(node.full_path === '1.2.6.7');
  102. });
  103. it('test getDataByNodeIds', function* () {
  104. const ctx = app.mockContext();
  105. // 查询节点202-1-a与201-1-b
  106. const result = yield ctx.service.ledger.getDataByNodeIds(testTenderId, [10, 9]);
  107. assert(result.length === 2);
  108. let node = findById(result, 10);
  109. assert(node.code === '202-1-a');
  110. node = findById(result, 9);
  111. assert(node.full_path === '1.2.6.7.9');
  112. });
  113. it('test getLastChildData', function* () {
  114. const ctx = app.mockContext();
  115. // 查询节点202-1最后一个子节点
  116. const result = yield ctx.service.ledger.getLastChildData(testTenderId, 7);
  117. assert(result.ledger_id === 10);
  118. assert(result.full_path === '1.2.6.7.10');
  119. });
  120. it('test getDataByParentAndOrder', function* () {
  121. const ctx = app.mockContext();
  122. // 查询节点202-1 第1子节点
  123. const result1 = yield ctx.service.ledger.getDataByParentAndOrder(testTenderId, 8, 1);
  124. assert(result1.ledger_id === 11);
  125. assert(result1.full_path === '1.2.6.8.11');
  126. // 查询节点1-1 第2/3子节点
  127. const result2 = yield ctx.service.ledger.getDataByParentAndOrder(testTenderId, 2, [2, 3]);
  128. assert(result2.length === 2);
  129. let node = findById(result2, 13);
  130. assert(node);
  131. assert(node.code === '1-1-2');
  132. node = findById(result2, 14);
  133. assert(node);
  134. assert(node.code === '1-1-3');
  135. });
  136. it('test getChildrenByParentId', function* () {
  137. const ctx = app.mockContext();
  138. // 查询节点202-1最后一个子节点
  139. const result = yield ctx.service.ledger.getChildrenByParentId(testTenderId, 8);
  140. assert(result.length === 2);
  141. let node = findById(result, 11);
  142. assert(node);
  143. assert(node.code === '202-2-c');
  144. node = findById(result, 12);
  145. assert(node);
  146. assert(node.full_path === '1.2.6.8.12');
  147. });
  148. it('test getDataByFullPath', function* () {
  149. const ctx = app.mockContext();
  150. // 查询节点202-1最后一个子节点
  151. const result = yield ctx.service.ledger.getDataByFullPath(testTenderId, '1.2.6.8%');
  152. assert(result.length === 3);
  153. let node = findById(result, 8);
  154. assert(node);
  155. assert(node.code === '202-2');
  156. node = findById(result, 11);
  157. assert(node);
  158. assert(node.code === '202-2-c');
  159. node = findById(result, 12);
  160. assert(node);
  161. assert(node.full_path === '1.2.6.8.12');
  162. });
  163. it('test getNextsData', function* () {
  164. const ctx = app.mockContext();
  165. // 查询节点202-1最后一个子节点
  166. const result = yield ctx.service.ledger.getNextsData(testTenderId, 2, 1);
  167. assert(result.length === 2);
  168. let node = findById(result, 13);
  169. assert(node);
  170. assert(node.code === '1-1-2');
  171. node = findById(result, 14);
  172. assert(node);
  173. assert(node.code === '1-1-3');
  174. });
  175. // 测试CUD类方法
  176. it('test addNode', function* () {
  177. const ctx = app.mockContext();
  178. // 选中1-1-1,插入节点
  179. const resultData = yield ctx.service.ledger.addNode(testTenderId, 6);
  180. assert(resultData.create.length === 1);
  181. assert(resultData.update.length === 2);
  182. assert(resultData.create[0].is_leaf === 1);
  183. assert(resultData.create[0].ledger_id === 17);
  184. });
  185. /* 期望运行结果:
  186. 1
  187. ├── 1-1
  188. │ ├── 1-1-1
  189. │ │ ├── 202-1
  190. │ │ │ ├── 202-1-a
  191. │ │ │ └── 202-1-b
  192. │ │ └── 202-2
  193. │ │ ├── 202-2-c
  194. │ │ └── 202-1-3
  195. │ ├── new
  196. │ ├── 1-1-2
  197. │ └── 1-1-3
  198. ├── 1-2
  199. │ └── 1-2-1
  200. ├── 1-3
  201. │ └── 1-3-1
  202. └── 1-4
  203. */
  204. it('test deleteNode', function* () {
  205. const ctx = app.mockContext();
  206. // 选中202-1,删除节点
  207. const resultData = yield ctx.service.ledger.deleteNode(testTenderId, 7);
  208. assert(resultData.delete.length === 3);
  209. assert(resultData.update.length === 1);
  210. });
  211. /* 期望运行结果:
  212. 1
  213. ├── 1-1
  214. │ ├── 1-1-1
  215. │ │ └── 202-2
  216. │ │ ├── 202-2-c
  217. │ │ └── 202-2-e
  218. │ ├── new
  219. │ ├── 1-1-2
  220. │ └── 1-1-3
  221. ├── 1-2
  222. │ └── 1-2-1
  223. ├── 1-3
  224. │ └── 1-3-1
  225. └── 1-4
  226. */
  227. it('test upMoveNode', function* () {
  228. const ctx = app.mockContext();
  229. // 选中202-2-e上移
  230. const resultData = yield ctx.service.ledger.upMoveNode(testTenderId, 12);
  231. resultData.update.sort(function(x, y) {
  232. return x.order - y.order;
  233. });
  234. assert(resultData.update.length === 2);
  235. assert(resultData.update[0].code === '202-2-e');
  236. });
  237. /* 期望运行结果:
  238. 1
  239. ├── 1-1
  240. │ ├── 1-1-1
  241. │ │ └── 202-2
  242. │ │ ├── 202-2-c
  243. │ │ └── 202-2-e
  244. │ ├── new
  245. │ ├── 1-1-2
  246. │ └── 1-1-3
  247. ├── 1-2
  248. │ └── 1-2-1
  249. ├── 1-3
  250. │ └── 1-3-1
  251. └── 1-4
  252. */
  253. it('test downMoveNode', function* () {
  254. const ctx = app.mockContext();
  255. // 选中202-2-e下移
  256. const resultData = yield ctx.service.ledger.downMoveNode(testTenderId, 12);
  257. resultData.update.sort(function(x, y) {
  258. return x.order - y.order;
  259. });
  260. assert(resultData.update.length === 2);
  261. assert(resultData.update[0].code === '202-2-c');
  262. });
  263. /* 期望运行结果:
  264. 1
  265. ├── 1-1
  266. │ ├── 1-1-1
  267. │ │ └── 202-2
  268. │ │ ├── 202-2-c
  269. │ │ └── 202-2-e
  270. │ ├── new
  271. │ ├── 1-1-2
  272. │ └── 1-1-3
  273. ├── 1-2
  274. │ └── 1-2-1
  275. ├── 1-3
  276. │ └── 1-3-1
  277. └── 1-4
  278. */
  279. it('test upLevelNode', function* () {
  280. const ctx = app.mockContext();
  281. // 选中 1-1-2 升级
  282. const resultData = yield ctx.service.ledger.upLevelNode(testTenderId, 13);
  283. assert(resultData);
  284. assert(resultData.update.length === 5);
  285. let node = findById(resultData.update, 13);
  286. assert(node.full_path === '1.13');
  287. assert(node.ledger_pid === 1);
  288. assert(!node.is_leaf);
  289. node = findById(resultData.update, 14);
  290. assert(node.ledger_pid === 13);
  291. assert(node.full_path === '1.13.14');
  292. node = findById(resultData.update, 3);
  293. assert(node.order === 3);
  294. node = findById(resultData.update, 4);
  295. assert(node.order === 4);
  296. node = findById(resultData.update, 5);
  297. assert(node.order === 5);
  298. });
  299. /* 期望运行结果:
  300. 1
  301. ├── 1-1
  302. │ ├── 1-1-1
  303. │ │ └── 202-2
  304. │ │ ├── 202-2-c
  305. │ │ └── 202-2-e
  306. │ └── new
  307. ├── 1-1-2
  308. │ └── 1-1-3
  309. ├── 1-2
  310. │ └── 1-2-1
  311. ├── 1-3
  312. │ └── 1-3-1
  313. └── 1-4
  314. */
  315. it('test downLevelNode', function* () {
  316. const ctx = app.mockContext();
  317. // 选中1-3 降级
  318. const resultData = yield ctx.service.ledger.downLevelNode(testTenderId, 4);
  319. assert(resultData.update.length === 3);
  320. let node = findById(resultData.update, 4);
  321. assert(node.full_path === '1.3.4');
  322. assert(node.ledger_pid === 3);
  323. assert(node.level === 3);
  324. assert(node.order === 2);
  325. node = findById(resultData.update, 16);
  326. assert(node.level === 4);
  327. assert(node.full_path === '1.3.4.16');
  328. node = findById(resultData.update, 5);
  329. assert(node.order === 4);
  330. });
  331. /* 期望运行结果:
  332. 1
  333. ├── 1-1
  334. │ ├── 1-1-1
  335. │ │ └── 202-2
  336. │ │ ├── 202-2-c
  337. │ │ └── 202-2-e
  338. │ └── new
  339. ├── 1-1-2
  340. │ └── 1-1-3
  341. ├── 1-2
  342. │ ├── 1-2-1
  343. │ └── 1-3
  344. │ └── 1-3-1
  345. └── 1-4
  346. */
  347. it('test pasteBlock', function* () {
  348. const ctx = app.mockContext();
  349. // 选中1-2-1, 粘贴1-1-1和new
  350. const resultData = yield ctx.service.ledger.pasteBlock(testTenderId, 15, [6, 17]);
  351. assert(resultData.create.length === 2);
  352. assert(resultData.create[0].order = 2);
  353. assert(resultData.create[0].level = 3);
  354. assert(resultData.create[0].full_path = '1.3.18');
  355. assert(resultData.create[1].order = 3);
  356. assert(resultData.create[1].level = 3);
  357. assert(resultData.create[1].full_path = '1.3.22');
  358. assert(resultData.update.length === 1);
  359. assert(resultData.update[0].order = 3);
  360. });
  361. /* 期望运行结果:
  362. 1
  363. ├── 1-1
  364. │ ├── 1-1-1
  365. │ │ └── 202-2
  366. │ │ ├── 202-2-c
  367. │ │ └── 202-2-e
  368. │ └── new
  369. ├── 1-1-2
  370. │ └── 1-1-3
  371. ├── 1-2
  372. │ ├── 1-2-1
  373. │ ├── 1-1-1
  374. │ │ └── 202-2
  375. │ │ ├── 202-2-c
  376. │ │ └── 202-2-e
  377. │ ├── new
  378. │ └── 1-3
  379. │ └── 1-3-1
  380. └── 1-4
  381. */
  382. it('test updateInfo', function* () {
  383. const ctx = app.mockContext();
  384. // 修改new(id=17)的code 为 1-1-4
  385. const node = yield ctx.service.ledger.getDataByNodeId(testTenderId, 17);
  386. assert(node);
  387. const resultData = yield ctx.service.ledger.updateInfo(testTenderId, {
  388. id: node.id,
  389. tender_id: node.tender_id,
  390. ledger_id: node.ledger_id,
  391. code: '1-1-4',
  392. });
  393. assert(resultData.code === '1-1-4');
  394. });
  395. /* 期望运行结果:
  396. 1
  397. ├── 1-1
  398. │ ├── 1-1-1
  399. │ │ └── 202-2
  400. │ │ ├── 202-2-c
  401. │ │ └── 202-2-e
  402. │ └── 1-1-3
  403. ├── 1-1-2
  404. │ └── 1-1-3
  405. ├── 1-2
  406. │ ├── 1-2-1
  407. │ ├── 1-1-1
  408. │ │ └── 202-2
  409. │ │ ├── 202-2-c
  410. │ │ └── 202-2-e
  411. │ ├── new
  412. │ └── 1-3
  413. │ └── 1-3-1
  414. └── 1-4
  415. */
  416. it('test updateInfos', function* () {
  417. const ctx = app.mockContext();
  418. // 修改new(id=17)的code 为 1-1-4
  419. const node1 = yield ctx.service.ledger.getDataByNodeId(testTenderId, 18);
  420. assert(node1);
  421. const node2 = yield ctx.service.ledger.getDataByNodeId(testTenderId, 22);
  422. assert(node2);
  423. const resultData = yield ctx.service.ledger.updateInfos(testTenderId, [{
  424. id: node1.id,
  425. tender_id: node1.tender_id,
  426. ledger_id: node1.ledger_id,
  427. code: '1-2-2',
  428. }, {
  429. id: node2.id,
  430. tender_id: node2.tender_id,
  431. ledger_id: node2.ledger_id,
  432. code: '1-2-3',
  433. }]);
  434. assert(resultData.length === 2);
  435. assert(resultData[0].code === '1-2-2');
  436. assert(resultData[1].code === '1-2-3');
  437. });
  438. /* 期望运行结果:
  439. 1
  440. ├── 1-1
  441. │ ├── 1-1-1
  442. │ │ └── 202-2
  443. │ │ ├── 202-2-c
  444. │ │ └── 202-2-e
  445. │ └── 1-1-3
  446. ├── 1-1-2
  447. │ └── 1-1-3
  448. ├── 1-2
  449. │ ├── 1-2-1
  450. │ ├── 1-2-2
  451. │ │ └── 202-2
  452. │ │ ├── 202-2-c
  453. │ │ └── 202-2-e
  454. │ ├── 1-2-3
  455. │ └── 1-3
  456. │ └── 1-3-1
  457. └── 1-4
  458. */
  459. });