def test_linked_published_dataset_then_publish(driver: selenium.webdriver, *args, **kwargs): """ 1. create and publish a dataset 2. create a project and link the dataset 3. publish the project """ # create a dataset # dataset set up testutils.log_in(driver) testutils.GuideElements(driver).remove_guide() ds_elements = testutils.DatasetElements(driver) # create and publish datset dataset_title_local = ds_elements.create_dataset(testutils.unique_dataset_name()) ds_elements.publish_dataset() driver.get(os.environ['GIGANTUM_HOST']) r = testutils.prep_py3_minimal_base(driver, skip_login=True) username, project_name = r.username, r.project_name filebrowser_elts = testutils.ProjectFileBrowserElements(driver) filebrowser_elts.link_dataset('a', 'b') time.sleep(4) pp = testutils.PublishProjectElements(driver) pp.publish_project() time.sleep(4)
def test_featured_public_projects(driver: selenium.webdriver, *args, **kwargs): """ Test that featured public projects import and build successfully. Args: driver """ # Project set up testutils.log_in(driver) testutils.GuideElements(driver).remove_guide() # Import featured public projects import_project_elts = testutils.ImportProjectElements(driver) side_bar_elts = testutils.SideBarElements(driver) # TO DO - add in https://gigantum.com/gigantum-examples/allen-sdk-examples # TO DO - add in gigantum.com/randal/baltimore-sun-data-bridge-data featured_public_projects = [ "gigantum.com/meg297/military-expenditure-gdp-population", "gigantum.com/billvb/fsw-telecoms-study" ] for project in featured_public_projects: logging.info(f"Importing featured public project: {project}") import_project_elts.import_existing_button.click() time.sleep(2) import_project_elts.project_url_input.send_keys(project) time.sleep(2) import_project_elts.import_button.click() wait = selenium.webdriver.support.ui.WebDriverWait(driver, 200) wait.until( EC.visibility_of_element_located((By.CSS_SELECTOR, "#overview"))) wait.until( EC.visibility_of_element_located( (By.CSS_SELECTOR, ".flex>.Stopped"))) project_stopped_visible = driver.find_element_by_css_selector( ".flex>.Stopped").is_displayed() assert project_stopped_visible, "Expected stopped container status" logging.info( f"Featured public project {project} was imported successfully") side_bar_elts.projects_icon.click() time.sleep(2)
def test_dataset_file_browser(driver: selenium.webdriver, *args, **kwargs): """ Test that a file can be dragged and dropped into data in a dataset. Args: driver """ testutils.log_in(driver) testutils.GuideElements(driver).remove_guide() dataset_elts = testutils.DatasetElements(driver) dataset_title = dataset_elts.create_dataset(testutils.unique_dataset_name()) logging.info(f"Navigating to Data for dataset: {dataset_title}") file_browser_elts = testutils.FileBrowserElements(driver) file_browser_elts.data_tab.wait().click() logging.info(f"Dragging and dropping file into Data for dataset: {dataset_title}") time.sleep(3) file_browser_elts.drag_drop_file_in_drop_zone() time.sleep(3) assert file_browser_elts.file_information.find().text == 'sample-upload.txt', \ "Expected sample-upload.txt to be the first file in Data"
def test_init_graphql(driver, *args, **kwargs): # Project set up username = testutils.log_in(driver) time.sleep(1) testutils.GuideElements(driver).remove_guide() time.sleep(1) owner, proj_name = create_py3_minimal_project( testutils.unique_project_name()) time.sleep(1) driver.get( f'{os.environ["GIGANTUM_HOST"]}/projects/{username}/{proj_name}') time.sleep(5)
def test_linked_published_dataset_then_publish(driver: selenium.webdriver, *args, **kwargs): """ Test that a dataset can be created, published, linked to a project and published with the project. """ testutils.log_in(driver) testutils.GuideElements(driver).remove_guide() ds_elts = testutils.DatasetElements(driver) # Create and publish dataset ds_elts.create_dataset(testutils.unique_dataset_name()) ds_elts.publish_dataset() # Create a project, link dataset, and publish project driver.get(os.environ['GIGANTUM_HOST']) r = testutils.prep_py3_minimal_base(driver, skip_login=True) username, project_title = r.username, r.project_name file_browser_elts = testutils.FileBrowserElements(driver) file_browser_elts.link_dataset('a', 'b') time.sleep(4) cloud_project_elts = testutils.CloudProjectElements(driver) cloud_project_elts.publish_private_project(project_title) time.sleep(4)
def test_create_local_branch(driver: selenium.webdriver, *args, **kwargs): """ Test the creation of a local branch. Args: driver """ # Project set up username = testutils.log_in(driver) time.sleep(2) testutils.GuideElements(driver).remove_guide() owner, proj_name = graphql.create_py3_minimal_project( testutils.unique_project_name()) driver.get( f'{os.environ["GIGANTUM_HOST"]}/projects/{username}/{proj_name}') time.sleep(4) logging.info("Creating a new branch") branch_elts = testutils.BranchElements(driver) branch_elts.create_branch_button.click() branch_elts.branch_name_input.send_keys("my-test-branch") branch_elts.create_button.click() time.sleep(5) logging.info("Checking that the new branch is local only") upper_left_branch_name = driver.find_element_by_css_selector( ".BranchMenu__dropdown-text").text upper_left_local_only = driver.find_element_by_css_selector( '.BranchMenu__dropdown-btn>div[data-tooltip="Local only"]') assert upper_left_branch_name == "my-test-branch", "Expected to be on my-test-branch, upper left" assert upper_left_local_only, "Expected my-test-branch to be local only, upper left" # Open manage branches branch_elts.manage_branches_button.click() time.sleep(2) manage_branches_branch_name = driver.find_element_by_css_selector( ".Branches__branchname").text manage_branches_local_only = driver.find_element_by_css_selector( '.Branches__details>div[data-tooltip="Local only"]') assert manage_branches_branch_name == "my-test-branch", "Expected to be on my-test-branch, manage branches" assert manage_branches_local_only, "Expected my-test-branch to be local only, manage branches"
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}"
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. Args: driver """ r = testutils.prep_py3_minimal_base(driver) username, project_title = r.username, r.project_name # Publish project, then wait until its rebuilt logging.info(f"Publishing private project {project_title}") publish_elts = testutils.PublishProjectElements(driver) publish_elts.publish_project_button.wait().click() time.sleep(1) publish_elts.publish_confirm_button.wait().click() time.sleep(5) wait = WebDriverWait(driver, 15) wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".flex>.Stopped"))) time.sleep(5) # Add collaborator logging.info(f"Adding a collaborator to private project {project_title}") publish_elts.collaborators_button.click() time.sleep(2) username2 = testutils.load_credentials(user_index=1)[0].rstrip() publish_elts.collaborators_input.send_keys(username2) publish_elts.add_collaborators_button.click() time.sleep(2) publish_elts.close_collaborators_button.click() testutils.log_out(driver) # Collaborator checks that the project is in the cloud tab and that the project imports successfully logging.info(f"Logging in as {username2}") testutils.log_in(driver, user_index=1) time.sleep(2) try: testutils.GuideElements.remove_guide(driver) except: pass time.sleep(2) publish_elts.cloud_tab.click() time.sleep(2) wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".RemoteLabbooks__panel-title"))) # Test that shared cloud project is in cloud tab cloud_tab_first_project_title_delete = driver.find_element_by_css_selector( ".RemoteLabbooks__panel-title:first-child span span").text assert cloud_tab_first_project_title_delete == project_title, \ f"Expected shared cloud project {project_title} in cloud tab" publish_elts.import_first_cloud_project_button.click() time.sleep(2) wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".flex>.Stopped"))) # Test that after import, the shared project opens to overview page shared_project_title = publish_elts.owner_title assert project_title in shared_project_title, \ f"After import, expected shared project {project_title} to open to overview page" testutils.log_out(driver) # Delete 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) testutils.delete_project_cloud(driver, project_title) # Assert project does not exist remotely (Via GraphQL). # TODO - Put back in check for the UI in addition to this check. remote_projects = graphql.list_remote_projects() assert (username, project_title) not in remote_projects # Check that the actual Git repo in the project had the remote removed successfully # Note! Use Git 2.20+ logging.info("Testing git remotes to check if set...") 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_stderr = git_get_remote_command_2.stderr.readline().decode('utf-8').strip() assert "fatal" in del_stderr, f"Expected to not see a remote set for {project_title}, but got {del_stderr}"