core-3nweb-client-lib 0.44.11 → 0.45.0

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.
Files changed (206) hide show
  1. package/build/core/asmail/msg/opener.js +1 -1
  2. package/build/core/asmail/msg/packer.js +1 -1
  3. package/build/core/index.d.ts +2 -2
  4. package/build/core/keyring/correspondent-keys.js +1 -1
  5. package/build/core/keyring/index.js +1 -1
  6. package/build/core/startup/sign-in.d.ts +1 -1
  7. package/build/core/startup/sign-up.d.ts +1 -1
  8. package/build/core/storage/index.d.ts +1 -1
  9. package/build/lib-client/key-derivation.d.ts +1 -1
  10. package/build/lib-client/xsp-fs/attrs.d.ts +3 -2
  11. package/build/lib-client/xsp-fs/attrs.js +7 -6
  12. package/build/lib-client/xsp-fs/folder-node.js +1 -1
  13. package/build/lib-client/xsp-fs/node-in-fs.js +1 -0
  14. package/build/lib-client/xsp-fs/node-persistence.js +1 -1
  15. package/build/lib-client/xsp-fs/xsp-payload-v2.js +1 -1
  16. package/build/tests/caps-api/asmail/specs/events.d.ts +2 -0
  17. package/build/tests/caps-api/asmail/specs/events.js +63 -0
  18. package/build/tests/caps-api/asmail/specs/send-to-wrong-address.d.ts +2 -0
  19. package/build/tests/caps-api/asmail/specs/send-to-wrong-address.js +68 -0
  20. package/build/tests/caps-api/asmail/specs/send-with-attacment-from-storage.d.ts +2 -0
  21. package/build/tests/caps-api/asmail/specs/send-with-attacment-from-storage.js +259 -0
  22. package/build/tests/caps-api/asmail/specs/send-without-attachments.d.ts +2 -0
  23. package/build/tests/caps-api/asmail/specs/send-without-attachments.js +90 -0
  24. package/build/tests/caps-api/asmail/test-utils.d.ts +12 -0
  25. package/build/tests/caps-api/asmail/test-utils.js +60 -0
  26. package/build/tests/caps-api/asmail.js +86 -0
  27. package/build/tests/caps-api/file-sink-checks/different-cases.d.ts +2 -0
  28. package/build/tests/caps-api/file-sink-checks/different-cases.js +47 -0
  29. package/build/tests/caps-api/file-sink-checks/splice.d.ts +2 -0
  30. package/build/tests/caps-api/file-sink-checks/splice.js +122 -0
  31. package/build/tests/caps-api/file-sink-checks/truncate.d.ts +2 -0
  32. package/build/tests/caps-api/file-sink-checks/truncate.js +122 -0
  33. package/build/tests/caps-api/fs-checks/local-to-synced-linking/link.d.ts +2 -0
  34. package/build/tests/caps-api/fs-checks/local-to-synced-linking/link.js +82 -0
  35. package/build/tests/caps-api/fs-checks/local-to-synced-linking/reversed-linking.d.ts +2 -0
  36. package/build/tests/caps-api/fs-checks/local-to-synced-linking/reversed-linking.js +50 -0
  37. package/build/tests/caps-api/fs-checks/not-versioned/deleteFile.d.ts +2 -0
  38. package/build/tests/caps-api/fs-checks/not-versioned/deleteFile.js +73 -0
  39. package/build/tests/caps-api/fs-checks/not-versioned/deleteFolder.d.ts +2 -0
  40. package/build/tests/caps-api/fs-checks/not-versioned/deleteFolder.js +75 -0
  41. package/build/tests/caps-api/fs-checks/not-versioned/getByteSink.d.ts +2 -0
  42. package/build/tests/caps-api/fs-checks/not-versioned/getByteSink.js +96 -0
  43. package/build/tests/caps-api/fs-checks/not-versioned/getByteSource.d.ts +2 -0
  44. package/build/tests/caps-api/fs-checks/not-versioned/getByteSource.js +67 -0
  45. package/build/tests/caps-api/fs-checks/not-versioned/getXAttr.d.ts +2 -0
  46. package/build/tests/caps-api/fs-checks/not-versioned/getXAttr.js +77 -0
  47. package/build/tests/caps-api/fs-checks/not-versioned/link.d.ts +2 -0
  48. package/build/tests/caps-api/fs-checks/not-versioned/link.js +115 -0
  49. package/build/tests/caps-api/fs-checks/not-versioned/listFolder.d.ts +2 -0
  50. package/build/tests/caps-api/fs-checks/not-versioned/listFolder.js +129 -0
  51. package/build/tests/caps-api/fs-checks/not-versioned/listXAttrs.d.ts +2 -0
  52. package/build/tests/caps-api/fs-checks/not-versioned/listXAttrs.js +73 -0
  53. package/build/tests/caps-api/fs-checks/not-versioned/makeFolder.d.ts +2 -0
  54. package/build/tests/caps-api/fs-checks/not-versioned/makeFolder.js +95 -0
  55. package/build/tests/caps-api/fs-checks/not-versioned/move.d.ts +2 -0
  56. package/build/tests/caps-api/fs-checks/not-versioned/move.js +127 -0
  57. package/build/tests/caps-api/fs-checks/not-versioned/readBytes.d.ts +2 -0
  58. package/build/tests/caps-api/fs-checks/not-versioned/readBytes.js +80 -0
  59. package/build/tests/caps-api/fs-checks/not-versioned/readJSONFile.d.ts +2 -0
  60. package/build/tests/caps-api/fs-checks/not-versioned/readJSONFile.js +59 -0
  61. package/build/tests/caps-api/fs-checks/not-versioned/readLink.d.ts +2 -0
  62. package/build/tests/caps-api/fs-checks/not-versioned/readLink.js +39 -0
  63. package/build/tests/caps-api/fs-checks/not-versioned/readTxtFile.d.ts +2 -0
  64. package/build/tests/caps-api/fs-checks/not-versioned/readTxtFile.js +54 -0
  65. package/build/tests/caps-api/fs-checks/not-versioned/readonlyFile.d.ts +2 -0
  66. package/build/tests/caps-api/fs-checks/not-versioned/readonlyFile.js +55 -0
  67. package/build/tests/caps-api/fs-checks/not-versioned/readonlySubRoot.d.ts +2 -0
  68. package/build/tests/caps-api/fs-checks/not-versioned/readonlySubRoot.js +55 -0
  69. package/build/tests/caps-api/fs-checks/not-versioned/select.d.ts +2 -0
  70. package/build/tests/caps-api/fs-checks/not-versioned/select.js +119 -0
  71. package/build/tests/caps-api/fs-checks/not-versioned/stat.d.ts +2 -0
  72. package/build/tests/caps-api/fs-checks/not-versioned/stat.js +96 -0
  73. package/build/tests/caps-api/fs-checks/not-versioned/updateXAttrs.d.ts +2 -0
  74. package/build/tests/caps-api/fs-checks/not-versioned/updateXAttrs.js +126 -0
  75. package/build/tests/caps-api/fs-checks/not-versioned/writableFile.d.ts +2 -0
  76. package/build/tests/caps-api/fs-checks/not-versioned/writableFile.js +79 -0
  77. package/build/tests/caps-api/fs-checks/not-versioned/writableSubRoot.d.ts +2 -0
  78. package/build/tests/caps-api/fs-checks/not-versioned/writableSubRoot.js +90 -0
  79. package/build/tests/caps-api/fs-checks/not-versioned/writeBytes.d.ts +2 -0
  80. package/build/tests/caps-api/fs-checks/not-versioned/writeBytes.js +137 -0
  81. package/build/tests/caps-api/fs-checks/not-versioned/writeJSONFile.d.ts +2 -0
  82. package/build/tests/caps-api/fs-checks/not-versioned/writeJSONFile.js +101 -0
  83. package/build/tests/caps-api/fs-checks/not-versioned/writeTxtFile.d.ts +2 -0
  84. package/build/tests/caps-api/fs-checks/not-versioned/writeTxtFile.js +100 -0
  85. package/build/tests/caps-api/fs-checks/sync-on-one-dev/startUpload.d.ts +2 -0
  86. package/build/tests/caps-api/fs-checks/sync-on-one-dev/startUpload.js +187 -0
  87. package/build/tests/caps-api/fs-checks/sync-on-one-dev/stat.d.ts +2 -0
  88. package/build/tests/caps-api/fs-checks/sync-on-one-dev/stat.js +70 -0
  89. package/build/tests/caps-api/fs-checks/sync-on-one-dev/status.d.ts +2 -0
  90. package/build/tests/caps-api/fs-checks/sync-on-one-dev/status.js +53 -0
  91. package/build/tests/caps-api/fs-checks/sync-on-one-dev/upload.d.ts +2 -0
  92. package/build/tests/caps-api/fs-checks/sync-on-one-dev/upload.js +194 -0
  93. package/build/tests/caps-api/fs-checks/sync-with-two-devs/conflicts.d.ts +2 -0
  94. package/build/tests/caps-api/fs-checks/sync-with-two-devs/conflicts.js +396 -0
  95. package/build/tests/caps-api/fs-checks/sync-with-two-devs/update-propagation.d.ts +2 -0
  96. package/build/tests/caps-api/fs-checks/sync-with-two-devs/update-propagation.js +229 -0
  97. package/build/tests/caps-api/fs-checks/test-utils.d.ts +34 -0
  98. package/build/tests/caps-api/fs-checks/test-utils.js +95 -0
  99. package/build/tests/caps-api/fs-checks/versioned/archiveCurrent.d.ts +2 -0
  100. package/build/tests/caps-api/fs-checks/versioned/archiveCurrent.js +73 -0
  101. package/build/tests/caps-api/fs-checks/versioned/getByteSink.d.ts +2 -0
  102. package/build/tests/caps-api/fs-checks/versioned/getByteSink.js +122 -0
  103. package/build/tests/caps-api/fs-checks/versioned/getByteSource.d.ts +2 -0
  104. package/build/tests/caps-api/fs-checks/versioned/getByteSource.js +71 -0
  105. package/build/tests/caps-api/fs-checks/versioned/listFolder.d.ts +2 -0
  106. package/build/tests/caps-api/fs-checks/versioned/listFolder.js +109 -0
  107. package/build/tests/caps-api/fs-checks/versioned/listVersions.d.ts +2 -0
  108. package/build/tests/caps-api/fs-checks/versioned/listVersions.js +48 -0
  109. package/build/tests/caps-api/fs-checks/versioned/readBytes.d.ts +2 -0
  110. package/build/tests/caps-api/fs-checks/versioned/readBytes.js +90 -0
  111. package/build/tests/caps-api/fs-checks/versioned/readJSONFile.d.ts +2 -0
  112. package/build/tests/caps-api/fs-checks/versioned/readJSONFile.js +60 -0
  113. package/build/tests/caps-api/fs-checks/versioned/readTxtFile.d.ts +2 -0
  114. package/build/tests/caps-api/fs-checks/versioned/readTxtFile.js +56 -0
  115. package/build/tests/caps-api/fs-checks/versioned/stat.d.ts +2 -0
  116. package/build/tests/caps-api/fs-checks/versioned/stat.js +80 -0
  117. package/build/tests/caps-api/fs-checks/versioned/watchFile.d.ts +2 -0
  118. package/build/tests/caps-api/fs-checks/versioned/watchFile.js +64 -0
  119. package/build/tests/caps-api/fs-checks/versioned/writeBytes.d.ts +2 -0
  120. package/build/tests/caps-api/fs-checks/versioned/writeBytes.js +128 -0
  121. package/build/tests/caps-api/fs-checks/versioned/writeJSONFile.d.ts +2 -0
  122. package/build/tests/caps-api/fs-checks/versioned/writeJSONFile.js +111 -0
  123. package/build/tests/caps-api/fs-checks/versioned/writeTxtFile.d.ts +2 -0
  124. package/build/tests/caps-api/fs-checks/versioned/writeTxtFile.js +107 -0
  125. package/build/tests/caps-api/fs-checks/with-core-restarts/xattrs.d.ts +2 -0
  126. package/build/tests/caps-api/fs-checks/with-core-restarts/xattrs.js +50 -0
  127. package/build/tests/caps-api/keyrings.js +69 -0
  128. package/build/tests/caps-api/mailerid.d.ts +1 -0
  129. package/build/tests/caps-api/mailerid.js +59 -0
  130. package/build/tests/caps-api/startup/signin-empty-cache.d.ts +1 -0
  131. package/build/tests/caps-api/startup/signin-empty-cache.js +108 -0
  132. package/build/tests/caps-api/startup/signin-with-cache.d.ts +1 -0
  133. package/build/tests/caps-api/startup/signin-with-cache.js +83 -0
  134. package/build/tests/caps-api/startup/signup-with-token.d.ts +1 -0
  135. package/build/tests/caps-api/startup/signup-with-token.js +53 -0
  136. package/build/tests/caps-api/startup/signup.d.ts +1 -0
  137. package/build/tests/caps-api/startup/signup.js +86 -0
  138. package/build/tests/caps-api/storage.d.ts +1 -0
  139. package/build/tests/caps-api/storage.js +225 -0
  140. package/build/tests/computer.3nweb.core/id-manager.d.ts +1 -0
  141. package/build/tests/computer.3nweb.core/id-manager.js +78 -0
  142. package/build/tests/computer.3nweb.core/inbox/msg-indexing.d.ts +1 -0
  143. package/build/tests/computer.3nweb.core/inbox/msg-indexing.js +145 -0
  144. package/build/tests/computer.3nweb.core/keyrings.d.ts +1 -0
  145. package/build/tests/computer.3nweb.core/keyrings.js +64 -0
  146. package/build/tests/computer.3nweb.core/test-utils.d.ts +21 -0
  147. package/build/tests/computer.3nweb.core/test-utils.js +92 -0
  148. package/build/tests/jasmine.d.ts +1 -0
  149. package/build/tests/jasmine.js +45 -0
  150. package/build/tests/libs-for-tests/bytes-equal.d.ts +1 -0
  151. package/build/tests/libs-for-tests/bytes-equal.js +32 -0
  152. package/build/tests/libs-for-tests/caps-ipc-wrap.d.ts +11 -0
  153. package/build/tests/libs-for-tests/caps-ipc-wrap.js +55 -0
  154. package/build/tests/libs-for-tests/core-runner.d.ts +39 -0
  155. package/build/tests/libs-for-tests/core-runner.js +231 -0
  156. package/build/tests/libs-for-tests/jasmine-utils.d.ts +13 -0
  157. package/build/tests/libs-for-tests/jasmine-utils.js +110 -0
  158. package/build/tests/libs-for-tests/json-equal.d.ts +1 -0
  159. package/build/tests/libs-for-tests/json-equal.js +78 -0
  160. package/build/tests/libs-for-tests/services-runner.d.ts +18 -0
  161. package/build/tests/libs-for-tests/services-runner.js +64 -0
  162. package/build/tests/libs-for-tests/setups.d.ts +51 -0
  163. package/build/tests/libs-for-tests/setups.js +305 -0
  164. package/build/tests/libs-for-tests/spec-module.d.ts +16 -0
  165. package/build/tests/libs-for-tests/spec-module.js +92 -0
  166. package/build/tests/libs-for-tests/startup.d.ts +1 -0
  167. package/build/tests/libs-for-tests/startup.js +29 -0
  168. package/build/tests/libs-for-tests/watching.d.ts +7 -0
  169. package/build/tests/libs-for-tests/watching.js +33 -0
  170. package/build/tests/units/canonical-address.d.ts +1 -0
  171. package/build/tests/units/canonical-address.js +41 -0
  172. package/build/tests/units/device-fs.d.ts +1 -0
  173. package/build/tests/units/device-fs.js +70 -0
  174. package/build/tests/units/folder-node-serialization.d.ts +1 -0
  175. package/build/tests/units/folder-node-serialization.js +74 -0
  176. package/build/tests/units/mid-sigs-NaCl-Ed.d.ts +1 -0
  177. package/build/tests/units/mid-sigs-NaCl-Ed.js +123 -0
  178. package/build/tests/units/number-line.d.ts +1 -0
  179. package/build/tests/units/number-line.js +63 -0
  180. package/build/tests/units/obj-folders.d.ts +1 -0
  181. package/build/tests/units/obj-folders.js +152 -0
  182. package/package.json +11 -3
  183. package/postinstall.js +1 -1
  184. package/build/cryptors.d.ts +0 -1
  185. package/build/cryptors.js +0 -34
  186. package/build/lib-client/cryptor/cryptor-in-worker.d.ts +0 -20
  187. package/build/lib-client/cryptor/cryptor-in-worker.js +0 -357
  188. package/build/lib-client/cryptor/cryptor-wasm.js +0 -1
  189. package/build/lib-client/cryptor/cryptor.d.ts +0 -30
  190. package/build/lib-client/cryptor/cryptor.js +0 -44
  191. package/build/lib-client/cryptor/cryptor.wasm +0 -0
  192. package/build/lib-client/cryptor/in-proc-js.d.ts +0 -2
  193. package/build/lib-client/cryptor/in-proc-js.js +0 -57
  194. package/build/lib-client/cryptor/in-proc-wasm.d.ts +0 -2
  195. package/build/lib-client/cryptor/in-proc-wasm.js +0 -176
  196. package/build/lib-client/cryptor/serialization-for-wasm.d.ts +0 -35
  197. package/build/lib-client/cryptor/serialization-for-wasm.js +0 -57
  198. package/build/lib-client/cryptor/wasm-mp1-modules.d.ts +0 -5
  199. package/build/lib-client/cryptor/wasm-mp1-modules.js +0 -78
  200. package/build/lib-client/cryptor/worker-js.js +0 -131
  201. package/build/lib-client/cryptor/worker-wasm.js +0 -37
  202. package/build/protos/cryptor.proto.js +0 -1804
  203. /package/build/lib-client/{cryptor/cryptor-work-labels.d.ts → cryptor-work-labels.d.ts} +0 -0
  204. /package/build/lib-client/{cryptor/cryptor-work-labels.js → cryptor-work-labels.js} +0 -0
  205. /package/build/{lib-client/cryptor/worker-js.d.ts → tests/caps-api/asmail.d.ts} +0 -0
  206. /package/build/{lib-client/cryptor/worker-wasm.d.ts → tests/caps-api/keyrings.d.ts} +0 -0
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (C) 2016 - 2018, 2020 3NSoft Inc.
4
+
5
+ This program is free software: you can redistribute it and/or modify it under
6
+ the terms of the GNU General Public License as published by the Free Software
7
+ Foundation, either version 3 of the License, or (at your option) any later
8
+ version.
9
+
10
+ This program is distributed in the hope that it will be useful, but
11
+ WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
+ See the GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License along with
16
+ this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.specs = void 0;
20
+ const test_utils_1 = require("../test-utils");
21
+ const sleep_1 = require("../../../../lib-common/processes/sleep");
22
+ const json_equal_1 = require("../../../libs-for-tests/json-equal");
23
+ exports.specs = {
24
+ description: '.sendMsg',
25
+ its: []
26
+ };
27
+ const it = {
28
+ expectation: 'send message to existing address and get it'
29
+ };
30
+ it.func = async function (s) {
31
+ const u1_w3n = s.testAppCapsByUserIndex(0);
32
+ const u2 = s.users[1];
33
+ const txtBody = 'Some text\nBlah-blah-blah';
34
+ const htmlBody = `Some html. Note that core isn't looking/checking this`;
35
+ const jsonBody = {
36
+ field1: 123,
37
+ field2: 'blah-blah'
38
+ };
39
+ // user 1 sends message to user 2
40
+ const recipient = u2.userId;
41
+ const outMsg = {
42
+ msgType: 'mail',
43
+ plainTxtBody: txtBody,
44
+ htmlTxtBody: htmlBody,
45
+ jsonBody
46
+ };
47
+ const idForSending = 'a4b5';
48
+ await u1_w3n.mail.delivery.addMsg([recipient], outMsg, idForSending);
49
+ expect(await u1_w3n.mail.delivery.currentState(idForSending)).toBeTruthy();
50
+ const notifs = [];
51
+ await new Promise((resolve, reject) => {
52
+ const observer = {
53
+ next: (p) => { notifs.push(p); },
54
+ complete: resolve, error: reject
55
+ };
56
+ const cbDetach = u1_w3n.mail.delivery.observeDelivery(idForSending, observer);
57
+ expect(typeof cbDetach).toBe('function');
58
+ });
59
+ expect(notifs.length).toBeGreaterThan(0);
60
+ const lastInfo = notifs[notifs.length - 1];
61
+ expect(typeof lastInfo).toBe('object');
62
+ expect(lastInfo.allDone).toBe('all-ok');
63
+ (0, test_utils_1.throwDeliveryErrorFrom)(lastInfo);
64
+ await u1_w3n.mail.delivery.rmMsg(idForSending);
65
+ await u1_w3n.mail.delivery.rmMsg(idForSending); // noop after first rm
66
+ expect(await u1_w3n.mail.delivery.currentState(idForSending)).toBeFalsy();
67
+ const recInfo = lastInfo.recipients[recipient];
68
+ expect(typeof recInfo.bytesSent).toBe('number');
69
+ expect(typeof recInfo.idOnDelivery).toBe('string');
70
+ const msgId = recInfo.idOnDelivery;
71
+ expect(msgId).toBeTruthy();
72
+ // user 2 checks messages after some delay
73
+ await (0, sleep_1.sleep)(500);
74
+ const u2_w3n = s.testAppCapsByUser(u2);
75
+ const msgs = await u2_w3n.mail.inbox.listMsgs();
76
+ const msgInfo = msgs.find(m => (m.msgId === msgId));
77
+ expect(msgInfo).withContext(`message ${msgId} should be present in a list of all messages`).not.toBeUndefined();
78
+ expect(msgInfo.msgType).toBe('mail');
79
+ const inMsg = await u2_w3n.mail.inbox.getMsg(msgId);
80
+ expect(inMsg).toBeTruthy();
81
+ expect(inMsg.msgId).toBe(msgId);
82
+ expect(inMsg.msgType).toBe('mail');
83
+ expect(inMsg.plainTxtBody).toBe(txtBody);
84
+ expect(inMsg.htmlTxtBody).toBe(htmlBody);
85
+ expect((0, json_equal_1.deepEqual)(inMsg.jsonBody, jsonBody)).toBeTrue();
86
+ await u2_w3n.mail.inbox.removeMsg(msgId);
87
+ await u2_w3n.mail.inbox.removeMsg(msgId); // second call is a noop
88
+ };
89
+ exports.specs.its.push(it);
90
+ Object.freeze(exports);
@@ -0,0 +1,12 @@
1
+ import { SpecIt as GenericSpecIt } from "../../libs-for-tests/spec-module";
2
+ import { MultiUserSetup } from "../../libs-for-tests/setups";
3
+ type commonW3N = web3n.caps.common.W3N;
4
+ /**
5
+ * This function to be run in renderer's context via execExpects
6
+ * @param recipient
7
+ * @param txtBody
8
+ */
9
+ export declare function sendTxtMsg(w3n: commonW3N, recipient: string, txtBody: string): Promise<string>;
10
+ export type SpecIt = GenericSpecIt<MultiUserSetup>;
11
+ export declare function throwDeliveryErrorFrom(lastNotif: web3n.asmail.DeliveryProgress): void;
12
+ export {};
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (C) 2017 - 2018, 2020 3NSoft Inc.
4
+
5
+ This program is free software: you can redistribute it and/or modify it under
6
+ the terms of the GNU General Public License as published by the Free Software
7
+ Foundation, either version 3 of the License, or (at your option) any later
8
+ version.
9
+
10
+ This program is distributed in the hope that it will be useful, but
11
+ WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
+ See the GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License along with
16
+ this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.sendTxtMsg = sendTxtMsg;
20
+ exports.throwDeliveryErrorFrom = throwDeliveryErrorFrom;
21
+ const assert_1 = require("../../../lib-common/assert");
22
+ const error_1 = require("../../../lib-common/exceptions/error");
23
+ /**
24
+ * This function to be run in renderer's context via execExpects
25
+ * @param recipient
26
+ * @param txtBody
27
+ */
28
+ async function sendTxtMsg(w3n, recipient, txtBody) {
29
+ const msg = {
30
+ msgType: 'mail',
31
+ plainTxtBody: txtBody
32
+ };
33
+ const idForSending = 'd5b6';
34
+ await w3n.mail.delivery.addMsg([recipient], msg, idForSending);
35
+ expect(await w3n.mail.delivery.currentState(idForSending)).toBeTruthy();
36
+ const lastInfo = await new Promise((resolve, reject) => {
37
+ let lastInfo;
38
+ w3n.mail.delivery.observeDelivery(idForSending, {
39
+ next: info => (lastInfo = info),
40
+ complete: () => resolve(lastInfo),
41
+ error: reject
42
+ });
43
+ });
44
+ expect(typeof lastInfo).toBe('object');
45
+ expect(lastInfo.allDone).toBe('all-ok');
46
+ throwDeliveryErrorFrom(lastInfo);
47
+ await w3n.mail.delivery.rmMsg(idForSending);
48
+ expect(await w3n.mail.delivery.currentState(idForSending)).toBeFalsy();
49
+ const recInfo = lastInfo.recipients[recipient];
50
+ expect(typeof recInfo.idOnDelivery).toBe('string');
51
+ return recInfo.idOnDelivery;
52
+ }
53
+ function throwDeliveryErrorFrom(lastNotif) {
54
+ (0, assert_1.assert)(!!lastNotif.allDone, `Given delivery notification is not last`);
55
+ for (const info of Object.values(lastNotif.recipients)) {
56
+ if (info.err) {
57
+ throw (0, error_1.errWithCause)(info.err, `Error occured in message delivery:\n${(0, error_1.stringifyErr)(info.err)}`);
58
+ }
59
+ }
60
+ }
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (C) 2016, 2018, 2020 3NSoft Inc.
4
+
5
+ This program is free software: you can redistribute it and/or modify it under
6
+ the terms of the GNU General Public License as published by the Free Software
7
+ Foundation, either version 3 of the License, or (at your option) any later
8
+ version.
9
+
10
+ This program is distributed in the hope that it will be useful, but
11
+ WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
+ See the GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License along with
16
+ this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ const jasmine_utils_1 = require("../libs-for-tests/jasmine-utils");
20
+ const setups_1 = require("../libs-for-tests/setups");
21
+ const spec_module_1 = require("../libs-for-tests/spec-module");
22
+ const path_1 = require("path");
23
+ const assert_1 = require("../../lib-common/assert");
24
+ describe('ASMail', () => {
25
+ const s = (0, setups_1.setupWithUsers)(true, ['Bob Perkins @company.inc', 'John Morrison @bank.com']);
26
+ beforeAll(() => {
27
+ (0, assert_1.assert)(s.users.length >= 2, `at least two users should be set up`);
28
+ });
29
+ (0, jasmine_utils_1.itCond)('mail is present in common CAPs', async () => {
30
+ (0, assert_1.assert)(s.users.length > 0);
31
+ for (const u of s.users) {
32
+ const w3n = s.testAppCapsByUser(u);
33
+ expect(typeof w3n.mail).toBe('object');
34
+ expect(typeof w3n.mail.delivery).toBe('object');
35
+ expect(typeof w3n.mail.inbox).toBe('object');
36
+ expect(typeof w3n.mail.config).toBe('object');
37
+ expect(typeof w3n.mail.getUserId).toBe('function');
38
+ }
39
+ }, undefined, s);
40
+ (0, jasmine_utils_1.itCond)('gets current user id', async () => {
41
+ (0, assert_1.assert)(s.users.length > 0);
42
+ for (const u of s.users) {
43
+ const w3n = s.testAppCapsByUser(u);
44
+ const userId = await w3n.mail.getUserId();
45
+ expect(userId).toBe(u.userId);
46
+ }
47
+ }, undefined, s);
48
+ describe(`config`, () => {
49
+ let config;
50
+ beforeAll(() => {
51
+ config = s.testAppCapsByUserIndex(0).mail.config;
52
+ });
53
+ (0, jasmine_utils_1.itCond)(`shows parameter' values on the server`, async () => {
54
+ const initPubKey = await config.getOnServer('init-pub-key');
55
+ expect(typeof initPubKey).toBe('object');
56
+ const anonSenderPolicy = await config.getOnServer('anon-sender/policy');
57
+ expect(anonSenderPolicy).toBeTruthy();
58
+ expect(typeof anonSenderPolicy.accept).toBe('boolean');
59
+ expect(typeof anonSenderPolicy.defaultMsgSize).toBe('number');
60
+ const anonSenderInvites = await config.getOnServer('anon-sender/invites');
61
+ expect(anonSenderInvites).toBeTruthy();
62
+ expect(typeof anonSenderInvites).toBe('object');
63
+ }, undefined, s);
64
+ (0, jasmine_utils_1.itCond)(`sets parameter' values on the server`, async () => {
65
+ // some paramaters can be set directly
66
+ let anonSenderPolicy = await config.getOnServer('anon-sender/policy');
67
+ const newDefaultMsgSize = anonSenderPolicy.defaultMsgSize + 42;
68
+ anonSenderPolicy.defaultMsgSize = newDefaultMsgSize;
69
+ await config.setOnServer('anon-sender/policy', anonSenderPolicy);
70
+ anonSenderPolicy = await config.getOnServer('anon-sender/policy');
71
+ expect(anonSenderPolicy.defaultMsgSize).toBe(newDefaultMsgSize);
72
+ // but public key should be set via keyring cap, and not here
73
+ await config.setOnServer('init-pub-key', null).then(() => fail(`public key shouldn't be set directly`), err => expect(err).toBeTruthy());
74
+ }, undefined, s);
75
+ });
76
+ (0, jasmine_utils_1.itCond)('inbox lists incoming messages (no messages)', async () => {
77
+ (0, assert_1.assert)(s.users.length > 0);
78
+ for (const u of s.users) {
79
+ const w3n = s.testAppCapsByUser(u);
80
+ const msgs = await w3n.mail.inbox.listMsgs();
81
+ expect(Array.isArray(msgs)).toBe(true);
82
+ expect(msgs.length).toBe(0);
83
+ }
84
+ }, undefined, s);
85
+ (0, spec_module_1.loadSpecs)(s, (0, path_1.join)(__dirname, 'asmail', 'specs'));
86
+ });
@@ -0,0 +1,2 @@
1
+ import { SpecDescribe } from '../../libs-for-tests/spec-module';
2
+ export declare const specs: SpecDescribe;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (C) 2020 3NSoft Inc.
4
+
5
+ This program is free software: you can redistribute it and/or modify it under
6
+ the terms of the GNU General Public License as published by the Free Software
7
+ Foundation, either version 3 of the License, or (at your option) any later
8
+ version.
9
+
10
+ This program is distributed in the hope that it will be useful, but
11
+ WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
+ See the GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License along with
16
+ this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.specs = void 0;
20
+ const random_node_1 = require("../../../lib-common/random-node");
21
+ exports.specs = {
22
+ description: 'gives file sink',
23
+ its: []
24
+ // ,focused:true
25
+ };
26
+ let it = { expectation: 'to write big chunks' };
27
+ it.func = async function (s) {
28
+ const { testFS } = s;
29
+ // XXX This is WIP. This catches bug, presumably in writing stage.
30
+ const fileName = 'big file';
31
+ const sink = await testFS.getByteSink(fileName, { create: true });
32
+ // write big chunk
33
+ const bytes = await (0, random_node_1.bytes)(1000000);
34
+ await sink.splice(0, bytes.length, bytes);
35
+ // console.log(` -> layout after splice: ${JSON.stringify(await sink.showLayout(), null, 2)}`);
36
+ await sink.done();
37
+ console.log(`Reading file ${fileName}`);
38
+ const fileContent = await testFS.readBytes(fileName)
39
+ .catch((err) => {
40
+ console.log(err.cause);
41
+ throw err;
42
+ });
43
+ console.log(` file content length ${fileContent.length}`);
44
+ // XXX add some expect checks
45
+ };
46
+ // specs.its.push(it);
47
+ Object.freeze(exports);
@@ -0,0 +1,2 @@
1
+ import { SpecDescribe } from '../../libs-for-tests/spec-module';
2
+ export declare const specs: SpecDescribe;
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (C) 2020 3NSoft Inc.
4
+
5
+ This program is free software: you can redistribute it and/or modify it under
6
+ the terms of the GNU General Public License as published by the Free Software
7
+ Foundation, either version 3 of the License, or (at your option) any later
8
+ version.
9
+
10
+ This program is distributed in the hope that it will be useful, but
11
+ WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
+ See the GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License along with
16
+ this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.specs = void 0;
20
+ const random_node_1 = require("../../../lib-common/random-node");
21
+ const bytes_equal_1 = require("../../libs-for-tests/bytes-equal");
22
+ exports.specs = {
23
+ description: 'gives file sinks, able to splice file content',
24
+ its: []
25
+ };
26
+ let it = { expectation: 'of a newly created file' };
27
+ it.func = async function (s) {
28
+ const { testFS } = s;
29
+ function expectSection(l, sectionInd, src, ofs, len) {
30
+ const section = l.sections[sectionInd];
31
+ if (section) {
32
+ expect(section.src).withContext(`wrong source in section ${sectionInd}`).toBe(src);
33
+ expect(section.ofs).withContext(`wrong offset in section ${sectionInd}`).toBe(ofs);
34
+ expect(section.len).withContext(`wrong length in section ${sectionInd}`).toBe(len);
35
+ }
36
+ else {
37
+ fail(`section index ${sectionInd} is not in layout with ${l.sections.length} sections`);
38
+ }
39
+ }
40
+ const fName = 'file1';
41
+ const sink = await testFS.getByteSink(fName, { create: true, exclusive: true });
42
+ let size = await sink.getSize();
43
+ expect(size).toBe(0);
44
+ let layout = await sink.showLayout();
45
+ expect(Array.isArray(layout.sections)).toBeTruthy();
46
+ expect(layout.sections.length).toBe(0);
47
+ const chunk1 = (0, random_node_1.bytesSync)(10000);
48
+ await sink.splice(0, chunk1.length, chunk1);
49
+ size = await sink.getSize();
50
+ expect(size).toBe(10000);
51
+ layout = await sink.showLayout();
52
+ expect(layout.sections.length).toBe(1);
53
+ expectSection(layout, 0, 'new', 0, size);
54
+ const chunk2 = (0, random_node_1.bytesSync)(100);
55
+ await sink.splice(11000, 0, chunk2);
56
+ size = await sink.getSize();
57
+ layout = await sink.showLayout();
58
+ if (testFS.type === 'device') {
59
+ expect(layout.sections.length).toBe(1);
60
+ expectSection(layout, 0, 'new', 0, size);
61
+ }
62
+ else {
63
+ expect(layout.sections.length).toBe(3);
64
+ expectSection(layout, 0, 'new', 0, 10000);
65
+ expectSection(layout, 1, 'empty', 10000, 1000);
66
+ expectSection(layout, 2, 'new', 11000, 100);
67
+ }
68
+ await sink.done();
69
+ const content = await testFS.readBytes(fName);
70
+ expect(content.length).toBe(size);
71
+ expect((0, bytes_equal_1.bytesEqual)(content.subarray(0, 10000), chunk1)).toBe(true);
72
+ expect((0, bytes_equal_1.bytesEqual)(content.subarray(11000), chunk2)).toBe(true);
73
+ };
74
+ exports.specs.its.push(it);
75
+ it = { expectation: 'of an existing file without inserting new bytes' };
76
+ it.func = async function (s) {
77
+ const { testFS } = s;
78
+ function expectSection(l, sectionInd, src, ofs, len) {
79
+ const section = l.sections[sectionInd];
80
+ if (section) {
81
+ expect(section.src).withContext(`source in section ${sectionInd}`).toBe(src);
82
+ expect(section.ofs).withContext(`offset in section ${sectionInd}`).toBe(ofs);
83
+ expect(section.len).withContext(`length in section ${sectionInd}`).toBe(len);
84
+ }
85
+ else {
86
+ fail(`section indexes ${sectionInd} is not in layout with ${l.sections.length} sections`);
87
+ }
88
+ }
89
+ // setup original file
90
+ const fName = 'file1';
91
+ let sink = await testFS.getByteSink(fName, { create: true, exclusive: true });
92
+ const chunk1 = (0, random_node_1.bytesSync)(10000);
93
+ await sink.splice(0, chunk1.length, chunk1);
94
+ const chunk2 = (0, random_node_1.bytesSync)(100);
95
+ await sink.splice(11000, 0, chunk2);
96
+ await sink.done();
97
+ const initSize = await sink.getSize();
98
+ // sink for this test
99
+ sink = await testFS.getByteSink(fName, { create: false });
100
+ await sink.splice(5000, 4000);
101
+ let size = await sink.getSize();
102
+ expect(size).toBe(initSize - 4000);
103
+ let layout = await sink.showLayout();
104
+ if (testFS.type === 'device') {
105
+ expect(layout.sections.length).toBe(1);
106
+ expectSection(layout, 0, 'new', 0, size);
107
+ }
108
+ else {
109
+ expect(layout.sections.length).toBe(3);
110
+ expectSection(layout, 0, 'base', 0, 6000);
111
+ expectSection(layout, 1, 'empty', 6000, 1000);
112
+ expectSection(layout, 2, 'base', 7000, 100);
113
+ }
114
+ await sink.done();
115
+ const content = await testFS.readBytes(fName);
116
+ expect(content.length).toBe(size);
117
+ expect((0, bytes_equal_1.bytesEqual)(content.subarray(0, 5000), chunk1.subarray(0, 5000))).toBe(true);
118
+ expect((0, bytes_equal_1.bytesEqual)(content.subarray(5000, 6000), chunk1.subarray(9000))).toBe(true);
119
+ expect((0, bytes_equal_1.bytesEqual)(content.subarray(7000), chunk2)).toBe(true);
120
+ };
121
+ exports.specs.its.push(it);
122
+ Object.freeze(exports);
@@ -0,0 +1,2 @@
1
+ import { SpecDescribe } from '../../libs-for-tests/spec-module';
2
+ export declare const specs: SpecDescribe;
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (C) 2020 3NSoft Inc.
4
+
5
+ This program is free software: you can redistribute it and/or modify it under
6
+ the terms of the GNU General Public License as published by the Free Software
7
+ Foundation, either version 3 of the License, or (at your option) any later
8
+ version.
9
+
10
+ This program is distributed in the hope that it will be useful, but
11
+ WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
+ See the GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License along with
16
+ this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.specs = void 0;
20
+ const random_node_1 = require("../../../lib-common/random-node");
21
+ const bytes_equal_1 = require("../../libs-for-tests/bytes-equal");
22
+ exports.specs = {
23
+ description: 'gives file sinks, able to truncate file content',
24
+ its: []
25
+ };
26
+ let it = { expectation: 'of a newly created file' };
27
+ it.func = async function (s) {
28
+ const { testFS } = s;
29
+ function expectSection(l, sectionInd, src, ofs, len) {
30
+ const section = l.sections[sectionInd];
31
+ if (section) {
32
+ expect(section.src).withContext(`source in section ${sectionInd}`).toBe(src);
33
+ expect(section.ofs).withContext(`offset in section ${sectionInd}`).toBe(ofs);
34
+ expect(section.len).withContext(`length in section ${sectionInd}`).toBe(len);
35
+ }
36
+ else {
37
+ fail(`section index ${sectionInd} is not in layout with ${l.sections.length} sections`);
38
+ }
39
+ }
40
+ const fName = 'file1';
41
+ const sink = await testFS.getByteSink(fName, { create: true, exclusive: true });
42
+ let size = await sink.getSize();
43
+ expect(size).toBe(0);
44
+ let layout = await sink.showLayout();
45
+ expect(Array.isArray(layout.sections)).toBeTruthy();
46
+ expect(layout.sections.length).toBe(0);
47
+ await sink.truncate(10000);
48
+ size = await sink.getSize();
49
+ expect(size).toBe(10000);
50
+ layout = await sink.showLayout();
51
+ expect(layout.sections.length).toBe(1);
52
+ if (testFS.type === 'device') {
53
+ expectSection(layout, 0, 'new', 0, 10000);
54
+ }
55
+ else {
56
+ expectSection(layout, 0, 'empty', 0, 10000);
57
+ }
58
+ const chunk = (0, random_node_1.bytesSync)(10000);
59
+ await sink.splice(0, chunk.length, chunk);
60
+ size = await sink.getSize();
61
+ expect(size).toBe(10000);
62
+ layout = await sink.showLayout();
63
+ expect(layout.sections.length).toBe(1);
64
+ expectSection(layout, 0, 'new', 0, size);
65
+ await sink.truncate(5000);
66
+ size = await sink.getSize();
67
+ expect(size).toBe(5000);
68
+ layout = await sink.showLayout();
69
+ expect(layout.sections.length).toBe(1);
70
+ expectSection(layout, 0, 'new', 0, size);
71
+ await sink.done();
72
+ const content = await testFS.readBytes(fName);
73
+ expect(content.length).toBe(size);
74
+ expect((0, bytes_equal_1.bytesEqual)(content, chunk.subarray(0, size))).toBe(true);
75
+ };
76
+ exports.specs.its.push(it);
77
+ it = {
78
+ expectation: 'and supports truncating without writing to file (scenario 1), checking version',
79
+ notIncludedIn: 'device-fs'
80
+ };
81
+ it.func = async function (s) {
82
+ const { testFS } = s;
83
+ async function checkSizeOf(file, expectedSize, expectedVersion) {
84
+ const { size, version } = await testFS.stat(file);
85
+ expect(size).withContext(`file size of "${file}"`).toBe(expectedSize);
86
+ expect(version).withContext(`file version`).toBe(expectedVersion);
87
+ }
88
+ const file = 'file to truncate';
89
+ let fileVersion = await testFS.v.writeTxtFile(file, '', { create: true, exclusive: true });
90
+ await checkSizeOf(file, 0, fileVersion);
91
+ let { sink, version } = await testFS.v.getByteSink(file, {});
92
+ await sink.truncate(500);
93
+ await sink.done();
94
+ await checkSizeOf(file, 500, version);
95
+ ({ sink, version } = await testFS.v.getByteSink(file, {}));
96
+ await sink.truncate(100);
97
+ await sink.done();
98
+ await checkSizeOf(file, 100, version);
99
+ };
100
+ exports.specs.its.push(it);
101
+ it = {
102
+ expectation: 'and supports truncating without writing to file (scenario 1), without checking versions'
103
+ };
104
+ it.func = async function (s) {
105
+ const { testFS } = s;
106
+ async function checkSizeOf(file, expectedSize) {
107
+ const { size, version } = await testFS.stat(file);
108
+ expect(size).withContext(`file size of "${file}"`).toBe(expectedSize);
109
+ }
110
+ const file = 'file to truncate';
111
+ await testFS.writeTxtFile(file, '', { create: true, exclusive: true });
112
+ await checkSizeOf(file, 0);
113
+ let sink = await testFS.getByteSink(file, {});
114
+ await sink.truncate(500);
115
+ await sink.done();
116
+ await checkSizeOf(file, 500);
117
+ sink = await testFS.getByteSink(file, {});
118
+ await sink.truncate(100);
119
+ await sink.done();
120
+ await checkSizeOf(file, 100);
121
+ };
122
+ exports.specs.its.push(it);
@@ -0,0 +1,2 @@
1
+ import { SpecDescribe } from '../../../libs-for-tests/spec-module';
2
+ export declare const specs: SpecDescribe;
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (C) 2016, 2018, 2020 3NSoft Inc.
4
+
5
+ This program is free software: you can redistribute it and/or modify it under
6
+ the terms of the GNU General Public License as published by the Free Software
7
+ Foundation, either version 3 of the License, or (at your option) any later
8
+ version.
9
+
10
+ This program is distributed in the hope that it will be useful, but
11
+ WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
+ See the GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License along with
16
+ this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.specs = void 0;
20
+ exports.specs = {
21
+ description: '.link, when linking from local into synced storage,',
22
+ its: []
23
+ };
24
+ let it = { expectation: 'links readonly file' };
25
+ it.func = async function (s) {
26
+ const { syncedTestFS, localTestFS } = s;
27
+ const original = 'Should I be at BlackHat conference or working?';
28
+ const fName = 'file1';
29
+ await syncedTestFS.writeTxtFile(fName, original);
30
+ let file = await syncedTestFS.readonlyFile(fName);
31
+ const linkPath = 'link1';
32
+ await localTestFS.link(linkPath, file);
33
+ const link = await localTestFS.readLink(linkPath);
34
+ expect(link.isFile).withContext('this link should be for a file').toBe(true);
35
+ expect(link.readonly).withContext('this link should be readonly').toBe(true);
36
+ file = (await link.target());
37
+ expect(!!file).withContext('target should be instantiated').toBe(true);
38
+ expect(await file.readTxt()).toBe(original);
39
+ expect(file.writable).toBe(false);
40
+ };
41
+ exports.specs.its.push(it);
42
+ it = { expectation: 'links writable file' };
43
+ it.func = async function (s) {
44
+ const { syncedTestFS, localTestFS } = s;
45
+ const original = 'Should I be at BlackHat conference or working?';
46
+ const fName = 'file1';
47
+ await syncedTestFS.writeTxtFile(fName, original);
48
+ let file = await syncedTestFS.writableFile(fName);
49
+ const linkPath = 'link1';
50
+ await localTestFS.link(linkPath, file);
51
+ const link = await localTestFS.readLink(linkPath);
52
+ expect(link.isFile).withContext('this link should be for a file').toBe(true);
53
+ expect(link.readonly).withContext('this link should be writable').toBe(false);
54
+ file = (await link.target());
55
+ expect(!!file).withContext('target should be instantiated').toBe(true);
56
+ expect(await file.readTxt()).toBe(original);
57
+ const newTxt = 'I better work. A-a-a!!!';
58
+ await file.writeTxt(newTxt);
59
+ expect(await file.readTxt()).toBe(newTxt);
60
+ };
61
+ exports.specs.its.push(it);
62
+ it = { expectation: 'links writable folder' };
63
+ it.func = async function (s) {
64
+ const { syncedTestFS, localTestFS } = s;
65
+ const original = 'Should I be at BlackHat conference or working?';
66
+ const folderName = 'folder1';
67
+ const fName = 'file1';
68
+ await syncedTestFS.writeTxtFile(`${folderName}/${fName}`, original);
69
+ let folder = await syncedTestFS.writableSubRoot(folderName);
70
+ const linkPath = 'link1';
71
+ await localTestFS.link(linkPath, folder);
72
+ const link = await localTestFS.readLink(linkPath);
73
+ expect(link.isFolder).withContext('this link should be for a folder').toBe(true);
74
+ expect(link.readonly).withContext('this link should be writable').toBe(false);
75
+ folder = (await link.target());
76
+ expect(!!folder).withContext('target should be instantiated').toBe(true);
77
+ expect(await folder.readTxtFile(fName)).toBe(original);
78
+ const newTxt = 'I better work. A-a-a!!!';
79
+ await folder.writeTxtFile(fName, newTxt);
80
+ expect(await folder.readTxtFile(fName)).toBe(newTxt);
81
+ };
82
+ exports.specs.its.push(it);
@@ -0,0 +1,2 @@
1
+ import { SpecDescribe } from '../../../libs-for-tests/spec-module';
2
+ export declare const specs: SpecDescribe;