e2e-simple.sh 8.4 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.'
Dan Abramov's avatar
Dan Abramov committed
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
Dan Abramov's avatar
Dan Abramov committed
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
45
46
47
function create_react_app {
  node "$temp_cli_path"/node_modules/create-react-app/index.js $*
}

48
49
50
51
52
# 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
53
54
55
56

# Echo every command being executed
set -x

Dan Abramov's avatar
Dan Abramov committed
57
# Go to root
Christopher Chedeau's avatar
Christopher Chedeau committed
58
cd ..
Dan Abramov's avatar
Dan Abramov committed
59
root_path=$PWD
60

61
62
63
64
65
66
67
npm install

# If the node version is < 4, the script should just give an error.
if [ `node --version | sed -e 's/^v//' -e 's/\..\+//g'` -lt 4 ]
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
68
  [[ $err_output =~ You\ are\ running\ Node ]] && exit 0 || exit 1
69
70
fi

Ville Immonen's avatar
Ville Immonen committed
71
72
73
if [ "$USE_YARN" = "yes" ]
then
  # Install Yarn so that the test can use it to install packages.
Dan Abramov's avatar
Dan Abramov committed
74
  npm install -g yarn@0.17.10 # TODO: remove version when https://github.com/yarnpkg/yarn/issues/2142 is fixed.
75
  yarn cache clean
Ville Immonen's avatar
Ville Immonen committed
76
77
fi

Dan Abramov's avatar
Dan Abramov committed
78
# Lint own code
79
80
./node_modules/.bin/eslint --ignore-path .gitignore ./

Dan Abramov's avatar
Dan Abramov committed
81
82
83
84
85
# ******************************************************************************
# 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
86
87
88
# Test local build command
npm run build
# Check for expected output
Max's avatar
Max committed
89
test -e build/*.html
90
91
test -e build/static/js/*.js
test -e build/static/css/*.css
92
test -e build/static/media/*.svg
93
test -e build/favicon.ico
Max's avatar
Max committed
94

95
96
# Run tests with CI flag
CI=true npm test
Dan Abramov's avatar
Dan Abramov committed
97
98
99
100
101
# Uncomment when snapshot testing is enabled by default:
# test -e template/src/__snapshots__/App.test.js.snap

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

Dan Abramov's avatar
Dan Abramov committed
103
104
105
106
# ******************************************************************************
# Next, pack react-scripts and create-react-app so we can verify they work.
# ******************************************************************************

Dan Abramov's avatar
Dan Abramov committed
107
# Pack CLI
Dan Abramov's avatar
Dan Abramov committed
108
cd $root_path/packages/create-react-app
Christopher Chedeau's avatar
Christopher Chedeau committed
109
110
cli_path=$PWD/`npm pack`

Dan Abramov's avatar
Dan Abramov committed
111
112
# Go to react-scripts
cd $root_path/packages/react-scripts
Ville Immonen's avatar
Ville Immonen committed
113

114
115
116
117
118
119
# 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.
node $root_path/tasks/replace-own-deps.js
Ville Immonen's avatar
Ville Immonen committed
120

Dan Abramov's avatar
Dan Abramov committed
121
# Finally, pack react-scripts
Dan Abramov's avatar
Dan Abramov committed
122
scripts_path=$root_path/packages/react-scripts/`npm pack`
Dan Abramov's avatar
Dan Abramov committed
123

124
125
126
127
# Restore package.json
rm package.json
mv package.json.orig package.json

Dan Abramov's avatar
Dan Abramov committed
128
129
130
131
# ******************************************************************************
# Now that we have packed them, create a clean app folder and install them.
# ******************************************************************************

Dan Abramov's avatar
Dan Abramov committed
132
# Install the CLI in a temporary location
Christopher Chedeau's avatar
Christopher Chedeau committed
133
134
135
136
137
cd $temp_cli_path
npm install $cli_path

# Install the app in a temporary location
cd $temp_app_path
138
create_react_app --scripts-version=$scripts_path test-app
Dan Abramov's avatar
Dan Abramov committed
139
140
141
142
143
144

# ******************************************************************************
# 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.
# ******************************************************************************

145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
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
}

Dan Abramov's avatar
Dan Abramov committed
194
# Enter the app directory
Christopher Chedeau's avatar
Christopher Chedeau committed
195
196
197
198
cd test-app

# Test the build
npm run build
199
# Check for expected output
Max's avatar
Max committed
200
test -e build/*.html
201
202
test -e build/static/js/*.js
test -e build/static/css/*.css
203
test -e build/static/media/*.svg
204
test -e build/favicon.ico
205

206
207
# Run tests with CI flag
CI=true npm test
Dan Abramov's avatar
Dan Abramov committed
208
209
# Uncomment when snapshot testing is enabled by default:
# test -e src/__snapshots__/App.test.js.snap
Christoph Pojer's avatar
Christoph Pojer committed
210

Dan Abramov's avatar
Dan Abramov committed
211
212
213
# Test the server
npm start -- --smoke-test

214
215
216
# Test environment handling
verify_env_url

Dan Abramov's avatar
Dan Abramov committed
217
218
219
220
# ******************************************************************************
# Finally, let's check that everything still works after ejecting.
# ******************************************************************************

Dan Abramov's avatar
Dan Abramov committed
221
# Eject...
Christopher Chedeau's avatar
Christopher Chedeau committed
222
223
echo yes | npm run eject

Dan Abramov's avatar
Dan Abramov committed
224
225
226
227
228
229
# ...but still link to the local packages
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
230
231
# Test the build
npm run build
232
# Check for expected output
Max's avatar
Max committed
233
test -e build/*.html
234
235
test -e build/static/js/*.js
test -e build/static/css/*.css
236
test -e build/static/media/*.svg
237
test -e build/favicon.ico
238

Dan Abramov's avatar
Dan Abramov committed
239
240
241
242
# 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
243
244
245
npm test -- --watch=no
# Uncomment when snapshot testing is enabled by default:
# test -e src/__snapshots__/App.test.js.snap
Christoph Pojer's avatar
Christoph Pojer committed
246

Dan Abramov's avatar
Dan Abramov committed
247
248
249
# Test the server
npm start -- --smoke-test

250
251
# Test environment handling
verify_env_url
252

Christopher Chedeau's avatar
Christopher Chedeau committed
253
# Cleanup
254
cleanup