Exemplo n.º 1
0
def test_get_form(app, lecture_an, amendements_an, user_david):
    from zam_repondeur.models import DBSession

    with transaction.manager:
        DBSession.add(lecture_an)
        lecture_an.texte.date_depot = datetime.utcnow().date() - timedelta(days=5)

    resp = app.get(
        "/dossiers/plfss-2018/lectures/an.15.269.PO717460/journal/", user=user_david
    )

    assert resp.status_code == 200
    assert resp.content_type == "text/html"

    assert resp.forms["manual-refresh"].method == "post"
    assert resp.forms["manual-refresh"].action == (
        "https://zam.test"
        "/dossiers/plfss-2018"
        "/lectures/an.15.269.PO717460"
        "/manual_refresh"
    )

    assert list(resp.forms["manual-refresh"].fields.keys()) == ["refresh"]

    assert resp.forms["manual-refresh"].fields["refresh"][0].attrs["type"] == "submit"
Exemplo n.º 2
0
    def test_get_articles_tlfp_parse_error(self, app, dossier_plfss2018,
                                           lecture_senat, amendements_senat,
                                           article1_an):
        from zam_repondeur.models import Amendement, DBSession
        from zam_repondeur.services.fetch.articles import get_articles

        responses.add(
            responses.GET,
            "https://www.senat.fr/leg/pjl17-063.html",
            body=(SAMPLE_DATA_DIR / "pjl18-218.html").read_text(
                "utf-8", "ignore"),
            status=200,
        )

        with transaction.manager:
            DBSession.add(dossier_plfss2018)
            DBSession.add(lecture_senat)
            changed = get_articles(lecture_senat)

        assert not changed

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 6666).first()
        assert amendement.article.content == {}

        # Events should NOT be created
        assert len(amendement.article.events) == 0
Exemplo n.º 3
0
def test_generate_pdf_with_amendement_content_gouvernemental(
        app, lecture_senat, article1_senat, amendements_senat):
    from zam_repondeur.models import DBSession
    from zam_repondeur.services.import_export.pdf import generate_html_for_pdf

    amendement_6666 = amendements_senat[0]
    amendement_6666.auteur = "LE GOUVERNEMENT"
    amendement_6666.user_content.reponse = "La présentation"
    DBSession.add(amendement_6666)

    parser = HTMLParser(
        generate_html_for_pdf(DummyRequest(), "print/all.html",
                              {"lecture": lecture_senat}))

    assert (
        parser.css_first(".first-page .lecture").text() ==
        "Sénat, session 2017-2018, Séance publique, Numéro lecture, texte nº\xa063"
    )
    assert _html_page_titles(parser) == [
        "Article 1", "Réponse", "Amendement nº 6666"
    ]
    response_node = parser.css_first(".reponse")
    assert _cartouche_to_list(response_node) == [
        "Article",
        "Art. 1",
        "Amendement",
        "6666",
        "Auteur",
        "Gouvernement",
    ]
    assert response_node.css_first("div h5").text() == "Réponse"
    assert "La présentation" in response_node.css_first("div p").text()
Exemplo n.º 4
0
def test_get_articles_with_mult(app, dummy_lecture, dummy_amendements):
    from zam_repondeur.fetch import get_articles
    from zam_repondeur.models import DBSession, Amendement

    responses.add(
        responses.GET,
        "https://www.senat.fr/leg/pjl17-063.html",
        body=(Path(__file__).parent / "sample_data" /
              "pjl17-063.html").read_text("utf-8", "ignore"),
        status=200,
    )

    with transaction.manager:
        dummy_lecture.chambre = "senat"
        dummy_lecture.session = "2017-2018"
        dummy_lecture.num_texte = 63

        amendement = dummy_amendements[0]
        amendement.chambre = "senat"
        amendement.session = "2017-2018"
        amendement.num_texte = 63
        amendement.subdiv_num = "4"
        amendement.subdiv_mult = "bis"

        # The objects are no longer bound to a session here, as they were created in a
        # previous transaction, so we add them to the current session to make sure that
        # our changes will be committed with the current transaction
        DBSession.add(dummy_lecture)
        DBSession.add(amendement)

    get_articles(dummy_lecture)

    amendement = DBSession.query(Amendement).filter(
        Amendement.num == 666).first()
    assert amendement.subdiv_contenu["001"].startswith("Ne donnent pas lieu à")
