Skip to content

Commit 8473866

Browse files
committed
fixed some test, added tests for diff
1 parent 82140a7 commit 8473866

11 files changed

Lines changed: 179 additions & 65 deletions

File tree

workers/grouper/src/data-filter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { EventAddons, EventDataAccepted } from '@hawk.so/types';
1+
import type { EventAddons, EventDataAccepted } from '@hawk.so/types';
22
import { unsafeFields } from '../../../lib/utils/unsafeFields';
33

44
/**

workers/grouper/src/index.ts

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import * as utils from '../../../lib/utils';
66
import { Worker } from '../../../lib/worker';
77
import * as WorkerNames from '../../../lib/workerNames';
88
import * as pkg from '../package.json';
9-
import { GroupWorkerTask, RepetitionDelta } from '../types/group-worker-task';
10-
import { EventAddons, EventDataAccepted, GroupedEventDBScheme, RepetitionDBScheme } from '@hawk.so/types';
9+
import type { GroupWorkerTask, RepetitionDelta } from '../types/group-worker-task';
10+
import type { EventAddons, EventDataAccepted, GroupedEventDBScheme, RepetitionDBScheme } from '@hawk.so/types';
1111
import { DatabaseReadWriteError, DiffCalculationError, ValidationError } from '../../../lib/workerErrors';
1212
import { decodeUnsafeFields, encodeUnsafeFields } from '../../../lib/utils/unsafeFields';
1313
import HawkCatcher from '@hawk.so/nodejs';
@@ -23,21 +23,6 @@ import TimeMs from '../../../lib/utils/time';
2323
*/
2424
const DB_DUPLICATE_KEY_ERROR = '11000';
2525

