Skip to content

Commit

Permalink
feat: require log levels in driver config (#36)
Browse files Browse the repository at this point in the history
* feat: require log levels in driver config

* fix: correct HTTP driver config in app

* feat: add HTTP driver options

* feat: remove named type

* docs: add inline docs to HttpDriverModule

* test: cover HttpDriverModule.withOptions
  • Loading branch information
LayZeeDK authored Nov 2, 2020
1 parent c1892e9 commit e0b5777
Show file tree
Hide file tree
Showing 7 changed files with 124 additions and 8 deletions.
9 changes: 7 additions & 2 deletions apps/lumberjack-app/src/app/app.component.spec.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { createComponentFactory, Spectator } from '@ngneat/spectator';

import { LumberjackModule } from '@ngworker/lumberjack';
import { LumberjackLogLevel, LumberjackModule } from '@ngworker/lumberjack';
import { ConsoleDriverModule } from '@ngworker/lumberjack/console-driver';
import { HttpDriverModule } from '@ngworker/lumberjack/http-driver';

Expand All @@ -15,7 +15,12 @@ describe('AppComponent', () => {
HttpClientTestingModule,
LumberjackModule.forRoot(),
ConsoleDriverModule.forRoot(),
HttpDriverModule.forRoot({ logWagonSize: 5, origin: 'ForestAPP', storeUrl: '/api/logs' }),
HttpDriverModule.forRoot({
levels: [LumberjackLogLevel.Error],
logWagonSize: 5,
origin: 'ForestAPP',
storeUrl: '/api/logs',
}),
],
});

Expand Down
3 changes: 2 additions & 1 deletion apps/lumberjack-app/src/app/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { HttpClientModule } from '@angular/common/http';
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

import { LumberjackModule } from '@ngworker/lumberjack';
import { LumberjackLogLevel, LumberjackModule } from '@ngworker/lumberjack';
import { ConsoleDriverModule } from '@ngworker/lumberjack/console-driver';
import { HttpDriverModule } from '@ngworker/lumberjack/http-driver';