Exemplo n.º 5
0
    def test_custom_article_titles_are_preserved(self, app, lecture_an,
                                                 amendements_an):
        from zam_repondeur.models import Amendement, DBSession
        from zam_repondeur.services.fetch.articles import get_articles

        responses.add(
            responses.GET,
            "http://www.assemblee-nationale.fr/15/projets/pl0269.asp",
            body=(SAMPLE_DATA_DIR / "pl0269.html").read_text(
                "utf-8", "ignore"),
            status=200,
        )

        DBSession.add(lecture_an)

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 666).first()
        assert amendement.article.user_content.title == ""
        assert amendement.article.content == {}

        # Let's set a custom article title
        amendement.article.user_content.title = "My custom title"

        changed = get_articles(lecture_an)

        assert changed

        # We can get the article contents from an amendement
        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 666).first()
        assert amendement.article.user_content.title == "My custom title"
        assert amendement.article.content["001"].startswith(
            "Au titre de l'exercice 2016")
Exemplo n.º 6
0
def test_parse_from_csv_unparsable_article(lecture_senat, settings):

    from zam_repondeur.models import DBSession
    from zam_repondeur.services.fetch.senat.amendements import Senat

    amend = {
        "Alinéa": " ",
        "Au nom de ": "",
        "Auteur ": "M. FRASSA",
        "Date de dépôt ": "2017-11-13",
        "Dispositif ": "",
        "Fiche Sénateur":
        "//www.senat.fr/senfic/frassa_christophe_andre08018u.html",
        "Nature ": "Amt",
        "Numéro ": "1 rect.",
        "Objet ": "",
        "Sort ": "Adopté",
        "Subdivision ": "this is unparsable garbage",
        "Url amendement ":
        "//www.senat.fr/amendements/2017-2018/63/Amdt_1.html",
    }

    DBSession.add(lecture_senat)

    source = Senat(settings=settings)
    amendement, created = source.parse_from_csv(amend, lecture_senat)

    assert created
    assert amendement.num == 1
    assert amendement.rectif == 1
    assert amendement.num_disp == "1 rect."

    assert amendement.article.num == ""
    assert str(amendement.article) == "Erreur"
Exemplo n.º 7
0
def test_amendement_edition_exit_stop_editing_status(wsgi_server, driver,
                                                     lecture_an,
                                                     amendements_an,
                                                     lecture_an_url,
                                                     user_david_table_an):
    from zam_repondeur.models import DBSession

    amendement = amendements_an[0]
    with transaction.manager:
        DBSession.add(user_david_table_an)
        user_david_table_an.add_amendement(amendement)
        DBSession.add(amendement)

    assert not amendement.is_being_edited

    driver.get(f"{lecture_an_url}/amendements/{amendements_an[0].num}/")
    avis = Select(driver.find_element_by_css_selector('select[name="avis"]'))
    avis.select_by_visible_text("Défavorable")
    time.sleep(1)  # Wait for the option to be selected.

    assert amendement.is_being_edited

    exit_link = driver.find_element_by_css_selector(
        ".save-buttons a.arrow-left")
    exit_link.click()
    driver.switch_to.alert.accept()
    time.sleep(1)  # Wait for the alert to actually redirect.

    assert not amendement.is_being_edited
Exemplo n.º 8
0
    def test_existing_articles_are_updated(self, app, lecture_an,
                                           amendements_an):
        from zam_repondeur.fetch.articles import get_articles
        from zam_repondeur.models import DBSession, Amendement

        responses.add(
            responses.GET,
            "http://www.assemblee-nationale.fr/15/projets/pl0269.asp",
            body=(Path(__file__).parent / "sample_data" /
                  "pl0269.html").read_text("utf-8", "ignore"),
            status=200,
        )

        DBSession.add(lecture_an)

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 666).first()
        assert amendement.article.user_content.title == ""
        assert amendement.article.content == {}

        changed = get_articles(lecture_an)

        assert changed

        # We can get the article contents from an amendement
        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 666).first()
        assert (amendement.article.user_content.title ==
                "Dispositions relatives l'exercice 2016")
        assert amendement.article.content["001"].startswith(
            "Au titre de l'exercice 2016")
