@forgehive/record-tape 0.1.6 → 0.2.1
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/README.md +385 -0
- package/dist/index.d.ts +10 -35
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -120
- package/dist/index.js.map +1 -1
- package/dist/tests/data-methods.test.d.ts +2 -0
- package/dist/tests/data-methods.test.d.ts.map +1 -0
- package/dist/tests/data-methods.test.js +129 -0
- package/dist/tests/data-methods.test.js.map +1 -0
- package/dist/tests/index.test.js +3 -3
- package/dist/tests/index.test.js.map +1 -1
- package/dist/tests/log-format.test.js +18 -27
- package/dist/tests/log-format.test.js.map +1 -1
- package/dist/tests/mode.test.js +66 -54
- package/dist/tests/mode.test.js.map +1 -1
- package/dist/tests/safe-run.test.js +110 -242
- package/dist/tests/safe-run.test.js.map +1 -1
- package/dist/tests/save.test.js +13 -13
- package/dist/tests/save.test.js.map +1 -1
- package/dist/tests/task-listener.test.js +35 -31
- package/dist/tests/task-listener.test.js.map +1 -1
- package/package.json +4 -4
- package/src/index.ts +34 -164
- package/src/tests/data-methods.test.ts +150 -0
- package/src/tests/index.test.ts +4 -9
- package/src/tests/log-format.test.ts +20 -32
- package/src/tests/safe-run.test.ts +119 -294
- package/src/tests/save.test.ts +19 -19
- package/src/tests/task-listener.test.ts +29 -42
- package/src/tests/mode.test.ts +0 -93
|
@@ -1,281 +1,149 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const index_1 = require("../index");
|
|
4
3
|
const task_1 = require("@forgehive/task");
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
// Create the task
|
|
18
|
-
const task = (0, task_1.createTask)(schema, boundaries, async function ({ value }, { fetchData }) {
|
|
19
|
-
const result = await fetchData(value);
|
|
20
|
-
return { result, success: true };
|
|
21
|
-
});
|
|
22
|
-
// Create a record tape
|
|
23
|
-
const tape = new index_1.RecordTape();
|
|
24
|
-
// Run the task with safeRun and directly use the logItem
|
|
25
|
-
const [result, error, record] = await task.safeRun({ value: 5 });
|
|
26
|
-
tape.push('test-task', record);
|
|
27
|
-
// Verify the execution was successful
|
|
28
|
-
expect(error).toBeNull();
|
|
29
|
-
expect(result).toEqual({ result: 10, success: true });
|
|
30
|
-
// Get the recorded log from the tape
|
|
31
|
-
const recordedLog = tape.getLog();
|
|
32
|
-
// Verify the log was recorded correctly
|
|
33
|
-
expect(recordedLog).toHaveLength(1);
|
|
34
|
-
const logItem = recordedLog[0];
|
|
35
|
-
expect(logItem.name).toEqual('test-task');
|
|
36
|
-
expect(logItem.type).toEqual('success');
|
|
37
|
-
expect(logItem.input).toEqual({ value: 5 });
|
|
38
|
-
expect(logItem.output).toEqual({ result: 10, success: true });
|
|
39
|
-
expect(logItem.boundaries).toEqual({
|
|
40
|
-
fetchData: [{
|
|
41
|
-
input: [5],
|
|
42
|
-
output: 10,
|
|
43
|
-
error: null
|
|
44
|
-
}]
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
it('should record log items from safeRun successfully', async () => {
|
|
48
|
-
// Create a schema
|
|
49
|
-
const schema = new task_1.Schema({
|
|
50
|
-
value: task_1.Schema.number()
|
|
51
|
-
});
|
|
52
|
-
// Define the boundaries
|
|
53
|
-
const boundaries = {
|
|
54
|
-
fetchData: async (value) => {
|
|
55
|
-
return value * 2;
|
|
4
|
+
const index_1 = require("../index");
|
|
5
|
+
describe('Safe run', () => {
|
|
6
|
+
it('Should run a simple task with no boundaries and register to a tape', async () => {
|
|
7
|
+
const tape = new index_1.RecordTape({});
|
|
8
|
+
const task = (0, task_1.createTask)({
|
|
9
|
+
name: 'simple-task',
|
|
10
|
+
schema: new task_1.Schema({
|
|
11
|
+
value: task_1.Schema.number()
|
|
12
|
+
}),
|
|
13
|
+
boundaries: {},
|
|
14
|
+
fn: async ({ value }) => {
|
|
15
|
+
return { doubled: value * 2 };
|
|
56
16
|
}
|
|
57
|
-
};
|
|
58
|
-
// Create the task
|
|
59
|
-
const task = (0, task_1.createTask)(schema, boundaries, async function ({ value }, { fetchData }) {
|
|
60
|
-
const result = await fetchData(value);
|
|
61
|
-
return { result, success: true };
|
|
62
17
|
});
|
|
63
|
-
// Create a record tape
|
|
64
|
-
const tape = new index_1.RecordTape();
|
|
65
|
-
// Add listener to record the log items
|
|
66
18
|
task.addListener((record) => {
|
|
67
|
-
|
|
68
|
-
if (record.boundaries && record.boundaries.fetchData && Array.isArray(record.boundaries.fetchData)) {
|
|
69
|
-
record.boundaries.fetchData = record.boundaries.fetchData.map((entry) => {
|
|
70
|
-
var _a, _b;
|
|
71
|
-
return (Object.assign(Object.assign({}, entry), { error: (_a = entry.error) !== null && _a !== void 0 ? _a : null, output: (_b = entry.output) !== null && _b !== void 0 ? _b : null }));
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
// Cast the record to LogItem type to satisfy TypeScript
|
|
75
|
-
tape.addLogItem('test-task', record);
|
|
19
|
+
tape.push(record);
|
|
76
20
|
});
|
|
77
|
-
//
|
|
21
|
+
// Test simple execution
|
|
78
22
|
const [result, error] = await task.safeRun({ value: 5 });
|
|
79
|
-
// Verify the execution was successful
|
|
80
23
|
expect(error).toBeNull();
|
|
81
|
-
expect(result).toEqual({
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
expect(recordedLog).toHaveLength(1);
|
|
86
|
-
expect(recordedLog[0]).toEqual({
|
|
87
|
-
name: 'test-task',
|
|
24
|
+
expect(result).toEqual({ doubled: 10 });
|
|
25
|
+
const log = tape.getLog();
|
|
26
|
+
expect(log).toHaveLength(1);
|
|
27
|
+
expect(log[0]).toEqual({
|
|
88
28
|
type: 'success',
|
|
89
29
|
input: { value: 5 },
|
|
90
|
-
output: {
|
|
91
|
-
boundaries: {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
output: 10,
|
|
95
|
-
error: null
|
|
96
|
-
}]
|
|
97
|
-
}
|
|
30
|
+
output: { doubled: 10 },
|
|
31
|
+
boundaries: {},
|
|
32
|
+
metadata: {},
|
|
33
|
+
taskName: 'simple-task'
|
|
98
34
|
});
|
|
99
35
|
});
|
|
100
|
-
it('
|
|
101
|
-
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
36
|
+
it('Should run a task with boundaries and register to a tape', async () => {
|
|
37
|
+
const tape = new index_1.RecordTape({});
|
|
38
|
+
const task = (0, task_1.createTask)({
|
|
39
|
+
name: 'test',
|
|
40
|
+
schema: new task_1.Schema({
|
|
41
|
+
value: task_1.Schema.number().min(10).max(20)
|
|
42
|
+
}),
|
|
43
|
+
boundaries: {
|
|
44
|
+
multiply: async (value) => {
|
|
45
|
+
return value * 2;
|
|
110
46
|
}
|
|
111
|
-
|
|
47
|
+
},
|
|
48
|
+
fn: async ({ value }, { multiply }) => {
|
|
49
|
+
const result = await multiply(value);
|
|
50
|
+
return { result, success: result > 10 };
|
|
112
51
|
}
|
|
113
|
-
};
|
|
114
|
-
// Create the task
|
|
115
|
-
const task = (0, task_1.createTask)(schema, boundaries, async function ({ value }, { fetchData }) {
|
|
116
|
-
const result = await fetchData(value);
|
|
117
|
-
return { result, success: true };
|
|
118
52
|
});
|
|
119
|
-
// Create a record tape
|
|
120
|
-
const tape = new index_1.RecordTape();
|
|
121
|
-
// Add listener to record the log items
|
|
122
53
|
task.addListener((record) => {
|
|
123
|
-
|
|
124
|
-
if (record.boundaries && record.boundaries.fetchData && Array.isArray(record.boundaries.fetchData)) {
|
|
125
|
-
record.boundaries.fetchData = record.boundaries.fetchData.map((entry) => {
|
|
126
|
-
var _a, _b;
|
|
127
|
-
return (Object.assign(Object.assign({}, entry), { error: (_a = entry.error) !== null && _a !== void 0 ? _a : null, output: (_b = entry.output) !== null && _b !== void 0 ? _b : null }));
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
// Cast the record to LogItem type to satisfy TypeScript
|
|
131
|
-
tape.addLogItem('test-task', record);
|
|
54
|
+
tape.push(record);
|
|
132
55
|
});
|
|
133
|
-
//
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
expect(
|
|
137
|
-
|
|
138
|
-
expect(error
|
|
139
|
-
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
expect(
|
|
143
|
-
expect(recordedLog[0]).toEqual({
|
|
144
|
-
name: 'test-task',
|
|
56
|
+
// Test invalid input
|
|
57
|
+
let [result, error] = await task.safeRun({ value: 5 });
|
|
58
|
+
expect(error).toBeDefined();
|
|
59
|
+
expect(error === null || error === void 0 ? void 0 : error.message).toContain('Invalid input');
|
|
60
|
+
[result, error] = await task.safeRun({ value: 15 });
|
|
61
|
+
expect(error).toBeNull();
|
|
62
|
+
expect(result).toEqual({ result: 30, success: true });
|
|
63
|
+
const log = tape.getLog();
|
|
64
|
+
expect(log).toHaveLength(2);
|
|
65
|
+
expect(log[0]).toEqual({
|
|
145
66
|
type: 'error',
|
|
146
|
-
input: { value:
|
|
147
|
-
error: '
|
|
67
|
+
input: { value: 5 },
|
|
68
|
+
error: 'Invalid input on: value: Number must be greater than or equal to 10',
|
|
69
|
+
boundaries: {
|
|
70
|
+
multiply: []
|
|
71
|
+
},
|
|
72
|
+
metadata: {},
|
|
73
|
+
taskName: 'test'
|
|
74
|
+
});
|
|
75
|
+
expect(log[1]).toEqual({
|
|
76
|
+
type: 'success',
|
|
77
|
+
input: { value: 15 },
|
|
78
|
+
output: { result: 30, success: true },
|
|
148
79
|
boundaries: {
|
|
149
|
-
|
|
150
|
-
input: [
|
|
151
|
-
|
|
152
|
-
output: null
|
|
80
|
+
multiply: [{
|
|
81
|
+
input: [15],
|
|
82
|
+
output: 30
|
|
153
83
|
}]
|
|
154
|
-
}
|
|
84
|
+
},
|
|
85
|
+
metadata: {},
|
|
86
|
+
taskName: 'test'
|
|
155
87
|
});
|
|
156
88
|
});
|
|
157
|
-
it('
|
|
158
|
-
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
89
|
+
it('Should run a task with boundaries and register errors to a tape', async () => {
|
|
90
|
+
const tape = new index_1.RecordTape({});
|
|
91
|
+
const task = (0, task_1.createTask)({
|
|
92
|
+
name: 'test',
|
|
93
|
+
schema: new task_1.Schema({
|
|
94
|
+
value: task_1.Schema.number()
|
|
95
|
+
}),
|
|
96
|
+
boundaries: {
|
|
97
|
+
divide: async (value) => {
|
|
98
|
+
if (value === 0) {
|
|
99
|
+
throw new Error('Division by zero');
|
|
100
|
+
}
|
|
101
|
+
return 100 / value;
|
|
167
102
|
}
|
|
168
|
-
|
|
103
|
+
},
|
|
104
|
+
fn: async ({ value }, { divide }) => {
|
|
105
|
+
const result = await divide(value);
|
|
106
|
+
return { result };
|
|
169
107
|
}
|
|
170
|
-
};
|
|
171
|
-
// Create the task
|
|
172
|
-
const task = (0, task_1.createTask)(schema, boundaries, async function ({ value }, { fetchData }) {
|
|
173
|
-
const result = await fetchData(value);
|
|
174
|
-
return { result, success: true };
|
|
175
108
|
});
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
expect(
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
const recordedLog = tape.getLog();
|
|
191
|
-
// Verify the error log was recorded correctly
|
|
192
|
-
expect(recordedLog).toHaveLength(1);
|
|
193
|
-
expect(recordedLog[0]).toEqual({
|
|
194
|
-
name: 'test-error',
|
|
109
|
+
task.addListener((record) => {
|
|
110
|
+
tape.push(record);
|
|
111
|
+
});
|
|
112
|
+
// Test division by zero
|
|
113
|
+
const [, error] = await task.safeRun({ value: 0 });
|
|
114
|
+
expect(error).toBeDefined();
|
|
115
|
+
expect(error === null || error === void 0 ? void 0 : error.message).toBe('Division by zero');
|
|
116
|
+
// Test valid input
|
|
117
|
+
const [secondResult, secondError] = await task.safeRun({ value: 10 });
|
|
118
|
+
expect(secondError).toBeNull();
|
|
119
|
+
expect(secondResult).toEqual({ result: 10 });
|
|
120
|
+
const log = tape.getLog();
|
|
121
|
+
expect(log).toHaveLength(2);
|
|
122
|
+
expect(log[0]).toEqual({
|
|
195
123
|
type: 'error',
|
|
196
|
-
input: { value:
|
|
197
|
-
error: '
|
|
124
|
+
input: { value: 0 },
|
|
125
|
+
error: 'Division by zero',
|
|
198
126
|
boundaries: {
|
|
199
|
-
|
|
200
|
-
input: [
|
|
201
|
-
|
|
202
|
-
error: 'Value cannot be negative'
|
|
127
|
+
divide: [{
|
|
128
|
+
input: [0],
|
|
129
|
+
error: 'Division by zero'
|
|
203
130
|
}]
|
|
204
|
-
}
|
|
131
|
+
},
|
|
132
|
+
metadata: {},
|
|
133
|
+
taskName: 'test'
|
|
205
134
|
});
|
|
206
|
-
|
|
207
|
-
it('should handle custom execution records with push', async () => {
|
|
208
|
-
// Create a record tape
|
|
209
|
-
const tape = new index_1.RecordTape();
|
|
210
|
-
// Create a custom execution record
|
|
211
|
-
const customRecord = {
|
|
212
|
-
input: { value: 10 },
|
|
213
|
-
output: { result: 20 },
|
|
214
|
-
boundaries: {
|
|
215
|
-
fetchData: [
|
|
216
|
-
{
|
|
217
|
-
input: [10],
|
|
218
|
-
output: 20
|
|
219
|
-
}
|
|
220
|
-
]
|
|
221
|
-
}
|
|
222
|
-
};
|
|
223
|
-
// Push the custom record
|
|
224
|
-
tape.push('custom-record', customRecord);
|
|
225
|
-
// Get the recorded log from the tape
|
|
226
|
-
const recordedLog = tape.getLog();
|
|
227
|
-
// Verify the log was recorded correctly
|
|
228
|
-
expect(recordedLog).toHaveLength(1);
|
|
229
|
-
expect(recordedLog[0]).toEqual({
|
|
230
|
-
name: 'custom-record',
|
|
135
|
+
expect(log[1]).toEqual({
|
|
231
136
|
type: 'success',
|
|
232
137
|
input: { value: 10 },
|
|
233
|
-
output: { result:
|
|
138
|
+
output: { result: 10 },
|
|
234
139
|
boundaries: {
|
|
235
|
-
|
|
140
|
+
divide: [{
|
|
236
141
|
input: [10],
|
|
237
|
-
output:
|
|
238
|
-
error: null
|
|
142
|
+
output: 10
|
|
239
143
|
}]
|
|
240
144
|
},
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
});
|
|
244
|
-
it('should handle execution records with Promise outputs correctly', async () => {
|
|
245
|
-
// Create a record tape
|
|
246
|
-
const tape = new index_1.RecordTape();
|
|
247
|
-
// Create a custom execution record with a Promise output
|
|
248
|
-
const promiseResult = Promise.resolve({ result: 30 });
|
|
249
|
-
const promiseRecord = {
|
|
250
|
-
input: { value: 15 },
|
|
251
|
-
output: promiseResult,
|
|
252
|
-
boundaries: {
|
|
253
|
-
fetchData: [
|
|
254
|
-
{
|
|
255
|
-
input: [15],
|
|
256
|
-
output: 30
|
|
257
|
-
}
|
|
258
|
-
]
|
|
259
|
-
}
|
|
260
|
-
};
|
|
261
|
-
// Push the record with Promise output using type parameter
|
|
262
|
-
tape.push('promise-record', promiseRecord);
|
|
263
|
-
// Get the recorded log from the tape
|
|
264
|
-
const recordedLog = tape.getLog();
|
|
265
|
-
// Verify the log was recorded correctly, with Promise output set to null
|
|
266
|
-
expect(recordedLog).toHaveLength(1);
|
|
267
|
-
expect(recordedLog[0]).toEqual({
|
|
268
|
-
name: 'promise-record',
|
|
269
|
-
type: 'success',
|
|
270
|
-
input: { value: 15 },
|
|
271
|
-
output: null, // Promise output should be set to null
|
|
272
|
-
boundaries: {
|
|
273
|
-
fetchData: [{
|
|
274
|
-
input: [15],
|
|
275
|
-
output: 30,
|
|
276
|
-
error: null
|
|
277
|
-
}]
|
|
278
|
-
}
|
|
145
|
+
metadata: {},
|
|
146
|
+
taskName: 'test'
|
|
279
147
|
});
|
|
280
148
|
});
|
|
281
149
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-run.test.js","sourceRoot":"","sources":["../../src/tests/safe-run.test.ts"],"names":[],"mappings":";;AAAA,
|
|
1
|
+
{"version":3,"file":"safe-run.test.js","sourceRoot":"","sources":["../../src/tests/safe-run.test.ts"],"names":[],"mappings":"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"}
|
package/dist/tests/save.test.js
CHANGED
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const fs_1 = __importDefault(require("fs"));
|
|
7
7
|
const path_1 = __importDefault(require("path"));
|
|
8
8
|
const index_1 = require("../index");
|
|
9
|
-
const logFileData = '{"
|
|
9
|
+
const logFileData = '{"input":true,"output":true,"boundaries":{},"type":"success","taskName":"name","metadata":{}}\n{"input":true,"error":"invalid data","boundaries":{},"type":"error","taskName":"name","metadata":{}}\n';
|
|
10
10
|
describe('Save to file async', () => {
|
|
11
11
|
it('Save async to existing file(should add new logs)', async () => {
|
|
12
12
|
const tapeFilePath = path_1.default.resolve(__dirname, './fixtures/save');
|
|
@@ -19,8 +19,8 @@ describe('Save to file async', () => {
|
|
|
19
19
|
}
|
|
20
20
|
const tape = new index_1.RecordTape({ path: tapeFilePath });
|
|
21
21
|
await tape.load();
|
|
22
|
-
tape.
|
|
23
|
-
tape.
|
|
22
|
+
tape.push({ input: true, output: true, boundaries: {}, type: 'success', taskName: 'name' });
|
|
23
|
+
tape.push({ input: true, error: 'invalid data', boundaries: {}, type: 'error', taskName: 'name' });
|
|
24
24
|
await tape.save();
|
|
25
25
|
const content = await fs_1.default.promises.readFile(tapeFilePath + '.log', 'utf8');
|
|
26
26
|
expect(tape.getLog().length).toBe(4);
|
|
@@ -30,8 +30,8 @@ describe('Save to file async', () => {
|
|
|
30
30
|
it('Save async to a path of invalid folder', async () => {
|
|
31
31
|
const tapeFilePath = path_1.default.resolve(__dirname, './nowhere/nop');
|
|
32
32
|
const tape = new index_1.RecordTape({ path: tapeFilePath });
|
|
33
|
-
tape.
|
|
34
|
-
tape.
|
|
33
|
+
tape.push({ input: true, output: true, boundaries: {}, type: 'success', taskName: 'name' });
|
|
34
|
+
tape.push({ input: true, error: 'invalid data', boundaries: {}, type: 'error', taskName: 'name' });
|
|
35
35
|
await expect(tape.save()).rejects.toThrow('Folder doesn\'t exists');
|
|
36
36
|
});
|
|
37
37
|
it('Save async to a log file that doesnt exist', async () => {
|
|
@@ -44,8 +44,8 @@ describe('Save to file async', () => {
|
|
|
44
44
|
// console.warn('Didnt found a file to unlink')
|
|
45
45
|
}
|
|
46
46
|
const tape = new index_1.RecordTape({ path: tapeFilePath });
|
|
47
|
-
tape.
|
|
48
|
-
tape.
|
|
47
|
+
tape.push({ input: true, output: true, boundaries: {}, type: 'success', taskName: 'name' });
|
|
48
|
+
tape.push({ input: true, error: 'invalid data', boundaries: {}, type: 'error', taskName: 'name' });
|
|
49
49
|
await tape.save();
|
|
50
50
|
const content = await fs_1.default.promises.readFile(tapeFilePath + '.log', 'utf8');
|
|
51
51
|
expect(content).toBe(logFileData);
|
|
@@ -62,8 +62,8 @@ describe('Save to file sync', () => {
|
|
|
62
62
|
// console.warn('didnt found a file to unlink')
|
|
63
63
|
}
|
|
64
64
|
const tape = new index_1.RecordTape({ path: tapeFilePath });
|
|
65
|
-
tape.
|
|
66
|
-
tape.
|
|
65
|
+
tape.push({ input: true, output: true, boundaries: {}, type: 'success', taskName: 'name' });
|
|
66
|
+
tape.push({ input: true, error: 'invalid data', boundaries: {}, type: 'error', taskName: 'name' });
|
|
67
67
|
tape.saveSync();
|
|
68
68
|
const content = fs_1.default.readFileSync(tapeFilePath + '.log', 'utf8');
|
|
69
69
|
expect(content).toBe(logFileData);
|
|
@@ -71,8 +71,8 @@ describe('Save to file sync', () => {
|
|
|
71
71
|
it('Save sync to a path of invalid folder', () => {
|
|
72
72
|
const tapeFilePath = path_1.default.resolve(__dirname, './nowhere/nop');
|
|
73
73
|
const tape = new index_1.RecordTape({ path: tapeFilePath });
|
|
74
|
-
tape.
|
|
75
|
-
tape.
|
|
74
|
+
tape.push({ input: true, output: true, boundaries: {}, type: 'success', taskName: 'name' });
|
|
75
|
+
tape.push({ input: true, error: 'invalid data', boundaries: {}, type: 'error', taskName: 'name' });
|
|
76
76
|
expect(() => tape.saveSync()).toThrow('Folder doesn\'t exists');
|
|
77
77
|
});
|
|
78
78
|
it('Save sync to a log file that doesnt exist', () => {
|
|
@@ -85,8 +85,8 @@ describe('Save to file sync', () => {
|
|
|
85
85
|
// console.warn('Didnt found a file to unlink')
|
|
86
86
|
}
|
|
87
87
|
const tape = new index_1.RecordTape({ path: tapeFilePath });
|
|
88
|
-
tape.
|
|
89
|
-
tape.
|
|
88
|
+
tape.push({ input: true, output: true, boundaries: {}, type: 'success', taskName: 'name' });
|
|
89
|
+
tape.push({ input: true, error: 'invalid data', boundaries: {}, type: 'error', taskName: 'name' });
|
|
90
90
|
tape.saveSync();
|
|
91
91
|
const content = fs_1.default.readFileSync(tapeFilePath + '.log', 'utf8');
|
|
92
92
|
expect(content).toBe(logFileData);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save.test.js","sourceRoot":"","sources":["../../src/tests/save.test.ts"],"names":[],"mappings":";;;;;AAAA,4CAAmB;AACnB,gDAAuB;AACvB,oCAAqC;AAErC,MAAM,WAAW,GAAG,
|
|
1
|
+
{"version":3,"file":"save.test.js","sourceRoot":"","sources":["../../src/tests/save.test.ts"],"names":[],"mappings":"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"}
|