def construct_test_table_builder_page(driver, live_server, measure_version, rdu_user):
    driver_login(driver, live_server, rdu_user)
    """
    BROWSE TO POINT WHERE WE CAN ADD A MEASURE
    """
    home_page = HomePage(driver, live_server)
    home_page.click_topic_link(measure_version.measure.subtopic.topic)
    topic_page = TopicPage(driver, live_server, measure_version.measure.subtopic.topic)
    topic_page.expand_accordion_for_subtopic(measure_version.measure.subtopic)
    """
    SET UP A SIMPLE DIMENSION WE CAN BUILD TEST TABLES ON
    """
    topic_page.click_add_measure(measure_version.measure.subtopic)
    topic_page.wait_until_url_contains("/measure/new")
    create_measure(
        driver, live_server, measure_version, measure_version.measure.subtopic.topic, measure_version.measure.subtopic
    )
    topic_page.wait_until_url_contains("/edit")
    edit_measure_page = MeasureEditPage(driver)
    edit_measure_page.get()
    dimension = MinimalRandomDimension()
    edit_measure_page.click_add_dimension()
    edit_measure_page.wait_until_url_contains("/dimension/new")
    create_dimension_page = DimensionAddPage(driver)
    create_dimension_page.set_title(dimension.title)
    create_dimension_page.set_time_period(dimension.time_period)
    create_dimension_page.set_summary(dimension.summary)
    create_dimension_page.click_save()
    edit_dimension_page = DimensionEditPage(driver)
    edit_dimension_page.get()
    edit_dimension_page.wait_for_seconds(1)
    edit_dimension_page.click_create_table()
    edit_dimension_page.wait_until_url_contains("create-table")
    table_builder_page = TableBuilderPage(driver)
    return table_builder_page
def test_adding_an_existing_data_source(driver, app, live_server):
    rdu_user = UserFactory(user_type=TypeOfUser.RDU_USER, active=True)

    topic = TopicFactory.create(title="Police and crime")
    subtopic = SubtopicFactory.create(title="Policing", topic=topic)
    DataSourceFactory.create(title="Police statistics 2019")

    existing_measure = MeasureFactory.create(subtopics=[subtopic])
    MeasureVersionFactory.create(status="APPROVED", measure=existing_measure)

    driver_login(driver, live_server, rdu_user)
    home_page = HomePage(driver, live_server)

    home_page.click_topic_link(topic)

    topic_page = TopicPage(driver, live_server, topic)
    topic_page.expand_accordion_for_subtopic(subtopic)

    topic_page.click_add_measure(subtopic)

    create_measure_page = MeasureEditPage(driver)
    create_measure_page.set_title("Arrests")
    create_measure_page.click_save()

    create_measure_page.click_add_primary_data_source()

    fill_in(driver,
            label_text="Search for an existing data source",
            with_text="Police statistics")
    click_button_with_text(driver, "Search")

    label_for_existing_data_source = driver.find_element_by_xpath(
        "//label[text()='Police statistics 2019']")

    label_for_existing_data_source.click()

    click_button_with_text(driver, "Select")

    assert "Successfully added the data source ‘Police statistics 2019’" in driver.page_source

    click_link_with_text(driver, "Preview this version")

    assert "Police statistics 2019" in driver.page_source
def test_secondary_source_can_be_added_and_removed(driver, live_server, government_departments, frequencies_of_release):
    rdu_user = UserFactory(user_type=TypeOfUser.RDU_USER, active=True)
    approved_measure_version = MeasureVersionFactory(
        status="APPROVED",
        data_sources__publisher=random.choice(government_departments),
        data_sources__frequency_of_release=random.choice(frequencies_of_release),
    )
    sample_measure_version = MeasureVersionFactory.build(data_sources=[])
    sample_data_source = DataSourceFactory.build(
        publisher__name=random.choice(government_departments).name,
        frequency_of_release__description=random.choice(frequencies_of_release).description,
    )

    # GIVEN a setup with Topic and Subtopic
    driver_login(driver, live_server, rdu_user)
    navigate_to_topic_page(driver, live_server, approved_measure_version.measure.subtopic.topic)

    # WHEN an editor creates and saves a new measure page
    measure_edit_page, page = create_measure_starting_at_topic_page(
        driver,
        live_server,
        approved_measure_version.measure.subtopic.topic,
        approved_measure_version.measure.subtopic,
        sample_measure_version,
        sample_data_source,
    )

    # Add and save a secondary data source
    measure_edit_page.click_add_secondary_data_source()

    fill_in(driver, label_text="Search for an existing data source", with_text="My data source")

    click_button_with_text(driver, "Search")

    click_link_with_text(driver, "Create a new data source")

    data_source_page = CreateDataSourcePage(driver)
    data_source_page.fill_data_source(sample_data_source)
    data_source_page.click_save()
    data_source_page.click_back()

    # Remove the secondary source
    measure_edit_page.click_remove_secondary_data_source()
