angular-docs-cn/integration
George Kalpakas 7f0d7f4d12 build: update lockfiles for integration projects (#33968)
In the `integration_test` CircleCI job, we run `yarn install` on all
projects in the `integration/` directory. If a project has no lockfile
or if the lockfile is out-of-sync with the corresponding `package.json`
file, then the installed dependency versions are no longer pinned, which
can result in different versions being installed between different runs
of the same job (if, for example, a new version is released for a
package) and breaks hermeticity.

This could be prevented by using the `--frozen-lockfile` option with
`yarn install`, but this is not possible with the current setup, because
yarn needs to be able to install the locally built Angular packages,
whose checksums will be different from the ones in the lockfile.
Therefore, we have to manually ensure that the lockfiles remain in-sync
with the corresponding `package.json` files for the rest of the
dependencies.

For example, previously, [cli-hello-world-lazy/yarn.lock][1] had an
entry for `@angular-devkit/build-angular@0.900.0-next.9` (pinned to
`0.900.0-next.9`), but [cli-hello-world-lazy/package.json][2] specified
the `@angular-devkit/build-angular` version as `^0.900.0-rc.0` (note the
leading caret). As a result, since the version in the lock file does not
much the one in `package.json`, the lockfile is ignored and the latest
available version that matches `^0.900.0-rc.0` is installed.

This, for example, started causing unrelated CI failures ([example][3]),
when `@angular-devkit/build-angular@9.0.0-rc.3` was released with a size
improvement.

This commit ensures that all integration projects have a lockfile and
that lockfiles are up-to-date (with the current `package.json` files).

[1]: https://github.com/angular/angular/blob/fc2f6b845/integration/cli-hello-world-lazy/yarn.lock#L13
[2]: https://github.com/angular/angular/blob/fc2f6b845/integration/cli-hello-world-lazy/package.json#L26
[3]: https://circleci.com/gh/angular/angular/535959#tests/containers/2

PR Close #33968
2019-11-26 16:08:32 -08:00
..
bazel build: update lockfiles for integration projects (#33968) 2019-11-26 16:08:32 -08:00
bazel-schematics build: update lockfiles for integration projects (#33968) 2019-11-26 16:08:32 -08:00
cli-hello-world build: update lockfiles for integration projects (#33968) 2019-11-26 16:08:32 -08:00
cli-hello-world-ivy-compat build: update lockfiles for integration projects (#33968) 2019-11-26 16:08:32 -08:00
cli-hello-world-ivy-i18n build: update lockfiles for integration projects (#33968) 2019-11-26 16:08:32 -08:00
cli-hello-world-ivy-minimal build: update lockfiles for integration projects (#33968) 2019-11-26 16:08:32 -08:00
cli-hello-world-lazy build: update lockfiles for integration projects (#33968) 2019-11-26 16:08:32 -08:00
cli-hello-world-lazy-rollup build: update lockfiles for integration projects (#33968) 2019-11-26 16:08:32 -08:00
dynamic-compiler build: update lockfiles for integration projects (#33968) 2019-11-26 16:08:32 -08:00
hello_world__closure test(ngcc): build `zone.js` from source in `scripts/build-packages-dist.sh` (#33733) 2019-11-12 09:55:16 -08:00
hello_world__systemjs_umd test(ngcc): build `zone.js` from source in `scripts/build-packages-dist.sh` (#33733) 2019-11-12 09:55:16 -08:00
i18n test(ngcc): build `zone.js` from source in `scripts/build-packages-dist.sh` (#33733) 2019-11-12 09:55:16 -08:00
injectable-def build: update lockfiles for integration projects (#33968) 2019-11-26 16:08:32 -08:00
ivy-i18n build: update lockfiles for integration projects (#33968) 2019-11-26 16:08:32 -08:00
language_service_plugin build: update lockfiles for integration projects (#33968) 2019-11-26 16:08:32 -08:00
ng_elements test(ngcc): build `zone.js` from source in `scripts/build-packages-dist.sh` (#33733) 2019-11-12 09:55:16 -08:00
ng_update test(ngcc): build `zone.js` from source in `scripts/build-packages-dist.sh` (#33733) 2019-11-12 09:55:16 -08:00
ng_update_migrations build: update lockfiles for integration projects (#33968) 2019-11-26 16:08:32 -08:00
ngcc build: update lockfiles for integration projects (#33968) 2019-11-26 16:08:32 -08:00
platform-server build: update lockfiles for integration projects (#33968) 2019-11-26 16:08:32 -08:00
service-worker-schema build: update lockfiles for integration projects (#33968) 2019-11-26 16:08:32 -08:00
side-effects docs(ivy): improve the missing `$localize` error message (#33826) 2019-11-15 10:38:36 -08:00
terser build: update lockfiles for integration projects (#33968) 2019-11-26 16:08:32 -08:00
typings_test_ts36 build: update lockfiles for integration projects (#33968) 2019-11-26 16:08:32 -08:00
.gitignore test(ivy): i18n - add compile time translation to integration test (#32881) 2019-10-09 13:19:38 -07:00
README.md build: update lockfiles for integration projects (#33968) 2019-11-26 16:08:32 -08:00
_payload-limits.json build: update payload limits for `cli-hello-world-ivy-i18n` es2015 bundle (#34043) 2019-11-25 20:50:41 -05:00
get-sharded-tests.js build: shard integration tests on circleci (#27937) 2019-01-07 15:35:09 -08:00
run_tests.sh ci: do not check/upload `packages-dist/` UMD bundle sizes multiple times (#33987) 2019-11-25 16:36:07 -05:00

README.md

Integration tests for Angular

This directory contains end-to-end tests for Angular. Each directory is a self-contained application that exactly mimics how a user might expect Angular to work, so they allow high-fidelity reproductions of real-world issues.

For this to work, we first build the Angular distribution just like we would publish it to npm, then install the distribution into each app.

To test Angular CLI applications, we use the cli-hello-world-* integration tests. When a significant change is released in the CLI, the applications should be updated with ng update:

$ cd integration/cli-hello-world[-*]
$ yarn install
$ yarn ng update @angular/cli @angular-devkit/build-angular
# yarn build
# yarn test
# typescript version

Render3 tests

The directory cli-hello-world-ivy-compat contains a test for render3 used with the angular cli.

The cli-hello-world-ivy-minimal contains a minimal ivy app that is meant to mimic the bazel equivalent in packages/core/test/bundling/hello_world, and should be kept similar.

Writing an integration test

The API for each test is:

  • Each sub-directory here is an integration test
  • Each test should have a package.json file
  • The test runner will run yarn and yarn test on the package

This means that the test should be started by test script, like

"scripts": {"test": "runProgramA && assertResultIsGood"}

Note that the package.json file uses a special file:../../dist scheme to reference the Angular packages, so that the locally-built Angular is installed into the test app.

Also, beware of floating (non-locked) dependencies. If in doubt, you can install the package directly from file:../../node_modules.

WARNING

Always ensure that yarn.lock files are up-to-date with the corresponding package.json files (wrt the non-local dependencies - i.e. dependencies whose versions do not start with file:).

You can update a yarn.lock file by running yarn install in the project subdirectory.

Running integration tests

$ ./integration/run_tests.sh

The test runner will first re-build any stale npm packages, then cd into each subdirectory to execute the test.