def test_update_measure_version_raises_if_page_not_editable(self):
        user = UserFactory(user_type=TypeOfUser.RDU_USER)
        measure_version = MeasureVersionFactory(version="1.0", status="DRAFT")

        measure_version_from_db = page_service.get_measure_version_by_measure_id_and_version(
            measure_version.measure.id, measure_version.version)
        assert measure_version_from_db.status == "DRAFT"

        page_service.update_measure_version(
            measure_version,
            measure_version_form=MeasureVersionForm(
                is_minor_update=True,
                title="Who cares",
                db_version_id=measure_version.db_version_id),
            data_source_forms=[],
            last_updated_by_email=user.email,
            **{"status": "APPROVED"},
        )

        measure_version_from_db = page_service.get_measure_version_by_measure_id_and_version(
            measure_version.measure.id, measure_version.version)
        assert measure_version_from_db.status == "APPROVED"

        with pytest.raises(PageUnEditable):
            page_service.update_measure_version(
                measure_version,
                measure_version_form=MeasureVersionForm(
                    is_minor_update=True,
                    title="I care too much!",
                    db_version_id=measure_version.db_version_id),
                data_source_forms=[],
                last_updated_by_email=user.email,
            )
    def test_first_version_of_page_title_and_url_match(self):
        subtopic = SubtopicFactory()
        user = UserFactory(user_type=TypeOfUser.RDU_USER)
        created_measure_version = page_service.create_measure(
            subtopic=subtopic,
            measure_version_form=MeasureVersionForm(
                is_minor_update=False,
                title="the title",
                published_at=datetime.now().date()),
            created_by_email=user.email,
        )

        assert "the title" == created_measure_version.title
        assert "the-title" == created_measure_version.measure.slug

        updated_measure_version = page_service.update_measure_version(
            created_measure_version,
            measure_version_form=MeasureVersionForm(
                is_minor_update=True,
                title="an updated title",
                db_version_id=created_measure_version.db_version_id),
            data_source_forms=[],
            last_updated_by_email=user.email,
        )

        assert "an updated title" == updated_measure_version.title
        assert "an-updated-title" == updated_measure_version.measure.slug
    def test_draft_versions_of_page_after_first_title_can_be_changed_without_url_changing(
            self):
        subtopic = SubtopicFactory()
        user = UserFactory(user_type=TypeOfUser.RDU_USER)
        created_measure_version = page_service.create_measure(
            subtopic=subtopic,
            measure_version_form=MeasureVersionForm(
                is_minor_update=False,
                title="the title",
                published_at=datetime.now().date()),
            created_by_email=user.email,
        )

        assert "the title" == created_measure_version.title
        assert "the-title" == created_measure_version.measure.slug

        page_service.update_measure_version(
            created_measure_version,
            measure_version_form=MeasureVersionForm(
                is_minor_update=True,
                title="the title",
                status="APPROVED",
                db_version_id=created_measure_version.db_version_id,
            ),
            data_source_forms=[],
            last_updated_by_email=user.email,
        )

        copied_measure_version = page_service.create_measure_version(
            created_measure_version, NewVersionType.MINOR_UPDATE, user=user)

        assert "the title" == copied_measure_version.title
        assert "the-title" == copied_measure_version.measure.slug

        page_service.update_measure_version(
            copied_measure_version,
            measure_version_form=MeasureVersionForm(
                is_minor_update=True,
                title="the updated title",
                db_version_id=copied_measure_version.db_version_id),
            data_source_forms=[],
            last_updated_by_email=user.email,
        )

        assert "the updated title" == copied_measure_version.title
        assert "the-title" == copied_measure_version.measure.slug
    def test_create_page_with_title_and_slug_already_exists_under_subtopic_raises_exception(
            self):
        subtopic = SubtopicFactory()
        user = UserFactory(user_type=TypeOfUser.RDU_USER)
        created_measure_version = page_service.create_measure(
            subtopic=subtopic,
            measure_version_form=MeasureVersionForm(
                is_minor_update=False,
                title="I care",
                published_at=datetime.now().date()),
            created_by_email=user.email,
        )

        with pytest.raises(PageExistsException):
            page_service.create_measure(
                subtopic=subtopic,
                measure_version_form=MeasureVersionForm(
                    is_minor_update=False,
                    title=created_measure_version.title,
                    published_at=created_measure_version.published_at,
                ),
                created_by_email=user.email,
            )
    def test_update_measure_version_trims_whitespace(self):
        user = UserFactory(user_type=TypeOfUser.RDU_USER)
        measure_version = MeasureVersionFactory(version="1.0", status="DRAFT")

        page_service.update_measure_version(
            measure_version,
            measure_version_form=MeasureVersionForm(
                is_minor_update=False,
                title="Who cares",
                db_version_id=measure_version.db_version_id,
                published_at=datetime.now().date(),
                ethnicity_definition_summary=
                "\n\n\n\n\n\nThis is what should be left\n",
            ),
            data_source_forms=[],
            last_updated_by_email=user.email,
        )

        assert measure_version.ethnicity_definition_summary == "This is what should be left"

        page_service.update_measure_version(
            measure_version,
            measure_version_form=MeasureVersionForm(
                is_minor_update=False,
                title="Who cares",
                db_version_id=measure_version.db_version_id,
                ethnicity_definition_summary=
                "\n   How about some more whitespace? \n             \n",
            ),
            data_source_forms=[],
            last_updated_by_email=user.email,
        )

        measure_version_from_db = page_service.get_measure_version_by_measure_id_and_version(
            measure_version.measure.id, measure_version.version)
        assert measure_version_from_db.ethnicity_definition_summary == "How about some more whitespace?"
    def test_create_page_trims_whitespace(self):
        subtopic = SubtopicFactory()
        user = UserFactory(user_type=TypeOfUser.RDU_USER)
        created_measure_version = page_service.create_measure(
            subtopic=subtopic,
            measure_version_form=MeasureVersionForm(
                is_minor_update=False,
                title="\n\t   I care\n",
                published_at=datetime.now().date(),
                methodology="\n\n\n\n\n\n",
            ),
            created_by_email=user.email,
        )

        assert created_measure_version.title == "I care"
        assert created_measure_version.methodology is None
    def test_update_measure_version(self):
        user = UserFactory(user_type=TypeOfUser.RDU_USER)
        measure_version = MeasureVersionFactory(version="1.0", status="DRAFT")

        page_service.update_measure_version(
            measure_version,
            measure_version_form=MeasureVersionForm(
                is_minor_update=True,
                title="I care too much!",
                db_version_id=measure_version.db_version_id),
            data_source_forms=[],
            last_updated_by_email=user.email,
        )

        measure_version_from_db = page_service.get_measure_version_by_measure_id_and_version(
            measure_version.measure.id, measure_version.version)
        assert measure_version_from_db.title == "I care too much!"
        assert measure_version_from_db.last_updated_by == user.email
    def test_create_measure_page(self, test_app_client, logged_in_rdu_user,
                                 stub_measure_data):
        LowestLevelOfGeographyFactory(
            name=stub_measure_data["lowest_level_of_geography_id"])
        subtopic = SubtopicFactory()
        form = MeasureVersionForm(is_minor_update=False, **stub_measure_data)

        response = test_app_client.post(
            url_for("cms.create_measure",
                    topic_slug=subtopic.topic.slug,
                    subtopic_slug=subtopic.slug),
            data=form.data,
            follow_redirects=True,
        )

        assert response.status_code == 200
        page = BeautifulSoup(response.data.decode("utf-8"), "html.parser")
        assert (page.find("div", class_="eff-flash-message__body").get_text(
            strip=True) == "Created page %s" % stub_measure_data["title"])
    def test_reject_measure_version(self):
        user = UserFactory(user_type=TypeOfUser.RDU_USER)
        measure_version = MeasureVersionFactory(version="1.0", status="DRAFT")

        assert measure_version.status == "DRAFT"

        page_service.update_measure_version(
            measure_version,
            measure_version_form=MeasureVersionForm(
                is_minor_update=False,
                title="Who cares",
                db_version_id=measure_version.db_version_id),
            last_updated_by_email=user.email,
            data_source_forms=[],
            **{"status": "DEPARTMENT_REVIEW"},
        )
        assert measure_version.status == "DEPARTMENT_REVIEW"

        message = page_service.reject_measure_version(measure_version)

        assert message == 'Sent page "Who cares" to REJECTED'
        assert measure_version.status == "REJECTED"
    def test_create_measure(self):
        subtopic = SubtopicFactory()
        user = UserFactory(user_type=TypeOfUser.RDU_USER)
        created_measure_version = page_service.create_measure(
            subtopic=subtopic,
            measure_version_form=MeasureVersionForm(
                is_minor_update=False,
                title="I care",
                published_at=datetime.now().date(),
                internal_reference="abc123"),
            created_by_email=user.email,
        )

        assert created_measure_version.title == "I care"
        assert created_measure_version.created_by == user.email
        # # TODO: remove this once MeasureVersions don't have reference
        assert created_measure_version.internal_reference == "abc123"

        created_measure = Measure.query.get(created_measure_version.measure_id)
        assert created_measure.slug == "i-care"
        assert created_measure.position == len(subtopic.measures) - 1
        assert created_measure.reference == "abc123"