Skip to content

Commit

Permalink
Add tests for config-parser
Browse files Browse the repository at this point in the history
  • Loading branch information
Yoann Chaudet committed Jul 19, 2022
1 parent 250c4fb commit 931e155
Show file tree
Hide file tree
Showing 8 changed files with 206 additions and 128 deletions.
6 changes: 3 additions & 3 deletions dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -14632,9 +14632,9 @@ class ConfigParser {
// The last node identified is an object expression, so do the assignment
if (lastNode.type === 'ObjectExpression') {
this.configuration =
this.configuration.slice(0, lastNode.value.range[0]) +
this.configuration.slice(0, lastNode.range[0]) +
`"${this.propertyValue}"` +
this.configuration.slice(lastNode.value.range[1])
this.configuration.slice(lastNode.range[1])
}

// A misc object was found in the configuration file (e.g. an array, a string, a boolean,
Expand Down Expand Up @@ -14679,7 +14679,7 @@ class ConfigParser {
else {
this.configuration =
this.configuration.slice(0, lastNode.range[0]) +
declaration +
'{' + declaration + '}' +
this.configuration.slice(lastNode.range[1])
}
}
Expand Down
2 changes: 1 addition & 1 deletion dist/index.js.map

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions src/config-parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -202,9 +202,9 @@ class ConfigParser {
// The last node identified is an object expression, so do the assignment
if (lastNode.type === 'ObjectExpression') {
this.configuration =
this.configuration.slice(0, lastNode.value.range[0]) +
this.configuration.slice(0, lastNode.range[0]) +
`"${this.propertyValue}"` +
this.configuration.slice(lastNode.value.range[1])
this.configuration.slice(lastNode.range[1])
}

// A misc object was found in the configuration file (e.g. an array, a string, a boolean,
Expand Down Expand Up @@ -249,7 +249,7 @@ class ConfigParser {
else {
this.configuration =
this.configuration.slice(0, lastNode.range[0]) +
declaration +
'{' + declaration + '}' +
this.configuration.slice(lastNode.range[1])
}
}
Expand Down
158 changes: 158 additions & 0 deletions src/config-parser.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
const fs = require('fs')

const {ConfigParser} = require('./config-parser')
const {getTempFolder, compareFiles} = require('./test-helpers')

// Get the temp folder
const tempFolder = getTempFolder()

// Cases to test
const cases = [
//
// Default export
//

{
property: 'property',
source: `export default {}`,
expected: `export default { property: "value" }`
},
{
property: 'property',
source: `export default { property: 0 }`, // property exists and is a number
expected: `export default { property: "value" }`
},
{
property: 'property',
source: `export default { property: false }`, // property exists and is a boolean
expected: `export default { property: "value" }`
},
{
property: 'property',
source: `export default { property: "test" }`, // property exists and is a string
expected: `export default { property: "value" }`
},
{
property: 'property',
source: `export default { property: [1,2] }`, // property exists and is an array
expected: `export default { property: "value" }`
},
{
property: 'property',
source: `export default { property: null }`, // property exists and is null
expected: `export default { property: "value" }`
},
{
property: 'property',
source: `export default { property: {}}`, // property exists and is an object
expected: `export default { property: "value" }`
},

// Deep properties (injection 1)
{
property: 'property.b.c',
source: `export default {}`,
expected: `export default { property: { b: { c: "value" }}}`
},
{
property: 'property.b.c',
source: `export default { property: 0 }`, // property exists and is a number
expected: `export default { property: { b: { c: "value" }}}`
},
{
property: 'property.b.c',
source: `export default { property: {}}`, // property exists and is an object
expected: `export default { property: { b: { c: "value" }}}`
},

// Deep properties (injection 2)
{
property: 'property.b.c',
source: `export default { property: { b: 0 }}`, // property exists and is a number
expected: `export default { property: { b: { c: "value" }}}`
},
{
property: 'property.b.c',
source: `export default { property: { b: {}}}`, // property exists and is an object
expected: `export default { property: { b: { c: "value" }}}`
},
{
property: 'property.b.c',
source: `export default { property: { b: { hello: 123}}}`, // property exists and is a non-empty object
expected: `export default { property: { b: { c: "value", hello: 123 }}}`
},

// Deep properties (existing properties)
{
property: 'a1.a2',
source: `export default { a2: false, a1: { a3: [12]}}`, // property exists and is a non-empty object
expected: `export default { a2: false, a1: { a2: "value", a3: [12]}}`
},

//
// Direct module exports
//
{
property: 'property',
source: `module.exports = {}`,
expected: `module.exports = { property: "value"}`
},
{
property: 'property',
source: `module.exports = { p1: 0}`,
expected: `module.exports = { property: "value", p1: 0}`
},
{
property: 'a.b.c',
source: `module.exports = { p1: 0}`,
expected: `module.exports = { a: { b: { c: "value" }}, p1: 0}`
},

//
// Indirect module exports
//
{
property: 'property',
source: `const config = {}; module.exports = config`,
expected: `const config = { property: "value"}; module.exports = config`
},
{
property: 'property',
source: `var config = {}; module.exports = config`,
expected: `var config = { property: "value"}; module.exports = config`
},
{
property: 'a.b.c',
source: `var config = {}; module.exports = config`,
expected: `var config = { a: { b: { c: "value"}}}; module.exports = config`
},
{
property: 'a.b.c',
source: `var config = { a: { b: [], c: "hello"}}; module.exports = config`,
expected: `var config = { a: { b: { c: "value"}, c: "hello"}}; module.exports = config`
},
]

describe('config-parser', () => {
cases.forEach(({property, source, expected}, index) => {
it(`Inject path properly for case #${index}`, () => {
// Write the source file
const sourceFile = `${tempFolder}/source.js`
fs.writeFileSync(sourceFile, source, {encoding: 'utf8'})

// Write the expected file
const expectedFile = `${tempFolder}/expected.js`
fs.writeFileSync(expectedFile, expected, {encoding: 'utf8'})

// Update the settings and do the injection
new ConfigParser({
configurationFile: sourceFile,
propertyName: property,
propertyValue: 'value'
}).inject()

// Compare the files
compareFiles(sourceFile, expectedFile)
})
})
})
101 changes: 0 additions & 101 deletions src/config-parser.testx.js

This file was deleted.

1 change: 0 additions & 1 deletion src/get-pages-base-url.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
const core = require('@actions/core')
const axios = require('axios')
//const { expect, jest } = require('@jest/globals')

const getPagesBaseUrl = require('./get-pages-base-url')

Expand Down
23 changes: 4 additions & 19 deletions src/set-pages-path.test.js
Original file line number Diff line number Diff line change
@@ -1,27 +1,12 @@
const fs = require('fs')
const assert = require('assert')
const path = require('path')
const prettier = require('prettier')

const {getConfigParserSettings} = require('./set-pages-path')
const {ConfigParser} = require('./config-parser')
const {getTempFolder, compareFiles} = require('./test-helpers')

// Temp folder for fixtures to be injected
const tmpFolder = `${process.cwd()}/src/fixtures/tmp`
if (!fs.existsSync(tmpFolder)) {
fs.mkdirSync(tmpFolder, {recursive: true})
}

// Read a JavaScript file and return it formatted
function formatFile(file) {
const fileContent = fs.readFileSync(file, 'utf8')
return prettier.format(fileContent, {parser: 'espree'})
}

// Compare two JavaScript files
function compareFiles(actualFile, expectedFile) {
assert.equal(formatFile(actualFile), formatFile(expectedFile))
}
// Get the temp folder
const tempFolder = getTempFolder()

// Test suite
describe('configParser', () => {
Expand All @@ -43,7 +28,7 @@ describe('configParser', () => {

// Copy the source fixture to a temp file
const fixtureSourceFile = `${fixtureFolder}/${configurationFile}`
const fixtureTargetFile = `${tmpFolder}/${configurationFile}`
const fixtureTargetFile = `${tempFolder}/${configurationFile}`
if (configurationFile != 'blank.js') {
fs.copyFileSync(fixtureSourceFile, fixtureTargetFile)
} else if (fs.existsSync(fixtureTargetFile)) {
Expand Down
37 changes: 37 additions & 0 deletions src/test-helpers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
const fs = require('fs')
const prettier = require('prettier')
const assert = require('assert')

// Create and return the path to a temp folder
function getTempFolder() {
const tmpFolder = `${__dirname}/fixtures/tmp`
if (!fs.existsSync(tmpFolder)) {
fs.mkdirSync(tmpFolder, {recursive: true})
}
return tmpFolder
}

// Read a JavaScript file and return it formatted
function formatFile(file) {
const fileContent = fs.readFileSync(file, 'utf8')
return prettier.format(fileContent, {
parser: 'espree',

// Prettier options
printWidth: 80,
tabWidth: 2,
useTabs: false,
semi: false,
singleQuote: true,
trailingComma: 'none',
bracketSpacing: false,
arrowParens: 'avoid'
}).trim()
}

// Compare two JavaScript files
function compareFiles(actualFile, expectedFile) {
assert.equal(formatFile(actualFile), formatFile(expectedFile))
}

module.exports = {getTempFolder, formatFile, compareFiles}

0 comments on commit 931e155

Please sign in to comment.