diff --git a/tracker/tracker/src/webworker/BatchWriter.unit.test.ts b/tracker/tracker/src/webworker/BatchWriter.unit.test.ts new file mode 100644 index 000000000..e9f039988 --- /dev/null +++ b/tracker/tracker/src/webworker/BatchWriter.unit.test.ts @@ -0,0 +1,95 @@ +import BatchWriter from './BatchWriter' +import * as Messages from '../common/messages.gen.js' +import { describe, expect, test, jest, beforeEach, afterEach } from '@jest/globals' +import Message from '../common/messages.gen.js' + +describe('BatchWriter', () => { + let onBatchMock: (b: Uint8Array) => void + let batchWriter: BatchWriter + + beforeEach(() => { + onBatchMock = jest.fn() + batchWriter = new BatchWriter(1, 123456789, 'example.com', onBatchMock) + }) + + afterEach(() => { + jest.clearAllMocks() + }) + + test('constructor initializes BatchWriter instance', () => { + expect(batchWriter['pageNo']).toBe(1) + expect(batchWriter['timestamp']).toBe(123456789) + expect(batchWriter['url']).toBe('example.com') + expect(batchWriter['onBatch']).toBe(onBatchMock) + expect(batchWriter['nextIndex']).toBe(0) + expect(batchWriter['beaconSize']).toBe(200000) + expect(batchWriter['encoder']).toBeDefined() + expect(batchWriter['strDict']).toBeDefined() + expect(batchWriter['sizeBuffer']).toHaveLength(3) + expect(batchWriter['isEmpty']).toBe(true) + }) + + test('writeType writes the type of the message', () => { + const message = [Messages.Type.BatchMetadata, 1, 2, 3, 4, 'example.com'] + const result = batchWriter['writeType'](message as Message) + expect(result).toBe(true) + }) + + test('writeFields encodes the message fields', () => { + const message = [Messages.Type.BatchMetadata, 1, 2, 3, 4, 'example.com'] + const result = batchWriter['writeFields'](message as Message) + expect(result).toBe(true) + }) + + test('writeSizeAt writes the size at the given offset', () => { + batchWriter['writeSizeAt'](100, 0) + expect(batchWriter['sizeBuffer']).toEqual(new Uint8Array([100, 0, 0])) + expect(batchWriter['encoder']['data'].slice(0, 3)).toEqual(new Uint8Array([100, 0, 0])) + }) + + test('prepare prepares the BatchWriter for writing', () => { + // TODO + }) + + test('writeWithSize writes the message with its size', () => { + const message = [Messages.Type.BatchMetadata, 1, 2, 3, 4, 'example.com'] + const result = batchWriter['writeWithSize'](message as Message) + expect(result).toBe(true) + }) + + test('setBeaconSizeLimit sets the beacon size limit', () => { + batchWriter['setBeaconSizeLimit'](500000) + expect(batchWriter['beaconSizeLimit']).toBe(500000) + }) + + test('Set note attribute tries to use dictionary', () => { + const spyOnStrGetKey = jest.spyOn(batchWriter['strDict'], 'getKey') + // @ts-ignore + batchWriter['writeMessage']([Messages.Type.SetNodeAttribute, 1, 'name', 'value']) + expect(spyOnStrGetKey).toHaveBeenCalledTimes(2) + expect(spyOnStrGetKey).toHaveBeenCalledWith('name') + expect(spyOnStrGetKey).toHaveBeenCalledWith('value') + }) + + test('writeMessage writes the given message', () => { + const message = [Messages.Type.Timestamp, 987654321] + // @ts-ignore + batchWriter['writeWithSize'] = jest.fn().mockReturnValue(true) + batchWriter['writeMessage'](message as Message) + expect(batchWriter['writeWithSize']).toHaveBeenCalledWith(message) + }) + + test('finaliseBatch flushes the encoder and calls onBatch', () => { + const flushSpy = jest.spyOn(batchWriter['encoder'], 'flush') + batchWriter['isEmpty'] = false + batchWriter['finaliseBatch']() + expect(flushSpy).toHaveBeenCalled() + expect(onBatchMock).toHaveBeenCalled() + }) + + test('clean resets the encoder', () => { + const cleanSpy = jest.spyOn(batchWriter['encoder'], 'reset') + batchWriter['clean']() + expect(cleanSpy).toHaveBeenCalled() + }) +})