stratify-utils

pull/1199/head
Vincent 5 years ago
parent c3af41cb80
commit 5d8f9cf950

@ -9,12 +9,23 @@ chai.use(chaiAsPromised);
const { expect } = chai;
describe('Promise Utils', () => {
const sandbox = sinon.createSandbox();
let pollSpy: sinon.SinonSpy<[(done: (arg: any) => void) => Promise<void> | void, (Partial<PromiseUtils.PollOptions> | undefined)?], Promise<void>>;
let waitForTaskSpy: sinon.SinonSpy<[(done: (arg: any) => void) => Promise<void> | void, (number | undefined)?], Promise<unknown>>;
let waitUntilSpy: sinon.SinonSpy<[() => Promise<boolean> | boolean, (number | undefined)?], Promise<void>>;
let pollSpy: sinon.SinonSpy<
[
(done: (arg: any) => void) => Promise<void> | void,
(Partial<PromiseUtils.PollOptions> | undefined)?
],
Promise<void>
>;
let waitForTaskSpy: sinon.SinonSpy<
[(done: (arg: any) => void) => Promise<void> | void, (number | undefined)?],
Promise<unknown>
>;
let waitUntilSpy: sinon.SinonSpy<
[() => Promise<boolean> | boolean, (number | undefined)?],
Promise<void>
>;
beforeEach(() => {
pollSpy = sandbox.spy(PromiseUtils, 'poll');

@ -82,7 +82,8 @@ describe('String Utils', () => {
});
it('can encode huge string', async () => {
const testString = Array(Math.pow(2, 16))
const stringSize = Math.pow(2, 16);
const testString = Array(stringSize)
.fill('0')
.join('');
@ -127,8 +128,100 @@ describe('String Utils', () => {
});
describe('decode', () => {
it('', async () => {
//
it('can decode empty buffer', async () => {
const buffer = new ByteBuffer(0);
const encodings = ['base64', 'hex', 'binary', 'utf8'] as Array<Encoding>;
// Each encoding should be valid
encodings.forEach(encoding => {
const decoded = StringUtils.decode(buffer, encoding);
expect(decoded).to.exist;
expect(typeof decoded === String.name.toLowerCase());
expect(decoded).to.have.length(0);
});
});
it('can decode huge buffer', async () => {
const bytes = Math.pow(2, 16);
const bufferString = Array(bytes)
.fill('A')
.join('');
const buffer = ByteBuffer.fromUTF8(bufferString);
const encodings = ['base64', 'hex', 'binary', 'utf8'] as Array<Encoding>;
// Each encoding should be valid
encodings.forEach(encoding => {
const decoded = StringUtils.decode(buffer, encoding);
expect(decoded).to.exist;
expect(typeof decoded === String.name.toLowerCase());
expect(decoded).to.have.length.greaterThan(0);
});
});
it('can decode from ByteBuffer', async () => {
const buffer = ByteBuffer.fromUTF8('AAAAAAAAAA');
const encodings = ['base64', 'hex', 'binary', 'utf8'] as Array<Encoding>;
// Each encoding should be valid
encodings.forEach(encoding => {
const decoded = StringUtils.decode(buffer, encoding);
expect(decoded).to.exist;
expect(typeof decoded === String.name.toLowerCase());
expect(decoded).to.have.length.greaterThan(0);
});
});
it('can decode from Buffer', async () => {
const arrayBuffer = new ArrayBuffer(10);
const buffer = Buffer.from(arrayBuffer);
buffer.writeUInt8(0, 0);
const encodings = ['base64', 'hex', 'binary', 'utf8'] as Array<Encoding>;
// Each encoding should be valid
encodings.forEach(encoding => {
const decoded = StringUtils.decode(buffer, encoding);
expect(decoded).to.exist;
expect(typeof decoded === String.name.toLowerCase());
expect(decoded).to.have.length.greaterThan(0);
});
});
it('can decode from ArrayBuffer', async () => {
const buffer = new ArrayBuffer(10);
const encodings = ['base64', 'hex', 'binary', 'utf8'] as Array<Encoding>;
// Each encoding should be valid
encodings.forEach(encoding => {
const decoded = StringUtils.decode(buffer, encoding);
expect(decoded).to.exist;
expect(typeof decoded === String.name.toLowerCase());
expect(decoded).to.have.length.greaterThan(0);
});
});
it('can decode from Uint8Array', async () => {
const buffer = new Uint8Array(10);
const encodings = ['base64', 'hex', 'binary', 'utf8'] as Array<Encoding>;
// Each encoding should be valid
encodings.forEach(encoding => {
const decoded = StringUtils.decode(buffer, encoding);
expect(decoded).to.exist;
expect(typeof decoded === String.name.toLowerCase());
expect(decoded).to.have.length.greaterThan(0);
});
});
});
});

@ -1 +0,0 @@
{"version":3,"file":"testUtils.js","sourceRoot":"","sources":["testUtils.ts"],"names":[],"mappings":"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"}

@ -1,145 +0,0 @@
"use strict";
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const sinon = __importStar(require("sinon"));
const crypto = __importStar(require("crypto"));
const uuid_1 = require("uuid");
const types_1 = require("../../../ts/session/types");
const outgoing_1 = require("../../session/messages/outgoing");
const _1 = require(".");
const globalAny = global;
const sandbox = sinon.createSandbox();
// We have to do this in a weird way because Data uses module.exports
// which doesn't play well with sinon or ImportMock
// tslint:disable-next-line: no-require-imports no-var-requires
const Data = require('../../../js/modules/data');
/**
* Stub a function inside Data.
*
* Note: This uses a custom sandbox.
* Please call `restoreStubs()` or `stub.restore()` to restore original functionality.
*/
function stubData(fn) {
return sandbox.stub(Data, fn);
}
exports.stubData = stubData;
/**
* Stub a window object.
*
* Note: This uses a custom sandbox.
* Please call `restoreStubs()` or `stub.restore()` to restore original functionality.
*/
function stubWindow(fn, value) {
// tslint:disable-next-line: no-typeof-undefined
if (typeof globalAny.window === 'undefined') {
globalAny.window = {};
}
const set = (newValue) => {
globalAny.window[fn] = newValue;
};
const get = () => {
return globalAny.window[fn];
};
globalAny.window[fn] = value;
return {
get,
set,
};
}
exports.stubWindow = stubWindow;
function restoreStubs() {
globalAny.window = undefined;
sandbox.restore();
}
exports.restoreStubs = restoreStubs;
function generateFakePubKey() {
// Generates a mock pubkey for testing
const numBytes = types_1.PubKey.PUBKEY_LEN / 2 - 1;
const hexBuffer = crypto.randomBytes(numBytes).toString('hex');
const pubkeyString = `05${hexBuffer}`;
return new types_1.PubKey(pubkeyString);
}
exports.generateFakePubKey = generateFakePubKey;
function generateFakePubKeys(amount) {
const numPubKeys = amount > 0 ? Math.floor(amount) : 0;
// tslint:disable-next-line: no-unnecessary-callback-wrapper
return new Array(numPubKeys).fill(0).map(() => generateFakePubKey());
}
exports.generateFakePubKeys = generateFakePubKeys;
function generateChatMessage(identifier) {
return new outgoing_1.ChatMessage({
body: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit',
identifier: (identifier !== null && identifier !== void 0 ? identifier : uuid_1.v4()),
timestamp: Date.now(),
attachments: undefined,
quote: undefined,
expireTimer: undefined,
lokiProfile: undefined,
preview: undefined,
});
}
exports.generateChatMessage = generateChatMessage;
function generateOpenGroupMessage() {
const group = new types_1.OpenGroup({
server: 'chat.example.server',
channel: 0,
conversationId: '0',
});
return new outgoing_1.OpenGroupMessage({
timestamp: Date.now(),
group,
attachments: undefined,
preview: undefined,
body: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit',
quote: undefined,
});
}
exports.generateOpenGroupMessage = generateOpenGroupMessage;
function generateClosedGroupMessage(groupId) {
return new outgoing_1.ClosedGroupChatMessage({
identifier: uuid_1.v4(),
groupId: (groupId !== null && groupId !== void 0 ? groupId : generateFakePubKey().key),
chatMessage: generateChatMessage(),
});
}
exports.generateClosedGroupMessage = generateClosedGroupMessage;
class MockPrivateConversation {
constructor(params) {
var _a;
const dayInSeconds = 86400;
this.isPrimary = params.isPrimary;
this.id = (_a = params.id, (_a !== null && _a !== void 0 ? _a : _1.TestUtils.generateFakePubKey().key));
this.attributes = {
members: [],
left: false,
expireTimer: dayInSeconds,
profileSharing: true,
mentionedUs: false,
unreadCount: 99,
isArchived: false,
active_at: Date.now(),
timestamp: Date.now(),
secondaryStatus: !this.isPrimary,
};
}
isPrivate() {
return true;
}
isOurLocalDevice() {
return false;
}
isBlocked() {
return false;
}
getPrimaryDevicePubKey() {
return this.isPrimary ? this.id : _1.TestUtils.generateFakePubKey().key;
}
}
exports.MockPrivateConversation = MockPrivateConversation;
//# sourceMappingURL=testUtils.js.map

@ -6,6 +6,7 @@ import {
import { v4 as uuid } from 'uuid';
import { OpenGroup } from '../../../session/types';
import { generateFakePubKey } from './pubkey';
import { ConversationAttributes } from '../../../../js/models/conversation';
export function generateChatMessage(identifier?: string): ChatMessage {
return new ChatMessage({
@ -46,3 +47,50 @@ export function generateClosedGroupMessage(
chatMessage: generateChatMessage(),
});
}
interface MockPrivateConversationParams {
id?: string;
isPrimary: boolean;
}
export class MockPrivateConversation {
public id: string;
public isPrimary: boolean;
public attributes: ConversationAttributes;
constructor(params: MockPrivateConversationParams) {
const dayInSeconds = 86400;
this.isPrimary = params.isPrimary;
this.id = params.id ?? generateFakePubKey().key;
this.attributes = {
members: [],
left: false,
expireTimer: dayInSeconds,
profileSharing: true,
mentionedUs: false,
unreadCount: 99,
isArchived: false,
active_at: Date.now(),
timestamp: Date.now(),
secondaryStatus: !this.isPrimary,
};
}
public isPrivate() {
return true;
}
public isOurLocalDevice() {
return false;
}
public isBlocked() {
return false;
}
public getPrimaryDevicePubKey() {
return this.isPrimary ? this.id : generateFakePubKey().key;
}
}

Loading…
Cancel
Save