def test_amendement_edition_exit_stop_editing_status(wsgi_server, driver,
                                                     lecture_an,
                                                     amendements_an):
    from zam_repondeur.models import DBSession, User

    LECTURE_URL = f"{wsgi_server.application_url}lectures/{lecture_an.url_key}"
    amendement = amendements_an[0]
    with transaction.manager:
        user = DBSession.query(User).filter(
            User.email == "*****@*****.**").first()
        table = user.table_for(lecture_an)
        DBSession.add(table)
        table.amendements.append(amendement)
        DBSession.add(amendement)

    assert not amendement.is_being_edited

    driver.get(
        f"{LECTURE_URL}/amendements/{amendements_an[0].num}/amendement_edit")
    avis = Select(driver.find_element_by_css_selector('select[name="avis"]'))
    avis.select_by_visible_text("Défavorable")
    time.sleep(1)  # Wait for the option to be selected.

    assert amendement.is_being_edited

    exit_link = driver.find_element_by_css_selector(
        ".save-buttons a.arrow-left")
    exit_link.click()
    driver.switch_to.alert.accept()
    time.sleep(1)  # Wait for the alert to actually redirect.

    assert not amendement.is_being_edited
Exemplo n.º 10
0
def test_batch_amendements_are_visible_with_at_least_two_selections(
    wsgi_server,
    driver,
    lecture_an,
    amendements_an,
    lecture_an_url,
    user_david,
    user_david_table_an,
):
    from zam_repondeur.models import DBSession

    with transaction.manager:
        DBSession.add(user_david_table_an)
        user_david_table_an.add_amendement(amendements_an[0])
        user_david_table_an.add_amendement(amendements_an[1])

    driver.get(f"{lecture_an_url}/tables/{user_david.email}")
    checkboxes = driver.find_elements_by_css_selector(
        '[name="amendement-selected"]')
    checkboxes[0].click()
    checkboxes[1].click()
    group_actions = driver.find_element_by_css_selector(".groupActions")
    assert group_actions.is_displayed()
    batch_amendements = driver.find_element_by_css_selector(
        "#batch-amendements")
    assert batch_amendements.is_displayed()
Exemplo n.º 11
0
def test_batch_amendements_is_hidden_when_selected_amendements_have_different_articles(
    wsgi_server,
    driver,
    lecture_an,
    article7bis_an,
    amendements_an,
    lecture_an_url,
    user_david,
    user_david_table_an,
):
    from zam_repondeur.models import Amendement, DBSession

    with transaction.manager:
        amendement = Amendement.create(lecture=lecture_an,
                                       article=article7bis_an,
                                       num=777)
        DBSession.add(user_david_table_an)
        user_david_table_an.add_amendement(amendements_an[0])
        user_david_table_an.add_amendement(amendements_an[1])
        user_david_table_an.add_amendement(amendement)

    driver.get(f"{lecture_an_url}/tables/{user_david.email}")
    checkboxes = driver.find_elements_by_css_selector(
        '[name="amendement-selected"]')
    checkboxes[0].click()
    checkboxes[1].click()
    checkboxes[2].click()
    group_actions = driver.find_element_by_css_selector(".groupActions")
    assert group_actions.is_displayed()
    batch_amendements = driver.find_element_by_css_selector(
        "#batch-amendements")
    assert not batch_amendements.is_displayed()
