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)
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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"
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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}"