* initial esm conversion Signed-off-by: Brian DeHamer <bdehamer@github.com> * esm'ify jest tests Signed-off-by: Brian DeHamer <bdehamer@github.com> * lint issues Signed-off-by: Brian DeHamer <bdehamer@github.com> * debug mock Signed-off-by: Brian DeHamer <bdehamer@github.com> * glob updated Signed-off-by: Brian DeHamer <bdehamer@github.com> * async all file functions Signed-off-by: Brian DeHamer <bdehamer@github.com> * update @actions/github Signed-off-by: Brian DeHamer <bdehamer@github.com> * update @actions/attest Signed-off-by: Brian DeHamer <bdehamer@github.com> * rebuild package-lock.json Signed-off-by: Brian DeHamer <bdehamer@github.com> * use experimental flag for jest in ci Signed-off-by: Brian DeHamer <bdehamer@github.com> * remove stray istanbul ignore Signed-off-by: Brian DeHamer <bdehamer@github.com> * Optimize getSubjectFromPath to avoid concurrent stat calls Co-authored-by: bdehamer <398027+bdehamer@users.noreply.github.com> * Fix boundary condition for MAX_SUBJECT_COUNT check Co-authored-by: bdehamer <398027+bdehamer@users.noreply.github.com> * Improve error message clarity for subject count limit Co-authored-by: bdehamer <398027+bdehamer@users.noreply.github.com> * Update test to match new error message format Co-authored-by: bdehamer <398027+bdehamer@users.noreply.github.com> * rebuild dist Signed-off-by: Brian DeHamer <bdehamer@github.com> * Fix parseSBOMFromPath to check file size before reading Co-authored-by: bdehamer <398027+bdehamer@users.noreply.github.com> * Build package with updated changes Co-authored-by: bdehamer <398027+bdehamer@users.noreply.github.com> --------- Signed-off-by: Brian DeHamer <bdehamer@github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: bdehamer <398027+bdehamer@users.noreply.github.com>
134 lines
3.6 KiB
TypeScript
134 lines
3.6 KiB
TypeScript
import fs from 'fs/promises'
|
|
import os from 'os'
|
|
import path from 'path'
|
|
import { predicateFromInputs, PredicateInputs } from '../src/predicate'
|
|
|
|
describe('subjectFromInputs', () => {
|
|
const blankInputs: PredicateInputs = {
|
|
predicateType: '',
|
|
predicate: '',
|
|
predicatePath: ''
|
|
}
|
|
|
|
describe('when no inputs are provided', () => {
|
|
it('throws an error', async () => {
|
|
await expect(predicateFromInputs(blankInputs)).rejects.toThrow(
|
|
/predicate-type/i
|
|
)
|
|
})
|
|
})
|
|
|
|
describe('when neither predicate path nor predicate are provided', () => {
|
|
it('throws an error', async () => {
|
|
const inputs: PredicateInputs = {
|
|
...blankInputs,
|
|
predicateType: 'https://example.com/predicate'
|
|
}
|
|
|
|
await expect(predicateFromInputs(inputs)).rejects.toThrow(
|
|
/one of predicate-path or predicate must be provided/i
|
|
)
|
|
})
|
|
})
|
|
|
|
describe('when both predicate path and predicate are provided', () => {
|
|
it('throws an error', async () => {
|
|
const inputs: PredicateInputs = {
|
|
predicateType: 'https://example.com/predicate',
|
|
predicate: '{}',
|
|
predicatePath: 'path/to/predicate'
|
|
}
|
|
|
|
await expect(predicateFromInputs(inputs)).rejects.toThrow(
|
|
/only one of predicate-path or predicate may be provided/i
|
|
)
|
|
})
|
|
})
|
|
|
|
describe('when specifying a predicate path', () => {
|
|
const predicateType = 'https://example.com/predicate'
|
|
const content = '{}'
|
|
let predicatePath = ''
|
|
|
|
beforeEach(async () => {
|
|
// Set-up temp directory
|
|
const tmpDir = await fs.realpath(os.tmpdir())
|
|
const dir = await fs.mkdtemp(tmpDir + path.sep)
|
|
|
|
const filename = 'subject'
|
|
predicatePath = path.join(dir, filename)
|
|
|
|
// Write file to temp directory
|
|
await fs.writeFile(predicatePath, content)
|
|
})
|
|
|
|
afterEach(async () => {
|
|
// Clean-up temp directory
|
|
await fs.rm(path.parse(predicatePath).dir, { recursive: true })
|
|
})
|
|
|
|
it('returns the predicate', async () => {
|
|
const inputs: PredicateInputs = {
|
|
...blankInputs,
|
|
predicateType,
|
|
predicatePath
|
|
}
|
|
await expect(predicateFromInputs(inputs)).resolves.toEqual({
|
|
type: predicateType,
|
|
params: JSON.parse(content)
|
|
})
|
|
})
|
|
})
|
|
|
|
describe('when specifying a predicate path that does not exist', () => {
|
|
const predicateType = 'https://example.com/predicate'
|
|
const predicatePath = 'foo'
|
|
|
|
it('returns the predicate', async () => {
|
|
const inputs: PredicateInputs = {
|
|
...blankInputs,
|
|
predicateType,
|
|
predicatePath
|
|
}
|
|
await expect(predicateFromInputs(inputs)).rejects.toThrow(
|
|
/file not found/
|
|
)
|
|
})
|
|
})
|
|
|
|
describe('when specifying a predicate value', () => {
|
|
const predicateType = 'https://example.com/predicate'
|
|
const content = '{}'
|
|
|
|
it('returns the predicate', async () => {
|
|
const inputs: PredicateInputs = {
|
|
...blankInputs,
|
|
predicateType,
|
|
predicate: content
|
|
}
|
|
|
|
await expect(predicateFromInputs(inputs)).resolves.toEqual({
|
|
type: predicateType,
|
|
params: JSON.parse(content)
|
|
})
|
|
})
|
|
})
|
|
|
|
describe('when specifying a predicate value exceeding the max size', () => {
|
|
const predicateType = 'https://example.com/predicate'
|
|
const content = JSON.stringify({ a: 'a'.repeat(16 * 1024 * 1024) })
|
|
|
|
it('throws an error', async () => {
|
|
const inputs: PredicateInputs = {
|
|
...blankInputs,
|
|
predicateType,
|
|
predicate: content
|
|
}
|
|
|
|
await expect(predicateFromInputs(inputs)).rejects.toThrow(
|
|
/predicate string exceeds maximum/
|
|
)
|
|
})
|
|
})
|
|
})
|