Skip to content

Commit

Permalink
feat: Create first service (browser)
Browse files Browse the repository at this point in the history
Implement a simple infrastructure with a single service and method
  • Loading branch information
owennw committed Nov 5, 2018
1 parent b4364ba commit 053f89c
Show file tree
Hide file tree
Showing 11 changed files with 132 additions and 8 deletions.
46 changes: 46 additions & 0 deletions src/__tests__/container-service.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import ContainerService from '../container-service'
import { IContainerService } from '../services'

const createMockService = (applies: boolean, start: () => void): IContainerService => ({
applies: () => applies,
start,
})

describe('Container Service', () => {
const service1Applies = false
const service1Start = jest.fn()
const mockService1 = createMockService(service1Applies, service1Start)

const service2Applies = true
const service2Start = jest.fn()
const mockService2 = createMockService(service2Applies, service2Start)

beforeEach(() => {
service1Start.mockReset()
service2Start.mockReset()
})

it('selects the first strategy that applies (1)', () => {
const containerService = new ContainerService([mockService1, mockService2])
containerService.start()

expect(service1Start).toHaveBeenCalledTimes(0)
expect(service2Start).toHaveBeenCalledTimes(1)
})

it('selects the first strategy that applies (2)', () => {
const containerService = new ContainerService([mockService2, mockService1])
containerService.start()

expect(service1Start).toHaveBeenCalledTimes(0)
expect(service2Start).toHaveBeenCalledTimes(1)
})

it('start calls start on the service', () => {
const containerService = new ContainerService([mockService2])
expect(service2Start).toHaveBeenCalledTimes(0)

containerService.start()
expect(service2Start).toHaveBeenCalledTimes(1)
})
})
7 changes: 5 additions & 2 deletions src/__tests__/index.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import services from '../services'
import ContainerService from '../container-service'

import containerService from '../index'

describe('containerService', () => {
it('has a double function', () => {
expect(containerService.double(5)).toBe(10)
it('is constructed with the services', () => {
expect(containerService).toEqual(new ContainerService(services))
})
})
15 changes: 15 additions & 0 deletions src/container-service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { IContainerService } from './services'

class ContainerService {
private service: IContainerService

constructor(services: IContainerService[]) {
this.service = services.find(s => s.applies())
}

public start() {
this.service.start()
}
}

export default ContainerService
7 changes: 3 additions & 4 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
const containerService = {
double: (input: number) => input * 2,
}
import services from './services'
import ContainerService from './container-service'

export default containerService
export default new ContainerService(services)
13 changes: 13 additions & 0 deletions src/services/__tests__/browser-service.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import BrowserService from '../browser-service'

const browserService = new BrowserService()

describe('BrowserService', () => {
it('applies returns true', () => {
expect(browserService.applies()).toBe(true)
})

it('start does not throw an error', () => {
browserService.start()
})
})
12 changes: 12 additions & 0 deletions src/services/__tests__/services.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
const mockBrowserService = class {}
jest.mock('../browser-service', () => ({
default: mockBrowserService,
}))

import services from '../services'

describe('services', () => {
it('combines all the services in the correct order', () => {
expect(services).toEqual([new mockBrowserService()])
})
})
13 changes: 13 additions & 0 deletions src/services/browser-service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import IContainerService from './container-service'

class BrowserService implements IContainerService {
public applies() {
return true
}

public start() {
// No-op
}
}

export default BrowserService
6 changes: 6 additions & 0 deletions src/services/container-service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
interface IContainerService {
applies(): boolean
start(): void
}

export default IContainerService
6 changes: 6 additions & 0 deletions src/services/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import IContainerService from './container-service'

import services from './services'

export default services
export { IContainerService }
7 changes: 7 additions & 0 deletions src/services/services.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import BrowserService from './browser-service'

const services = [
new BrowserService(),
]

export default services
8 changes: 6 additions & 2 deletions tslint.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,16 @@
"semicolon": [true, "never"],
"indent": [true, "spaces", 2],
"quotemark": [true, "single"],
"eofline": false
"eofline": false,
"arrow-parens": false,
"ordered-imports": false
},
"jsRules": {
"semicolon": [true, "never"],
"indent": [true, "spaces", 2],
"quotemark": [true, "single"],
"eofline": false
"eofline": false,
"arrow-parens": false,
"ordered-imports": false
}
}

0 comments on commit 053f89c

Please sign in to comment.