Skip to content

Commit

Permalink
Performance tests (#17)
Browse files Browse the repository at this point in the history
  • Loading branch information
joseffffff committed Jun 30, 2024
1 parent 291d79b commit e03795a
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 0 deletions.
17 changes: 17 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
"@babel/core": "^7.24.4",
"@babel/preset-env": "^7.24.4",
"@babel/preset-typescript": "^7.24.1",
"@faker-js/faker": "^8.4.1",
"@types/jest": "^29.5.12",
"@types/luxon": "^3.4.2",
"@typescript-eslint/eslint-plugin": "^7.7.1",
Expand Down
88 changes: 88 additions & 0 deletions tests/GoogleSpreadsheetsOrm.performance.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import { mock, MockProxy } from 'jest-mock-extended';
import { sheets_v4 } from 'googleapis';
import { GoogleSpreadsheetsOrm } from '../src';
import { FieldType } from '../src/serialization/FieldType';
import Resource$Spreadsheets = sheets_v4.Resource$Spreadsheets;
import Resource$Spreadsheets$Values = sheets_v4.Resource$Spreadsheets$Values;

import { faker } from '@faker-js/faker';
import { DateTime } from 'luxon';

const SPREADSHEET_ID = 'spreadsheetId';
const SHEET = 'test_entities';

class TestEntity {
constructor(
public readonly id: string,
public readonly age: number,
public readonly createdAt: Date,
public readonly enabled: boolean,
public readonly jsonField: object,
) {}
}

describe('Performance ORM tests', () => {
let sheetClient: MockProxy<sheets_v4.Sheets>;
let sut: GoogleSpreadsheetsOrm<TestEntity>;

beforeEach(() => {
sheetClient = mock<sheets_v4.Sheets>();
sheetClient.spreadsheets = mock<Resource$Spreadsheets>();
sheetClient.spreadsheets.values = mock<Resource$Spreadsheets$Values>();

sut = new GoogleSpreadsheetsOrm<TestEntity>({
spreadsheetId: SPREADSHEET_ID,
sheet: SHEET,
sheetClients: [sheetClient],
verbose: false,
cacheEnabled: false,
cacheTtlSeconds: 1,
castings: {
enabled: FieldType.BOOLEAN,
},
instantiator: row => new TestEntity(row.id, row.age, row.createdAt, row.enabled, row.jsonField),
});
});

test('Performance testing for 1000 rows', async () => {
const executionTimeMs = await runForRandomData(1000);
expect(executionTimeMs).toBeLessThan(5);
});

test('Performance testing for 10000 rows', async () => {
const executionTimeMs = await runForRandomData(10_000);
expect(executionTimeMs).toBeLessThan(20);
});

test('Performance testing for 100000 rows', async () => {
const executionTimeMs = await runForRandomData(100_000);
expect(executionTimeMs).toBeLessThan(100);
});

async function runForRandomData(rows: number): Promise<number> {
const rawValues = [
['id', 'age', 'createdAt', 'enabled', 'jsonField'],
...Array(rows)
.fill(1)
.map(_ => [
faker.string.uuid(),
faker.number.int().toString(),
DateTime.fromJSDate(faker.date.past()).toFormat('d/M/yyyy H:mm:ss'),
faker.datatype.boolean().toString(),
'[1,2,3,4,5]',
]),
];

(sheetClient.spreadsheets.values as MockProxy<sheets_v4.Resource$Spreadsheets$Values>).get.mockResolvedValue({
data: {
values: rawValues,
},
} as never);

const start = Date.now();
await sut.all();
const end = Date.now();

return end - start;
}
});

0 comments on commit e03795a

Please sign in to comment.