1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-24 10:27:10 +02:00

Chore: Convert test-utils to TypeScript

This commit is contained in:
Laurent Cozic 2020-12-08 20:01:33 +00:00
parent cdf2873883
commit f21199a7f3
4 changed files with 89 additions and 74 deletions

View File

@ -268,6 +268,9 @@ packages/app-cli/tests/synchronizer_MigrationHandler.js.map
packages/app-cli/tests/test-utils-synchronizer.d.ts
packages/app-cli/tests/test-utils-synchronizer.js
packages/app-cli/tests/test-utils-synchronizer.js.map
packages/app-cli/tests/test-utils.d.ts
packages/app-cli/tests/test-utils.js
packages/app-cli/tests/test-utils.js.map
packages/app-desktop/ElectronAppWrapper.d.ts
packages/app-desktop/ElectronAppWrapper.js
packages/app-desktop/ElectronAppWrapper.js.map

3
.gitignore vendored
View File

@ -257,6 +257,9 @@ packages/app-cli/tests/synchronizer_MigrationHandler.js.map
packages/app-cli/tests/test-utils-synchronizer.d.ts
packages/app-cli/tests/test-utils-synchronizer.js
packages/app-cli/tests/test-utils-synchronizer.js.map
packages/app-cli/tests/test-utils.d.ts
packages/app-cli/tests/test-utils.js
packages/app-cli/tests/test-utils.js.map
packages/app-desktop/ElectronAppWrapper.d.ts
packages/app-desktop/ElectronAppWrapper.js
packages/app-desktop/ElectronAppWrapper.js.map

View File