def test_delete_a_draft_1_0_measure(driver, live_server):
    rdu_user = UserFactory(user_type=TypeOfUser.RDU_USER, active=True)
    measure_version = MeasureVersionFactory(status="APPROVED")

    assert Measure.query.count() == 1

    # GIVEN we create a version 1.0 measure
    driver_login(driver, live_server, rdu_user)
    navigate_to_topic_page(driver, live_server,
                           measure_version.measure.subtopic.topic)
    measure = create_measure_with_minimal_content(
        driver, live_server, measure_version.measure.subtopic,
        measure_version.measure.subtopic.topic)

    assert Measure.query.count() == 2

    # WHEN we go to the topic page
    topic_page = TopicPage(driver, live_server,
                           measure_version.measure.subtopic.topic)
    topic_page.get()

    # No longer required; accordion remembers the expanded state from earlier in the test.
    # topic_page.expand_accordion_for_subtopic(measure_version.measure.subtopic)

    # THEN measure is listed
    assert topic_page.measure_is_listed(measure) is True

    driver.find_element_by_link_text(measure.title).click()

    # WHEN we walk through the delete process
    driver.find_element_by_xpath(
        f"//a[contains(., 'Delete page: {measure.title}')]").click()

    driver.find_element_by_xpath('//button[text()="Yes, delete"]').click()

    topic_page.get()
    # This test has been passing when the final .get() returned a 500 error page.
    # TODO: Check the page didn't error and is the actual page we expect to not find the thing in
    # TODO: Maybe assert 200 responses after all get()s in functional tests?
    assert topic_page.measure_is_listed(measure) is False

    assert Measure.query.count() == 1
예제 #5
0
def test_can_reject_a_measure_in_review_as_editor(driver, live_server,
                                                  government_departments,
                                                  frequencies_of_release):
    rdu_user = UserFactory(user_type=TypeOfUser.RDU_USER, active=True)
    approved_measure_version = MeasureVersionFactory(
        status="APPROVED",
        data_sources__publisher=random.choice(government_departments),
        data_sources__frequency_of_release=random.choice(
            frequencies_of_release),
    )
    sample_measure_version = MeasureVersionFactory.build(data_sources=[])
    sample_data_source = DataSourceFactory.build(
        publisher__name=random.choice(government_departments).name,
        frequency_of_release__description=random.choice(
            frequencies_of_release).description,
    )

    # GIVEN a setup with Topic and Subtopic
    driver_login(driver, live_server, rdu_user)
    navigate_to_topic_page(driver, live_server,
                           approved_measure_version.measure.subtopic.topic)

    # WHEN an editor creates and saves a new measure page
    measure_edit_page, page = create_measure_starting_at_topic_page(
        driver,
        live_server,
        approved_measure_version.measure.subtopic.topic,
        approved_measure_version.measure.subtopic,
        sample_measure_version,
        sample_data_source,
    )

    # THEN the status should be draft
    assert measure_edit_page.is_current()
    assert measure_edit_page.get_status() == EXPECTED_STATUSES["draft"]

    # WHEN we save and send it to internal review
    measure_edit_page.click_save_and_send_to_review()

    # THEN the status should be internal review
    assert measure_edit_page.get_status(
    ) == EXPECTED_STATUSES["internal_review"]

    # WHEN we reject the page
    measure_edit_page.click_reject()

    # THEN the status should be rejected
    assert measure_edit_page.get_status() == EXPECTED_STATUSES["rejected"]

    # WHEN we send it back to a draft
    measure_edit_page.click_send_back_to_draft()

    # THEN the status should be draft
    driver.implicitly_wait(2)
    assert measure_edit_page.is_current()
    assert measure_edit_page.get_status() == EXPECTED_STATUSES["draft"]

    # WHEN we save and send it for department review
    measure_edit_page.click_save_and_send_to_review()
    measure_edit_page.click_department_review()

    # THEN the status should be department review
    driver.implicitly_wait(2)
    assert measure_edit_page.is_current()
    assert measure_edit_page.get_status(
    ) == EXPECTED_STATUSES["department_review"]

    # WHEN we reject the measure again
    measure_edit_page.click_reject()

    # THEN the status should be rejected
    driver.implicitly_wait(2)
    assert measure_edit_page.is_current()
    assert measure_edit_page.get_status() == EXPECTED_STATUSES["rejected"]

    measure_edit_page.log_out()
