Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
Merge pull request #36 from github/config_utils_tests
Add tests for config-utils
- v3.22.12
- v3.22.11
- v3
- v2.22.12
- v2.22.11
- v2.22.10
- v2.22.9
- v2.22.8
- v2.22.7
- v2.22.6
- v2.22.5
- v2.22.4
- v2.22.3
- v2.22.2
- v2.22.1
- v2.22.0
- v2.21.9
- v2.21.8
- v2.21.7
- v2.21.6
- v2.21.5
- v2.21.4
- v2.21.3
- v2.21.2
- v2.21.1
- v2.21.0
- v2.20.4
- v2.20.3
- v2.20.2
- v2.20.1
- v2.20.0
- v2.3.6
- v2.3.5
- v2.3.4
- v2.3.3
- v2.3.2
- v2.3.1
- v2.3.0
- v2.2.12
- v2.2.11
- v2.2.10
- v2.2.9
- v2.2.8
- v2.2.7
- v2.2.6
- v2.2.5
- v2.2.4
- v2.2.3
- v2.2.2
- v2.2.1
- v2.2.0
- v2.1.39
- v2.1.38
- v2.1.37
- v2.1.36
- v2.1.35
- v2.1.34
- v2.1.33
- v2.1.32
- v2.1.31
- v2.1.30
- v2.1.29
- v2.1.28
- v2.1.27
- v2.1.26
- v2.1.25
- v2.1.24
- v2.1.23
- v2.1.22
- v2.1.21
- v2.1.20
- v2.1.19
- v2.1.18
- v2.1.17
- v2.1.16
- v2.1.15
- v2.1.14
- v2.1.13
- v2.1.12
- v2.1.11
- v2.1.10
- v2.1.9
- v2.1.8
- v2.1.7
- v2.1.6
- v2
- v1.1.39
- v1.1.38
- v1.1.37
- v1.1.36
- v1.1.35
- v1.1.34
- v1.1.33
- v1.1.32
- v1.1.31
- v1.1.30
- v1.1.29
- v1.1.28
- v1.1.27
- v1.1.26
- v1.1.25
- v1.1.24
- v1.1.23
- v1.1.22
- v1.1.21
- v1.1.20
- v1.1.19
- v1.1.18
- v1.1.17
- v1.1.16
- v1.1.15
- v1.1.14
- v1.1.13
- v1.1.12
- v1.1.11
- v1.1.10
- v1.1.9
- v1.1.8
- v1.1.7
- v1.1.6
- v1.1.5
- v1.1.4
- v1.1.3
- v1.1.2
- v1.1.1
- v1.1.0
- v1.0.32
- v1.0.31
- v1.0.30
- v1.0.29
- v1.0.28
- v1.0.27
- v1.0.26
- v1.0.25
- v1.0.24
- v1.0.23
- v1.0.22
- v1.0.21
- v1.0.20
- v1.0.19
- v1.0.18
- v1.0.17
- v1.0.16
- v1.0.15
- v1.0.14
- v1.0.13
- v1.0.12
- v1.0.11
- v1.0.10
- v1.0.9
- v1.0.8
- v1.0.7
- v1.0.6
- v1.0.5
- v1.0.4
- v1.0.3
- v1.0.2
- v1.0.1
- v1.0.0
- v1
Showing
10 changed files
with
647 additions
and
93 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Oops, something went wrong.
Oops, something went wrong.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,253 @@ | ||
import test from 'ava'; | ||
import * as fs from 'fs'; | ||
import * as path from 'path'; | ||
|
||
import * as configUtils from './config-utils'; | ||
import * as util from './util'; | ||
|
||
function setInput(name: string, value: string | undefined) { | ||
// Transformation copied from | ||
// https://github.com/actions/toolkit/blob/05e39f551d33e1688f61b209ab5cdd335198f1b8/packages/core/src/core.ts#L69 | ||
const envVar = `INPUT_${name.replace(/ /g, '_').toUpperCase()}`; | ||
if (value !== undefined) { | ||
process.env[envVar] = value; | ||
} else { | ||
delete process.env[envVar]; | ||
} | ||
} | ||
|
||
test("load empty config", async t => { | ||
return await util.withTmpDir(async tmpDir => { | ||
process.env['RUNNER_WORKSPACE'] = tmpDir; | ||
process.env['GITHUB_WORKSPACE'] = tmpDir; | ||
|
||
setInput('config-file', undefined); | ||
|
||
const config = await configUtils.loadConfig(); | ||
|
||
t.deepEqual(config, new configUtils.Config()); | ||
}); | ||
}); | ||
|
||
test("loading config saves config", async t => { | ||
return await util.withTmpDir(async tmpDir => { | ||
process.env['RUNNER_WORKSPACE'] = tmpDir; | ||
process.env['GITHUB_WORKSPACE'] = tmpDir; | ||
|
||
const configFile = configUtils.getConfigFile(); | ||
// Sanity check the saved config file does not already exist | ||
t.false(fs.existsSync(configFile)); | ||
|
||
const config = await configUtils.loadConfig(); | ||
|
||
// The saved config file should now exist | ||
t.true(fs.existsSync(configFile)); | ||
|
||
// And the contents should parse correctly to the config that was returned | ||
t.deepEqual(fs.readFileSync(configFile, 'utf8'), JSON.stringify(config)); | ||
}); | ||
}); | ||
|
||
test("load input outside of workspace", async t => { | ||
return await util.withTmpDir(async tmpDir => { | ||
process.env['RUNNER_WORKSPACE'] = tmpDir; | ||
process.env['GITHUB_WORKSPACE'] = tmpDir; | ||
|
||
setInput('config-file', '../input'); | ||
|
||
try { | ||
await configUtils.loadConfig(); | ||
throw new Error('loadConfig did not throw error'); | ||
} catch (err) { | ||
t.deepEqual(err, new Error(configUtils.getConfigFileOutsideWorkspaceErrorMessage(path.join(tmpDir, '../input')))); | ||
} | ||
}); | ||
}); | ||
|
||
test("load non-existent input", async t => { | ||
return await util.withTmpDir(async tmpDir => { | ||
process.env['RUNNER_WORKSPACE'] = tmpDir; | ||
process.env['GITHUB_WORKSPACE'] = tmpDir; | ||
|
||
t.false(fs.existsSync(path.join(tmpDir, 'input'))); | ||
setInput('config-file', 'input'); | ||
|
||
try { | ||
await configUtils.loadConfig(); | ||
throw new Error('loadConfig did not throw error'); | ||
} catch (err) { | ||
t.deepEqual(err, new Error(configUtils.getConfigFileDoesNotExistErrorMessage(path.join(tmpDir, 'input')))); | ||
} | ||
}); | ||
}); | ||
|
||
test("load non-empty input", async t => { | ||
return await util.withTmpDir(async tmpDir => { | ||
process.env['RUNNER_WORKSPACE'] = tmpDir; | ||
process.env['GITHUB_WORKSPACE'] = tmpDir; | ||
|
||
// Just create a generic config object with non-default values for all fields | ||
const inputFileContents = ` | ||
name: my config | ||
disable-default-queries: true | ||
queries: | ||
- uses: ./foo | ||
- uses: foo/bar@dev | ||
paths-ignore: | ||
- a | ||
- b | ||
paths: | ||
- c/d`; | ||
|
||
// And the config we expect it to parse to | ||
const expectedConfig = new configUtils.Config(); | ||
expectedConfig.name = 'my config'; | ||
expectedConfig.disableDefaultQueries = true; | ||
expectedConfig.additionalQueries.push('foo'); | ||
expectedConfig.externalQueries = [new configUtils.ExternalQuery('foo/bar', 'dev')]; | ||
expectedConfig.pathsIgnore = ['a', 'b']; | ||
expectedConfig.paths = ['c/d']; | ||
|
||
fs.writeFileSync(path.join(tmpDir, 'input'), inputFileContents, 'utf8'); | ||
setInput('config-file', 'input'); | ||
|
||
const actualConfig = await configUtils.loadConfig(); | ||
|
||
// Should exactly equal the object we constructed earlier | ||
t.deepEqual(actualConfig, expectedConfig); | ||
}); | ||
}); | ||
|
||
test("load partially invalid input", async t => { | ||
return await util.withTmpDir(async tmpDir => { | ||
process.env['RUNNER_WORKSPACE'] = tmpDir; | ||
process.env['GITHUB_WORKSPACE'] = tmpDir; | ||
|
||
// The valid parts of this config should be parsed correctly. | ||
// The invalid parts should be ignored and left as the default values. | ||
const inputFileContents = ` | ||
name: | ||
- foo: bar | ||
disable-default-queries: 42 | ||
queries: | ||
- name: foo/bar | ||
uses: foo/bar@dev | ||
paths-ignore: | ||
- a | ||
- b | ||
paths: | ||
- c/d`; | ||
|
||
// And the config we expect it to parse to | ||
const expectedConfig = new configUtils.Config(); | ||
expectedConfig.externalQueries = [new configUtils.ExternalQuery('foo/bar', 'dev')]; | ||
expectedConfig.pathsIgnore = ['a', 'b']; | ||
expectedConfig.paths = ['c/d']; | ||
|
||
fs.writeFileSync(path.join(tmpDir, 'input'), inputFileContents, 'utf8'); | ||
setInput('config-file', 'input'); | ||
|
||
const actualConfig = await configUtils.loadConfig(); | ||
|
||
// Should exactly equal the object we constructed earlier | ||
t.deepEqual(actualConfig, expectedConfig); | ||
}); | ||
}); | ||
|
||
test("load invalid input - top level entries", async t => { | ||
return await util.withTmpDir(async tmpDir => { | ||
process.env['RUNNER_WORKSPACE'] = tmpDir; | ||
process.env['GITHUB_WORKSPACE'] = tmpDir; | ||
|
||
// Replace the arrays with strings or numbers. | ||
// The invalid parts should be ignored and left as the default values. | ||
const inputFileContents = ` | ||
name: my config | ||
disable-default-queries: true | ||
queries: foo | ||
paths-ignore: bar | ||
paths: 123`; | ||
|
||
// And the config we expect it to parse to | ||
const expectedConfig = new configUtils.Config(); | ||
expectedConfig.name = 'my config'; | ||
expectedConfig.disableDefaultQueries = true; | ||
|
||
fs.writeFileSync(path.join(tmpDir, 'input'), inputFileContents, 'utf8'); | ||
setInput('config-file', 'input'); | ||
|
||
const actualConfig = await configUtils.loadConfig(); | ||
|
||
// Should exactly equal the object we constructed earlier | ||
t.deepEqual(actualConfig, expectedConfig); | ||
}); | ||
}); | ||
|
||
test("load invalid input - queries field type", async t => { | ||
return await util.withTmpDir(async tmpDir => { | ||
process.env['RUNNER_WORKSPACE'] = tmpDir; | ||
process.env['GITHUB_WORKSPACE'] = tmpDir; | ||
|
||
// Invalid contents of the "queries" array. | ||
// The invalid parts should be ignored and left as the default values. | ||
const inputFileContents = ` | ||
name: my config | ||
disable-default-queries: true | ||
queries: | ||
- name: foo | ||
uses: | ||
- hello: world | ||
- name: bar | ||
uses: github/bar@master`; | ||
|
||
// And the config we expect it to parse to | ||
const expectedConfig = new configUtils.Config(); | ||
expectedConfig.name = 'my config'; | ||
expectedConfig.disableDefaultQueries = true; | ||
expectedConfig.externalQueries.push(new configUtils.ExternalQuery("github/bar", "master")); | ||
|
||
fs.writeFileSync(path.join(tmpDir, 'input'), inputFileContents, 'utf8'); | ||
setInput('config-file', 'input'); | ||
|
||
const actualConfig = await configUtils.loadConfig(); | ||
|
||
// Should exactly equal the object we constructed earlier | ||
t.deepEqual(actualConfig, expectedConfig); | ||
}); | ||
}); | ||
|
||
// Various "uses" fields, and the errors they should produce | ||
const testInputs = { | ||
"''": configUtils.getQueryUsesBlank(), | ||
"foo/bar": configUtils.getQueryUsesIncorrect("foo/bar"), | ||
"foo/bar@v1@v2": configUtils.getQueryUsesIncorrect("foo/bar@v1@v2"), | ||
"foo@master": configUtils.getQueryUsesIncorrect("foo@master"), | ||
"https://github.com/foo/bar@master": configUtils.getQueryUsesIncorrect("https://github.com/foo/bar@master") | ||
}; | ||
|
||
for (const [input, result] of Object.entries(testInputs)) { | ||
test("load invalid input - queries uses \"" + input + "\"", async t => { | ||
return await util.withTmpDir(async tmpDir => { | ||
process.env['RUNNER_WORKSPACE'] = tmpDir; | ||
process.env['GITHUB_WORKSPACE'] = tmpDir; | ||
|
||
// Invalid contents of a "queries.uses" field. | ||
// Should fail with the expected error message | ||
const inputFileContents = ` | ||
name: my config | ||
queries: | ||
- name: foo | ||
uses: ` + input; | ||
|
||
fs.writeFileSync(path.join(tmpDir, 'input'), inputFileContents, 'utf8'); | ||
setInput('config-file', 'input'); | ||
|
||
try { | ||
await configUtils.loadConfig(); | ||
throw new Error('loadConfig did not throw error'); | ||
} catch (err) { | ||
t.deepEqual(err, new Error(result)); | ||
} | ||
}); | ||
}); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters