def test_pip_packages(driver: selenium.webdriver, *args, **kwargs): """ Test that pip packages install successfully. Args: driver """ # Create project r = testutils.prep_py3_minimal_base(driver) username, project_title = r.username, r.project_name # Add pip packages env_elts = testutils.EnvironmentElements(driver) env_elts.add_pip_packages("pandas", "numpy", "matplotlib") # Get environment package versions logging.info("Extracting package versions from environment") environment_package_versions = env_elts.get_all_versions() #Open JupyterLab and create Jupyter notebook project_control = testutils.ProjectControlElements(driver) project_control.container_status_stopped.wait(120) project_control.launch_devtool('JupyterLab') jupyterlab_elts = testutils.JupyterLabElements(driver) # TODO DC This seems unnecessary given the wait below time.sleep(5) jupyterlab_elts.jupyter_notebook_button.wait().click() time.sleep(5) logging.info( "Running script to import packages and print package versions") package_script = "import pandas\nimport numpy\nimport matplotlib\n" \ "print(pandas.__version__,numpy.__version__,matplotlib.__version__)" actions = ActionChains(driver) actions.move_to_element(jupyterlab_elts.code_input.find()) \ .click(jupyterlab_elts.code_input.find()) \ .send_keys(package_script) \ .key_down(Keys.SHIFT).send_keys(Keys.ENTER).key_up(Keys.SHIFT).key_up(Keys.CONTROL) \ .perform() time.sleep(3) # Get JupyterLab package versions logging.info("Extracting package versions from JupyterLab") jupyterlab_package_output = jupyterlab_elts.code_output.find().text.split( " ") jupyterlab_package_versions = jupyterlab_package_output logging.info( f"Environment package version {environment_package_versions} \n " f"JupyterLab package version {jupyterlab_package_versions}") assert environment_package_versions == jupyterlab_package_versions,\ "Environment and JupyterLab package versions do not match"
def test_valid_custom_docker(driver: selenium.webdriver, *args, **kwargs): """ Test valid custom Docker instructions. Args: driver """ # Create project r = testutils.prep_py3_minimal_base(driver) username, project_name = r.username, r.project_name env_elts = testutils.EnvironmentElements(driver) env_elts.add_custom_docker_instructions( "RUN cd /tmp && " "git clone https://github.com/gigantum/confhttpproxy && " "cd /tmp/confhttpproxy && pip install -e.") time.sleep(3) proj_elements = testutils.ProjectControlElements(driver) proj_elements.container_status_stopped.wait(60) container_status = proj_elements.container_status_stopped.is_displayed() assert container_status, "Expected stopped container status"
def prep_merge_conflict(driver: selenium.webdriver, *args, **kwargs): """ Prepare a merge conflict in a cloud project. """ # Owner creates a project, publishes it, adds a collaborator, and logs out r = testutils.prep_py3_minimal_base(driver) username, project_title = r.username, r.project_name cloud_project_elts = testutils.CloudProjectElements(driver) cloud_project_elts.publish_private_project(project_title) collaborator = cloud_project_elts.add_collaborator_with_permissions( project_title, permissions="admin") side_bar_elts = testutils.SideBarElements(driver) side_bar_elts.do_logout(username) # Collaborator logs in and imports the cloud project logging.info(f"Logging in as {collaborator}") testutils.log_in(driver, user_index=1) time.sleep(2) try: testutils.GuideElements.remove_guide(driver) except: pass time.sleep(2) logging.info(f"Navigating to {collaborator}'s Cloud tab") driver.get(f"{os.environ['GIGANTUM_HOST']}/projects/cloud") time.sleep(2) cloud_project_elts.first_cloud_project.wait(30) cloud_project_elts.import_first_cloud_project_button.find().click() project_control = testutils.ProjectControlElements(driver) project_control.container_status_stopped.wait(30) # Collaborator adds a file, syncs, and logs out logging.info(f"Navigating to {collaborator}'s Input Data tab") driver.get( f'{os.environ["GIGANTUM_HOST"]}/projects/{username}/{project_title}/inputData' ) time.sleep(2) file_browser_elts = testutils.FileBrowserElements(driver) file_browser_elts.drag_drop_file_in_drop_zone(file_content="Collaborator") cloud_project_elts.sync_cloud_project(project_title) side_bar_elts.do_logout(collaborator) # Owner logs in and navigates to Input Data logging.info(f"Logging in as {username}") testutils.log_in(driver) time.sleep(2) try: testutils.GuideElements.remove_guide(driver) except: pass time.sleep(2) logging.info(f"Navigating to {username}'s Input Data tab") driver.get( f'{os.environ["GIGANTUM_HOST"]}/projects/{username}/{project_title}/inputData' ) time.sleep(2) file_browser_elts = testutils.FileBrowserElements(driver) file_browser_elts.drag_drop_file_in_drop_zone(file_content="Owner") cloud_project_elts = testutils.CloudProjectElements(driver) cloud_project_elts.sync_cloud_project(project_title) return username, project_title, collaborator
def test_publish_collaborator(driver: selenium.webdriver, *args, ** kwargs): """ Test that a project in Gigantum can be published, shared with a collaborator, and imported by the collaborator. """ # Owner creates and publishes project r = testutils.prep_py3_minimal_base(driver) username, project_title = r.username, r.project_name cloud_project_elts = testutils.CloudProjectElements(driver) cloud_project_elts.publish_private_project(project_title) # Owner adds collaborator and logs out collaborator = cloud_project_elts.add_collaborator_with_permissions(project_title) side_bar_elts = testutils.SideBarElements(driver) side_bar_elts.do_logout(username) # Collaborator logs in, imports cloud project, and logs out logging.info(f"Logging in as {collaborator}") testutils.log_in(driver, user_index=1) time.sleep(2) try: testutils.GuideElements.remove_guide(driver) except: pass time.sleep(2) logging.info(f"Navigating to {collaborator}'s Cloud tab") driver.get(f"{os.environ['GIGANTUM_HOST']}/projects/cloud") cloud_project_elts.first_cloud_project.wait() first_cloud_project = cloud_project_elts.first_cloud_project.find().text assert project_title == first_cloud_project, \ f"Expected {project_title} to be the first cloud project in {collaborator}'s Cloud tab, " \ f"but instead got {first_cloud_project}" cloud_project_elts.import_first_cloud_project_button.find().click() project_control = testutils.ProjectControlElements(driver) project_control.container_status_stopped.wait(30) shared_project_title = cloud_project_elts.project_overview_project_title.find().text assert project_title in shared_project_title, \ f"After import, expected project {project_title} to open to project overview page" side_bar_elts.do_logout(collaborator) # Owner logs in and deletes cloud project logging.info(f"Logging in as {username}") testutils.log_in(driver) time.sleep(2) try: testutils.GuideElements.remove_guide(driver) except: pass time.sleep(2) cloud_project_elts.delete_cloud_project(project_title) # Assert cloud project does not exist remotely (via GraphQL) remote_projects = graphql_helpers.list_remote_projects() assert (username, project_title) not in remote_projects # Assert that cloud project does not have remote Git repo (use Git 2.20+) project_path = os.path.join(os.environ['GIGANTUM_HOME'], username, username, 'labbooks', project_title) git_get_remote_command_2 = Popen(['git', 'remote', 'get-url', 'origin'], cwd=project_path, stdout=PIPE, stderr=PIPE) del_cloud_project_stderr = git_get_remote_command_2.stderr.readline().decode('utf-8').strip() assert "fatal" in del_cloud_project_stderr, f"Expected to not see a remote set for project {project_title}, " \ f"but got {del_cloud_project_stderr}"