def test_can_create_a_measure_page(driver, app, live_server):
    rdu_user = UserFactory(user_type=TypeOfUser.RDU_USER, active=True)
    measure_version = MeasureVersionFactory(status="APPROVED")

    driver_login(driver, live_server, rdu_user)

    """
    BROWSE TO POINT WHERE WE CAN ADD A MEASURE
    """
    home_page = HomePage(driver, live_server)
    home_page.click_topic_link(measure_version.measure.subtopic.topic)

    topic_page = TopicPage(driver, live_server, measure_version.measure.subtopic.topic)
    topic_page.expand_accordion_for_subtopic(measure_version.measure.subtopic)

    """
    CREATE A NEW MEASURE
    """
    topic_page.click_add_measure(measure_version.measure.subtopic)
    topic_page.wait_until_url_contains("/measure/new")
    create_measure(
        driver, live_server, measure_version, measure_version.measure.subtopic.topic, measure_version.measure.subtopic
    )

    """
    EDIT THE MEASURE
    """
    topic_page.wait_until_url_contains("/edit")
    edit_measure_page = MeasureEditPage(driver)

    edit_measure_page.set_measure_summary(measure_version.measure_summary)
    edit_measure_page.set_summary(measure_version.summary)
    edit_measure_page.click_save()
    assert edit_measure_page.is_current()

    """
    PREVIEW CURRENT PROGRESS
    """
    edit_measure_page.click_preview()
    edit_measure_page.wait_until_url_does_not_contain("/cms/")

    preview_measure_page = MeasurePreviewPage(driver)
    assert preview_measure_page.is_current()

    assert_page_contains(preview_measure_page, measure_version.title)
    assert_page_contains(preview_measure_page, measure_version.measure_summary)
    assert_page_contains(preview_measure_page, measure_version.summary)

    """
    ADD A DIMENSION
    Save some dimension data
    """
    edit_measure_page.get()
    assert edit_measure_page.is_current()

    dimension = RandomDimension()

    edit_measure_page.click_add_dimension()
    edit_measure_page.wait_until_url_contains("/dimension/new")

    create_dimension_page = DimensionAddPage(driver)

    create_dimension_page.set_title(dimension.title)
    create_dimension_page.set_time_period(dimension.time_period)
    create_dimension_page.set_summary(dimension.summary)
    create_dimension_page.click_save()

    edit_dimension_page = DimensionEditPage(driver)
    assert edit_dimension_page.is_current()

    preview_measure_page.get()
    edit_dimension_page.wait_until_url_does_not_contain("/cms/")
    assert_page_contains(preview_measure_page, dimension.title)
    assert_page_contains(preview_measure_page, dimension.time_period)
    assert_page_contains(preview_measure_page, dimension.summary)

    """
    EDIT A DIMENSION
    """
    edit_dimension_page.get()
    assert edit_dimension_page.is_current()

    edit_dimension_page.set_summary("some updated text")
    edit_dimension_page.click_update()

    assert edit_dimension_page.is_current()

    preview_measure_page.get()
    edit_dimension_page.wait_until_url_does_not_contain("/cms/")
    assert_page_contains(preview_measure_page, "some updated text")

    """
    CHART BUILDER
    test content has been moved to a separate set of functional tests
    """

    """
    CREATE A SIMPLE TABLE
    """
    edit_dimension_page.get()
    assert edit_dimension_page.is_current()
    edit_dimension_page.click_create_table()
    edit_dimension_page.wait_until_url_contains("create-table")

    table_builder_page = TableBuilderPage(driver)
    assert table_builder_page.is_current()

    inject_data(driver, simple_data)
    table_builder_page.click_data_ok()
    table_builder_page.select_column(1, "Value")
    table_builder_page.click_save()
    table_builder_page.wait_for_seconds(1)

    """
    CREATE A TABLE WITH TWO COLUMNS
    """
    table_builder_page.get()
    table_builder_page.click_data_edit()
    inject_data(driver, ethnicity_by_gender_data)
    table_builder_page.click_data_ok()

    table_builder_page.select_data_style("Use ethnicity for rows")
    table_builder_page.select_columns_when_ethnicity_is_row("Gender")
    table_builder_page.select_column(1, "Value")
    table_builder_page.select_column(2, "Gender")

    table_builder_page.click_save()
