Skip to content
This repository has been archived by the owner on Apr 17, 2023. It is now read-only.

Commit

Permalink
fix: ensure null values in VoyagerConfig do not override defaults
Browse files Browse the repository at this point in the history
  • Loading branch information
Dara Hayes committed Jan 10, 2019
1 parent e128058 commit c33a1da
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import test from 'ava'
import { GraphQLResolveInfo } from 'graphql'

import { AuditLogger } from '../audit'
import { DefaultAuditLogger } from '../audit/DefaultAuditLogger'
import { DefaultSecurityService } from '../security/DefaultSecurityService'
import { SecurityService } from '../security/SecurityService'
import { DefaultVoyagerConfig } from './DefaultVoyagerConfig'
Expand All @@ -9,6 +12,7 @@ test('DefaultVoyagerConfig returns a blank security service by default', async (

t.truthy(voyagerConfig.securityService)
t.truthy(voyagerConfig.securityService instanceof DefaultSecurityService)
t.truthy(voyagerConfig.auditLogger instanceof DefaultAuditLogger)
})

test('DefaultVoyagerConfig.merge() will override default security service with user supplied one', async (t) => {
Expand All @@ -31,3 +35,30 @@ test('DefaultVoyagerConfig.merge() will override default security service with u
t.truthy(voyagerConfig.securityService)
t.truthy(voyagerConfig.securityService instanceof DummySecurityService)
})

test('DefaultVoyagerConfig.merge() will override default audit logger with user supplied one', async (t) => {

class DummyAuditLogger implements AuditLogger {
public logResolverCompletion (msg: string, success: boolean, obj: any, args: any, context: any, info: GraphQLResolveInfo): void {
// no op
}

public auditLog (msg: string, obj: any, args: any, context: any, info: GraphQLResolveInfo): void {
// no op
}
}

const auditLogger = new DummyAuditLogger()
const voyagerConfig = new DefaultVoyagerConfig().merge({ auditLogger })

t.truthy(voyagerConfig.auditLogger)
t.truthy(voyagerConfig.auditLogger instanceof DummyAuditLogger)
})

test('DefaultVoyagerConfig.merge() will still give you defaults if user explicitly sets them to null', (t) => {
const voyagerConfig = new DefaultVoyagerConfig().merge({ securityService: null, auditLogger: null })

t.truthy(voyagerConfig.securityService)
t.truthy(voyagerConfig.securityService instanceof DefaultSecurityService)
t.truthy(voyagerConfig.auditLogger instanceof DefaultAuditLogger)
})
13 changes: 11 additions & 2 deletions packages/apollo-voyager-server/src/config/DefaultVoyagerConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,23 @@ import { DefaultSecurityService } from '../security/DefaultSecurityService'
import { SecurityService } from '../security/SecurityService'
import { VoyagerConfig } from './VoyagerConfig'

interface UserVoyagerConfig {
securityService?: SecurityService | null
auditLogger?: AuditLogger | null
}

export class DefaultVoyagerConfig implements VoyagerConfig {
/**
* Optional security service to be applied
*/
public securityService: SecurityService = new DefaultSecurityService()
public auditLogger: AuditLogger = new DefaultAuditLogger()

public merge (userConfig: VoyagerConfig) {
return Object.assign(this, userConfig)
public merge (userConfig: UserVoyagerConfig) {
if (userConfig) {
this.securityService = (userConfig.securityService) ? userConfig.securityService : this.securityService
this.auditLogger = (userConfig.auditLogger) ? userConfig.auditLogger : this.auditLogger
}
return this
}
}

0 comments on commit c33a1da

Please sign in to comment.