def test_post_amendement_edit_form_reset_editing_state(app, lecture_an,
                                                       amendements_an,
                                                       user_david,
                                                       user_david_table_an):
    from zam_repondeur.models import Amendement, DBSession

    amendement = amendements_an[1]
    with transaction.manager:
        DBSession.add(user_david_table_an)
        user_david_table_an.amendements.append(amendement)

    amendement.start_editing()
    assert amendement.is_being_edited

    resp = app.get(
        "/lectures/an.15.269.PO717460/amendements/999/amendement_edit",
        user=user_david)
    form = resp.forms["edit-amendement"]
    form["avis"] = "Favorable"
    form["objet"] = "Un objet très pertinent"
    form["reponse"] = "Une réponse <strong>très</strong> appropriée"
    form["comments"] = "Avec des <table><tr><td>commentaires</td></tr></table>"
    resp = form.submit("save")

    amendement = DBSession.query(Amendement).filter(
        Amendement.num == 999).one()
    assert not amendement.is_being_edited
def test_get_amendement_edit_form_gouvernemental(app, lecture_an,
                                                 amendements_an, user_david,
                                                 user_david_table_an):
    from zam_repondeur.models import DBSession

    amendement = amendements_an[1]
    with transaction.manager:
        DBSession.add(user_david_table_an)
        amendement.auteur = "LE GOUVERNEMENT"
        user_david_table_an.amendements.append(amendement)

    resp = app.get(
        "/lectures/an.15.269.PO717460/amendements/999/amendement_edit",
        user=user_david)

    assert resp.status_code == 200
    assert resp.content_type == "text/html"
    assert resp.forms["edit-amendement"].method == "POST"
    assert list(resp.forms["edit-amendement"].fields.keys()) == [
        "objet",
        "reponse",
        "comments",
        "save-and-transfer",
        "save",
    ]
    assert resp.forms.get("prefill-reponse") is None
Exemplo n.º 14
0
def test_fetch_and_parse_discussion_details_parent_missing(
        lecture_senat, caplog):
    from zam_repondeur.models import DBSession
    from zam_repondeur.services.fetch.senat.derouleur import (
        fetch_and_parse_discussion_details, )

    with transaction.manager:
        lecture_senat.organe = "PO744107"
        DBSession.add(lecture_senat)

    data = json.loads(
        read_sample_data("liste_discussion_63-short-parent-missing.json"))

    responses.add(
        responses.GET,
        "https://www.senat.fr/encommission/2017-2018/63/liste_discussion.json",
        json=data,
        status=200,
    )

    details = fetch_and_parse_discussion_details(lecture_senat)

    assert len(details) == 2
    assert details[0].parent_num is None
    assert details[1].parent_num is None
    assert "Unknown parent amendement 1234" in [
        rec.message for rec in caplog.records
    ]
Exemplo n.º 15
0
def test_get_amendement_edit_form_only_if_owner(app, lecture_an_url,
                                                amendements_an_batch,
                                                user_david):
    from zam_repondeur.models import DBSession

    with transaction.manager:
        amdt = amendements_an_batch[1]
        amdt.expose = "<p>Bla bla bla</p>"
        amdt.corps = "<p>Supprimer cet article.</p>"
        amdt.user_content.avis = "Favorable"
        DBSession.add(amdt)

    resp = app.get(f"{lecture_an_url}/amendements/{amdt.num}/",
                   user=user_david)

    assert resp.status_code == 200
    assert resp.content_type == "text/html"

    # Check has transfer form
    assert resp.forms["transfer"].method == "POST"

    # Check the displayed reponse
    assert resp.parser.css_first(
        ".reponse h4").text() == "Position du gouvernement"
    assert resp.parser.css_first(".reponse h4 + *").text() == "Favorable"
def test_lecture_post_transfer_amendements_to_index(app, lecture_an,
                                                    amendements_an,
                                                    user_david):
    from zam_repondeur.models import DBSession, Amendement

    with transaction.manager:
        DBSession.add(amendements_an[0])
        table_david = user_david.table_for(lecture_an)
        table_david.amendements.append(amendements_an[0])

    resp = app.get(
        "/lectures/an.15.269.PO717460/transfer_amendements",
        {"nums": [amendements_an[0]]},
        user=user_david,
    )
    resp = resp.form.submit("submit-index")

    # We're redirected to our table
    assert resp.status_code == 302
    assert (
        resp.location ==
        f"https://zam.test/lectures/an.15.269.PO717460/tables/{user_david.email}"
    )

    # Reload amendement as it was updated in another transaction
    amendement = Amendement.get(lecture_an, amendements_an[0].num)

    # The amendement is now on the index
    assert amendement.user_table is None
    assert amendement.events[0].render_summary() == (
        "<abbr title='*****@*****.**'>David</abbr> "
        "a remis l’amendement dans l’index")
