Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

test(integration/gatsby-cli): use sandboxed directory to "globally" install gatsby-cli #27056

Merged
merged 2 commits into from
Oct 1, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions integration-tests/gatsby-cli/__tests__/new.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ const clean = dir => execa(`yarn`, ["del-cli", dir])
describe(`gatsby new`, () => {
// make folder for us to create sites into
const dir = join(__dirname, "../execution-folder")
const originalPackageManager = getConfigStore().get("cli.packageManager")
const originalPackageManager =
getConfigStore().get("cli.packageManager") || `npm`

beforeAll(async () => {
await clean(dir)
Expand All @@ -23,7 +24,7 @@ describe(`gatsby new`, () => {
})

afterAll(async () => {
GatsbyCLI.from(cwd).invoke([`options`, `set`,`pm`, originalPackageManager])
GatsbyCLI.from(cwd).invoke([`options`, `set`, `pm`, originalPackageManager])
await clean(dir)
})

Expand Down
42 changes: 42 additions & 0 deletions integration-tests/gatsby-cli/jest.boot.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
const path = require(`path`)
const execa = require(`execa`)
const fs = require(`fs-extra`)

module.exports = async () => {
console.log(
`Installing "gatsby-cli" in sandbox directory: "${process.env.GLOBAL_GATSBY_CLI_LOCATION}"`
)
console.log(
`Tests will use "${process.env.GLOBAL_GATSBY_CLI_LOCATION}/node_modules/.bin/gatsby" CLI to invoke commands`
)

await fs.ensureDir(process.env.GLOBAL_GATSBY_CLI_LOCATION)

await fs.outputJson(
path.join(process.env.GLOBAL_GATSBY_CLI_LOCATION, `package.json`),
{
dependencies: {
"gatsby-cli": "latest",
},
}
)

const gatsbyDevLocation = path.join(
__dirname,
`..`,
`..`,
`packages`,
`gatsby-dev-cli`,
`dist`,
`index.js`
)

await execa.node(gatsbyDevLocation, [`--force-install`, `--scan-once`], {
cwd: process.env.GLOBAL_GATSBY_CLI_LOCATION,
stdio: `inherit`,
env: {
// we don't want to run gatsby-dev in with NODE_ENV=test
NODE_ENV: `production`,
},
})
}
18 changes: 18 additions & 0 deletions integration-tests/gatsby-cli/jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
const fs = require(`fs`)
const path = require(`path`)
const os = require(`os`)
const baseConfig = require(`../jest.config.js`)

// install global gatsby-cli to tmp dir to simulate sandbox
const GLOBAL_GATSBY_CLI_LOCATION = (process.env.GLOBAL_GATSBY_CLI_LOCATION = fs.mkdtempSync(
path.join(os.tmpdir(), `gatsby-cli-`)
))

module.exports = {
...baseConfig,
globalSetup: "<rootDir>/integration-tests/gatsby-cli/jest.boot.js",
rootDir: `../../`,
globals: {
GLOBAL_GATSBY_CLI_LOCATION,
},
}
3 changes: 1 addition & 2 deletions integration-tests/gatsby-cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,11 @@
"name": "gatsby-cli-tests",
"version": "1.0.0",
"dependencies": {
"gatsby-cli": "^2.12.29",
"strip-ansi": "^6.0.0"
},
"license": "MIT",
"scripts": {
"test": "jest --config=../jest.config.js gatsby-cli/"
"test": "jest --config=./jest.config.js gatsby-cli/"
},
"devDependencies": {
"del-cli": "^3.0.1",
Expand Down
33 changes: 16 additions & 17 deletions integration-tests/gatsby-cli/test-helpers/invoke-cli.js
Original file line number Diff line number Diff line change
@@ -1,22 +1,25 @@
import execa, { sync } from "execa"
import { join, resolve } from "path"
import { join } from "path"
import { createLogsMatcher } from "./matcher"

const gatsbyBinLocation = join(
GLOBAL_GATSBY_CLI_LOCATION,
`node_modules`,
`.bin`,
`gatsby`
)

// Use as `GatsbyCLI.cwd('execution-folder').invoke('new', 'foo')`
export const GatsbyCLI = {
from(relativeCwd) {
return {
invoke(args) {
const NODE_ENV = args[0] === `develop` ? `development` : `production`
try {
const results = sync(
resolve(`./node_modules/.bin/gatsby`),
[].concat(args),
{
cwd: join(__dirname, `../`, `./${relativeCwd}`),
env: { NODE_ENV, CI: 1, GATSBY_LOGGER: `ink` },
}
)
const results = sync(gatsbyBinLocation, [].concat(args), {
cwd: join(__dirname, `../`, `./${relativeCwd}`),
env: { NODE_ENV, CI: 1, GATSBY_LOGGER: `ink` },
})

return [
results.exitCode,
Expand All @@ -32,14 +35,10 @@ export const GatsbyCLI = {

invokeAsync: (args, onExit) => {
const NODE_ENV = args[0] === `develop` ? `development` : `production`
const res = execa(
resolve(`./node_modules/.bin/gatsby`),
[].concat(args),
{
cwd: join(__dirname, `../`, `./${relativeCwd}`),
env: { NODE_ENV, CI: 1, GATSBY_LOGGER: `ink` },
}
)
const res = execa(gatsbyBinLocation, [].concat(args), {
cwd: join(__dirname, `../`, `./${relativeCwd}`),
env: { NODE_ENV, CI: 1, GATSBY_LOGGER: `ink` },
})

const logs = []
res.stdout.on("data", data => {
Expand Down
19 changes: 13 additions & 6 deletions scripts/e2e-test.sh
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
#!/bin/bash
set -e # bail on errors
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I dropped chaining commands with && in favour of this so the script fails when any command fails (with exception to if statement conditions in this case)

check https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html for set command (and -e flag in particular) explanation

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just to showcase that this continue to fail tests properly - https://app.circleci.com/pipelines/github/gatsbyjs/gatsby/50132/workflows/a257b5b7-1e8c-4de1-9854-77c7e530725b is the intentionally not passing jest test ( from temporary draft PR just to test that - #27182 )

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(and reason for dropping chaining is that becomes unreadable with conditional commands - like the chmod that is only done if the file actually exists that I added in this PR)


SRC_PATH=$1
CUSTOM_COMMAND="${2:-yarn test}"
GATSBY_PATH="${CIRCLE_WORKING_DIRECTORY:-../../}"

# cypress docker does not support sudo and does not need it, but the default node executor does
command -v gatsby-dev || command -v sudo && sudo npm install -g gatsby-dev-cli || npm install -g gatsby-dev-cli &&
command -v gatsby-dev || command -v sudo && sudo npm install -g gatsby-dev-cli || npm install -g gatsby-dev-cli

# setting up child integration test link to gatsby packages
cd "$SRC_PATH" &&
gatsby-dev --set-path-to-repo "$GATSBY_PATH" &&
gatsby-dev --force-install --scan-once && # install _all_ files in gatsby/packages
chmod +x ./node_modules/.bin/gatsby && # this is sometimes necessary to ensure executable
sh -c "$CUSTOM_COMMAND" &&
cd "$SRC_PATH"
gatsby-dev --set-path-to-repo "$GATSBY_PATH"
gatsby-dev --force-install --scan-once # install _all_ files in gatsby/packages
if test -f "./node_modules/.bin/gatsby"; then
chmod +x ./node_modules/.bin/gatsby # this is sometimes necessary to ensure executable
echo "Gatsby bin chmoded"
else
echo "Gatsby bin doesn't exist. Skipping chmod."
fi
sh -c "$CUSTOM_COMMAND"
echo "e2e test run succeeded"