e2e-simple.sh 10.9 KB
Newer Older
1
#!/bin/bash
Christopher Chedeau's avatar
Christopher Chedeau committed
2
3
4
5
6
7
8
# Copyright (c) 2015-present, Facebook, Inc.
# All rights reserved.
#
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree. An additional grant
# of patent rights can be found in the PATENTS file in the same directory.

9
10
11
12
13
# ******************************************************************************
# This is an end-to-end test intended to run on CI.
# You can also run it locally but it's slow.
# ******************************************************************************

Dan Abramov's avatar
Dan Abramov committed
14
# Start in tasks/ even if run from root directory
Christopher Chedeau's avatar
Christopher Chedeau committed
15
16
cd "$(dirname "$0")"

17
18
19
20
21
# CLI and app temporary locations
# http://unix.stackexchange.com/a/84980
temp_cli_path=`mktemp -d 2>/dev/null || mktemp -d -t 'temp_cli_path'`
temp_app_path=`mktemp -d 2>/dev/null || mktemp -d -t 'temp_app_path'`

22
23
function cleanup {
  echo 'Cleaning up.'
24
  cd "$root_path"
Dan Abramov's avatar
Dan Abramov committed
25
  # Uncomment when snapshot testing is enabled by default:
Ville Immonen's avatar
Ville Immonen committed
26
  # rm ./packages/react-scripts/template/src/__snapshots__/App.test.js.snap
27
  rm -rf "$temp_cli_path" $temp_app_path
28
29
}

Dan Abramov's avatar
Dan Abramov committed
30
# Error messages are redirected to stderr
31
function handle_error {
Dan Abramov's avatar
Dan Abramov committed
32
  echo "$(basename $0): ERROR! An error was encountered executing line $1." 1>&2;
Dan Abramov's avatar
Dan Abramov committed
33
  cleanup
34
  echo 'Exiting with error.' 1>&2;
35
36
37
38
39
  exit 1
}

function handle_exit {
  cleanup
40
  echo 'Exiting without error.' 1>&2;
41
42
43
  exit
}

44
function create_react_app {
45
  node "$temp_cli_path"/node_modules/create-react-app/index.js "$@"
46
47
}

48
49
50
51
52
53
54
# Check for the existence of one or more files.
function exists {
  for f in $*; do
    test -e "$f"
  done
}

55
56
57
58
59
# Exit the script with a helpful error message when any error is encountered
trap 'set +x; handle_error $LINENO $BASH_COMMAND' ERR

# Cleanup before exit on any termination signal
trap 'set +x; handle_exit' SIGQUIT SIGTERM SIGINT SIGKILL SIGHUP
Christopher Chedeau's avatar
Christopher Chedeau committed
60
61
62
63

# Echo every command being executed
set -x

Dan Abramov's avatar
Dan Abramov committed
64
# Go to root
Christopher Chedeau's avatar
Christopher Chedeau committed
65
cd ..
Dan Abramov's avatar
Dan Abramov committed
66
root_path=$PWD
67

68
69
70
71
72
73
# Clear cache to avoid issues with incorrect packages being used
if hash yarnpkg 2>/dev/null
then
  # AppVeyor uses an old version of yarn.
  # Once updated to 0.24.3 or above, the workaround can be removed
  # and replaced with `yarnpkg cache clean`
74
  # Issues:
75
76
77
78
79
80
81
82
83
84
85
86
87
88
  #    https://github.com/yarnpkg/yarn/issues/2591
  #    https://github.com/appveyor/ci/issues/1576
  #    https://github.com/facebookincubator/create-react-app/pull/2400
  # When removing workaround, you may run into
  #    https://github.com/facebookincubator/create-react-app/issues/2030
  case "$(uname -s)" in
    *CYGWIN*|MSYS*|MINGW*) yarn=yarn.cmd;;
    *) yarn=yarnpkg;;
  esac
  $yarn cache clean
fi

