diff --git a/packages/react-scripts/fixtures/kitchensink/.template.dependencies.json b/packages/react-scripts/fixtures/kitchensink/.template.dependencies.json index a20139318c1..ad2da83e197 100644 --- a/packages/react-scripts/fixtures/kitchensink/.template.dependencies.json +++ b/packages/react-scripts/fixtures/kitchensink/.template.dependencies.json @@ -5,6 +5,7 @@ "babel-polyfill": "6.20.0", "chai": "3.5.0", "jsdom": "9.8.3", - "mocha": "3.2.0" + "mocha": "3.2.0", + "test-integrity": "1.0.0" } } diff --git a/packages/react-scripts/fixtures/kitchensink/integration/webpack.test.js b/packages/react-scripts/fixtures/kitchensink/integration/webpack.test.js index 031786e0ee7..bda69cc61af 100644 --- a/packages/react-scripts/fixtures/kitchensink/integration/webpack.test.js +++ b/packages/react-scripts/fixtures/kitchensink/integration/webpack.test.js @@ -44,6 +44,14 @@ describe('Integration', () => { ); }); + it('linked modules', async () => { + const doc = await initDOM('linked-modules'); + + expect(doc.getElementById('feature-linked-modules').textContent).to.equal( + '2.0.0' + ); + }); + it('svg inclusion', async () => { const doc = await initDOM('svg-inclusion'); diff --git a/packages/react-scripts/fixtures/kitchensink/src/App.js b/packages/react-scripts/fixtures/kitchensink/src/App.js index 67de182b59e..4edfcba9391 100644 --- a/packages/react-scripts/fixtures/kitchensink/src/App.js +++ b/packages/react-scripts/fixtures/kitchensink/src/App.js @@ -111,6 +111,10 @@ class App extends Component { import('./features/webpack/JsonInclusion').then(f => this.setFeature(f.default)); break; + case 'linked-modules': + import('./features/webpack/LinkedModules').then(f => + this.setFeature(f.default)); + break; case 'node-path': import('./features/env/NodePath').then(f => this.setFeature(f.default)); break; diff --git a/packages/react-scripts/fixtures/kitchensink/src/features/webpack/LinkedModules.js b/packages/react-scripts/fixtures/kitchensink/src/features/webpack/LinkedModules.js new file mode 100644 index 00000000000..de8a5e4ab5b --- /dev/null +++ b/packages/react-scripts/fixtures/kitchensink/src/features/webpack/LinkedModules.js @@ -0,0 +1,20 @@ +/** + * 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. + */ + +import React from 'react'; +import './assets/style.css'; +import { test, version } from 'test-integrity'; + +export default () => { + const v = version(); + if (!test() || v !== '2.0.0') { + throw new Error('Functionality test did not pass.'); + } + return

{v}

; +}; diff --git a/packages/react-scripts/fixtures/kitchensink/src/features/webpack/LinkedModules.test.js b/packages/react-scripts/fixtures/kitchensink/src/features/webpack/LinkedModules.test.js new file mode 100644 index 00000000000..aa1e911ae45 --- /dev/null +++ b/packages/react-scripts/fixtures/kitchensink/src/features/webpack/LinkedModules.test.js @@ -0,0 +1,25 @@ +/** + * 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. + */ + +import React from 'react'; +import ReactDOM from 'react-dom'; +import { test, version } from 'test-integrity'; +import LinkedModules from './LinkedModules'; + +describe('linked modules', () => { + it('has integrity', () => { + expect(test()); + expect(version() === '2.0.0'); + }); + + it('renders without crashing', () => { + const div = document.createElement('div'); + ReactDOM.render(, div); + }); +}); diff --git a/tasks/e2e-kitchensink.sh b/tasks/e2e-kitchensink.sh index becd88282c1..afc36e1a368 100755 --- a/tasks/e2e-kitchensink.sh +++ b/tasks/e2e-kitchensink.sh @@ -14,17 +14,18 @@ # Start in tasks/ even if run from root directory cd "$(dirname "$0")" -# CLI and app temporary locations +# CLI, app, and test module 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'` +temp_module_path=`mktemp -d 2>/dev/null || mktemp -d -t 'temp_module_path'` function cleanup { echo 'Cleaning up.' ps -ef | grep 'react-scripts' | grep -v grep | awk '{print $2}' | xargs kill -s 9 cd "$root_path" # TODO: fix "Device or resource busy" and remove ``|| $CI` - rm -rf "$temp_cli_path" $temp_app_path || $CI + rm -rf "$temp_cli_path" "$temp_app_path" "$temp_module_path" || $CI } # Error messages are redirected to stderr @@ -111,17 +112,24 @@ npm install "$cli_path" cd $temp_app_path create_react_app --scripts-version="$scripts_path" --internal-testing-template="$root_path"/packages/react-scripts/fixtures/kitchensink test-kitchensink +# Install the test module +cd "$temp_module_path" +npm install test-integrity@^2.0.1 + # ****************************************************************************** # 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 -cd test-kitchensink +cd "$temp_app_path/test-kitchensink" # Link to our preset npm link "$root_path"/packages/babel-preset-react-app +# Link to test module +npm link "$temp_module_path/node_modules/test-integrity" + # Test the build REACT_APP_SHELL_ENV_MESSAGE=fromtheshell \ NODE_PATH=src \ @@ -183,6 +191,9 @@ npm link "$root_path"/packages/eslint-config-react-app npm link "$root_path"/packages/react-dev-utils npm link "$root_path"/packages/react-scripts +# Link to test module +npm link "$temp_module_path/node_modules/test-integrity" + # Test the build REACT_APP_SHELL_ENV_MESSAGE=fromtheshell \ NODE_PATH=src \