def test_table_notification_on_amendement_transfer(wsgi_server, driver,
                                                   lecture_an, amendements_an,
                                                   user_david_table_an,
                                                   user_david):
    from zam_repondeur.models import DBSession

    LECTURE_URL = f"{wsgi_server.application_url}lectures/{lecture_an.url_key}"
    with transaction.manager:
        DBSession.add(user_david_table_an)
        user_david_table_an.amendements.append(amendements_an[0])
        DBSession.add_all(amendements_an)

    driver.get(f"{LECTURE_URL}/tables/{user_david.email}")
    status = driver.find_element_by_css_selector('div[role="status"] div')
    assert not status.is_displayed()
    assert not status.text

    with transaction.manager:
        amendements_an[0].user_table = None
        DBSession.add_all(amendements_an)

    sleep(wsgi_server.settings["zam.check_for.transfers_from_to_my_table"])

    assert status.is_displayed()
    assert status.text == "L’amendement 666 a été retiré de votre table. Rafraîchir"
def test_lecture_post_transfer_amendements_to_index_from_index(
        app, lecture_an, amendements_an, user_david):
    from zam_repondeur.models import DBSession, User, Amendement

    with transaction.manager:
        DBSession.add(amendements_an[0])
        table_david = user_david.table_for(lecture_an)
        table_david.amendements.append(amendements_an[0])

    resp = app.get(
        "/lectures/an.15.269.PO717460/transfer_amendements",
        {
            "nums": [amendements_an[0]],
            "from_index": 1
        },
        user=user_david,
    )
    resp = resp.form.submit("submit-index")
    assert resp.status_code == 302
    assert resp.location == "https://zam.test/lectures/an.15.269.PO717460/amendements"
    user_david = DBSession.query(User).filter(
        User.email == user_david.email).first()
    table = user_david.table_for(lecture_an)
    assert len(table.amendements) == 0
    amendement = (DBSession.query(Amendement).filter(
        Amendement.num == amendements_an[0].num).first())
    assert amendement.events[0].render_summary() == (
        "<abbr title='*****@*****.**'>David</abbr> "
        "a remis l’amendement dans l’index")
Exemplo n.º 19
0
def test_amendement_edition_with_reponse_only_and_deny(wsgi_server, driver,
                                                       lecture_an,
                                                       amendements_an,
                                                       lecture_an_url,
                                                       user_david_table_an):
    from zam_repondeur.models import Amendement, DBSession

    amendement = amendements_an[0]
    with transaction.manager:
        DBSession.add(user_david_table_an)
        user_david_table_an.add_amendement(amendement)
        DBSession.add(amendement)

    driver.get(f"{lecture_an_url}/amendements/{amendements_an[0].num}/")

    driver.switch_to.frame("reponse_ifr")
    WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable((
            By.CSS_SELECTOR,
            '[data-id="reponse"]',
        ))).send_keys("Réponse")

    driver.switch_to.default_content()
    save_button = driver.find_element_by_css_selector(
        '.save-buttons input[name="save"]')
    save_button.click()
    driver.switch_to.alert.dismiss()
    time.sleep(1)  # Wait for the alert dismiss.

    with transaction.manager:
        amendements_an = DBSession.query(Amendement).all()
        assert amendements_an[0].user_content.reponse is None

    assert (driver.current_url ==
            f"{lecture_an_url}/amendements/{amendements_an[0].num}/")