if hash npm 2>/dev/null
then
Dan Abramov's avatar
Dan Abramov committed
89
90
91
92
93
  # npm 5 is too buggy right now
  if [ $(npm -v | head -c 1) -eq 5 ]; then
    npm i -g npm@^4.x
  fi;
  npm cache clean || npm cache verify
94
95
fi

96
# Prevent bootstrap, we only want top-level dependencies
97
cp package.json package.json.bak
98
grep -v "postinstall" package.json > temp && mv temp package.json
99
100
101
npm install
mv package.json.bak package.json

Joe Haddad's avatar
Joe Haddad committed
102
103
104
105
106
# We need to install create-react-app deps to test it
cd "$root_path"/packages/create-react-app
npm install
cd "$root_path"

107
108
109
110
111
# If the node version is < 6, the script should just give an error.
nodeVersion=`node --version | cut -d v -f2`
nodeMajor=`echo $nodeVersion | cut -d. -f1`
nodeMinor=`echo $nodeVersion | cut -d. -f2`
if [[ nodeMajor -lt 6 ]]
112
113
114
then
  cd $temp_app_path
  err_output=`node "$root_path"/packages/create-react-app/index.js test-node-version 2>&1 > /dev/null || echo ''`
Dan Abramov's avatar
Dan Abramov committed
115
  [[ $err_output =~ You\ are\ running\ Node ]] && exit 0 || exit 1
116
117
fi

Ville Immonen's avatar
Ville Immonen committed
118
119
120
if [ "$USE_YARN" = "yes" ]
then
  # Install Yarn so that the test can use it to install packages.
Dan Abramov's avatar
Dan Abramov committed
121
  npm install -g yarn
122
  yarn cache clean
Ville Immonen's avatar
Ville Immonen committed
123
124
fi

125
126
127
# We removed the postinstall, so do it manually here
node bootstrap.js

Dan Abramov's avatar
Dan Abramov committed
128
# Lint own code
129
130
131
132
133
134
135
136
137
138
./node_modules/.bin/eslint --max-warnings 0 packages/babel-preset-react-app/
./node_modules/.bin/eslint --max-warnings 0 packages/create-react-app/
./node_modules/.bin/eslint --max-warnings 0 packages/eslint-config-react-app/
./node_modules/.bin/eslint --max-warnings 0 packages/react-dev-utils/
./node_modules/.bin/eslint --max-warnings 0 packages/react-scripts/
cd packages/react-error-overlay/
./node_modules/.bin/eslint --max-warnings 0 src/
npm test
npm run build:prod
cd ../..
139

Dan Abramov's avatar
Dan Abramov committed
140
141
142
143
144
# ******************************************************************************
# First, test the create-react-app development environment.
# This does not affect our users but makes sure we can develop it.
# ******************************************************************************

