Skip to content

Commit

Permalink
feat: include search-parameters.yaml in edge driver package
Browse files Browse the repository at this point in the history
  • Loading branch information
rossiam committed Jun 5, 2023
1 parent 0105f95 commit 7f331ca
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 19 deletions.
6 changes: 6 additions & 0 deletions .changeset/shiny-bananas-add.md
@@ -0,0 +1,6 @@
---
"@smartthings/plugin-cli-edge": minor
"@smartthings/cli": minor
---

include search-parameters.yaml (or .yml) in edge driver package
Expand Up @@ -4,9 +4,27 @@ import { CliUx, Errors } from '@oclif/core'
import JSZip from 'jszip'
import picomatch from 'picomatch'

import { fileExists, findYAMLFilename, isDir, isFile, isSymbolicLink, readYAMLFile, realPathForSymbolicLink, requireDir } from '../../../../lib/file-util'
import { buildTestFileMatchers, processConfigFile, processFingerprintsFile, processProfiles,
processSrcDir, resolveProjectDirName } from '../../../../lib/commands/drivers/package-util'
import {
fileExists,
findYAMLFilename,
isDir,
isFile,
isSymbolicLink,
readYAMLFile,
realPathForSymbolicLink,
requireDir,
} from '../../../../lib/file-util'
import {
buildTestFileMatchers,
processConfigFile,
processFingerprintsFile,
processOptionalYAMLFile,
processProfiles,
processSearchParametersFile,
processSrcDir,
resolveProjectDirName,
} from '../../../../lib/commands/drivers/package-util'
import * as packageUtilModule from '../../../../lib/commands/drivers/package-util'


jest.mock('fs')
Expand Down Expand Up @@ -94,36 +112,56 @@ describe('package-utils', () => {
})
})