def test_lecture_post_transfer_amendements_to_other_from_index(
        app, lecture_an, amendements_an, user_david, user_ronan):
    from zam_repondeur.models import DBSession, User

    with transaction.manager:
        DBSession.add(amendements_an[0])
        table_david = user_david.table_for(lecture_an)
        table_david.amendements.append(amendements_an[0])

    resp = app.get(
        "/lectures/an.15.269.PO717460/transfer_amendements",
        {
            "nums": [amendements_an[0]],
            "from_index": 1
        },
        user=user_david,
    )
    form = resp.form
    form["target"] = user_ronan.email
    resp = form.submit()
    assert resp.status_code == 302
    assert resp.location == "https://zam.test/lectures/an.15.269.PO717460/amendements"
    user_david = DBSession.query(User).filter(
        User.email == user_david.email).first()
    table_david = user_david.table_for(lecture_an)
    assert len(table_david.amendements) == 0
    user_ronan = DBSession.query(User).filter(
        User.email == user_ronan.email).first()
    table_ronan = user_ronan.table_for(lecture_an)
    assert len(table_ronan.amendements) == 1
    assert table_ronan.amendements[0].events[0].render_summary() == (
        "<abbr title='*****@*****.**'>David</abbr> "
        "a transféré l’amendement à « Ronan ([email protected]) »")
Exemplo n.º 21
0
def test_amendement_edition_with_avis_and_reponse(wsgi_server, driver,
                                                  lecture_an, amendements_an,
                                                  lecture_an_url,
                                                  user_david_table_an):
    from zam_repondeur.models import Amendement, DBSession

    amendement = amendements_an[0]
    with transaction.manager:
        DBSession.add(user_david_table_an)
        user_david_table_an.add_amendement(amendement)
        DBSession.add(amendement)

    driver.get(f"{lecture_an_url}/amendements/{amendements_an[0].num}/")
    avis = Select(driver.find_element_by_css_selector('select[name="avis"]'))
    avis.select_by_visible_text("Défavorable")

    driver.switch_to.frame("reponse_ifr")
    WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable((
            By.CSS_SELECTOR,
            '[data-id="reponse"]',
        ))).send_keys("Réponse")

    driver.switch_to.default_content()
    save_button = driver.find_element_by_css_selector(
        '.save-buttons input[name="save"]')
    save_button.click()

    with pytest.raises(NoAlertPresentException):
        driver.switch_to.alert

    with transaction.manager:
        amendements_an = DBSession.query(Amendement).all()
        assert amendements_an[0].user_content.avis == "Défavorable"
        assert amendements_an[0].user_content.reponse == "<p>Réponse</p>"
def test_lecture_get_transfer_amendements_from_me(app, lecture_an,
                                                  amendements_an, user_david,
                                                  user_ronan):
    from zam_repondeur.models import DBSession

    with transaction.manager:
        DBSession.add(amendements_an[0])
        table_david = user_david.table_for(lecture_an)
        table_david.amendements.append(amendements_an[0])

    resp = app.get(
        "/lectures/an.15.269.PO717460/transfer_amendements",
        {"nums": [amendements_an[0]]},
        user=user_david,
    )
    assert resp.status_code == 200
    assert ("Cet amendement est sur votre table"
            in resp.parser.css_first(".amendements li").text())
    assert "checked" in resp.parser.css_first(
        ".amendements li input").attributes

    assert resp.form.method == "POST"
    assert list(resp.form.fields.keys()) == [
        "nums",
        "target",
        "submit-to",
        "submit-index",
    ]
    assert resp.form.fields["nums"][0].value == "666"
    assert resp.form.fields["target"][0].options == [
        ("", True, ""),
        ("*****@*****.**", False, "Ronan ([email protected])"),
    ]
Exemplo n.º 23
0
    def test_article_ranges(self, app, lecture_an):
        from zam_repondeur.models import DBSession
        from zam_repondeur.services.fetch.articles import get_articles

        responses.add(
            responses.GET,
            "http://www.assemblee-nationale.fr/15/projets/pl0269.asp",
            body=(SAMPLE_DATA_DIR /
                  "pl0387.html").read_text("latin-1").encode("latin-1"),
            status=200,
        )

        DBSession.add(lecture_an)

        # No articles initially
        assert {article.num for article in lecture_an.articles} == set()

        changed = get_articles(lecture_an)

        assert changed

        nums = {article.num for article in lecture_an.articles}

        # "Articles 1er et 2"
        assert {"1", "2"}.issubset(nums)

        # "Articles 19 à 24"
        assert {"19", "20", "21", "22", "23", "24"}.issubset(nums)