def test_create_a_measure_as_editor(driver, live_server,
                                    government_departments,
                                    frequencies_of_release):
    rdu_user = UserFactory(user_type=TypeOfUser.RDU_USER, active=True)
    admin_user = UserFactory(user_type=TypeOfUser.ADMIN_USER, active=True)
    approved_measure_version = MeasureVersionFactory(
        status="APPROVED",
        data_sources__publisher=random.choice(government_departments),
        data_sources__frequency_of_release=random.choice(
            frequencies_of_release),
    )
    sample_measure_version = MeasureVersionFactory.build(
        version="1.1", data_sources=[], update_corrects_data_mistake=True)
    sample_data_source = DataSourceFactory.build(
        publisher__name=random.choice(government_departments).name,
        frequency_of_release__description=random.choice(
            frequencies_of_release).description,
    )

    # GIVEN a setup with Topic and Subtopic
    driver_login(driver, live_server, rdu_user)
    navigate_to_topic_page(driver, live_server,
                           approved_measure_version.measure.subtopic.topic)

    # WHEN an editor creates and saves a new measure page
    measure_edit_page, page = create_measure_starting_at_topic_page(
        driver,
        live_server,
        approved_measure_version.measure.subtopic.topic,
        approved_measure_version.measure.subtopic,
        sample_measure_version,
        sample_data_source,
    )

    # THEN the status should be draft
    assert measure_edit_page.is_current()
    assert measure_edit_page.get_status() == EXPECTED_STATUSES["draft"]

    measure_edit_page.click_save_and_send_to_review()

    # THEN the status should be internal review
    assert measure_edit_page.is_current()
    assert measure_edit_page.get_status(
    ) == EXPECTED_STATUSES["internal_review"]

    # WHEN we send page to department review
    measure_edit_page.click_department_review()

    # THEN the status should be department review
    driver.implicitly_wait(2)
    assert measure_edit_page.is_current()
    assert measure_edit_page.get_status(
    ) == EXPECTED_STATUSES["department_review"]

    # AND the approve button should not be on page
    assert measure_edit_page.approved_is_visible() is False

    # GIVEN the department link
    review_link = measure_edit_page.get_review_link()

    # WHEN we log out and go to the review link
    measure_edit_page.log_out()
    driver.get(review_link)

    # THEN the preview page ought to have content
    assert page.title in driver.page_source

    # GIVEN the admin user
    driver_login(driver, live_server, admin_user)

    # WHEN we go to the edit page
    navigate_to_edit_page(
        driver,
        live_server,
        approved_measure_version.measure.subtopic.topic,
        approved_measure_version.measure.subtopic,
        page,
    )

    # THEN the approve button is visible
    assert measure_edit_page.approved_is_visible() is True

    # WHEN the admin user clicks approve
    measure_edit_page.click_approved()

    # THEN the status should be published
    assert measure_edit_page.get_status() == EXPECTED_STATUSES["published"]

    # WHEN we create a minor update
    measure_edit_page.click_update()
    measure_create_version_page = MeasureCreateVersionPage(driver)
    measure_create_version_page.click_minor_update()
    measure_create_version_page.click_create()

    # THEN we are on the 1.1 measure version edit page
    assert driver.current_url.endswith("/1.1/edit")

    # WHEN we try to submit the minor update immediately
    measure_edit_page.click_save_and_send_to_review()

    # THEN we get validation errors (corrections radio+edit summary)
    assert "There is a problem" in driver.page_source

    # WHEN we fill in the required data
    measure_edit_page.fill_measure_page_minor_edit_fields(
        sample_measure_version)

    # THEN we can publish the new version.
    measure_edit_page.click_save_and_send_to_review()
    measure_edit_page.click_department_review()
    measure_edit_page.click_approved()

    # THEN the status should be published
    assert measure_edit_page.get_status() == EXPECTED_STATUSES["published"]

    # WHEN we create a major update
    measure_edit_page.click_update()
    measure_create_version_page = MeasureCreateVersionPage(driver)
    measure_create_version_page.click_major_update()
    measure_create_version_page.click_create()

    # THEN we are on the 2.0 measure version edit page
    assert driver.current_url.endswith("/2.0/edit")

    # WHEN we try to submit the major update immediately
    measure_edit_page.click_save_and_send_to_review()

    # THEN we get validation errors (edit summary)
    assert "There is a problem" in driver.page_source

    # WHEN we add an upload file
    measure_edit_page.click_add_source_data()
    add_source_data_page = AddSourceDataPage(driver)
    add_source_data_page.fill_source_data_page(
        sample_measure_version.uploads[0])
    add_source_data_page.click_save()

    # AND provide an edit summary
    measure_edit_page.fill_measure_page_major_edit_fields(
        sample_measure_version)
    measure_edit_page.click_save()

    # AND add a new primary data source
    add_primary_data_source_to_measure(driver, sample_data_source)

    # AND approve the major edit
    measure_edit_page.click_save_and_send_to_review()
    measure_edit_page.click_department_review()
    measure_edit_page.click_approved()

    # THEN the status should be published
    assert measure_edit_page.get_status() == EXPECTED_STATUSES["published"]

    measure_edit_page.log_out()
