Sfoglia il codice sorgente

Switch to dev-mode for ui-tests
Fixes #10528

Frédéric Collonval 3 anni fa
parent
commit
dd22a03a0a
54 ha cambiato i file con 94 aggiunte e 55 eliminazioni
  1. 2 0
      .github/workflows/ui-tests.yml
  2. 1 0
      .gitignore
  3. 25 36
      Dockerfile
  4. 3 0
      docker/jupyter_server_config.json
  5. 37 15
      packages/apputils/src/sessioncontext.tsx
  6. 11 0
      scripts/build_docker.sh
  7. 1 0
      setup.cfg
  8. 8 0
      ui-tests/README.md
  9. 5 3
      ui-tests/docker/docker-compose.yml
  10. 1 1
      ui-tests/docker/run-e2e.sh
  11. BIN
      ui-tests/reference-output/screenshots/contextmenu_notebook_code.png
  12. BIN
      ui-tests/reference-output/screenshots/contextmenu_notebook_md.png
  13. BIN
      ui-tests/reference-output/screenshots/general_dark_theme.png
  14. BIN
      ui-tests/reference-output/screenshots/general_filebrowser_right.png
  15. BIN
      ui-tests/reference-output/screenshots/general_launch.png
  16. BIN
      ui-tests/reference-output/screenshots/general_opened_menu_settings.png
  17. BIN
      ui-tests/reference-output/screenshots/general_opened_sidebar_extensionmanager_main_view.png
  18. BIN
      ui-tests/reference-output/screenshots/general_opened_sidebar_filebrowser.png
  19. BIN
      ui-tests/reference-output/screenshots/general_opened_sidebar_jp_property_inspector.png
  20. BIN
      ui-tests/reference-output/screenshots/general_opened_sidebar_jp_running_sessions.png
  21. BIN
      ui-tests/reference-output/screenshots/general_opened_sidebar_table_of_contents.png
  22. BIN
      ui-tests/reference-output/screenshots/general_simple_mode.png
  23. BIN
      ui-tests/reference-output/screenshots/notebook_create_dark_theme.png
  24. BIN
      ui-tests/reference-output/screenshots/notebook_create_opened_menu_settings.png
  25. BIN
      ui-tests/reference-output/screenshots/notebook_create_run_cells.png
  26. BIN
      ui-tests/reference-output/screenshots/notebook_edit_copy_paste_cell.png
  27. BIN
      ui-tests/reference-output/screenshots/notebook_edit_cut_paste_cell.png
  28. BIN
      ui-tests/reference-output/screenshots/notebook_edit_delete_cell.png
  29. BIN
      ui-tests/reference-output/screenshots/notebook_edit_deselect_all_cells.png
  30. BIN
      ui-tests/reference-output/screenshots/notebook_edit_execute_again.png
  31. BIN
      ui-tests/reference-output/screenshots/notebook_edit_merge_cells.png
  32. BIN
      ui-tests/reference-output/screenshots/notebook_edit_move_cell_down.png
  33. BIN
      ui-tests/reference-output/screenshots/notebook_edit_move_cell_up.png
  34. BIN
      ui-tests/reference-output/screenshots/notebook_edit_paste_replace_cell.png
  35. BIN
      ui-tests/reference-output/screenshots/notebook_edit_reedit_cell.png
  36. BIN
      ui-tests/reference-output/screenshots/notebook_edit_run_cell.png
  37. BIN
      ui-tests/reference-output/screenshots/notebook_edit_select_all_cells.png
  38. BIN
      ui-tests/reference-output/screenshots/notebook_edit_split_cell.png
  39. BIN
      ui-tests/reference-output/screenshots/notebook_run_page_0.png
  40. BIN
      ui-tests/reference-output/screenshots/notebook_toolbar_change_to_markdown.png
  41. BIN
      ui-tests/reference-output/screenshots/notebook_toolbar_copy_paste_cell.png
  42. BIN
      ui-tests/reference-output/screenshots/notebook_toolbar_cut_cell.png
  43. BIN
      ui-tests/reference-output/screenshots/notebook_toolbar_delete_cell.png
  44. BIN
      ui-tests/reference-output/screenshots/notebook_toolbar_insert_cells.png
  45. BIN
      ui-tests/reference-output/screenshots/notebook_toolbar_paste_cell.png
  46. BIN
      ui-tests/reference-output/screenshots/notebook_toolbar_re_run_cell.png
  47. BIN
      ui-tests/reference-output/screenshots/notebook_toolbar_run_cell.png
  48. BIN
      ui-tests/reference-output/screenshots/toc_show_tags.png
  49. BIN
      ui-tests/reference-output/screenshots/toc_toc_panel.png
  50. BIN
      ui-tests/reference-output/screenshots/toc_toggle_code.png
  51. BIN
      ui-tests/reference-output/screenshots/toc_toggle_markdown.png
  52. BIN
      ui-tests/reference-output/screenshots/toc_toggle_numbered_list.png
  53. BIN
      ui-tests/reference-output/screenshots/toc_toggle_tag_1.png
  54. BIN
      ui-tests/reference-output/screenshots/toc_toggle_tag_2.png