26-
/**
27-
* @todo encodeUnsafeFields/decodeUnsafeFields should process both "payload" and "delta" fields
28-
* @todo cover repetition save with tests. Test various cases:
29-
* - original event has no backtrace
30-
* - original event has backtrace
31-
* - repetition has no backtrace
32-
* - repetition has backtrace
33-
* - backtrace is different
34-
* - original event has no context.somefield
35-
* - original event has context.somefield
36-
* - repetition has no context.somefield
37-
* - repetition has context.somefield
38-
* (etc)
39-
*/
40-
4126
/**
4227
* Worker for handling Javascript events
4328
*/
@@ -212,7 +197,7 @@ export default class GrouperWorker extends Worker {
212197
const newRepetition = {
213198
groupHash: uniqueEventHash,
214199
delta: JSON.stringify(delta),
215-
timestamp: task.event.timestamp
200+
timestamp: task.event.timestamp,
216201
} as RepetitionDBScheme;
217202

218203
repetitionId = await this.saveRepetition(task.projectId, newRepetition);
@@ -510,7 +495,7 @@ export default class GrouperWorker extends Worker {
510495
* @returns {string} cache key for event
511496
*/
512497
private async getEventCacheKey(projectId: string, groupHash: string): Promise<string> {
513-
return `${projectId}:${JSON.stringify({ groupHash: groupHash })}`;
498+
return `${projectId}:${JSON.stringify({ groupHash })}`;
514499
}
515500

516501
/**

workers/grouper/src/redisHelper.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import HawkCatcher from '@hawk.so/nodejs';
2-
import { createClient, RedisClientType } from 'redis';
2+
import type { RedisClientType } from 'redis';
3+
import { createClient } from 'redis';
34
import createLogger from '../../../lib/logger';
45

56
/**

workers/grouper/src/utils/repetitionDiff.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
import { EventAddons, EventDataAccepted } from "@hawk.so/types";
2-
import { diff } from "@n1ru4l/json-patch-plus";
3-
import { RepetitionDelta } from "../../types/group-worker-task";
1+
import type { EventAddons, EventDataAccepted } from '@hawk.so/types';
2+
import { diff } from '@n1ru4l/json-patch-plus';
3+
import type { RepetitionDelta } from '../../types/group-worker-task';
44

55
/**
66
* Calculate delta between original event and repetition
7+
*
78
* @param originalEvent - first event
89
* @param repetition - one of remaining events
910
* @returns delta

workers/grouper/tests/data-filter.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import '../../../env-test';
2-
import { EventAddons, EventDataAccepted, Json } from '@hawk.so/types';
2+
import type { EventAddons, EventDataAccepted, Json } from '@hawk.so/types';
33
import DataFilter from '../src/data-filter';
44
jest.mock('amqplib');
55

workers/grouper/tests/diff.test.ts

Lines changed: 100 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import { generateEvent } from './mocks/generateEvent';
88
* Check that we always can get the whole repetition by applying delta to the original event
99
*/
1010
describe('Diff', () => {
11-
it('saved delta should allow to get the original repetition using patch', () => {
12-
const originalEvent = generateEvent()
11+
it('Original event has backtrace, repetition has no backtrace, merged event has no backtrace', () => {
12+
const originalEvent = generateEvent();
1313

1414
const repetition = generateEvent({
1515
backtrace: null,
@@ -26,5 +26,102 @@ describe('Diff', () => {
2626
});
2727

2828
expect(patched).toEqual(repetition);
29-
})
29+
});
30+
it('Original event has no backtrace, repetition has backtrace, merged event has backtrace', () => {
31+
const originalEvent = generateEvent({
32+
backtrace: null,
33+
context: {
34+
testField: 10,
35+
},
36+
});
37+
38+
const repetition = generateEvent({
39+
backtrace: [
40+
{
41+
file: 'test.ts',
42+
line: 10,
43+
},
44+
],
45+
});
46+
47+
const delta = computeDelta(originalEvent, repetition);
48+
49+
const patched = patch({
50+
left: originalEvent,
51+
delta,
52+
});
53+
54+
expect(patched).toEqual(repetition);
55+
});
56+
57+
it('Original event and repetition have different backtrace', () => {
58+
const originalEvent = generateEvent({
59+
backtrace: [
60+
{
61+
file: 'test.ts',
62+
line: 10,
63+
},
64+
],
65+
});
66+
67+
const repetition = generateEvent({
68+
backtrace: [
69+
{
70+
file: 'test.ts',
71+
line: 11,
72+
},
73+
],
74+
});
75+
76+
const delta = computeDelta(originalEvent, repetition);
77+
78+
const patched = patch({
79+
left: originalEvent,
80+
delta,
81+
});
82+
83+
expect(patched.backtrace).toEqual(repetition.backtrace);
84+
});
85+
86+
it('Original event has context with "someField" and repetition has no "someField"', () => {
87+
const originalEvent = generateEvent({
88+
context: {
89+
someField: 'someValue',
90+
},
91+
});
92+
93+
const repetition = generateEvent({
94+
context: {},
95+
});
96+
97+
const delta = computeDelta(originalEvent, repetition);
98+
99+
const patched = patch({
100+
left: originalEvent,
101+
delta,
102+
});
103+
104+
expect(patched.context).toEqual(repetition.context);
105+
});
106+
107+
it('Original event has no context with "someField" and repetition has "someField"', () => {
108+
const originalEvent = generateEvent({
109+
context: {},
110+
});
111+
112+
const repetition = generateEvent({
113+
context: {
114+
someField: 'someValue',
115+
},
116+
});
117+
118+
const delta = computeDelta(originalEvent, repetition);
119+
120+
const patched = patch({
121+
left: originalEvent,
122+
delta,
123+
});
124+
125+
expect(patched.context).toEqual(repetition.context);
126+
});
30127
});

workers/grouper/tests/index.test.ts

Lines changed: 53 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
import '../../../env-test';
22
import GrouperWorker from '../src';
3-
import { GroupWorkerTask } from '../types/group-worker-task';
4-
import { createClient, RedisClientType } from 'redis';
5-
import { Collection, MongoClient } from 'mongodb';
6-
import { EventAddons, EventDataAccepted } from '@hawk.so/types';
3+
import type { GroupWorkerTask, RepetitionDelta } from '../types/group-worker-task';
4+
import type { RedisClientType } from 'redis';
5+
import { createClient } from 'redis';
6+
import type { Collection } from 'mongodb';
7+
import { MongoClient } from 'mongodb';
8+
import type { EventAddons, EventDataAccepted } from '@hawk.so/types';
79
import { MS_IN_SEC } from '../../../lib/utils/consts';
810
import * as mongodb from 'mongodb';
11+
import { patch } from '@n1ru4l/json-patch-plus';
912

1013
jest.mock('amqplib');
1114

@@ -374,7 +377,7 @@ describe('GrouperWorker', () => {
374377
}).toArray()).length).toBe(2);
375378
});
376379