Exemplo n.º 24
0
    def test_delete(self, app, user_sgg, user_david):
        from zam_repondeur.models import DBSession, User

        with transaction.manager:
            user_david.admin_at = datetime.utcnow()
            DBSession.add(user_david)

        assert DBSession.query(User).filter(User.admin_at.isnot(None)).count() == 2

        resp = app.get("/admins/", user=user_sgg)

        form = resp.forms[1]
        form["user_pk"] = user_david.pk

        resp = form.submit()

        assert resp.status_code == 302
        assert resp.location == "https://zam.test/admins/"

        resp = resp.follow()

        assert resp.status_code == 200
        assert resp.content_type == "text/html"

        assert len(resp.parser.css(".box ul li")) == 1
        assert DBSession.query(User).filter(User.admin_at.isnot(None)).count() == 1

        with transaction.manager:
            DBSession.add(user_sgg)
            assert len(user_sgg.events) == 1
            assert user_sgg.events[0].render_summary() == (
                "<abbr title='*****@*****.**'>SGG user</abbr> a retiré "
                "<abbr title='*****@*****.**'>David ([email protected])"
                "</abbr> de la liste des administrateur·ice·s."
            )
Exemplo n.º 25
0
    def test_intersticial_articles_are_not_updated(self, app, lecture_an):
        from zam_repondeur.models import Article, DBSession
        from zam_repondeur.services.fetch.articles import get_articles

        article_avant_2 = Article.create(lecture=lecture_an,
                                         type="article",
                                         num="2",
                                         pos="avant")
        DBSession.add(article_avant_2)

        responses.add(
            responses.GET,
            "http://www.assemblee-nationale.fr/15/projets/pl0269.asp",
            body=(SAMPLE_DATA_DIR / "pl0269.html").read_text(
                "utf-8", "ignore"),
            status=200,
        )

        changed = get_articles(lecture_an)

        assert changed

        article = DBSession.query(Article).filter(
            Article.pos == "avant").first()
        assert article.user_content.title == ""
        assert article.content == {}
Exemplo n.º 26
0
def test_post_amendement_edit_form_reset_editing_state(app, lecture_an_url,
                                                       amendements_an_batch,
                                                       user_david,
                                                       user_david_table_an):
    from zam_repondeur.models import Amendement, DBSession

    amendement_666, amendement_999 = amendements_an_batch
    with transaction.manager:
        DBSession.add(user_david_table_an)
        user_david_table_an.add_amendement(amendement_666)
        user_david_table_an.add_amendement(amendement_999)

    amendement_666.start_editing()
    assert amendement_666.is_being_edited
    amendement_999.start_editing()
    assert amendement_999.is_being_edited

    resp = app.get(f"{lecture_an_url}/amendements/999/", user=user_david)
    form = resp.forms["edit-amendement"]
    form["avis"] = "Favorable"
    form["objet"] = "Un objet très pertinent"
    form["reponse"] = "Une réponse <strong>très</strong> appropriée"
    form["comments"] = "Avec des <table><tr><td>commentaires</td></tr></table>"
    resp = form.submit("save")

    amendement_666 = DBSession.query(Amendement).filter(
        Amendement.num == 666).one()
    assert not amendement_666.is_being_edited
    amendement_999 = DBSession.query(Amendement).filter(
        Amendement.num == 999).one()
    assert not amendement_999.is_being_edited