+ 2 - 0
.github/workflows/ui-tests.yml

@@ -14,6 +14,8 @@ jobs:
         run: |
           docker-compose -f "./ui-tests/docker/docker-compose.yml" down || true
           docker-compose -f "./ui-tests/docker/docker-compose.yml" pull
+          /bin/sh ./scripts/build_docker.sh
+          docker-compose -f "./ui-tests/docker/docker-compose.yml" build
           docker-compose -f "./ui-tests/docker/docker-compose.yml" run --rm e2e
 
       - name: Upload UI Test artifacts

+ 1 - 0
.gitignore

@@ -114,3 +114,4 @@ junit.xml
 
 ui-tests/test-output
 ui-tests/jlab_root
+package_json.tar.gz

+ 25 - 36
Dockerfile

@@ -1,57 +1,46 @@
-# Build image
 FROM mambaorg/micromamba:0.14.0 as build
 
 # Install basic tools
-RUN micromamba install -qy -c conda-forge python nodejs yarn=1.21 build
-
-# Install python dependencies - faster build thanks to caching
-COPY setup.cfg /tmp
-
-RUN list_package=$(python -c "from configparser import ConfigParser; c = ConfigParser(); c.read('/tmp/setup.cfg'); print(' '.join(c['options']['install_requires'].strip().splitlines()))") \
-    && micromamba install -qy -c conda-forge $list_package
-
-# Build JupyterLab wheel
-COPY ./builder /tmp/jupyterlab-dev/builder
-COPY ./buildutils /tmp/jupyterlab-dev/buildutils
-COPY ./dev_mode /tmp/jupyterlab-dev/dev_mode
-COPY ./jupyterlab /tmp/jupyterlab-dev/jupyterlab
-COPY ./packages /tmp/jupyterlab-dev/packages
-COPY ./scripts /tmp/jupyterlab-dev/scripts
-COPY ./*.* ./LICENSE /tmp/jupyterlab-dev/
-
-RUN pushd /tmp/jupyterlab-dev \
-    && pip install -e . \
-    && jlpm install \
-    && jlpm run build \
-    && python -m build .
-
-# Runtime image
-FROM mambaorg/micromamba:0.14.0
-
-RUN micromamba install -qy -c conda-forge python \
+RUN micromamba install -qy -c conda-forge python nodejs yarn=1.21 build \
     && useradd --shell /bin/bash jovyan \
     && chown jovyan $HOME
 
+# Install npm packages - faster build thanks to caching
+## package_json.tar.gz contains all package.json files using 
+## `tar cvf package_json.tar.gz package.json packages/*/package.package_json`
+ADD ./package_json.tar.gz /tmp/jupyterlab-dev
+COPY yarn.lock /tmp/jupyterlab-dev
+
+RUN cd /tmp/jupyterlab-dev \
+    && yarn install --ignore-scripts
+
 # Install python dependencies - faster build thanks to caching
 COPY setup.cfg /tmp
 
 RUN list_package=$(python -c "from configparser import ConfigParser; c = ConfigParser(); c.read('/tmp/setup.cfg'); print(' '.join(c['options']['install_requires'].strip().splitlines()))") \
     && micromamba install -qy -c conda-forge $list_package \
-    && micromamba clean --all --yes \
+    && micromamba clean -ay \
     && rm /tmp/setup.cfg
 
+# Install JupyterLab
+COPY ./builder/ /tmp/jupyterlab-dev/builder/
+COPY ./buildutils/ /tmp/jupyterlab-dev/buildutils/
+COPY ./dev_mode/ /tmp/jupyterlab-dev/dev_mode/
+COPY ./jupyterlab/ /tmp/jupyterlab-dev/jupyterlab/
+COPY ./packages/ /tmp/jupyterlab-dev/packages/
+COPY ./scripts/ /tmp/jupyterlab-dev/scripts/
+COPY ./*.* ./LICENSE /tmp/jupyterlab-dev/
+
+RUN pushd /tmp/jupyterlab-dev \
+    && pip install -e .[ui-tests] \
+    && chown -R jovyan /tmp/jupyterlab-dev
+
 USER jovyan
 WORKDIR ${HOME}
 
-# Install JupyterLab
 ENV PATH="/home/micromamba/.local/bin:$PATH"
 
-COPY --from=build /tmp/jupyterlab-dev/dist/jupyterlab*.whl /tmp
-
-RUN pip install /tmp/jupyterlab*.whl \
-    # TODO remove when ipykernel 6 is released
-    && pip install --pre --upgrade ipykernel \
-    && mkdir -p /home/micromamba/jlab_root
+RUN mkdir -p /home/micromamba/jlab_root
 
 COPY ./docker/jupyter_server_config.json /etc/jupyter/
 

+ 3 - 0
docker/jupyter_server_config.json

@@ -5,5 +5,8 @@
     "port": 8888,
     "open_browser": false,
     "root_dir": "/home/micromamba/jlab_root"
+  },
+  "LabApp": {
+    "dev_mode": true
   }
 }

+ 37 - 15
packages/apputils/src/sessioncontext.tsx

@@ -132,7 +132,15 @@ export interface ISessionContext extends IObservableDisposable {
   kernelPreference: ISessionContext.IKernelPreference;
 
   /**
-   * The sensible display name for the kernel, or "No Kernel"
+   * Whether the kernel is "No Kernel" or not.
+   *
+   * #### Notes
+   * As the displayed name is translated, this can be used directly.
+   */
+  readonly hasNoKernel: boolean;
+
+  /**
+   * The sensible display name for the kernel, or translated "No Kernel"
    *
    * #### Notes
    * This is at this level since the underlying kernel connection does not
@@ -478,6 +486,16 @@ export class SessionContext implements ISessionContext {
    */
   readonly specsManager: KernelSpec.IManager;
 
+  /**
+   * Whether the kernel is "No Kernel" or not.
+   *
+   * #### Notes
+   * As the displayed name is translated, this can be used directly.
+   */
+  get hasNoKernel(): boolean {
+    return this.kernelDisplayName === this.noKernelName;
+  }
+
   /**
    * The display name of the current kernel, or a sensible alternative.
    *
@@ -487,8 +505,8 @@ export class SessionContext implements ISessionContext {
    */
   get kernelDisplayName(): string {
     const kernel = this.session?.kernel;
-    if (this._pendingKernelName === this._trans.__('No Kernel')) {
-      return this._trans.__('No Kernel');
+    if (this._pendingKernelName === this.noKernelName) {
+      return this.noKernelName;
     }
     if (
       !kernel &&
@@ -508,7 +526,7 @@ export class SessionContext implements ISessionContext {
         name = this.specsManager.specs?.kernelspecs[name]?.display_name ?? name;
         return name;
       }
-      return this._trans.__('No Kernel');
+      return this.noKernelName;
     }
     if (this._pendingKernelName) {
       return (
@@ -517,7 +535,7 @@ export class SessionContext implements ISessionContext {
       );
     }
     if (!kernel) {
-      return this._trans.__('No Kernel');
+      return this.noKernelName;
     }
     return (
       this.specsManager.specs?.kernelspecs[kernel.name]?.display_name ??
@@ -543,7 +561,7 @@ export class SessionContext implements ISessionContext {
       return 'restarting';
     }
 
-    if (this._pendingKernelName === this._trans.__('No Kernel')) {
+    if (this._pendingKernelName === this.noKernelName) {
       return 'idle';
     }
 
@@ -588,6 +606,13 @@ export class SessionContext implements ISessionContext {
     return this._disposed;
   }
 
+  /**
+   * Get the constant displayed name for "No Kernel"
+   */
+  protected get noKernelName(): string {
+    return this._trans.__('No Kernel');
+  }
+
   /**
    * Dispose of the resources held by the context.
    */
@@ -668,7 +693,7 @@ export class SessionContext implements ISessionContext {
     }
     await this._initStarted.promise;
     this._pendingSessionRequest = '';
-    this._pendingKernelName = this._trans.__('No Kernel');
+    this._pendingKernelName = this.noKernelName;
     return this._shutdownSession();
   }
 
@@ -1216,8 +1241,8 @@ export const sessionContextDialogs: ISessionContext.IDialogs = {
     // If there is no existing kernel, offer the option
     // to keep no kernel.
     let label = trans.__('Cancel');
-    if (sessionContext.kernelDisplayName === trans.__('No Kernel')) {
-      label = trans.__('No Kernel');
+    if (sessionContext.hasNoKernel) {
+      label = sessionContext.kernelDisplayName;
     }
     const buttons = [
       Dialog.cancelButton({ label }),
@@ -1235,10 +1260,7 @@ export const sessionContextDialogs: ISessionContext.IDialogs = {
       return;
     }
     const model = result.value;
-    if (
-      model === null &&
-      sessionContext.kernelDisplayName !== trans.__('No Kernel')
-    ) {
+    if (model === null && !sessionContext.hasNoKernel) {
       return sessionContext.shutdown();
     }
     if (model) {
@@ -1347,7 +1369,7 @@ namespace Private {
       selector,
       options,
       translator,
-      sessionContext.kernelDisplayName
+      !sessionContext.hasNoKernel ? sessionContext.kernelDisplayName : null
     );
     body.appendChild(selector);
     return body;
@@ -1424,7 +1446,7 @@ namespace Private {
     node: HTMLSelectElement,
     options: SessionContext.IKernelSearch,
     translator?: ITranslator,
-    currentKernelDisplayName?: string
+    currentKernelDisplayName: string | null = null
   ): void {
     while (node.firstChild) {
       node.removeChild(node.firstChild);

+ 11 - 0
scripts/build_docker.sh

@@ -0,0 +1,11 @@
+#! /bin/sh
+# This script build the JupyterLab image
+if [ -d ${PWD}/packages ]; then
+    echo Create package.json files archive
+    tar cf /tmp/package_json.tar.gz package.json packages/*/package.json
+    cp /tmp/package_json.tar.gz ${PWD}
+    echo Build JupyterLab docker
+    docker build -f Dockerfile -t jupyterlab-dev ${PWD}
+else
+    echo You need to run this script from the JupyterLab root folder
+fi

+ 1 - 0
setup.cfg

@@ -39,6 +39,7 @@ install_requires =
 
 [options.extras_require]
 test = coverage; pytest>=6.0; pytest-cov; pytest-console-scripts; pytest-check-links>=0.5; jupyterlab_server[test]~=2.2; requests; requests_cache; virtualenv; check-manifest
+ui-tests = ipykernel>=6.0
 
 [options.entry_points]
 console_scripts =

+ 8 - 0
ui-tests/README.md

@@ -16,6 +16,9 @@ import { galata, describe, test } from '@jupyterlab/galata';
 5. If you added visual regression tests, make sure you tested them locally enough number of times to make sure they do not produce false positives due to async nature of UI actions. Use the following steps to test locally (it requires [docker](https://docs.docker.com/engine/) and [docker-compose](https://docs.docker.com/compose/install/)).
 
 ```bash
