e2e.sh 5.67 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.

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

12
13
function cleanup {
  echo 'Cleaning up.'
Dan Abramov's avatar
Dan Abramov committed
14
  cd $root_path
Dan Abramov's avatar
Dan Abramov committed
15
  # Uncomment when snapshot testing is enabled by default:
Dan Abramov's avatar
Dan Abramov committed
16
  # rm ./template/src/__snapshots__/App.test.js.snap
17
18
19
  rm -rf $temp_cli_path $temp_app_path
}

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

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

# 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
39
40
41
42

# Echo every command being executed
set -x

Dan Abramov's avatar
Dan Abramov committed
43
# Go to root
Christopher Chedeau's avatar
Christopher Chedeau committed
44
cd ..
Dan Abramov's avatar
Dan Abramov committed
45
root_path=$PWD
46

Dan Abramov's avatar
Dan Abramov committed
47
# Lint
48
49
./node_modules/.bin/eslint --ignore-path .gitignore ./

Dan Abramov's avatar
Dan Abramov committed
50
51
52
53
54
55
56
# ******************************************************************************
# 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
57
58
59
# Test local build command
npm run build
# Check for expected output
Max's avatar
Max committed
60
test -e build/*.html
61
62
63
test -e build/static/js/*.js
test -e build/static/css/*.css
test -e build/static/media/*.svg
64
test -e build/favicon.ico
Max's avatar
Max committed
65

66
67
# Run tests with CI flag
CI=true npm test
Dan Abramov's avatar
Dan Abramov committed
68
69
70
71
72
# 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
73

Dan Abramov's avatar
Dan Abramov committed
74
75
76
77
78
# ******************************************************************************
# 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
79
80
81
82
cd global-cli
npm install
cli_path=$PWD/`npm pack`

Dan Abramov's avatar
Dan Abramov committed
83
84
85
86
87
88
89
90
91
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
# 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

# A hacky way to avoid bundling dependencies.
# Packing with them enabled takes too much memory, and Travis crashes.
perl -i -p0e 's/bundledDependencies.*?]/bundledDependencies": []/s' package.json

# 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
117
118
# Install the CLI in a temporary location
# http://unix.stackexchange.com/a/84980
Christopher Chedeau's avatar
Christopher Chedeau committed
119
120
121
122
123
124
125
126
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
node "$temp_cli_path"/node_modules/create-react-app/index.js --scripts-version=$scripts_path test-app
Dan Abramov's avatar
Dan Abramov committed
127
128
129
130
131
132
133

# ******************************************************************************
# 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
134
135
136
137
cd test-app

# Test the build
npm run build
138
# Check for expected output
Max's avatar
Max committed
139
test -e build/*.html
140
141
142
test -e build/static/js/*.js
test -e build/static/css/*.css
test -e build/static/media/*.svg
143
test -e build/favicon.ico
144

145
146
# Run tests with CI flag
CI=true npm test
Dan Abramov's avatar
Dan Abramov committed
147
148
# Uncomment when snapshot testing is enabled by default:
# test -e src/__snapshots__/App.test.js.snap
Christoph Pojer's avatar
Christoph Pojer committed
149

Dan Abramov's avatar
Dan Abramov committed
150
151
152
# Test the server
npm start -- --smoke-test

Dan Abramov's avatar
Dan Abramov committed
153
154
155
156
157
# ******************************************************************************
# Finally, let's check that everything still works after ejecting.
# ******************************************************************************

# Eject
Christopher Chedeau's avatar
Christopher Chedeau committed
158
159
echo yes | npm run eject

Dan Abramov's avatar
Dan Abramov committed
160
161
# Test the build
npm run build
162
# Check for expected output
Max's avatar
Max committed
163
test -e build/*.html
164
165
166
test -e build/static/js/*.js
test -e build/static/css/*.css
test -e build/static/media/*.svg
167
test -e build/favicon.ico
168

Dan Abramov's avatar
Dan Abramov committed
169
170
171
172
# 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
173
174
175
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
176

Dan Abramov's avatar
Dan Abramov committed
177
178
179
# Test the server
npm start -- --smoke-test

Christopher Chedeau's avatar
Christopher Chedeau committed
180
# Cleanup
181
cleanup