Exemplo n.º 27
0
def test_export_csv_with_identique(lecture_an, article1_an, tmpdir):
    from zam_repondeur.export.spreadsheet import write_csv
    from zam_repondeur.models import DBSession, Amendement

    filename = str(tmpdir.join("test.csv"))

    amendements = [
        Amendement.create(
            lecture=lecture_an,
            article=article1_an,
            num=num,
            position=position,
            avis="Favorable",
            objet="Un objet très pertinent",
            reponse="Une réponse très appropriée",
            comments="Avec des commentaires",
        ) for position, num in enumerate((333, 444, 777), 1)
    ]
    amendements[0].id_identique = 42
    amendements[1].id_identique = 42
    DBSession.add_all(amendements)
    DBSession.add(lecture_an)

    counter = write_csv(lecture_an, filename, request={})

    assert counter["amendements"] == 3

    with Path(filename).open(encoding="utf-8-sig") as csv_file:
        reader = csv.DictReader(csv_file, delimiter=";")
        amendement1 = next(reader)
        assert amendement1["Identique"] == "333"
        amendement2 = next(reader)
        assert amendement2["Identique"] == "333"
        amendement3 = next(reader)
        assert amendement3["Identique"] == ""
Exemplo n.º 28
0
def test_post_amendement_edit_form_creates_event_only_if_modified(
        app, lecture_an_url, amendements_an_batch, user_david,
        user_david_table_an):
    from zam_repondeur.models import DBSession

    amendement_666 = amendements_an_batch[0]

    # Let's set a response on the amendement
    with transaction.manager:
        DBSession.add(user_david_table_an)
        amendement_666.user_content.avis = "Favorable"
        amendement_666.user_content.objet = "Un objet très pertinent"
        amendement_666.user_content.reponse = "Une réponse très appropriée"
        user_david_table_an.add_amendement(amendement_666)

    # Let's post the response edit form, but with unchanged values
    resp = app.get(f"{lecture_an_url}/amendements/666/", user=user_david)
    form = resp.forms["edit-amendement"]
    form["avis"] = "Favorable"
    # Even with extra spaces.
    form["objet"] = "Un objet très pertinent  "
    form["reponse"] = "  Une réponse très appropriée"
    form.submit("save")

    # No event should be created
    DBSession.add_all(amendements_an_batch)
    assert len(amendements_an_batch[0].events) == 0
    assert len(amendements_an_batch[1].events) == 0
Exemplo n.º 29
0
def test_post_form_xss_address(app, user_david, dossier_plfss2018):
    from zam_repondeur.models import DBSession, Dossier

    with transaction.manager:
        DBSession.add(dossier_plfss2018)
        assert len(dossier_plfss2018.team.users) == 1
        assert dossier_plfss2018.events == []

    resp = app.get("/dossiers/plfss-2018/invite", user=user_david)
    assert resp.status_code == 200

    form = resp.forms[0]
    form["emails"] = "<script>alert('xss')</script>"

    resp = form.submit()
    assert resp.status_code == 302

    resp = resp.follow()
    assert resp.status_code == 200

    assert "Aucune invitation n’a été envoyée." in resp.text

    assert (
        "L’adresse courriel &lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt; "
        "est mal formée ou non autorisée et n’a pas été invitée.") in resp.text

    dossier_plfss2018 = (DBSession.query(Dossier).filter(
        Dossier.pk == dossier_plfss2018.pk).one())
    assert len(dossier_plfss2018.team.users) == 1
    assert dossier_plfss2018.events == []
Exemplo n.º 30
0
def test_amendement_stop_editing(
    app, lecture_an_url, amendements_an_batch, user_david, user_david_table_an
):
    from zam_repondeur.models import Amendement, DBSession

    amendement_666 = amendements_an_batch[0]
    amendement_999 = amendements_an_batch[1]
    with transaction.manager:
        DBSession.add(user_david_table_an)
        user_david_table_an.add_amendement(amendement_666)
        user_david_table_an.add_amendement(amendement_999)

    assert not amendement_666.is_being_edited
    assert not amendement_999.is_being_edited

    resp = app.post_json(
        f"{lecture_an_url}/amendements/{amendement_666.num}/start_editing",
        user=user_david,
    )
    resp = app.post_json(
        f"{lecture_an_url}/amendements/{amendement_666.num}/stop_editing",
        user=user_david,
    )

    assert resp.status_code == 200
    assert resp.content_type == "application/json"

    amendement_666 = DBSession.query(Amendement).get(amendement_666.pk)
    amendement_999 = DBSession.query(Amendement).get(amendement_999.pk)
    assert not amendement_666.is_being_edited
    assert not amendement_999.is_being_edited