@ -1,10 +1,24 @@
/* eslint-disable require-atomic-updates */
import BaseApplication from '@joplin/lib/BaseApplication';
import BaseModel from '@joplin/lib/BaseModel';
import Logger, { TargetType, LoggerWrapper } from '@joplin/lib/Logger';
import Setting from '@joplin/lib/models/Setting';
import BaseService from '@joplin/lib/services/BaseService';
import FsDriverNode from '@joplin/lib/fs-driver-node';
import time from '@joplin/lib/time';
import shim from '@joplin/lib/shim';
import uuid from '@joplin/lib/uuid';
import ResourceService from '@joplin/lib/services/ResourceService';
import KeymapService from '@joplin/lib/services/KeymapService';
import KvStore from '@joplin/lib/services/KvStore';
import KeychainServiceDriver from '@joplin/lib/services/keychain/KeychainServiceDriver.node';
import KeychainServiceDriverDummy from '@joplin/lib/services/keychain/KeychainServiceDriver.dummy';
import PluginRunner from '../app/services/plugins/PluginRunner';
import PluginService from '@joplin/lib/services/plugins/PluginService';
const fs = require('fs-extra');
const { JoplinDatabase } = require('@joplin/lib/joplin-database.js');
const { DatabaseDriverNode } = require('@joplin/lib/database-driver-node.js');
const BaseApplication = require('@joplin/lib/BaseApplication').default;
const BaseModel = require('@joplin/lib/BaseModel').default;
const Folder = require('@joplin/lib/models/Folder.js');
const Note = require('@joplin/lib/models/Note.js');
const ItemChange = require('@joplin/lib/models/ItemChange.js');
@ -12,8 +26,6 @@ const Resource = require('@joplin/lib/models/Resource.js');
const Tag = require('@joplin/lib/models/Tag.js');
const NoteTag = require('@joplin/lib/models/NoteTag.js');
const Revision = require('@joplin/lib/models/Revision.js');
const Logger = require('@joplin/lib/Logger').default;
const Setting = require('@joplin/lib/models/Setting').default;
const MasterKey = require('@joplin/lib/models/MasterKey');
const BaseItem = require('@joplin/lib/models/BaseItem.js');
const { FileApi } = require('@joplin/lib/file-api.js');
@ -23,12 +35,7 @@ const { FileApiDriverWebDav } = require('@joplin/lib/file-api-driver-webdav.js')
const { FileApiDriverDropbox } = require('@joplin/lib/file-api-driver-dropbox.js');
const { FileApiDriverOneDrive } = require('@joplin/lib/file-api-driver-onedrive.js');
const { FileApiDriverAmazonS3 } = require('@joplin/lib/file-api-driver-amazon-s3.js');
const BaseService = require('@joplin/lib/services/BaseService').default;
const FsDriverNode = require('@joplin/lib/fs-driver-node').default;
const time = require('@joplin/lib/time').default;
const { shimInit } = require('@joplin/lib/shim-init-node.js');
const shim = require('@joplin/lib/shim').default;
const uuid = require('@joplin/lib/uuid').default;
const SyncTargetRegistry = require('@joplin/lib/SyncTargetRegistry.js');
const SyncTargetMemory = require('@joplin/lib/SyncTargetMemory.js');
const SyncTargetFilesystem = require('@joplin/lib/SyncTargetFilesystem.js');
@ -38,21 +45,14 @@ const SyncTargetDropbox = require('@joplin/lib/SyncTargetDropbox.js');
const SyncTargetAmazonS3 = require('@joplin/lib/SyncTargetAmazonS3.js');
const EncryptionService = require('@joplin/lib/services/EncryptionService.js');
const DecryptionWorker = require('@joplin/lib/services/DecryptionWorker.js');
const ResourceService = require('@joplin/lib/services/ResourceService').default;
const RevisionService = require('@joplin/lib/services/RevisionService.js');
const ResourceFetcher = require('@joplin/lib/services/ResourceFetcher.js');
const KeymapService = require('@joplin/lib/services/KeymapService').default;
const KvStore = require('@joplin/lib/services/KvStore').default;
const WebDavApi = require('@joplin/lib/WebDavApi');
const DropboxApi = require('@joplin/lib/DropboxApi');
const { OneDriveApi } = require('@joplin/lib/onedrive-api');
const { loadKeychainServiceAndSettings } = require('@joplin/lib/services/SettingUtils');
const KeychainServiceDriver = require('@joplin/lib/services/keychain/KeychainServiceDriver.node').default;
const KeychainServiceDriverDummy = require('@joplin/lib/services/keychain/KeychainServiceDriver.dummy').default;
const md5 = require('md5');
const S3 = require('aws-sdk/clients/s3');
const PluginRunner = require('../app/services/plugins/PluginRunner').default;
const PluginService = require('@joplin/lib/services/plugins/PluginService').default;
const { Dirnames } = require('@joplin/lib/services/synchronizer/utils/types');
const sharp = require('sharp');
@ -63,16 +63,16 @@ const sharp = require('sharp');
// Jest, to make debugging easier, but it's not clear how to get this info).
const suiteName_ = uuid.createNano();
const databases_ = [];
let synchronizers_ = [];
const synchronizerContexts_ = {};
const fileApis_ = {};
const encryptionServices_ = [];
const revisionServices_ = [];
const decryptionWorkers_ = [];
const resourceServices_ = [];
const resourceFetchers_ = [];
const kvStores_ = [];
const databases_: any[] = [];
let synchronizers_: any[] = [];
const synchronizerContexts_: any = {};
const fileApis_: any = {};
const encryptionServices_: any[] = [];
const revisionServices_: any[] = [];
const decryptionWorkers_: any[] = [];
const resourceServices_: any[] = [];
const resourceFetchers_: any[] = [];
const kvStores_: KvStore[] = [];
let currentClient_ = 1;
// The line `process.on('unhandledRejection'...` in all the test files is going to
@ -113,7 +113,7 @@ SyncTargetRegistry.addClass(SyncTargetDropbox);
SyncTargetRegistry.addClass(SyncTargetAmazonS3);
let syncTargetName_ = '';
let syncTargetId_ = null;
let syncTargetId_: number = null;
let sleepTime = 0;
let isNetworkSyncTarget_ = false;
@ -121,7 +121,7 @@ function syncTargetName() {
return syncTargetName_;
}
function setSyncTargetName(name) {
function setSyncTargetName(name: string) {
if (name === syncTargetName_) return syncTargetName_;
const previousName = syncTargetName_;
syncTargetName_ = name;
@ -150,13 +150,11 @@ if (isNetworkSyncTarget_) defaultJestTimeout = 60 * 1000 * 10;
jest.setTimeout(defaultJestTimeout);
const dbLogger = new Logger();
dbLogger.addTarget('console');
// dbLogger.addTarget('file', { path: `${logDir}/log.txt` });
dbLogger.addTarget(TargetType.Console);
dbLogger.setLevel(Logger.LEVEL_WARN);
const logger = new Logger();
logger.addTarget('console');
// logger.addTarget('file', { path: `${logDir}/log.txt` });
logger.addTarget(TargetType.Console);
logger.setLevel(Logger.LEVEL_WARN); // Set to DEBUG to display sync process in console
Logger.initializeGlobalLogger(logger);
@ -186,16 +184,16 @@ function isNetworkSyncTarget() {
return isNetworkSyncTarget_;
}
function sleep(n) {
return new Promise((resolve, reject) => {
function sleep(n: number) {
return new Promise((resolve) => {
shim.setTimeout(() => {
resolve();
}, Math.round(n * 1000));
});
}
function msleep(ms) {
return new Promise((resolve, reject) => {
function msleep(ms: number) {
return new Promise((resolve) => {
shim.setTimeout(() => {
resolve();
}, ms);
@ -211,7 +209,7 @@ async function afterEachCleanUp() {
KeymapService.destroyInstance();
}
async function switchClient(id, options = null) {
async function switchClient(id: number, options: any = null) {
options = Object.assign({}, { keychainEnabled: false }, options);
if (!databases_[id]) throw new Error(`Call setupDatabaseAndSynchronizer(${id}) first!!`);
@ -236,7 +234,7 @@ async function switchClient(id, options = null) {
Setting.setValue('sync.wipeOutFailSafe', false); // To keep things simple, always disable fail-safe unless explicitely set in the test itself
}
async function clearDatabase(id = null) {
async function clearDatabase(id: number = null) {
if (id === null) id = currentClient_;
if (!databases_[id]) return;
@ -267,13 +265,19 @@ async function clearDatabase(id = null) {
await databases_[id].transactionExecBatch(queries);
}
async function setupDatabase(id = null, options = null) {
async function setupDatabase(id: number = null, options: any = null) {
options = Object.assign({}, { keychainEnabled: false }, options);
if (id === null) id = currentClient_;
Setting.cancelScheduleSave();
Setting.cache_ = null;
// Note that this was changed from `Setting.cache_ = []` to `await
// Setting.reset()` during the TypeScript conversion. Normally this is
// more correct but something to keep in mind anyway in case there are
// some strange async issue related to settings when the tests are
// running.
await Setting.reset();
if (databases_[id]) {
BaseModel.setDb(databases_[id]);
@ -298,22 +302,22 @@ async function setupDatabase(id = null, options = null) {
await loadKeychainServiceAndSettings(options.keychainEnabled ? KeychainServiceDriver : KeychainServiceDriverDummy);
}
function resourceDirName(id = null) {
function resourceDirName(id: number = null) {
if (id === null) id = currentClient_;
return `resources-${id}`;
}
function resourceDir(id = null) {
function resourceDir(id: number = null) {
if (id === null) id = currentClient_;
return `${dataDir}/${resourceDirName(id)}`;
}
function pluginDir(id = null) {
function pluginDir(id: number = null) {
if (id === null) id = currentClient_;
return `${dataDir}/plugins-${id}`;
}
async function setupDatabaseAndSynchronizer(id, options = null) {
async function setupDatabaseAndSynchronizer(id: number, options: any = null) {
if (id === null) id = currentClient_;
BaseService.logger_ = logger;
@ -350,12 +354,12 @@ async function setupDatabaseAndSynchronizer(id, options = null) {
await fileApi().clearRoot();
}
function db(id = null) {
function db(id: number = null) {
if (id === null) id = currentClient_;
return databases_[id];
}
function synchronizer(id = null) {
function synchronizer(id: number = null) {
if (id === null) id = currentClient_;
return synchronizers_[id];
}
@ -363,7 +367,7 @@ function synchronizer(id = null) {
// This is like calling synchronizer.start() but it handles the
// complexity of passing around the sync context depending on
// the client.
async function synchronizerStart(id = null, extraOptions = null) {
async function synchronizerStart(id: number = null, extraOptions: any = null) {
if (id === null) id = currentClient_;
const context = synchronizerContexts_[id];
const options = Object.assign({}, extraOptions);
@ -373,41 +377,41 @@ async function synchronizerStart(id = null, extraOptions = null) {
return newContext;
}
function encryptionService(id = null) {
function encryptionService(id: number = null) {
if (id === null) id = currentClient_;
return encryptionServices_[id];
}
function kvStore(id = null) {
function kvStore(id: number = null) {
if (id === null) id = currentClient_;
const o = kvStores_[id];
o.setDb(db(id));
return o;
}
function revisionService(id = null) {
function revisionService(id: number = null) {
if (id === null) id = currentClient_;
return revisionServices_[id];
}
function decryptionWorker(id = null) {
function decryptionWorker(id: number = null) {
if (id === null) id = currentClient_;
const o = decryptionWorkers_[id];
o.setKvStore(kvStore(id));
return o;
}
function resourceService(id = null) {
function resourceService(id: number = null) {
if (id === null) id = currentClient_;
return resourceServices_[id];
}
function resourceFetcher(id = null) {
function resourceFetcher(id: number = null) {
if (id === null) id = currentClient_;
return resourceFetchers_[id];
}
async function loadEncryptionMasterKey(id = null, useExisting = false) {
async function loadEncryptionMasterKey(id: number = null, useExisting = false) {
const service = encryptionService(id);
let masterKey = null;
@ -490,7 +494,7 @@ function fileApi() {
return fileApis_[syncTargetId_];
}
function objectsEqual(o1, o2) {
function objectsEqual(o1: any, o2: any) {
if (Object.getOwnPropertyNames(o1).length !== Object.getOwnPropertyNames(o2).length) return false;
for (const n in o1) {
if (!o1.hasOwnProperty(n)) continue;
@ -499,7 +503,7 @@ function objectsEqual(o1, o2) {
return true;
}
async function checkThrowAsync(asyncFn) {
async function checkThrowAsync(asyncFn: Function) {
let hasThrown = false;
try {
await asyncFn();
@ -509,7 +513,7 @@ async function checkThrowAsync(asyncFn) {
return hasThrown;
}
async function expectThrow(asyncFn, errorCode = undefined) {
async function expectThrow(asyncFn: Function, errorCode: any = undefined) {
let hasThrown = false;
let thrownError = null;
try {
@ -520,7 +524,7 @@ async function expectThrow(asyncFn, errorCode = undefined) {
}
if (!hasThrown) {
expect('not throw').toBe('throw', 'Expected function to throw an error but did not');
expect('not throw').toBe('throw');
} else if (thrownError.code !== errorCode) {
console.error(thrownError);
expect(`error code: ${thrownError.code}`).toBe(`error code: ${errorCode}`);
@ -529,7 +533,7 @@ async function expectThrow(asyncFn, errorCode = undefined) {
}
}
async function expectNotThrow(asyncFn) {
async function expectNotThrow(asyncFn: Function) {
let thrownError = null;
try {
await asyncFn();
@ -539,13 +543,13 @@ async function expectNotThrow(asyncFn) {
if (thrownError) {
console.error(thrownError);
expect(thrownError.message).toBe('', 'Expected function not to throw an error but it did');
expect(thrownError.message).toBe('');
} else {
expect(true).toBe(true);
}
}
function checkThrow(fn) {
function checkThrow(fn: Function) {
let hasThrown = false;
try {
fn();
@ -555,7 +559,7 @@ function checkThrow(fn) {
return hasThrown;
}
function fileContentEqual(path1, path2) {
function fileContentEqual(path1: string, path2: string) {
const fs = require('fs-extra');
const content1 = fs.readFileSync(path1, 'base64');
const content2 = fs.readFileSync(path2, 'base64');
@ -594,19 +598,19 @@ async function allSyncTargetItemsEncrypted() {
return totalCount === encryptedCount;
}
function id(a) {
function id(a: any) {
return a.id;
}
function ids(a) {
function ids(a: any[]) {
return a.map(n => n.id);
}
function sortedIds(a) {
function sortedIds(a: any[]) {
return ids(a).sort();
}
function at(a, indexes) {
function at(a: any[], indexes: any[]) {
const out = [];
for (let i = 0; i < indexes.length; i++) {
out.push(a[indexes[i]]);
@ -614,7 +618,7 @@ function at(a, indexes) {
return out;
}
async function createNTestFolders(n) {
async function createNTestFolders(n: number) {
const folders = [];
for (let i = 0; i < n; i++) {
const folder = await Folder.save({ title: 'folder' });
@ -624,7 +628,7 @@ async function createNTestFolders(n) {
return folders;
}
async function createNTestNotes(n, folder, tagIds = null, title = 'note') {
async function createNTestNotes(n: number, folder: any, tagIds: string[] = null, title: string = 'note') {
const notes = [];
for (let i = 0; i < n; i++) {
const title_ = n > 1 ? `${title}${i}` : title;
@ -641,7 +645,7 @@ async function createNTestNotes(n, folder, tagIds = null, title = 'note') {
return notes;
}
async function createNTestTags(n) {
async function createNTestTags(n: number) {
const tags = [];
for (let i = 0; i < n; i++) {
const tag = await Tag.save({ title: 'tag' });
@ -651,7 +655,7 @@ async function createNTestTags(n) {
return tags;
}
function tempFilePath(ext) {
function tempFilePath(ext: string) {
return `${Setting.value('tempDir')}/${md5(Date.now() + Math.random())}.${ext}`;
}
@ -678,7 +682,7 @@ function newPluginService(appVersion = '1.4') {
return service;
}
function newPluginScript(script) {
function newPluginScript(script: string) {
return `
/* joplin-manifest:
{
@ -708,6 +712,11 @@ function newPluginScript(script) {
// Application for feature integration testing
class TestApp extends BaseApplication {
private hasGui_: boolean;
private middlewareCalls_: any[];
private logger_: LoggerWrapper;
constructor(hasGui = true) {
super();
this.hasGui_ = hasGui;
@ -719,7 +728,7 @@ class TestApp extends BaseApplication {
return this.hasGui_;
}
async start(argv) {
async start(argv: any[]) {
this.logger_.info('Test app starting...');
if (!argv.includes('--profile')) {
@ -740,7 +749,7 @@ class TestApp extends BaseApplication {
this.logger_.info('Test app started...');
}
async generalMiddleware(store, next, action) {
async generalMiddleware(store: any, next: any, action: any) {
this.middlewareCalls_.push(true);
try {
await super.generalMiddleware(store, next, action);

View File

@ -23,7 +23,7 @@ export default class KvStore extends BaseService {
this.instance_ = null;
}
private constructor() {
public constructor() {
super();
this.incMutex_ = new Mutex();
}