e2e.sh 5.74 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
39
40
41
42
43
  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
44
45
46
47

# Echo every command being executed
set -x

Dan Abramov's avatar
Dan Abramov committed
48
# Go to root
Christopher Chedeau's avatar
Christopher Chedeau committed
49
cd ..
Dan Abramov's avatar
Dan Abramov committed
50
root_path=$PWD
51

Dan Abramov's avatar
Dan Abramov committed
52
# Lint
53
54
./node_modules/.bin/eslint --ignore-path .gitignore ./

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

71
72
# Run tests with CI flag
CI=true npm test
Dan Abramov's avatar
Dan Abramov committed
73
74
75
76
77
# 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
78

Dan Abramov's avatar
Dan Abramov committed
79
80
81
82
83
# ******************************************************************************
# 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
84
85
86
87
cd global-cli
npm install
cli_path=$PWD/`npm pack`

Dan Abramov's avatar
Dan Abramov committed
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
117
# 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
118
119
# Install the CLI in a temporary location
# http://unix.stackexchange.com/a/84980
Christopher Chedeau's avatar
Christopher Chedeau committed
120
121
122
123
124
125
126
127
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
128
129
130
131
132
133
134

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

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

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

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

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

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

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

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

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

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