Expand All @@ -16,6 +16,7 @@ import { AppComponent } from './app.component';
LumberjackModule.forRoot(),
ConsoleDriverModule.forRoot(),
HttpDriverModule.forRoot({
levels: [LumberjackLogLevel.Error],
origin: 'ForestApp',
storeUrl: '/api/logs',
logWagonSize: 2,
Expand Down
1 change: 1 addition & 0 deletions libs/ngworker/lumberjack/http-driver/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
*/

export * from './lib/http-driver-config.token';
export * from './lib/http-driver-options';
export * from './lib/http-driver-root.module';
export * from './lib/http-driver.module';
export * from './lib/http.driver';
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { LogDriverConfig } from '@ngworker/lumberjack';

import { HttpDriverConfig } from './http-driver-config.token';

export type HttpDriverOptions = Omit<HttpDriverConfig, keyof LogDriverConfig>;
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
} from '@ngworker/lumberjack';

import { HttpDriverConfig } from './http-driver-config.token';
import { HttpDriverOptions } from './http-driver-options';
import { HttpDriverModule } from './http-driver.module';
import { HttpDriver } from './http.driver';

Expand All @@ -21,7 +22,7 @@ const createHttpDriver = (
}: {
config: HttpDriverConfig;
isLumberjackModuleImportedFirst?: boolean;
} = { config: { storeUrl: 'api/json', logWagonSize: 1, origin: 'TEST_MODULE' } }
} = { config: { levels: [LumberjackLogLevel.Verbose], storeUrl: 'api/json', logWagonSize: 1, origin: 'TEST_MODULE' } }
) => {
TestBed.configureTestingModule({
imports: [
Expand All @@ -36,14 +37,36 @@ const createHttpDriver = (

return httpDriver;
};
const createHttpDriverWithOptions = (
{
isLumberjackModuleImportedFirst = true,
options,
}: {
isLumberjackModuleImportedFirst?: boolean;
options: HttpDriverOptions;
} = { options: { storeUrl: 'api/json', logWagonSize: 1, origin: 'TEST_MODULE' } }
) => {
TestBed.configureTestingModule({
imports: [
HttpClientTestingModule,
isLumberjackModuleImportedFirst ? LumberjackModule.forRoot() : [],
HttpDriverModule.withOptions(options),
isLumberjackModuleImportedFirst ? [] : LumberjackModule.forRoot(),
],
});

const [httpDriver] = (resolveDependency(LogDriverToken) as unknown) as LogDriver[];

return httpDriver;
};

describe(HttpDriverModule.name, () => {
it(`cannot be imported without using the ${HttpDriverModule.forRoot.name} method`, () => {
expectNgModuleToBeGuarded(HttpDriverModule);
});

describe(HttpDriverModule.forRoot.name, () => {
it('provides the http driver', () => {
it('provides the HTTP driver', () => {
const httpDriver = createHttpDriver();

expect(httpDriver).toBeInstanceOf(HttpDriver);
Expand All @@ -65,6 +88,7 @@ describe(HttpDriverModule.name, () => {

it('registers a default level configuration if none is specified', () => {
const customHttpConfig: HttpDriverConfig = {
levels: [LumberjackLogLevel.Verbose],
storeUrl: 'api/logstore',
origin: 'TEST_MODULE',
logWagonSize: 5,
Expand Down Expand Up @@ -94,4 +118,64 @@ describe(HttpDriverModule.name, () => {
expect(actualConfig).toEqual(expectedConfig);
});
});

describe(HttpDriverModule.withOptions.name, () => {
it('provides the HTTP driver', () => {
const httpDriver = createHttpDriverWithOptions();

expect(httpDriver).toBeInstanceOf(HttpDriver);
});

it('registers the specified options', () => {
const options: HttpDriverOptions = {
storeUrl: 'api/logstore',
origin: 'TEST_MODULE',
logWagonSize: 5,
};

const httpDriver = createHttpDriverWithOptions({ options });

const actualConfig = httpDriver.config;
const expectedConfig: HttpDriverConfig = {
...options,
// tslint:disable-next-line: no-any
levels: jasmine.any(Array) as any,
};
expect(actualConfig).toEqual(expectedConfig);
});

it('gets common options from the log driver config', () => {
const options: HttpDriverOptions = {
storeUrl: 'api/logstore',
origin: 'TEST_MODULE',
logWagonSize: 5,
};

const httpDriver = createHttpDriverWithOptions({ options });

const { levels } = httpDriver.config;
expect(levels).toEqual([LumberjackLogLevel.Verbose]);
});

it('does register the specified log driver configuration when the lumberjack module is imported after the http driver module', () => {
const options: HttpDriverOptions = {
storeUrl: 'api/logstore',
origin: 'TEST_MODULE',
logWagonSize: 5,
};

const httpDriver = createHttpDriverWithOptions({
options,
isLumberjackModuleImportedFirst: false,
});

const actualConfig = httpDriver.config;
const expectedConfig: HttpDriverConfig = {
...options,
// tslint:disable-next-line: no-any
levels: jasmine.any(Array) as any,
};
expect(actualConfig).toEqual(expectedConfig);
});
});
});
20 changes: 20 additions & 0 deletions libs/ngworker/lumberjack/http-driver/src/lib/http-driver.module.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import { ModuleWithProviders, NgModule } from '@angular/core';

import { HttpDriverConfig, HttpDriverConfigToken } from './http-driver-config.token';
import { HttpDriverOptions } from './http-driver-options';
import { HttpDriverRootModule } from './http-driver-root.module';

@NgModule()
export class HttpDriverModule {
/**
* Pass a full HTTP driver configuration.
*/
static forRoot(config: HttpDriverConfig): ModuleWithProviders<HttpDriverRootModule> {
return {
ngModule: HttpDriverRootModule,
Expand All @@ -17,6 +21,22 @@ export class HttpDriverModule {
};
}

/**
* Pass options exclusive to the HTTP driver configuration, but fall back on
* the log driver config for common options.
*/
static withOptions(options: HttpDriverOptions): ModuleWithProviders<HttpDriverRootModule> {
return {
ngModule: HttpDriverRootModule,
providers: [
{
provide: HttpDriverConfigToken,
useValue: options,
},
],
};
}

constructor() {
throw new Error('Do not import HttpDriverModule directly. Use HttpDriverModule.forRoot.');
}
Expand Down
6 changes: 3 additions & 3 deletions libs/ngworker/lumberjack/src/lib/configs/log-driver.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ export interface LogDriverConfig {
* If undefined or [LumberjackLogLevel.Verbose] all levels are allowed.
*
*/
levels?: LumberjackLogEntryLevel[] | [LumberjackLogLevel.Verbose];
readonly levels: ReadonlyArray<LumberjackLogEntryLevel> | [LumberjackLogLevel.Verbose];
}

export const defaultLogDriverConfig = {
levels: undefined,
export const defaultLogDriverConfig: LogDriverConfig = {
levels: [LumberjackLogLevel.Verbose],
};

0 comments on commit e0b5777

Please sign in to comment.