Max's avatar
Max committed
145
146
147
# Test local build command
npm run build
# Check for expected output
148
149
150
151
152
exists build/*.html
exists build/static/js/*.js
exists build/static/css/*.css
exists build/static/media/*.svg
exists build/favicon.ico
Max's avatar
Max committed
153

154
155
# Run tests with CI flag
CI=true npm test
Dan Abramov's avatar
Dan Abramov committed
156
# Uncomment when snapshot testing is enabled by default:
157
# exists template/src/__snapshots__/App.test.js.snap
Dan Abramov's avatar
Dan Abramov committed
158
159
160

# Test local start command
npm start -- --smoke-test
Christoph Pojer's avatar
Christoph Pojer committed
161

Dan Abramov's avatar
Dan Abramov committed
162
163
164
165
# ******************************************************************************
# Next, pack react-scripts and create-react-app so we can verify they work.
# ******************************************************************************

Dan Abramov's avatar
Dan Abramov committed
166
# Pack CLI
167
cd "$root_path"/packages/create-react-app
Christopher Chedeau's avatar
Christopher Chedeau committed
168
169
cli_path=$PWD/`npm pack`

Dan Abramov's avatar
Dan Abramov committed
170
# Go to react-scripts
171
cd "$root_path"/packages/react-scripts
Ville Immonen's avatar
Ville Immonen committed
172

173
174
175
176
177
# Save package.json because we're going to touch it
cp package.json package.json.orig

# Replace own dependencies (those in the `packages` dir) with the local paths
# of those packages.
178
node "$root_path"/tasks/replace-own-deps.js
Ville Immonen's avatar
Ville Immonen committed
179

Dan Abramov's avatar
Dan Abramov committed
180
# Finally, pack react-scripts
181
scripts_path="$root_path"/packages/react-scripts/`npm pack`
Dan Abramov's avatar
Dan Abramov committed
182

183
184
185
186
# Restore package.json
rm package.json
mv package.json.orig package.json

Dan Abramov's avatar
Dan Abramov committed
187
188
189
190
# ******************************************************************************
# Now that we have packed them, create a clean app folder and install them.
# ******************************************************************************

Dan Abramov's avatar
Dan Abramov committed
191
# Install the CLI in a temporary location
192
cd "$temp_cli_path"
193
194
195
196
197
198

# Initialize package.json before installing the CLI because npm will not install
# the CLI properly in the temporary location if it is missing.
npm init --yes

# Now we can install the CLI from the local package.
199
npm install "$cli_path"
Christopher Chedeau's avatar
Christopher Chedeau committed
200
201
202

# Install the app in a temporary location
cd $temp_app_path
203
create_react_app --scripts-version="$scripts_path" test-app
Dan Abramov's avatar
Dan Abramov committed
204
205
206
207
208
209

# ******************************************************************************
# Now that we used create-react-app to create an app depending on react-scripts,
# let's make sure all npm scripts are in the working state.
# ******************************************************************************

210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
function verify_env_url {
  # Backup package.json because we're going to make it dirty
  cp package.json package.json.orig

  # Test default behavior
  grep -F -R --exclude=*.map "\"/static/" build/ -q; test $? -eq 0 || exit 1

  # Test relative path build
  awk -v n=2 -v s="  \"homepage\": \".\"," 'NR == n {print s} {print}' package.json > tmp && mv tmp package.json

  npm run build
  # Disabled until this can be tested
  # grep -F -R --exclude=*.map "../../static/" build/ -q; test $? -eq 0 || exit 1
  grep -F -R --exclude=*.map "\"./static/" build/ -q; test $? -eq 0 || exit 1
  grep -F -R --exclude=*.map "\"/static/" build/ -q; test $? -eq 1 || exit 1

  PUBLIC_URL="/anabsolute" npm run build
  grep -F -R --exclude=*.map "/anabsolute/static/" build/ -q; test $? -eq 0 || exit 1
  grep -F -R --exclude=*.map "\"/static/" build/ -q; test $? -eq 1 || exit 1

  # Test absolute path build
  sed "2s/.*/  \"homepage\": \"\/testingpath\",/" package.json > tmp && mv tmp package.json

  npm run build
  grep -F -R --exclude=*.map "/testingpath/static/" build/ -q; test $? -eq 0 || exit 1
  grep -F -R --exclude=*.map "\"/static/" build/ -q; test $? -eq 1 || exit 1

  PUBLIC_URL="https://www.example.net/overridetest" npm run build
  grep -F -R --exclude=*.map "https://www.example.net/overridetest/static/" build/ -q; test $? -eq 0 || exit 1
  grep -F -R --exclude=*.map "\"/static/" build/ -q; test $? -eq 1 || exit 1
  grep -F -R --exclude=*.map "testingpath/static" build/ -q; test $? -eq 1 || exit 1

  # Test absolute url build
  sed "2s/.*/  \"homepage\": \"https:\/\/www.example.net\/testingpath\",/" package.json > tmp && mv tmp package.json

  npm run build
  grep -F -R --exclude=*.map "/testingpath/static/" build/ -q; test $? -eq 0 || exit 1
  grep -F -R --exclude=*.map "\"/static/" build/ -q; test $? -eq 1 || exit 1

  PUBLIC_URL="https://www.example.net/overridetest" npm run build
  grep -F -R --exclude=*.map "https://www.example.net/overridetest/static/" build/ -q; test $? -eq 0 || exit 1
  grep -F -R --exclude=*.map "\"/static/" build/ -q; test $? -eq 1 || exit 1
  grep -F -R --exclude=*.map "testingpath/static" build/ -q; test $? -eq 1 || exit 1

  # Restore package.json
  rm package.json
  mv package.json.orig package.json
}

