Skip to content

Commit

Permalink
Update snapshot command and associated tests
Browse files Browse the repository at this point in the history
  • Loading branch information
maprules1000 committed Apr 10, 2019
1 parent c5f7788 commit 409e9d0
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 72 deletions.
38 changes: 21 additions & 17 deletions src/commands/snapshot.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {flags} from '@oclif/command'
import Constants from '../services/constants'
import {StaticSnapshotOptions} from '../services/static-snapshot-options'
import StaticSnapshotService from '../services/static-snapshot-service'
import PercyCommand from './percy-command'

Expand All @@ -17,6 +18,7 @@ export default class Snapshot extends PercyCommand {
'$ percy snapshot _mySite/',
'$ percy snapshot _mySite/ --baseUrl "blog/"',
'$ percy snapshot _mySite/ --widths "320,780,1280"',
'$ percy snapshot _mySite/ --ignore-folders "Tmp,_secrets,node_modules"',
]

static flags = {
Expand All @@ -25,9 +27,9 @@ export default class Snapshot extends PercyCommand {
description: 'Regular expression for matching the files to snapshot. Defaults to: "\.(html|htm)$"',
default: '\.(html|htm)$',
}),
'snapshot-ignore-regex': flags.string({
'ignore-folders': flags.string({
char: 'i',
description: 'Regular expression for matching the files to NOT snapshot.',
description: 'Comma-seperated string of folders to ignore. Ex: Tmp,_secrets,node_modules',
}),
'widths': flags.string({
char: 'w',
Expand All @@ -53,8 +55,6 @@ export default class Snapshot extends PercyCommand {
}),
}

staticSnapshotService: StaticSnapshotService = new StaticSnapshotService()

async run() {
await super.run()

Expand All @@ -67,34 +67,38 @@ export default class Snapshot extends PercyCommand {
const networkIdleTimeout = flags['network-idle-timeout'] as number
const rawWidths = flags.widths as string
const baseUrl = flags.baseUrl as string
const snapshotIgnoreRegex = flags['snapshot-ignore-regex'] as string
const rawIgnoreFolders = flags['ignore-folders'] as string
const snapshotCaptureRegex = flags['snapshot-capture-regex'] as string

// Exit snapshot command if percy will not run
// exit gracefully if percy will not run
if (!this.percyWillRun()) { this.exit(0) }

const widths = rawWidths.split(',').map(Number)
const ignoreFolders = rawIgnoreFolders.split(',')

// start the agent service
await this.agentService.start({port, networkIdleTimeout})
this.logStart()

// need to start the snapshot service
const staticSnapshotService = this.staticSnapshotService.snapshot({
const options: StaticSnapshotOptions = {
port: portPlusOne,
staticAssetDirectory,
widths,
baseUrl,
snapshotCaptureRegex,
snapshotIgnoreRegex,
})
ignoreFolders,
}

const staticSnapshotService = new StaticSnapshotService(options)

// start the snapshot service
staticSnapshotService.start()

// take the snapshots
await staticSnapshotService.snapshotAll()

// then wait for the snapshot service to complete
// staticSnapshotService.on('exit', async (code: any) => {
// if (this.percyWillRun()) {
// // and then stop the agent
// await this.agentService.stop()
// }
// })
// stop the static snapshot and agent services
await staticSnapshotService.stop()
await this.agentService.stop()
}
}
2 changes: 1 addition & 1 deletion src/services/static-snapshot-options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@ export interface StaticSnapshotOptions {
widths: number[],
baseUrl: string,
snapshotCaptureRegex: string,
snapshotIgnoreRegex?: string | undefined,
ignoreFolders?: string[] | undefined,
}
8 changes: 6 additions & 2 deletions src/services/static-snapshot-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,18 @@ import logger from '../utils/logger'
import {StaticSnapshotOptions} from './static-snapshot-options'

export default class StaticSnapshotService {
constructor() {
constructor(options: StaticSnapshotOptions) {
// logger.info('calling constructor...')
}

async snapshot(options: StaticSnapshotOptions) {
async start() {
// logger.info('starting static snapshot service...')
}

async snapshotAll() {
// logger.info('taking snapshots of the static site...')
}

async stop() {
// logger.info('stopping static snapshot service...')
}
Expand Down
101 changes: 49 additions & 52 deletions test/commands/snapshot.test.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import * as chai from 'chai'
import {describe} from 'mocha'
import * as sinon from 'sinon'
import Snapshot from '../../src/commands/snapshot'
import AgentService from '../../src/services/agent-service'
import StaticSnapshotService from '../../src/services/static-snapshot-service'
import {describe} from 'mocha'
import {captureStdOut} from '../helpers/stdout'

import {expect, test} from '@oclif/test'
Expand All @@ -28,24 +28,14 @@ describe('snapshot', () => {

function StaticSnapshotServiceStub(): StaticSnapshotService {
const staticSnapshotService = StaticSnapshotService.prototype as StaticSnapshotService
sandbox.stub(staticSnapshotService, 'snapshot')

const snapshot = new Snapshot([], '') as Snapshot
sandbox.stub(snapshot, 'staticSnapshotService').returns(staticSnapshotService)
sandbox.stub(staticSnapshotService, 'snapshotAll')
sandbox.stub(staticSnapshotService, 'start')

return staticSnapshotService
}

it('starts the static snapshot service', async () => {
const expectedAgentOptions = {networkIdleTimeout: 50, port: 5338}
const expectedSnapshotOptions = {
port: 5339,
staticAssetDirectory: './dummy-test-dir',
widths: [1280],
baseUrl: '/',
snapshotCaptureRegex: '\.(html|htm)$',
snapshotIgnoreRegex: undefined,
}

const agentServiceStub = AgentServiceStub()
const staticSnapshotServiceStub = StaticSnapshotServiceStub()
Expand All @@ -55,48 +45,55 @@ describe('snapshot', () => {
})

chai.expect(agentServiceStub.start).to.be.calledWith(expectedAgentOptions)
chai.expect(staticSnapshotServiceStub.snapshot).to.be.calledWith(expectedSnapshotOptions)
chai.expect(staticSnapshotServiceStub.start).to.have.callCount(1)
chai.expect(staticSnapshotServiceStub.snapshotAll).to.have.callCount(1)
chai.expect(stdout).to.match(/\[percy\] percy has started./)
})

it('passes the correct args to the static snapshot service', async () => {
const port = 5338

const expectedAgentOptions = {networkIdleTimeout: 50, port}
const expectedSnapshotOptions = {
port: port + 1,
staticAssetDirectory: './dummy-test-dir',
widths: [1280],
baseUrl: '/',
snapshotCaptureRegex: 'custom-capture',
snapshotIgnoreRegex: 'custom-ignore',
}

const snapshotCommandOptions = [
'-p',
port.toString(),
'-w',
expectedSnapshotOptions.widths.toString(),
'-b',
expectedSnapshotOptions.baseUrl,
'-c',
expectedSnapshotOptions.snapshotCaptureRegex,
'-i',
expectedSnapshotOptions.snapshotIgnoreRegex,
expectedSnapshotOptions.staticAssetDirectory,
]

const agentServiceStub = AgentServiceStub()
const staticSnapshotServiceStub = StaticSnapshotServiceStub()

const stdout = await captureStdOut(async () => {
await Snapshot.run(snapshotCommandOptions)
})

chai.expect(stdout).to.match(/\[percy\] percy has started./)
chai.expect(staticSnapshotServiceStub.snapshot).to.be.calledWith(expectedSnapshotOptions)
chai.expect(agentServiceStub.start).to.be.calledWith(expectedAgentOptions)
})
// todo: how to test that the flags are being passed to the service correctly?
xit('starts the snapshot service on the correct port')
xit('passes the correct args to the snapshotAll command')

// old way of testing flags
// it('passes the correct args to the static snapshot service', async () => {
// const port = 5338

// const expectedAgentOptions = {networkIdleTimeout: 50, port}
// const expectedSnapshotOptions = {
// port: port + 1,
// staticAssetDirectory: './dummy-test-dir',
// widths: [1280],
// baseUrl: '/',
// snapshotCaptureRegex: 'custom-capture',
// snapshotIgnoreRegex: 'custom-ignore',
// }

// const snapshotCommandOptions = [
// '-p',
// port.toString(),
// '-w',
// expectedSnapshotOptions.widths.toString(),
// '-b',
// expectedSnapshotOptions.baseUrl,
// '-c',
// expectedSnapshotOptions.snapshotCaptureRegex,
// '-i',
// expectedSnapshotOptions.snapshotIgnoreRegex,
// expectedSnapshotOptions.staticAssetDirectory,
// ]

// const agentServiceStub = AgentServiceStub()
// const staticSnapshotServiceStub = StaticSnapshotServiceStub()

// const stdout = await captureStdOut(async () => {
// await Snapshot.run(snapshotCommandOptions)
// })

// chai.expect(stdout).to.match(/\[percy\] percy has started./)

// chai.expect(staticSnapshotServiceStub.snapshot).to.be.calledWith(expectedSnapshotOptions)
// chai.expect(agentServiceStub.start).to.be.calledWith(expectedAgentOptions)
// })
})

describe('snapshot command', () => {
Expand Down

0 comments on commit 409e9d0

Please sign in to comment.