1
0
mirror of https://github.com/bitwarden/jslib synced 2025-12-22 03:03:15 +00:00

WIP - Split up tests to their proper project

This commit is contained in:
Hinton
2021-12-10 15:03:16 +01:00
parent 6a179ab2df
commit f4f2b6cdf9
39 changed files with 6587 additions and 12440 deletions

View File

@@ -1,5 +1,5 @@
{
"name": "@bitwarden/jslib-common",
"name": "@bitwarden/jslib-angular",
"version": "0.0.0",
"description": "Common code used across Bitwarden JavaScript projects.",
"keywords": [

83
common/karma.conf.js Normal file
View File

@@ -0,0 +1,83 @@
const webpack = require('webpack');
module.exports = (config) => {
config.set({
// base path that will be used to resolve all patterns (eg. files, exclude)
basePath: '',
// frameworks to use
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
frameworks: ['jasmine', 'webpack'],
// list of files / patterns to load in the browser
files: [
{ pattern: 'spec/**/*.spec.ts', watched: false },
],
browsers: [
'Chrome'
],
// list of files to exclude
exclude: [],
// preprocess matching files before serving them to the browser
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
preprocessors: {
'spec/**/*.ts': ['webpack', 'sourcemap'],
},
// test results reporter to use
// possible values: 'dots', 'progress'
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
reporters: ['progress', 'kjhtml'],
// web server port
port: 9876,
// enable / disable colors in the output (reporters and logs)
colors: true,
// level of logging
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
logLevel: config.LOG_INFO,
// Concurrency level
// how many browser should be started simultaneous
concurrency: Infinity,
client: {
clearContext: false // leave Jasmine Spec Runner output visible in browser
},
webpack: {
mode: 'development',
resolve: {
extensions: ['.js', '.ts', '.tsx'],
fallback: {
"util": require.resolve("util/"),
"url": require.resolve("url/"),
},
},
plugins: [
new webpack.ProvidePlugin({
process: 'process/browser',
}),
],
module: {
rules: [
{
test: /\.tsx?$/,
loader: 'ts-loader',
},
],
},
stats: {
colors: true,
modules: true,
reasons: true,
errorDetails: true,
},
},
})
}

6150
common/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -17,17 +17,37 @@
"build": "npm run clean && tsc",
"build:watch": "npm run clean && tsc -watch",
"lint": "tslint 'src/**/*.ts' 'spec/**/*.ts'",
"lint:fix": "tslint 'src/**/*.ts' 'spec/**/*.ts' --fix"
"lint:fix": "tslint 'src/**/*.ts' 'spec/**/*.ts' --fix",
"test": "karma start --single-run",
"test:node": "npm run build && jasmine"
},
"devDependencies": {
"@fluffy-spoon/substitute": "^1.208.0",
"@types/jasmine": "^3.10.2",
"@types/lunr": "^2.3.3",
"@types/node": "^14.17.1",
"@types/node-forge": "^0.9.7",
"@types/papaparse": "^5.2.5",
"@types/tldjs": "^2.3.0",
"@types/zxcvbn": "^4.4.1",
"fs": "^0.0.1-security",
"jasmine": "^3.10.0",
"jasmine-core": "^3.10.1",
"jasmine-ts-console-reporter": "^3.1.1",
"jsdom": "^19.0.0",
"karma": "^6.3.9",
"karma-chrome-launcher": "^3.1.0",
"karma-jasmine": "^4.0.1",
"karma-jasmine-html-reporter": "^1.7.0",
"karma-sourcemap-loader": "^0.3.8",
"karma-webpack": "^5.0.0",
"path": "^0.12.7",
"process": "^0.11.10",
"rimraf": "^3.0.2",
"typescript": "4.3.5"
"ts-loader": "^9.2.6",
"typescript": "4.3.5",
"url": "^0.11.0",
"util": "^0.12.4"
},
"dependencies": {
"@microsoft/signalr": "5.0.10",

9
common/spec/helpers.ts Normal file
View File

@@ -0,0 +1,9 @@
// tslint:disable-next-line
const TSConsoleReporter = require('jasmine-ts-console-reporter');
jasmine.getEnv().clearReporters(); // Clear default console reporter
jasmine.getEnv().addReporter(new TSConsoleReporter());
// Polyfills
// tslint:disable-next-line
const jsdom: any = require('jsdom');
(global as any).DOMParser = new jsdom.JSDOM().window.DOMParser;

View File

@@ -1,8 +1,8 @@
import { FirefoxCsvImporter as Importer } from 'jslib-common/importers/firefoxCsvImporter';
import { FirefoxCsvImporter as Importer } from '../../src/importers/firefoxCsvImporter';
import { CipherView } from 'jslib-common/models/view/cipherView';
import { LoginUriView } from 'jslib-common/models/view/loginUriView';
import { LoginView } from 'jslib-common/models/view/loginView';
import { CipherView } from '../../src/models/view/cipherView';
import { LoginUriView } from '../../src/models/view/loginUriView';
import { LoginView } from '../../src/models/view/loginView';
import { data as firefoxAccountsData } from './testData/firefoxCsv/firefoxAccountsData.csv';
import { data as simplePasswordData } from './testData/firefoxCsv/simplePasswordData.csv';

View File

@@ -1,4 +1,4 @@
import { KeePass2XmlImporter as Importer } from 'jslib-common/importers/keepass2XmlImporter';
import { KeePass2XmlImporter as Importer } from '../../src/importers/keepass2XmlImporter';
const TestData: string = `<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<KeePassFile>

View File

@@ -1,11 +1,11 @@
import { LastPassCsvImporter as Importer } from 'jslib-common/importers/lastpassCsvImporter';
import { LastPassCsvImporter as Importer } from '../../src/importers/lastpassCsvImporter';
import { ImportResult } from 'jslib-common/models/domain/importResult';
import { CipherView } from 'jslib-common/models/view/cipherView';
import { FieldView } from 'jslib-common/models/view/fieldView';
import { ImportResult } from '../../src/models/domain/importResult';
import { CipherView } from '../../src/models/view/cipherView';
import { FieldView } from '../../src/models/view/fieldView';
import { CipherType } from 'jslib-common/enums/cipherType';
import { FieldType } from 'jslib-common/enums/fieldType';
import { CipherType } from '../../src/enums/cipherType';
import { FieldType } from '../../src/enums/fieldType';
function baseExcept(result: ImportResult) {
expect(result).not.toBeNull();

View File

@@ -1,9 +1,9 @@
import { NordPassCsvImporter as Importer } from 'jslib-common/importers/nordpassCsvImporter';
import { NordPassCsvImporter as Importer } from '../../src/importers/nordpassCsvImporter';
import { CipherType } from 'jslib-common/enums/cipherType';
import { SecureNoteType } from 'jslib-common/enums/secureNoteType';
import { CipherView } from 'jslib-common/models/view/cipherView';
import { IdentityView } from 'jslib-common/models/view/identityView';
import { CipherType } from '../../src/enums/cipherType';
import { SecureNoteType } from '../../src/enums/secureNoteType';
import { CipherView } from '../../src/models/view/cipherView';
import { IdentityView } from '../../src/models/view/identityView';
import { data as creditCardData } from './testData/nordpassCsv/nordpass.card.csv';
import { data as identityData } from './testData/nordpassCsv/nordpass.identity.csv';

View File

@@ -1,5 +1,5 @@
import { FieldType } from 'jslib-common/enums/fieldType';
import { OnePassword1PifImporter as Importer } from 'jslib-common/importers/onepasswordImporters/onepassword1PifImporter';
import { FieldType } from '../../src/enums/fieldType';
import { OnePassword1PifImporter as Importer } from '../../src/importers/onepasswordImporters/onepassword1PifImporter';
const TestData: string = '***aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee***\n' +
JSON.stringify({

View File

@@ -1,7 +1,7 @@
import { OnePasswordMacCsvImporter as Importer } from 'jslib-common/importers/onepasswordImporters/onepasswordMacCsvImporter';
import { OnePasswordMacCsvImporter as Importer } from '../../src/importers/onepasswordImporters/onepasswordMacCsvImporter';
import { CipherType } from 'jslib-common/enums/cipherType';
import { CipherView } from 'jslib-common/models/view/cipherView';
import { CipherType } from '../../src/enums/cipherType';
import { CipherView } from '../../src/models/view/cipherView';
import { data as creditCardData } from './testData/onePasswordCsv/creditCard.mac.csv';
import { data as identityData } from './testData/onePasswordCsv/identity.mac.csv';

View File

@@ -1,9 +1,9 @@
import { OnePasswordWinCsvImporter as Importer } from 'jslib-common/importers/onepasswordImporters/onepasswordWinCsvImporter';
import { OnePasswordWinCsvImporter as Importer } from '../../src/importers/onepasswordImporters/onepasswordWinCsvImporter';
import { CipherType } from 'jslib-common/enums/cipherType';
import { FieldType } from 'jslib-common/enums/fieldType';
import { CipherView } from 'jslib-common/models/view/cipherView';
import { FieldView } from 'jslib-common/models/view/fieldView';
import { CipherType } from '../../src/enums/cipherType';
import { FieldType } from '../../src/enums/fieldType';
import { CipherView } from '../../src/models/view/cipherView';
import { FieldView } from '../../src/models/view/fieldView';
import { data as creditCardData } from './testData/onePasswordCsv/creditCard.windows.csv';
import { data as identityData } from './testData/onePasswordCsv/identity.windows.csv';

View File

@@ -1,4 +1,4 @@
import { sequentialize } from 'jslib-common/misc/sequentialize';
import { sequentialize } from '../../src/misc/sequentialize';
describe('sequentialize decorator', () => {
it('should call the function once', async () => {

View File

@@ -1,5 +1,5 @@
import { sequentialize } from 'jslib-common/misc/sequentialize';
import { throttle } from 'jslib-common/misc/throttle';
import { sequentialize } from '../../src/misc/sequentialize';
import { throttle } from '../../src/misc/throttle';
describe('throttle decorator', () => {
it('should call the function once at a time', async () => {

View File

@@ -1,4 +1,4 @@
import { Utils } from 'jslib-common/misc/utils';
import { Utils } from '../../src/misc/utils';
describe('Utils Service', () => {
describe('getDomain', () => {

View File

@@ -1,21 +1,21 @@
import { Arg, Substitute, SubstituteOf } from '@fluffy-spoon/substitute';
import { ApiService } from 'jslib-common/abstractions/api.service';
import { CryptoService } from 'jslib-common/abstractions/crypto.service';
import { FileUploadService } from 'jslib-common/abstractions/fileUpload.service';
import { I18nService } from 'jslib-common/abstractions/i18n.service';
import { LogService } from 'jslib-common/abstractions/log.service';
import { SearchService } from 'jslib-common/abstractions/search.service';
import { SettingsService } from 'jslib-common/abstractions/settings.service';
import { StorageService } from 'jslib-common/abstractions/storage.service';
import { UserService } from 'jslib-common/abstractions/user.service';
import { Utils } from 'jslib-common/misc/utils';
import { Cipher } from 'jslib-common/models/domain/cipher';
import { EncArrayBuffer } from 'jslib-common/models/domain/encArrayBuffer';
import { EncString } from 'jslib-common/models/domain/encString';
import { SymmetricCryptoKey } from 'jslib-common/models/domain/symmetricCryptoKey';
import { ApiService } from '../../src/abstractions/api.service';
import { CryptoService } from '../../src/abstractions/crypto.service';
import { FileUploadService } from '../../src/abstractions/fileUpload.service';
import { I18nService } from '../../src/abstractions/i18n.service';
import { LogService } from '../../src/abstractions/log.service';
import { SearchService } from '../../src/abstractions/search.service';
import { SettingsService } from '../../src/abstractions/settings.service';
import { StorageService } from '../../src/abstractions/storage.service';
import { UserService } from '../../src/abstractions/user.service';
import { Utils } from '../../src/misc/utils';
import { Cipher } from '../../src/models/domain/cipher';
import { EncArrayBuffer } from '../../src/models/domain/encArrayBuffer';
import { EncString } from '../../src/models/domain/encString';
import { SymmetricCryptoKey } from '../../src/models/domain/symmetricCryptoKey';
import { CipherService } from 'jslib-common/services/cipher.service';
import { CipherService } from '../../src/services/cipher.service';
const ENCRYPTED_TEXT = 'This data has been encrypted';
const ENCRYPTED_BYTES = new EncArrayBuffer(Utils.fromUtf8ToArray(ENCRYPTED_TEXT).buffer);

View File

@@ -1,4 +1,4 @@
import { ConsoleLogService } from 'jslib-common/services/consoleLog.service';
import { ConsoleLogService } from '../../src/services/consoleLog.service';
const originalConsole = console;
let caughtMessage: any;

View File

@@ -1,22 +1,22 @@
import { Substitute, SubstituteOf } from '@fluffy-spoon/substitute';
import { ApiService } from 'jslib-common/abstractions/api.service';
import { CipherService } from 'jslib-common/abstractions/cipher.service';
import { CryptoService } from 'jslib-common/abstractions/crypto.service';
import { FolderService } from 'jslib-common/abstractions/folder.service';
import { ApiService } from '../../src/abstractions/api.service';
import { CipherService } from '../../src/abstractions/cipher.service';
import { CryptoService } from '../../src/abstractions/crypto.service';
import { FolderService } from '../../src/abstractions/folder.service';
import { ExportService } from 'jslib-common/services/export.service';
import { ExportService } from '../../src/services/export.service';
import { Cipher } from 'jslib-common/models/domain/cipher';
import { EncString } from 'jslib-common/models/domain/encString';
import { Login } from 'jslib-common/models/domain/login';
import { CipherWithIds as CipherExport } from 'jslib-common/models/export/cipherWithIds';
import { Cipher } from '../../src/models/domain/cipher';
import { EncString } from '../../src/models/domain/encString';
import { Login } from '../../src/models/domain/login';
import { CipherWithIds as CipherExport } from '../../src/models/export/cipherWithIds';
import { CipherType } from 'jslib-common/enums/cipherType';
import { CipherView } from 'jslib-common/models/view/cipherView';
import { LoginView } from 'jslib-common/models/view/loginView';
import { CipherType } from '../../src/enums/cipherType';
import { CipherView } from '../../src/models/view/cipherView';
import { LoginView } from '../../src/models/view/loginView';
import { BuildTestObject, GetUniqueString } from '../../utils';
import { BuildTestObject, GetUniqueString } from '../utils';
const UserCipherViews = [
generateCipherView(false),

View File

@@ -0,0 +1,11 @@
{
"spec_dir": "dist/spec",
"spec_files": [
"**/*[sS]pec.js"
],
"helpers": [
"helpers.js"
],
"stopSpecOnExpectationFailure": false,
"random": true
}

16
common/spec/utils.ts Normal file
View File

@@ -0,0 +1,16 @@
function newGuid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
// tslint:disable:no-bitwise
const r = Math.random() * 16 | 0;
const v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
export function GetUniqueString(prefix: string = '') {
return prefix + '_' + newGuid();
}
export function BuildTestObject<T, K extends keyof T = keyof T>(def: Partial<Pick<T, K>> | T, constructor?: (new () => T)): T {
return Object.assign(constructor === null ? {} : new constructor(), def) as T;
}

View File

@@ -1,5 +1,7 @@
{
"compilerOptions": {
"baseUrl": ".",
"rootDir": ".",
"pretty": true,
"moduleResolution": "node",
"noImplicitAny": true,
@@ -12,10 +14,7 @@
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"declarationDir": "dist/types",
"outDir": "dist",
"typeRoots": [
"node_modules/@types"
]
"outDir": "dist"
},
"include": [
"src",

12503
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -23,40 +23,12 @@
"test:node": "npm run build && jasmine",
"test:node:watch": "concurrently -k -n TSC,Node -c yellow,cyan \"npm run build:watch\" \"nodemon -w ./dist --delay 500ms --exec jasmine\""
},
"devDependencies": {
"@fluffy-spoon/substitute": "^1.202.0",
"@types/jasmine": "^3.7.6",
"@types/node": "^14.17.1",
"concurrently": "^6.1.0",
"jasmine": "^3.7.0",
"jasmine-core": "^3.7.1",
"jasmine-ts-console-reporter": "^3.1.1",
"jsdom": "^16.5.3",
"karma": "^6.3.2",
"karma-chrome-launcher": "^3.1.0",
"karma-cli": "^2.0.0",
"karma-detect-browsers": "^2.3.3",
"karma-firefox-launcher": "^2.1.0",
"karma-jasmine": "^4.0.1",
"karma-jasmine-html-reporter": "^1.5.4",
"karma-safari-launcher": "^1.0.0",
"karma-webpack": "^4.0.2",
"nodemon": "^2.0.7",
"rimraf": "^3.0.2",
"ts-loader": "^8.1.0",
"tslint": "^6.1.3",
"ttypescript": "^1.5.12",
"typemoq": "^2.1.0",
"typescript": "4.1.5",
"typescript-transform-paths": "^2.2.3",
"webpack": "^4.46.0"
},
"dependencies": {
"@bitwarden/jslib-angular": "file:angular",
"@bitwarden/jslib-common": "file:common",
"@bitwarden/jslib-electron": "file:electron",
"@bitwarden/jslib-node": "file:node"
},
"workspaces": [
"common",
"angular",
"electron",
"node"
],
"engines": {
"node": "~14",
"npm": "~7"

View File

@@ -1,9 +0,0 @@
import { ElectronLogService } from 'jslib-electron/services/electronLog.service';
describe('ElectronLogService', () => {
it('sets dev based on electron method', () => {
process.env.ELECTRON_IS_DEV = '1';
const logService = new ElectronLogService();
expect(logService).toEqual(jasmine.objectContaining({ isDev: true }) as any);
});
});

View File

@@ -1,27 +0,0 @@
import { cleanUserAgent } from 'jslib-electron/utils';
const expectedUserAgent = `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${process.versions.chrome} Safari/537.36`;
describe('cleanUserAgent', () => {
it('cleans mac agent', () => {
const initialMacAgent = `Mozilla/5.0 (Macintosh; Intel Mac OS X 11_6_0) AppleWebKit/537.36 (KHTML, like Gecko) Bitwarden/${process.version} Chrome/${process.versions.chrome} Electron/${process.versions.electron} Safari/537.36`;
expect(cleanUserAgent(initialMacAgent)).toEqual(expectedUserAgent);
});
it('cleans windows agent', () => {
const initialWindowsAgent = `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Bitwarden/${process.version} Chrome/${process.versions.chrome} Electron/${process.versions.electron} Safari/537.36`;
expect(cleanUserAgent(initialWindowsAgent)).toEqual(expectedUserAgent);
});
it('cleans linux agent', () => {
const initialWindowsAgent = `Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Bitwarden/${process.version} Chrome/${process.versions.chrome} Electron/${process.versions.electron} Safari/537.36`;
expect(cleanUserAgent(initialWindowsAgent)).toEqual(expectedUserAgent);
});
it('does not change version numbers', () => {
const expected = `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36`;
const initialAgent = `Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Bitwarden/1.28.3 Chrome/87.0.4280.141 Electron/11.4.5 Safari/537.36`;
expect(cleanUserAgent(initialAgent)).toEqual(expected);
});
});

View File

@@ -1,5 +1,5 @@
{
"spec_dir": "dist/spec",
"spec_dir": "dist/common/spec",
"spec_files": [
"common/**/*[sS]pec.js",
"node/**/*[sS]pec.js",