377-
test('Should stringify payload`s addons and context fields', async () => {
380+
test('Should stringify delta', async () => {
378381
const generatedTask = generateTask();
379382

380383
await worker.handle(generateTask());
@@ -389,35 +392,39 @@ describe('GrouperWorker', () => {
389392

390393
const savedRepetition = await repetitionsCollection.findOne({});
391394

392-
expect(typeof savedRepetition.payload.addons).toBe('string');
393-
expect(typeof savedRepetition.payload.context).toBe('string');
395+
expect(typeof savedRepetition.delta).toBe('string');
394396
});
395397

396398
test('Should correctly calculate diff after encoding original event when they are the same', async () => {
397-
await worker.handle(generateTask());
398-
await worker.handle(generateTask());
399+
await worker.handle(generateTask({ user: { id: '123' } }));
400+
await worker.handle(generateTask({ user: { id: '123' } }));
399401

400402
const savedRepetition = await repetitionsCollection.findOne({});
401-
const savedPayload = savedRepetition.payload as EventDataAccepted<EventAddons>;
402403

403-
expect(savedPayload.title).toBe(undefined);
404-
expect(savedPayload.type).toBe(undefined);
405-
expect(savedPayload.backtrace).toBe(undefined);
406-
expect(savedPayload.context).toBe(undefined);
407-
expect(savedPayload.addons).toBe(undefined);
408-
expect(savedPayload.release).toBe(undefined);
409-
expect(savedPayload.user).toBe(undefined);
410-
expect(savedPayload.catcherVersion).toBe(undefined);
404+
const savedDelta = savedRepetition.delta as string;
405+
const parsedDelta = JSON.parse(savedDelta) as RepetitionDelta;
406+
407+
console.log('parsedDelta', parsedDelta);
408+
409+
expect(parsedDelta.type).toBe(undefined);
410+
expect(parsedDelta.backtrace).toBe(undefined);
411+
expect(parsedDelta.context).toBe(undefined);
412+
expect(parsedDelta.addons).toBe(undefined);
413+
expect(parsedDelta.release).toBe(undefined);
414+
expect(parsedDelta.user).toBe(undefined);
415+
expect(parsedDelta.catcherVersion).toBe(undefined);
411416

412417
/**
413418
* Timestamp always unique, so it should be present in a stored payload diff
414419
*/
415-
expect(savedPayload.timestamp).not.toBe(undefined);
416-
expect(typeof savedPayload.timestamp).toBe('number');
420+
expect(parsedDelta.timestamp).not.toBe(undefined);
421+
expect(typeof parsedDelta.timestamp).toBe('object');
417422
});
418423

419424
test('Should correctly calculate diff after encoding original event when they are different', async () => {
420-
await worker.handle(generateTask());
425+
const originalGeneratedEvent = generateTask();
426+
427+
await worker.handle(originalGeneratedEvent);
421428

422429
const generatedTask = generateTask();
423430

@@ -436,11 +443,33 @@ describe('GrouperWorker', () => {
436443
},
437444
});
438445

446+
const savedEvent = await eventsCollection.findOne({});
439447
const savedRepetition = await repetitionsCollection.findOne({});
440-
const savedPayload = savedRepetition.payload as EventDataAccepted<EventAddons>;
448+
const savedDelta = savedRepetition.delta as string;
449+
const parsedDelta = JSON.parse(savedDelta) as RepetitionDelta;
441450

442-
expect(savedPayload.context).toBe('{"testField":9}');
443-
expect(savedPayload.addons).toBe('{"vue":{"props":{"test-test":true}}}');
451+
/**
452+
* Parse context and addons from string to object
453+
*/
454+
savedEvent.payload.context = JSON.parse(savedEvent.payload.context);
455+
savedEvent.payload.addons = JSON.parse(savedEvent.payload.addons);
456+
457+
expect(typeof parsedDelta.context).toBe('object');
458+
expect(typeof parsedDelta.addons).toBe('object');
459+
460+
const patched = patch({
461+
left: savedEvent.payload,
462+
delta: parsedDelta,
463+
});
464+
465+
expect(patched.context).toEqual({
466+
testField: 9,
467+
});
468+
expect(patched.addons).toEqual({
469+
vue: {
470+
props: { 'test-test': true },
471+
},
472+
});
444473
});
445474
});
446475

workers/grouper/tests/mocks/generateEvent.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
1-
import { EventAddons, EventDataAccepted } from "@hawk.so/types";
2-
import { generateRandomId } from "./randomId";
1+
import type { EventAddons, EventDataAccepted } from '@hawk.so/types';
2+
import { generateRandomId } from './randomId';
33

44
/**
55
* Mocked User id used for tests
66
*/
77
const userIdMock = generateRandomId();
88

9-
9+
/**
10+
*
11+
* @param event
12+
*/
1013
export function generateEvent(event: Partial<EventDataAccepted<EventAddons>> = undefined): EventDataAccepted<EventAddons> {
1114
return {
1215
title: 'Hawk client catcher test',

workers/grouper/tests/mocks/generateTask.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
import { EventAddons, EventDataAccepted } from "@hawk.so/types";
2-
import { GroupWorkerTask } from "../../types/group-worker-task";
3-
import { projectIdMock } from "./projectId";
4-
import { generateEvent } from "./generateEvent";
1+
import type { EventAddons, EventDataAccepted } from '@hawk.so/types';
2+
import type { GroupWorkerTask } from '../../types/group-worker-task';
3+
import { projectIdMock } from './projectId';
4+
import { generateEvent } from './generateEvent';
55

66
/**
77
* Generates task for testing
88
*
99
* @param event - allows to override some event properties in generated task
1010
*/
1111
export function generateTask(
12-
event: Partial<EventDataAccepted<EventAddons>> = undefined,
12+
event: Partial<EventDataAccepted<EventAddons>> = undefined
1313
): GroupWorkerTask {
1414
return {
1515
projectId: projectIdMock,

workers/grouper/tests/mocks/randomId.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,3 @@ export function generateRandomId(): string {
66
.substring(2, 15) + Math.random().toString(36)
77
.substring(2, 15);
88
}
9-

0 commit comments

Comments
 (0)