e2e.sh 7.18 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
function cleanup {
  echo 'Cleaning up.'
Dan Abramov's avatar
Dan Abramov committed
19
  cd $root_path
Dan Abramov's avatar
Dan Abramov committed
20
  # Uncomment when snapshot testing is enabled by default:
Dan Abramov's avatar
Dan Abramov committed
21
  # rm ./template/src/__snapshots__/App.test.js.snap
22
  rm -rf $temp_cli_path $temp_app_path $clean_path
23
24
}

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

function handle_exit {
  cleanup
35
  echo 'Exiting without error.' 1>&2;
36
37
38
  exit
}

39
40
41
42
function create_react_app {
  node "$temp_cli_path"/node_modules/create-react-app/index.js $*
}

43
44
45
46
47
# 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
48
49
50
51

# Echo every command being executed
set -x

Dan Abramov's avatar
Dan Abramov committed
52
# Go to root
Christopher Chedeau's avatar
Christopher Chedeau committed
53
cd ..
Dan Abramov's avatar
Dan Abramov committed
54
root_path=$PWD
55

Dan Abramov's avatar
Dan Abramov committed
56
# Lint
57
58
./node_modules/.bin/eslint --ignore-path .gitignore ./

Dan Abramov's avatar
Dan Abramov committed
59
60
61
62
63
64
65
# ******************************************************************************
# First, test the create-react-app development environment.
# This does not affect our users but makes sure we can develop it.
# ******************************************************************************

npm install

Max's avatar
Max committed
66
67
68
# Test local build command
npm run build
# Check for expected output
Max's avatar
Max committed
69
test -e build/*.html
70
71
72
test -e build/static/js/*.js
test -e build/static/css/*.css
test -e build/static/media/*.svg
73
test -e build/favicon.ico
Max's avatar
Max committed
74

75
76
# Run tests with CI flag
CI=true npm test
Dan Abramov's avatar
Dan Abramov committed
77
78
79
80
81
# 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
82

Dan Abramov's avatar
Dan Abramov committed
83
84
85
86
87
# ******************************************************************************
# Next, pack react-scripts and create-react-app so we can verify they work.
# ******************************************************************************

# Pack CLI (it doesn't need cleaning)
Christopher Chedeau's avatar
Christopher Chedeau committed
88
89
90
91
cd global-cli
npm install
cli_path=$PWD/`npm pack`

Dan Abramov's avatar
Dan Abramov committed
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# Packing react-scripts takes more work because we want to clean it up first.
# Create a temporary clean folder that contains production only code.
# Do not overwrite any files in the current folder.
clean_path=`mktemp -d 2>/dev/null || mktemp -d -t 'clean_path'`

# Copy some of the project files to the temporary folder.
# Exclude folders that definitely won’t be part of the package from processing.
# We will strip the dev-only code there, `npm pack`, and copy the package back.
cd $root_path
rsync -av --exclude='.git' --exclude=$clean_path\
  --exclude='node_modules' --exclude='build'\
  './' $clean_path  >/dev/null

# Open the clean folder
cd $clean_path
# Now remove all the code relevant to development of Create React App.
files="$(find -L . -name "*.js" -type f)"
for file in $files; do
  sed -i.bak '/\/\/ @remove-on-publish-begin/,/\/\/ @remove-on-publish-end/d' $file
  rm $file.bak
done

# Finally, pack react-scripts
npm install
scripts_path=$clean_path/`npm pack`

# ******************************************************************************
# Now that we have packed them, create a clean app folder and install them.
# ******************************************************************************

Dan Abramov's avatar
Dan Abramov committed
122
123
# Install the CLI in a temporary location
# http://unix.stackexchange.com/a/84980
Christopher Chedeau's avatar
Christopher Chedeau committed
124
125
126
127
128
129
130
temp_cli_path=`mktemp -d 2>/dev/null || mktemp -d -t 'temp_cli_path'`
cd $temp_cli_path
npm install $cli_path

# Install the app in a temporary location
temp_app_path=`mktemp -d 2>/dev/null || mktemp -d -t 'temp_app_path'`
cd $temp_app_path
131
create_react_app --scripts-version=$scripts_path test-app
Dan Abramov's avatar
Dan Abramov committed
132
133
134
135
136
137
138

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

# Enter the app directory
Christopher Chedeau's avatar
Christopher Chedeau committed
139
140
141
142
cd test-app

# Test the build
npm run build
143
# Check for expected output
Max's avatar
Max committed
144
test -e build/*.html
145
146
147
test -e build/static/js/*.js
test -e build/static/css/*.css
test -e build/static/media/*.svg
148
test -e build/favicon.ico
149

150
151
# Run tests with CI flag
CI=true npm test
Dan Abramov's avatar
Dan Abramov committed
152
153
# Uncomment when snapshot testing is enabled by default:
# test -e src/__snapshots__/App.test.js.snap
Christoph Pojer's avatar
Christoph Pojer committed
154

Dan Abramov's avatar
Dan Abramov committed
155
156
157
# Test the server
npm start -- --smoke-test

Dan Abramov's avatar
Dan Abramov committed
158
159
160
161
162
# ******************************************************************************
# Finally, let's check that everything still works after ejecting.
# ******************************************************************************

# Eject
Christopher Chedeau's avatar
Christopher Chedeau committed
163
164
echo yes | npm run eject

Dan Abramov's avatar
Dan Abramov committed
165
166
# Test the build
npm run build
167
# Check for expected output
Max's avatar
Max committed
168
test -e build/*.html
169
170
171
test -e build/static/js/*.js
test -e build/static/css/*.css
test -e build/static/media/*.svg
172
test -e build/favicon.ico
173

Dan Abramov's avatar
Dan Abramov committed
174
175
176
177
# 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
178
179
180
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
181

Dan Abramov's avatar
Dan Abramov committed
182
183
184
# Test the server
npm start -- --smoke-test

185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220

# ******************************************************************************
# Test --scripts-version is a version number
# ******************************************************************************

cd $temp_app_path
create_react_app --scripts-version=0.4.0 test-app-version-number
cd test-app-version-number

# Check corresponding scripts version is installed.
test -e node_modules/react-scripts
grep '"version": "0.4.0"' node_modules/react-scripts/package.json

# ******************************************************************************
# Test --scripts-version is a tarball url
# ******************************************************************************

cd $temp_app_path
create_react_app --scripts-version=https://registry.npmjs.org/react-scripts/-/react-scripts-0.4.0.tgz test-app-tarball-url
cd test-app-tarball-url

# Check corresponding scripts version is installed.
test -e node_modules/react-scripts
grep '"version": "0.4.0"' node_modules/react-scripts/package.json

# ******************************************************************************
# Test --scripts-version is a custom fork of react-scripts
# ******************************************************************************

cd $temp_app_path
create_react_app --scripts-version=react-scripts-fork test-app-fork
cd test-app-fork

# Check corresponding scripts version is installed.
test -e node_modules/react-scripts-fork

Christopher Chedeau's avatar
Christopher Chedeau committed
221
# Cleanup
222
cleanup