From 107a7c5e9eb3ed248bc71a14d038056e21e4c60e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thea=20Sch=C3=B6bl?= Date: Wed, 5 Jul 2023 12:56:15 +0200 Subject: [PATCH] test: fix app unit tests --- .changeset/tasty-islands-smell.md | 6 ++ .gitlab-ci.yml | 1 + frontend/app/karma.conf.js | 17 ++-- frontend/app/package.json | 9 +- .../app/_helpers/data/sample-configuration.ts | 6 +- .../modules/auth/auth-helper.service.spec.ts | 6 +- .../modules/auth/default-auth.service.spec.ts | 10 +-- .../daia-availability.component.spec.ts | 6 +- .../modules/hebis/daia-data.provider.spec.ts | 6 +- .../app/modules/map/position.service.spec.ts | 7 +- frontend/app/src/test.ts | 15 +++- package.json | 2 +- pnpm-lock.yaml | 89 +++++++++++-------- 13 files changed, 102 insertions(+), 78 deletions(-) create mode 100644 .changeset/tasty-islands-smell.md diff --git a/.changeset/tasty-islands-smell.md b/.changeset/tasty-islands-smell.md new file mode 100644 index 00000000..37310c6b --- /dev/null +++ b/.changeset/tasty-islands-smell.md @@ -0,0 +1,6 @@ +--- +'@openstapps/app': patch +--- + +Migrate unit tests to karma-coverage and junit reports. +Fixes an issue where coverage reports would not be generated. diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3d4d6a6c..65b350c7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -95,6 +95,7 @@ stop review: rules: *deploy-rules unit: + image: registry.gitlab.com/openstapps/app:v18 stage: test needs: ['build'] script: diff --git a/frontend/app/karma.conf.js b/frontend/app/karma.conf.js index 449e893d..b14ad309 100644 --- a/frontend/app/karma.conf.js +++ b/frontend/app/karma.conf.js @@ -24,19 +24,26 @@ module.exports = function (config) { plugins: [ require('karma-jasmine'), require('karma-chrome-launcher'), - require('karma-coverage-istanbul-reporter'), + require('karma-coverage'), require('@angular-devkit/build-angular/plugins/karma'), require('karma-mocha-reporter'), + require('karma-junit-reporter'), ], client: { clearContext: false, // leave Jasmine Spec Runner output visible in browser }, - coverageIstanbulReporter: { - dir: require('path').join(__dirname, './coverage'), - reports: ['html', 'lcovonly', 'text-summary', 'cobertura'], + coverageReporter: { + dir: 'coverage/', + reporters: [{type: 'cobertura', subdir: '.'}], + // reports: ['html', 'lcovonly', 'text-summary', 'cobertura'], fixWebpackSourcePaths: true, }, - reporters: config.buildWebpack.options.codeCoverage ? ['mocha', 'coverage-istanbul'] : ['mocha'], + junitReporter: { + outputDir: 'coverage/', + outputFile: 'report-junit.xml', + useBrowserName: false, + }, + reporters: ['mocha', 'junit', 'coverage'], port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/frontend/app/package.json b/frontend/app/package.json index 7f9193ac..7c4036c8 100644 --- a/frontend/app/package.json +++ b/frontend/app/package.json @@ -47,7 +47,7 @@ "start": "ionic serve", "start:external": "ionic serve --external", "start:prod": "ionic serve --prod", - "test": "ng test", + "test": "ng test --watch=false --code-coverage", "test:integration": "sh integration-test.sh" }, "dependencies": { @@ -121,6 +121,7 @@ "@angular/compiler": "13.4.0", "@angular/compiler-cli": "13.4.0", "@angular/language-service": "13.4.0", + "@angular/platform-browser-dynamic": "13.3.11", "@capacitor/android": "4.6.1", "@capacitor/cli": "4.6.1", "@capacitor/ios": "4.6.1", @@ -157,10 +158,10 @@ "junit-report-merger": "6.0.2", "karma": "6.4.1", "karma-chrome-launcher": "3.1.1", - "karma-coverage-istanbul-reporter": "3.0.3", - "karma-jasmine": "5.1.0", - "karma-jasmine-html-reporter": "2.0.0", + "karma-junit-reporter": "2.0.1", + "karma-coverage": "2.2.1", "karma-mocha-reporter": "2.2.5", + "karma-jasmine": "5.1.0", "license-checker": "25.0.1", "protractor": "7.0.0", "surge": "0.23.1", diff --git a/frontend/app/src/app/_helpers/data/sample-configuration.ts b/frontend/app/src/app/_helpers/data/sample-configuration.ts index f440abfa..b82922c8 100644 --- a/frontend/app/src/app/_helpers/data/sample-configuration.ts +++ b/frontend/app/src/app/_helpers/data/sample-configuration.ts @@ -22,7 +22,7 @@ import { SCThingType, } from '@openstapps/core'; import {Polygon} from 'geojson'; -import packageJson from '../../../../package.json'; +import {environment} from '../../../environments/environment'; // provides sample aggregations to be used in tests or backendless development export const sampleAggregations: SCBackendAggregationConfiguration[] = [ @@ -108,8 +108,6 @@ export const sampleDefaultPolygon: Polygon = { type: 'Polygon', }; -const scVersion = packageJson.dependencies['@openstapps/core']; - export const sampleIndexResponse: SCIndexResponse = { app: { aboutPages: { @@ -197,7 +195,7 @@ export const sampleIndexResponse: SCIndexResponse = { }, auth: {}, backend: { - SCVersion: scVersion, + SCVersion: environment.sc_version, externalRequestTimeout: 5000, hiddenTypes: [SCThingType.DateSeries, SCThingType.Diff, SCThingType.Floor], mappingIgnoredTags: [], diff --git a/frontend/app/src/app/modules/auth/auth-helper.service.spec.ts b/frontend/app/src/app/modules/auth/auth-helper.service.spec.ts index 17699f94..1c2f9839 100644 --- a/frontend/app/src/app/modules/auth/auth-helper.service.spec.ts +++ b/frontend/app/src/app/modules/auth/auth-helper.service.spec.ts @@ -21,10 +21,10 @@ import {Browser} from 'ionic-appauth'; import {Requestor, StorageBackend} from '@openid/appauth'; import {TranslateService} from '@ngx-translate/core'; import {PAIAAuthService} from './paia/paia-auth.service'; -import {LoggerConfig, LoggerModule, NGXLogger} from 'ngx-logger'; import {StAppsWebHttpClient} from '../data/stapps-web-http-client.provider'; import {HttpClientModule} from '@angular/common/http'; import {SimpleBrowser} from '../../util/browser.factory'; +import {LoggerTestingModule} from 'ngx-logger/testing'; describe('AuthHelperService', () => { let authHelperService: AuthHelperService; @@ -54,11 +54,9 @@ describe('AuthHelperService', () => { beforeEach(() => { TestBed.configureTestingModule({ - imports: [HttpClientModule, LoggerModule], + imports: [HttpClientModule, LoggerTestingModule], providers: [ - NGXLogger, StAppsWebHttpClient, - LoggerConfig, { provide: TranslateService, useValue: translateServiceSpy, diff --git a/frontend/app/src/app/modules/auth/default-auth.service.spec.ts b/frontend/app/src/app/modules/auth/default-auth.service.spec.ts index 693c78da..4a23d140 100644 --- a/frontend/app/src/app/modules/auth/default-auth.service.spec.ts +++ b/frontend/app/src/app/modules/auth/default-auth.service.spec.ts @@ -19,11 +19,11 @@ import {DefaultAuthService} from './default-auth.service'; import {Browser} from 'ionic-appauth'; import {nowInSeconds, Requestor, StorageBackend} from '@openid/appauth'; import {TranslateService} from '@ngx-translate/core'; -import {LoggerConfig, LoggerModule, NGXLogger, NgxLoggerLevel} from 'ngx-logger'; import {StAppsWebHttpClient} from '../data/stapps-web-http-client.provider'; import {HttpClientModule} from '@angular/common/http'; import {IonicStorage} from 'ionic-appauth/lib'; import {RouterModule} from '@angular/router'; +import {LoggerTestingModule} from 'ngx-logger/testing'; describe('AuthService', () => { let defaultAuthService: DefaultAuthService; @@ -35,15 +35,9 @@ describe('AuthService', () => { storageBackendSpy = jasmine.createSpyObj('StorageBackend', ['getItem']); TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - LoggerModule.forRoot({level: NgxLoggerLevel.TRACE}), - RouterModule.forRoot([]), - ], + imports: [HttpClientModule, LoggerTestingModule, RouterModule.forRoot([])], providers: [ - NGXLogger, StAppsWebHttpClient, - LoggerConfig, { provide: TranslateService, useValue: translateServiceSpy, diff --git a/frontend/app/src/app/modules/hebis/daia-availability/daia-availability.component.spec.ts b/frontend/app/src/app/modules/hebis/daia-availability/daia-availability.component.spec.ts index 377bc32b..ed1fd3a7 100644 --- a/frontend/app/src/app/modules/hebis/daia-availability/daia-availability.component.spec.ts +++ b/frontend/app/src/app/modules/hebis/daia-availability/daia-availability.component.spec.ts @@ -25,8 +25,8 @@ import {DaiaAvailabilityComponent} from './daia-availability.component'; import {Observable, of} from 'rxjs'; import {StorageProvider} from '../../storage/storage.provider'; import {DaiaDataProvider} from '../daia-data.provider'; -import {LoggerConfig, LoggerModule, NGXLogger} from 'ngx-logger'; import {ConfigProvider} from '../../config/config.provider'; +import {LoggerTestingModule} from 'ngx-logger/testing'; const translations: any = {data: {detail: {TITLE: 'Foo'}}}; @@ -71,7 +71,7 @@ describe('DaiaAvailabilityComponent', () => { TranslateModule.forRoot({ loader: {provide: TranslateLoader, useClass: TranslateFakeLoader}, }), - LoggerModule, + LoggerTestingModule, ], providers: [ { @@ -86,8 +86,6 @@ describe('DaiaAvailabilityComponent', () => { provide: ConfigProvider, useValue: configProviderMock, }, - NGXLogger, - LoggerConfig, ], schemas: [CUSTOM_ELEMENTS_SCHEMA], }).compileComponents(); diff --git a/frontend/app/src/app/modules/hebis/daia-data.provider.spec.ts b/frontend/app/src/app/modules/hebis/daia-data.provider.spec.ts index 9fefb831..956fe877 100644 --- a/frontend/app/src/app/modules/hebis/daia-data.provider.spec.ts +++ b/frontend/app/src/app/modules/hebis/daia-data.provider.spec.ts @@ -19,7 +19,7 @@ import {HebisModule} from './hebis.module'; import {ConfigProvider} from '../config/config.provider'; import {StAppsWebHttpClient} from '../data/stapps-web-http-client.provider'; import {StorageProvider} from '../storage/storage.provider'; -import {LoggerConfig, LoggerModule, NGXLogger} from 'ngx-logger'; +import {LoggerTestingModule} from 'ngx-logger/testing'; import {MapModule} from '../map/map.module'; import {HttpClientModule} from '@angular/common/http'; import {StorageModule} from '../storage/storage.module'; @@ -49,7 +49,7 @@ describe('DaiaDataProvider', () => { MapModule, HttpClientModule, StorageModule, - LoggerModule, + LoggerTestingModule, TranslateModule.forRoot({ loader: {provide: TranslateLoader, useClass: TranslateFakeLoader}, }), @@ -61,8 +61,6 @@ describe('DaiaDataProvider', () => { }, StAppsWebHttpClient, StorageProvider, - NGXLogger, - LoggerConfig, DaiaDataProvider, ], }); diff --git a/frontend/app/src/app/modules/map/position.service.spec.ts b/frontend/app/src/app/modules/map/position.service.spec.ts index 9a165eb9..fa231449 100644 --- a/frontend/app/src/app/modules/map/position.service.spec.ts +++ b/frontend/app/src/app/modules/map/position.service.spec.ts @@ -18,7 +18,7 @@ import {HttpClientModule} from '@angular/common/http'; import {StorageModule} from '../storage/storage.module'; import {MapPosition, PositionService} from './position.service'; import {ConfigProvider} from '../config/config.provider'; -import {LoggerConfig, LoggerModule, NGXLogger, NGXMapperService} from 'ngx-logger'; +import {LoggerTestingModule} from 'ngx-logger/testing'; describe('PositionService', () => { let positionService: PositionService; @@ -37,11 +37,8 @@ describe('PositionService', () => { }, }); TestBed.configureTestingModule({ - imports: [MapModule, HttpClientModule, StorageModule, LoggerModule], + imports: [MapModule, HttpClientModule, StorageModule, LoggerTestingModule], providers: [ - LoggerConfig, - NGXLogger, - NGXMapperService, { provider: ConfigProvider, useValue: configProviderMock, diff --git a/frontend/app/src/test.ts b/frontend/app/src/test.ts index 812d6df1..d598cd14 100644 --- a/frontend/app/src/test.ts +++ b/frontend/app/src/test.ts @@ -15,14 +15,25 @@ // This file is required by karma.conf.js and loads recursively all the .spec and framework files import 'zone.js/testing'; import {getTestBed} from '@angular/core/testing'; -import {BrowserTestingModule, platformBrowserTesting} from '@angular/platform-browser/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting, +} from '@angular/platform-browser-dynamic/testing'; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +declare const __karma__: any; // eslint-disable-next-line @typescript-eslint/no-explicit-any declare const require: any; +// prevent Karma from runnint prematurely +// eslint-disable-next-line @typescript-eslint/no-empty-function +__karma__.loaded = function () {}; + // First, initialize the Angular testing environment. -getTestBed().initTestEnvironment(BrowserTestingModule, platformBrowserTesting()); +getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()); // Then we find all the tests. const context = require.context('./', true, /\.spec\.ts$/); // And load the modules. context.keys().map(context); + +__karma__.start(); diff --git a/package.json b/package.json index 769bc431..191d6912 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "publish-packages": "pnpm changeset version && pnpm syncpack:fix && pnpm install && git add . && git commit -m \"refactor: update changelog\n\nci: publish release\" && git push && pnpm changeset tag && git push --follow-tags", "syncpack": "syncpack list-mismatches && syncpack lint-semver-ranges --types dev,peer,prod", "syncpack:fix": "syncpack format && syncpack fix-mismatches", - "test": "trap 'node coverage.mjs' EXIT && dotenv -c -- turbo run test --filter=!@openstapps/app", + "test": "trap 'node coverage.mjs' EXIT && dotenv -c -- turbo run test", "test:integration": "dotenv -c -- turbo run test:integration", "test:integration:app": "dotenv -c -- turbo run test:integration --filter=@openstapps/app", "test:integration:backend": "dotenv -c -- turbo run test:integration --filter=@openstapps/backend", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f7bfa20f..793eca98 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -396,8 +396,6 @@ importers: specifier: 2.8.6 version: 2.8.6 - configuration/builder-image: {} - configuration/eslint-config: dependencies: '@typescript-eslint/eslint-plugin': @@ -924,6 +922,9 @@ importers: '@angular/language-service': specifier: 13.4.0 version: 13.4.0 + '@angular/platform-browser-dynamic': + specifier: 13.3.11 + version: 13.3.11(@angular/common@13.4.0)(@angular/compiler@13.4.0)(@angular/core@13.4.0)(@angular/platform-browser@13.4.0) '@capacitor/android': specifier: 4.6.1 version: 4.6.1(@capacitor/core@4.6.1) @@ -1032,15 +1033,15 @@ importers: karma-chrome-launcher: specifier: 3.1.1 version: 3.1.1 - karma-coverage-istanbul-reporter: - specifier: 3.0.3 - version: 3.0.3 + karma-coverage: + specifier: 2.2.1 + version: 2.2.1 karma-jasmine: specifier: 5.1.0 version: 5.1.0(karma@6.4.1) - karma-jasmine-html-reporter: - specifier: 2.0.0 - version: 2.0.0(jasmine-core@4.5.0)(karma-jasmine@5.1.0)(karma@6.4.1) + karma-junit-reporter: + specifier: 2.0.1 + version: 2.0.1(karma@6.4.1) karma-mocha-reporter: specifier: 2.2.5 version: 2.2.5(karma@6.4.1) @@ -2390,7 +2391,6 @@ packages: dependencies: '@angular/core': 13.4.0(rxjs@7.8.0)(zone.js@0.12.0) tslib: 2.4.1 - dev: false /@angular/cdk@13.3.9(@angular/common@13.4.0)(@angular/core@13.4.0)(rxjs@7.8.0): resolution: {integrity: sha512-XCuCbeuxWFyo3EYrgEYx7eHzwl76vaWcxtWXl00ka8d+WAOtMQ6Tf1D98ybYT5uwF9889fFpXAPw98mVnlo3MA==} @@ -2448,7 +2448,6 @@ packages: '@angular/core': 13.4.0(rxjs@7.8.0)(zone.js@0.12.0) rxjs: 7.8.0 tslib: 2.4.1 - dev: false /@angular/compiler-cli@13.4.0(@angular/compiler@13.4.0)(typescript@4.6.4): resolution: {integrity: sha512-OQD0w9aZXbpcyWDEaozoHH/n3eYDLhBsmJcIBVqUN8Awx8m17v2u2R6m7DIEpVRbBzYtTscAMTKONNVwsTolHA==} @@ -2513,6 +2512,22 @@ packages: engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0} dev: true + /@angular/platform-browser-dynamic@13.3.11(@angular/common@13.4.0)(@angular/compiler@13.4.0)(@angular/core@13.4.0)(@angular/platform-browser@13.4.0): + resolution: {integrity: sha512-xM0VRC1Nw//SHO3gkghUHyjCaaQbk1UYMq4vIu3iKVq9KLqOSZgccv0NcOKHzXXN3S5RgX2auuyOUOCD6ny1Pg==} + engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0} + peerDependencies: + '@angular/common': 13.3.11 + '@angular/compiler': 13.3.11 + '@angular/core': 13.3.11 + '@angular/platform-browser': 13.3.11 + dependencies: + '@angular/common': 13.4.0(@angular/core@13.4.0)(rxjs@7.8.0) + '@angular/compiler': 13.4.0 + '@angular/core': 13.4.0(rxjs@7.8.0)(zone.js@0.12.0) + '@angular/platform-browser': 13.4.0(@angular/animations@13.4.0)(@angular/common@13.4.0)(@angular/core@13.4.0) + tslib: 2.4.1 + dev: true + /@angular/platform-browser@13.4.0(@angular/animations@13.4.0)(@angular/common@13.4.0)(@angular/core@13.4.0): resolution: {integrity: sha512-kq4TpdkSS0Z/7ToFzWhyBbh4Ai1uOKFVdL9/TAm19dLnYNIInrN3KYW6GRxZ+pkJJA9Vkq4NtgcxysQ42VFotA==} engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0} @@ -2528,7 +2543,6 @@ packages: '@angular/common': 13.4.0(@angular/core@13.4.0)(rxjs@7.8.0) '@angular/core': 13.4.0(rxjs@7.8.0)(zone.js@0.12.0) tslib: 2.4.1 - dev: false /@angular/router@13.4.0(@angular/common@13.4.0)(@angular/core@13.4.0)(@angular/platform-browser@13.4.0)(rxjs@7.8.0): resolution: {integrity: sha512-YlPAf3tPqD04rAMPAwW+XqFQaBXT9fY2Mh7J/9MXeyLZau59afBIcVNbeQxW5RxDajmfyFy437Qh22qFP2l0Hw==} @@ -12854,11 +12868,6 @@ packages: resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} dev: true - /istanbul-lib-coverage@2.0.5: - resolution: {integrity: sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==} - engines: {node: '>=6'} - dev: true - /istanbul-lib-coverage@3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} @@ -12886,14 +12895,12 @@ packages: supports-color: 7.2.0 dev: true - /istanbul-lib-source-maps@3.0.6: - resolution: {integrity: sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==} - engines: {node: '>=6'} + /istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} dependencies: debug: 4.3.4(supports-color@8.1.1) - istanbul-lib-coverage: 2.0.5 - make-dir: 2.1.0 - rimraf: 2.7.1 + istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: - supports-color @@ -13171,30 +13178,20 @@ packages: which: 1.3.1 dev: true - /karma-coverage-istanbul-reporter@3.0.3: - resolution: {integrity: sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==} + /karma-coverage@2.2.1: + resolution: {integrity: sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==} + engines: {node: '>=10.0.0'} dependencies: istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.2.1 istanbul-lib-report: 3.0.0 - istanbul-lib-source-maps: 3.0.6 + istanbul-lib-source-maps: 4.0.1 istanbul-reports: 3.1.5 minimatch: 3.1.2 transitivePeerDependencies: - supports-color dev: true - /karma-jasmine-html-reporter@2.0.0(jasmine-core@4.5.0)(karma-jasmine@5.1.0)(karma@6.4.1): - resolution: {integrity: sha512-SB8HNNiazAHXM1vGEzf8/tSyEhkfxuDdhYdPBX2Mwgzt0OuF2gicApQ+uvXLID/gXyJQgvrM9+1/2SxZFUUDIA==} - peerDependencies: - jasmine-core: ^4.0.0 - karma: ^6.0.0 - karma-jasmine: ^5.0.0 - dependencies: - jasmine-core: 4.5.0 - karma: 6.4.1 - karma-jasmine: 5.1.0(karma@6.4.1) - dev: true - /karma-jasmine@5.1.0(karma@6.4.1): resolution: {integrity: sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==} engines: {node: '>=12'} @@ -13205,6 +13202,17 @@ packages: karma: 6.4.1 dev: true + /karma-junit-reporter@2.0.1(karma@6.4.1): + resolution: {integrity: sha512-VtcGfE0JE4OE1wn0LK8xxDKaTP7slN8DO3I+4xg6gAi1IoAHAXOJ1V9G/y45Xg6sxdxPOR3THCFtDlAfBo9Afw==} + engines: {node: '>= 8'} + peerDependencies: + karma: '>=0.9' + dependencies: + karma: 6.4.1 + path-is-absolute: 1.0.1 + xmlbuilder: 12.0.0 + dev: true + /karma-mocha-reporter@2.2.5(karma@6.4.1): resolution: {integrity: sha512-Hr6nhkIp0GIJJrvzY8JFeHpQZNseuIakGac4bpw8K1+5F0tLb6l7uvXRa8mt2Z+NVwYgCct4QAfp2R2QP6o00w==} peerDependencies: @@ -13725,10 +13733,12 @@ packages: /make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} + requiresBuild: true dependencies: pify: 4.0.1 semver: 5.7.1 dev: true + optional: true /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} @@ -18958,6 +18968,11 @@ packages: engines: {node: '>=4.0'} dev: true + /xmlbuilder@12.0.0: + resolution: {integrity: sha512-lMo8DJ8u6JRWp0/Y4XLa/atVDr75H9litKlb2E5j3V3MesoL50EBgZDWoLT3F/LztVnG67GjPXLZpqcky/UMnQ==} + engines: {node: '>=6.0'} + dev: true + /xmlbuilder@15.1.1: resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} engines: {node: '>=8.0'}