+# Build the JupyterLab docker to be tested
+/bin/sh ./scripts/build_docker.sh
+
 # run UI tests once to create test captures to use as reference images for your new feature
 docker-compose -f "./ui-tests/docker/docker-compose.yml" run --rm e2e yarn run test:create-references --jlab-base-url=http://jupyterlab:8888
 
@@ -24,8 +27,13 @@ docker-compose -f "./ui-tests/docker/docker-compose.yml" run --rm e2e yarn run t
 
 # run UI tests locally, repeatedly. make sure no test fails. wait for 10-20 successful repeats
 docker-compose -f "./ui-tests/docker/docker-compose.yml" run --rm e2e
+
+# Stop the docker stack
+docker-compose -f "./ui-tests/docker/docker-compose.yml" down
 ```
 
+> You can access the server logs by running `docker logs jupyterlab`
+
 6. Once you are done testing locally, push the new references on your PR and check CI is passing.
 
 7. If your tests are failing or if you want to debug UI tests, you can use the script `yarn run test:debug --include=...` by specifying the particular test suite(s) you want to debug. Check [Galata CLI Options](https://github.com/jupyterlab/galata#command-line-options) for list of available command-line options.

+ 5 - 3
ui-tests/docker/docker-compose.yml

@@ -3,9 +3,8 @@ version: '3.5'
 services:
   lab:
     container_name: jupyterlab
-    build:
-      context: ../..
-      dockerfile: ./Dockerfile
+    # Need to be built running script: scripts/build_docker.sh
+    image: jupyterlab-dev
     command:
       [
         '--ServerApp.token=',
@@ -21,6 +20,9 @@ services:
   e2e:
     build:
       context: ..
+    environment:
+      SERVER_URL: 'jupyterlab:8888'
+      TIMEOUT: 180
     command: ['yarn', 'run', 'test', '--jlab-base-url=http://jupyterlab:8888']
     # See https://playwright.dev/docs/docker/#run-the-image
     ipc: host

+ 1 - 1
ui-tests/docker/run-e2e.sh

@@ -2,4 +2,4 @@
 # Trick to get the galata test outputs writable on the host
 umask 0000
 # Wait for jupyterlab container to be ready
-/opt/galata/wait-for-it.sh jupyterlab:8888 --strict --timeout=10 -- $*
+/opt/galata/wait-for-it.sh ${SERVER_URL} --strict --timeout=${TIMEOUT:-120} -- $*

BIN
ui-tests/reference-output/screenshots/contextmenu_notebook_code.png


BIN
ui-tests/reference-output/screenshots/contextmenu_notebook_md.png


BIN
ui-tests/reference-output/screenshots/general_dark_theme.png


BIN
ui-tests/reference-output/screenshots/general_filebrowser_right.png


BIN
ui-tests/reference-output/screenshots/general_launch.png


BIN
ui-tests/reference-output/screenshots/general_opened_menu_settings.png


BIN
ui-tests/reference-output/screenshots/general_opened_sidebar_extensionmanager_main_view.png


BIN
ui-tests/reference-output/screenshots/general_opened_sidebar_filebrowser.png


BIN
ui-tests/reference-output/screenshots/general_opened_sidebar_jp_property_inspector.png


BIN
ui-tests/reference-output/screenshots/general_opened_sidebar_jp_running_sessions.png


BIN
ui-tests/reference-output/screenshots/general_opened_sidebar_table_of_contents.png


BIN
ui-tests/reference-output/screenshots/general_simple_mode.png


BIN
ui-tests/reference-output/screenshots/notebook_create_dark_theme.png


BIN
ui-tests/reference-output/screenshots/notebook_create_opened_menu_settings.png


BIN
ui-tests/reference-output/screenshots/notebook_create_run_cells.png


BIN
ui-tests/reference-output/screenshots/notebook_edit_copy_paste_cell.png


BIN
ui-tests/reference-output/screenshots/notebook_edit_cut_paste_cell.png


BIN
ui-tests/reference-output/screenshots/notebook_edit_delete_cell.png


BIN
ui-tests/reference-output/screenshots/notebook_edit_deselect_all_cells.png


BIN
ui-tests/reference-output/screenshots/notebook_edit_execute_again.png


BIN
ui-tests/reference-output/screenshots/notebook_edit_merge_cells.png


BIN
ui-tests/reference-output/screenshots/notebook_edit_move_cell_down.png


BIN
ui-tests/reference-output/screenshots/notebook_edit_move_cell_up.png


BIN
ui-tests/reference-output/screenshots/notebook_edit_paste_replace_cell.png


BIN
ui-tests/reference-output/screenshots/notebook_edit_reedit_cell.png


BIN
ui-tests/reference-output/screenshots/notebook_edit_run_cell.png


BIN
ui-tests/reference-output/screenshots/notebook_edit_select_all_cells.png


BIN
ui-tests/reference-output/screenshots/notebook_edit_split_cell.png


BIN
ui-tests/reference-output/screenshots/notebook_run_page_0.png


BIN
ui-tests/reference-output/screenshots/notebook_toolbar_change_to_markdown.png


BIN
ui-tests/reference-output/screenshots/notebook_toolbar_copy_paste_cell.png


BIN
ui-tests/reference-output/screenshots/notebook_toolbar_cut_cell.png


BIN
ui-tests/reference-output/screenshots/notebook_toolbar_delete_cell.png


BIN
ui-tests/reference-output/screenshots/notebook_toolbar_insert_cells.png


BIN
ui-tests/reference-output/screenshots/notebook_toolbar_paste_cell.png


BIN
ui-tests/reference-output/screenshots/notebook_toolbar_re_run_cell.png


BIN
ui-tests/reference-output/screenshots/notebook_toolbar_run_cell.png


BIN
ui-tests/reference-output/screenshots/toc_show_tags.png


BIN
ui-tests/reference-output/screenshots/toc_toc_panel.png


BIN
ui-tests/reference-output/screenshots/toc_toggle_code.png


BIN
ui-tests/reference-output/screenshots/toc_toggle_markdown.png


BIN
ui-tests/reference-output/screenshots/toc_toggle_numbered_list.png


BIN
ui-tests/reference-output/screenshots/toc_toggle_tag_1.png


BIN
ui-tests/reference-output/screenshots/toc_toggle_tag_2.png