describe('processFingerprintsFile', () => {
describe('processOptionalYAMLFile', () => {
it('includes fingerprint file if found', async () => {
findYAMLFilenameMock.mockResolvedValueOnce('fingerprints filename')
findYAMLFilenameMock.mockResolvedValueOnce('yaml filename')
readYAMLFileMock.mockReturnValueOnce({ yaml: 'file contents' })
createReadStreamMock.mockReturnValueOnce(readStreamMock)

await processFingerprintsFile('project dir', zipMock)
await processOptionalYAMLFile('optional yaml file', 'project dir', zipMock)

expect(findYAMLFilenameMock).toHaveBeenCalledTimes(1)
expect(findYAMLFilenameMock).toHaveBeenCalledWith('project dir/fingerprints')
expect(findYAMLFilenameMock).toHaveBeenCalledWith('project dir/optional yaml file')
expect(readYAMLFileMock).toHaveBeenCalledTimes(1)
expect(readYAMLFileMock).toHaveBeenCalledWith('fingerprints filename')
expect(readYAMLFileMock).toHaveBeenCalledWith('yaml filename')
expect(createReadStreamMock).toHaveBeenCalledTimes(1)
expect(createReadStreamMock).toHaveBeenCalledWith('fingerprints filename')
expect(createReadStreamMock).toHaveBeenCalledWith('yaml filename')
expect(zipFileMock).toHaveBeenCalledTimes(1)
expect(zipFileMock).toHaveBeenCalledWith('fingerprints.yml', readStreamMock)
expect(zipFileMock).toHaveBeenCalledWith('optional yaml file.yml', readStreamMock)
})

it('skips fingerprint file if none', async () => {
findYAMLFilenameMock.mockResolvedValueOnce(false)

await processFingerprintsFile('project dir', zipMock)
await processOptionalYAMLFile('optional yaml file', 'project dir', zipMock)

expect(findYAMLFilenameMock).toHaveBeenCalledTimes(1)
expect(findYAMLFilenameMock).toHaveBeenCalledWith('project dir/fingerprints')
expect(findYAMLFilenameMock).toHaveBeenCalledWith('project dir/optional yaml file')
expect(readYAMLFileMock).toHaveBeenCalledTimes(0)
expect(zipFileMock).toHaveBeenCalledTimes(0)
})
})

test('processFingerprintsFile calls processOptionalYAMLFile', async () => {
const processOptionalYAMLFileSpy = jest.spyOn(packageUtilModule, 'processOptionalYAMLFile')
.mockImplementationOnce(async () => { /* do nothing */ })

await processFingerprintsFile('project dir', zipMock)

expect(processOptionalYAMLFileSpy).toHaveBeenCalledTimes(1)
expect(processOptionalYAMLFileSpy).toHaveBeenCalledWith('fingerprints', 'project dir', zipMock)
})

test('processSearchParametersFile calls processOptionalYAMLFile', async () => {
const processOptionalYAMLFileSpy = jest.spyOn(packageUtilModule, 'processOptionalYAMLFile')
.mockImplementationOnce(async () => { /* do nothing */ })

await processSearchParametersFile('project dir', zipMock)

expect(processOptionalYAMLFileSpy).toHaveBeenCalledTimes(1)
expect(processOptionalYAMLFileSpy).toHaveBeenCalledWith('search-parameters', 'project dir', zipMock)
})

test('buildTestFileMatchers converts to matchers', () => {
const picomatchMock = jest.mocked(picomatch)
const matcher1 = (): boolean => true
Expand Down
12 changes: 10 additions & 2 deletions packages/edge/src/commands/edge/drivers/package.ts
Expand Up @@ -5,8 +5,15 @@ import JSZip from 'jszip'

import { outputItem, OutputItemConfig, readFile } from '@smartthings/cli-lib'

import { buildTestFileMatchers, processConfigFile, processFingerprintsFile, processProfiles,
processSrcDir, resolveProjectDirName } from '../../../lib/commands/drivers/package-util'
import {
buildTestFileMatchers,
processConfigFile,
processFingerprintsFile,
processProfiles,
processSearchParametersFile,
processSrcDir,
resolveProjectDirName,
} from '../../../lib/commands/drivers/package-util'
import { chooseChannel } from '../../../lib/commands/channels-util'
import { chooseHub } from '../../../lib/commands/drivers-util'
import { EdgeCommand } from '../../../lib/edge-command'
Expand Down Expand Up @@ -125,6 +132,7 @@ $ smartthings edge:drivers:package -u driver.zip`]
await processConfigFile(projectDirectory, zip)

await processFingerprintsFile(projectDirectory, zip)
await processSearchParametersFile(projectDirectory, zip)
const edgeDriverTestDirs = this.stringArrayConfigValue('edgeDriverTestDirs', ['test/**', 'tests/**'])
const testFileMatchers = buildTestFileMatchers(edgeDriverTestDirs)
if (!await processSrcDir(projectDirectory, zip, testFileMatchers)) {
Expand Down
16 changes: 11 additions & 5 deletions packages/edge/src/lib/commands/drivers/package-util.ts
Expand Up @@ -35,15 +35,21 @@ export const processConfigFile = async (projectDirectory: string, zip: JSZip): P
return parsedConfig
}

export const processFingerprintsFile = async (projectDirectory: string, zip: JSZip): Promise<void> => {
const fingerprintsFile = await findYAMLFilename(`${projectDirectory}/fingerprints`)
if (fingerprintsFile !== false) {
export const processOptionalYAMLFile = async (baseFilename: string, projectDirectory: string, zip: JSZip): Promise<void> => {
const yamlFile = await findYAMLFilename(`${projectDirectory}/${baseFilename}`)
if (yamlFile !== false) {
// validate file is at least parsable as a YAML file
readYAMLFile(fingerprintsFile)
zip.file('fingerprints.yml', fs.createReadStream(fingerprintsFile))
readYAMLFile(yamlFile)
zip.file(`${baseFilename}.yml`, fs.createReadStream(yamlFile))
}
}

export const processFingerprintsFile = async (projectDirectory: string, zip: JSZip): Promise<void> =>
processOptionalYAMLFile('fingerprints', projectDirectory, zip)

export const processSearchParametersFile = async (projectDirectory: string, zip: JSZip): Promise<void> =>
processOptionalYAMLFile('search-parameters', projectDirectory, zip)

export const buildTestFileMatchers = (matchersFromConfig: string[]): picomatch.Matcher[] =>
matchersFromConfig.map(glob => picomatch(glob))

Expand Down

0 comments on commit 7f331ca

Please sign in to comment.