def test_merging_two_data_sources(driver, live_server):

    # Setup
    DataSourceFactory.create(title="Police statistics 2019")
    DataSourceFactory.create(title="Police stats 2019")
    admin_user = UserFactory(user_type=TypeOfUser.ADMIN_USER, active=True)

    driver_login(driver, live_server, admin_user)

    # When I go to the admin page
    driver.get(f"http://localhost:{live_server.port}/admin")

    # Then there should be a link to Data sources
    data_sources_link = driver.find_element_by_link_text("Data sources")
    assert data_sources_link

    # When I click the link
    data_sources_link.click()

    # Then I should be on the data sources page
    assert "Data sources" == driver.find_element_by_tag_name("h1").text

    assert "Select all options that represent the same data source" == driver.find_element_by_tag_name(
        "legend").text

    data_source_1_label = driver.find_element_by_xpath(
        "//label[text() = 'Police statistics 2019']")

    assert data_source_1_label

    data_source_2_label = driver.find_element_by_xpath(
        "//label[text() = 'Police stats 2019']")

    assert data_source_2_label

    submit_button = driver.find_element_by_xpath(
        "//button[text() = 'Continue']")

    assert submit_button

    # When I select the two data sources and click continue
    data_source_1_label.click()
    data_source_2_label.click()
    submit_button.click()

    # Then I should be on the merge data sources page

    assert "Merge 2 data sources" == driver.find_element_by_tag_name("h1").text
    assert "Which one would you like to keep?" == driver.find_element_by_tag_name(
        "legend").text

    data_source_1_label = driver.find_element_by_xpath(
        "//label[text() = 'Police statistics 2019']")

    assert data_source_1_label

    data_source_2_label = driver.find_element_by_xpath(
        "//label[text() = 'Police stats 2019']")

    assert data_source_2_label

    submit_button = driver.find_element_by_xpath("//button[text() = 'Merge']")

    assert submit_button

    # When I select the first data source and click merge
    data_source_1_label.click()
    submit_button.click()

    # Then I should be back on the Data sources page
    assert "Data sources" == driver.find_element_by_tag_name("h1").text

    data_source_1_label = driver.find_element_by_xpath(
        "//label[text() = 'Police statistics 2019']")

    assert data_source_1_label

    with pytest.raises(NoSuchElementException):
        data_source_2_label = driver.find_element_by_xpath(
            "//label[text() = 'Police stats 2019']")