Joe Haddad's avatar
Joe Haddad committed
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
function verify_module_scope {
  # Create stub json file
  echo "{}" >> sample.json

  # Save App.js, we're going to modify it
  cp src/App.js src/App.js.bak

  # Add an out of scope import
  echo "import sampleJson from '../sample'" | cat - src/App.js > src/App.js.temp && mv src/App.js.temp src/App.js

  # Make sure the build fails
  npm run build; test $? -eq 1 || exit 1
  # TODO: check for error message

  # Restore App.js
  rm src/App.js
  mv src/App.js.bak src/App.js
}

Dan Abramov's avatar
Dan Abramov committed
278
# Enter the app directory
Christopher Chedeau's avatar
Christopher Chedeau committed
279
280
281
282
cd test-app

# Test the build
npm run build
283
# Check for expected output
284
285
286
287
288
exists build/*.html
exists build/static/js/*.js
exists build/static/css/*.css
exists build/static/media/*.svg
exists build/favicon.ico
289

290
291
# Run tests with CI flag
CI=true npm test
Dan Abramov's avatar
Dan Abramov committed
292
# Uncomment when snapshot testing is enabled by default:
293
# exists src/__snapshots__/App.test.js.snap
Christoph Pojer's avatar
Christoph Pojer committed
294

Dan Abramov's avatar
Dan Abramov committed
295
296
297
# Test the server
npm start -- --smoke-test

298
299
300
# Test environment handling
verify_env_url

Joe Haddad's avatar
Joe Haddad committed
301
302
303
# Test reliance on webpack internals
verify_module_scope

Dan Abramov's avatar
Dan Abramov committed
304
305
306
307
# ******************************************************************************
# Finally, let's check that everything still works after ejecting.
# ******************************************************************************

Dan Abramov's avatar
Dan Abramov committed
308
# Eject...
Christopher Chedeau's avatar
Christopher Chedeau committed
309
310
echo yes | npm run eject

Dan Abramov's avatar
Dan Abramov committed
311
# ...but still link to the local packages
312
313
314
315
npm link "$root_path"/packages/babel-preset-react-app
npm link "$root_path"/packages/eslint-config-react-app
npm link "$root_path"/packages/react-dev-utils
npm link "$root_path"/packages/react-scripts
Dan Abramov's avatar
Dan Abramov committed
316

Dan Abramov's avatar
Dan Abramov committed
317
318
# Test the build
npm run build
319
# Check for expected output
320
321
322
323
324
exists build/*.html
exists build/static/js/*.js
exists build/static/css/*.css
exists build/static/media/*.svg
exists build/favicon.ico
325

Dan Abramov's avatar
Dan Abramov committed
326
327
328
329
# Run tests, overring the watch option to disable it.
# `CI=true npm test` won't work here because `npm test` becomes just `jest`.
# We should either teach Jest to respect CI env variable, or make
# `scripts/test.js` survive ejection (right now it doesn't).
Dan Abramov's avatar
Dan Abramov committed
330
331
npm test -- --watch=no
# Uncomment when snapshot testing is enabled by default:
332
# exists src/__snapshots__/App.test.js.snap
Christoph Pojer's avatar
Christoph Pojer committed
333

Dan Abramov's avatar
Dan Abramov committed
334
335
336
# Test the server
npm start -- --smoke-test

337
338
# Test environment handling
verify_env_url
339

Joe Haddad's avatar
Joe Haddad committed
340
341
342
# Test reliance on webpack internals
verify_module_scope

Christopher Chedeau's avatar
Christopher Chedeau committed
343
# Cleanup
344
cleanup