Пример #1
0
def test_view_page_attachments(swissvotes_app, temporary_path, pdf_1, pdf_2):

    client = Client(swissvotes_app)

    login = client.get('/auth/login')
    login.form['username'] = '******'
    login.form['password'] = '******'
    login.form.submit()

    client.get(f'/locale/en_US').follow()
    add = client.get('/').maybe_follow().click(href='add')
    add.form['title'] = "About"
    add.form['content'] = "About the project"
    add.form.submit()

    manage = client.get('/page/about').click("Manage attachments")
    assert "No attachments." in manage

    # Upload two attachment (en_US, de_CH)
    with open(pdf_1, 'rb') as file:
        content_1 = file.read()
    manage.form['file'] = Upload('1.pdf', content_1, 'application/pdf')
    manage = manage.form.submit().maybe_follow()
    assert "Attachment added" in manage
    assert "1.pdf" in manage
    assert manage.click('1.pdf').content_type == 'application/pdf'

    client.get(f'/locale/de_CH').follow()
    manage = client.get('/page/about').click("Anhänge verwalten")

    with open(pdf_2, 'rb') as file:
        content_2 = file.read()
    manage.form['file'] = Upload('2.pdf', content_2, 'application/pdf')
    manage = manage.form.submit().maybe_follow()
    assert "Anhang hinzugefügt" in manage
    assert "1.pdf" not in manage
    assert "2.pdf" in manage
    assert manage.click('2.pdf').content_type == 'application/pdf'

    # Check visibility
    view = client.get('/page/about')
    assert "1.pdf" not in view
    assert "2.pdf" in view

    client.get(f'/locale/en_US').follow()
    view = client.get('/page/about')
    assert "1.pdf" in view
    assert "2.pdf" not in view

    # Delete attachments
    client.get('/page/about').click("Manage attachments")\
        .click("Delete").form.submit()

    client.get(f'/locale/de_CH').follow()
    client.get('/page/about').click("Anhänge verwalten")\
        .click("Löschen").form.submit()

    view = client.get('/page/about')
    assert "1.pdf" not in view
    assert "2.pdf" not in view
Пример #2
0
def test_views_invoices(client):
    # Add a municipality with dates
    client.login_admin()

    add = client.get('/municipalities').click(href='/add')
    add.form['name'] = "Adlikon"
    add.form['bfs_number'] = '1'
    add.form['gpn_number'] = '11223344'
    add.form['payment_type'] = 'normal'
    assert "Adlikon" in add.form.submit().follow()

    upload = client.get('/municipalities').click("Daten importieren")
    upload.form['file'] = Upload(
        'test.csv', "Gemeinde;1;-1;Normal;5.1.2019".encode('cp1252'),
        'text/csv')
    assert "Gemeindedaten importiert." in upload.form.submit().follow()

    # Add a scan job
    with freeze_time("2019-01-01"):
        add = client.get('/scan-jobs/unrestricted').click(href='/add')
        add.form['type'].select("normal")
        add.form['municipality_id'].select(text="Adlikon (1)")
        add.form['dispatch_date'] = "2019-01-05"
        add.form['dispatch_tax_forms_older'] = "30"
        add.form['dispatch_tax_forms_last_year'] = "20"
        add.form['dispatch_tax_forms_current_year'] = "10"
        assert "Scan-Auftrag hinzugefügt." in add.form.submit().maybe_follow()

        edit = client.get('/scan-jobs/unrestricted')\
            .click("05.01.2019").click("Bearbeiten")
        edit.form['return_date'] = "2019-01-10"
        edit.form['return_unscanned_tax_forms_older'] = "3"
        edit.form['return_unscanned_tax_forms_last_year'] = "2"
        edit.form['return_unscanned_tax_forms_current_year'] = "1"

        assert "Scan-Auftrag geändert." in edit.form.submit().maybe_follow()

    with freeze_time("2019-01-02"):
        create = client.get('/invoice')
        create.form['from_date'] = "2019-01-01"
        create.form['to_date'] = "2019-01-07"
        create.form['cs2_user'] = "******"
        create.form['subject'] = "Rechnungen"
        create.form['municipality_id'].select(text="Adlikon (1)")
        create.form['accounting_unit'] = "456"
        create.form['revenue_account'] = "789"
        created = create.form.submit()
        assert created.headers['Content-Type'] == 'text/csv; charset=UTF-8'
        assert created.headers['Content-Disposition'] == (
            'inline; filename=rechnungen.csv')

        invoice = created.text
        assert "11223344" in invoice
        assert "Rechnungen" in invoice
        assert "123" in invoice
        assert "456" in invoice
        assert "789" in invoice
        assert "2019-01-02" in invoice
        assert "-00000000000006000" in invoice
        assert "+00000000070000000" in invoice
Пример #3
0
 def upload_file_pypi(self,
                      basename,
                      content,
                      name=None,
                      version=None,
                      indexname=None,
                      register=True,
                      code=200,
                      waithooks=False,
                      set_whitelist=True):
     assert py.builtin._isbytes(content)
     indexname = self._getindexname(indexname)
     #name_version = splitbasename(basename, checkarch=False)
     #if not name:
     #    name = name_version[0]
     #if not version:
     #    version = name_version[1]
     if register and code == 200:
         self.set_versiondata(dict(name=name, version=version),
                              set_whitelist=set_whitelist)
     r = self.testapp.post("/%s/" % indexname, {
         ":action": "file_upload",
         "name": name,
         "version": version,
         "content": Upload(basename, content)
     },
                           expect_errors=True)
     assert r.status_code == code
     if waithooks:
         self._wait_for_serial_in_result(r)
     return r
Пример #4
0
    def upload_file_pypi(self,
                         basename,
                         content,
                         name=None,
                         version=None,
                         indexname=None,
                         register=True,
                         code=200,
                         waithooks=False,
                         set_whitelist=True):
        assert py.builtin._isbytes(content)
        indexname = self._getindexname(indexname)
        #name_version = splitbasename(basename, checkarch=False)
        #if not name:
        #    name = name_version[0]
        #if not version:
        #    version = name_version[1]
        if register and code == 200:
            self.set_versiondata(dict(name=name, version=version),
                                 set_whitelist=set_whitelist)
        r = self.testapp.post("/%s/" % indexname, {
            ":action": "file_upload",
            "name": name,
            "version": version,
            "content": Upload(basename, content)
        },
                              expect_errors=True)
        assert r.status_code == code
        if waithooks:
            self._wait_for_serial_in_result(r)

        # return the file url so users/callers can easily use it
        # (probably the official server response should include the url)
        r.file_url = make_file_url(basename, content, stagename=indexname)
        return r
Пример #5
0
def test_views_municipality(client):
    client.login_admin()

    # Add a municipality
    add = client.get('/municipalities').click(href='/add')
    add.form['name'] = "Adlikon"
    add.form['bfs_number'] = '21'
    add.form['payment_type'] = 'normal'
    added = add.form.submit().follow()
    assert "hinzugefügt." in added
    assert "Adlikon" in added

    # View the municipality
    view = client.get('/municipalities').click("Adlikon")
    assert "Adlikon" in view
    assert "21" in view
    assert "Normal" in view
    assert "7.00" in view

    # Edit the municipality
    edit = view.click("Bearbeiten")
    edit.form['name'] = "Aesch"
    edit.form['bfs_number'] = '241'
    edit.form['payment_type'] = 'spezial'
    edit.form['address_supplement'] = "Zusatz"
    edit.form['gpn_number'] = "12321"
    edited = edit.form.submit().follow()
    assert "geändert." in edited
    assert "Aesch" in edited
    view = edited.click("Aesch")
    assert "Spezial" in view
    assert "8.50" in view
    assert "12321" in view

    # Upload some dates
    upload = client.get('/municipalities').click("Daten importieren")
    upload.form['file'] = Upload(
        'test.csv', "Gemeinde;241;-1;Normal;12.2.2015".encode('cp1252'),
        'text/csv')
    uploaded = upload.form.submit().follow()
    assert "Gemeindedaten importiert." in uploaded
    with freeze_time("2016-01-01"):
        assert "12.02.2015" in client.get('/municipalities').click("Aesch")
    with freeze_time("2018-01-01"):
        assert "12.02.2015" not in client.get('/municipalities').click("Aesch")

    # Delete some dates
    with freeze_time("2015-01-01"):
        clear = client.get('/municipalities').click("Aesch")\
            .click("Abholtermine löschen")
        cleared = clear.form.submit().follow()
    assert "Abholtermine gelöscht." in cleared
    with freeze_time("2016-01-01"):
        assert "12.02.2015" not in client.get('/municipalities').click("Aesch")

    # Delete the municipality
    deleted = client.get('/municipalities').click("Aesch").click("Löschen")
    assert deleted.status_int == 200
    assert "Aesch" not in client.get('/municipalities')
Пример #6
0
def test_views_scan_jobs_filter(client):
    # Add municipality dates
    client.login_admin()

    upload = client.get('/municipalities').click("Daten importieren")
    upload.form['file'] = Upload(
        'test.csv', "Gemeinde;1;-1;Normal;5.1.2019".encode('cp1252'),
        'text/csv')
    assert "Gemeindedaten importiert." in upload.form.submit().follow()

    # Add scan jobs
    client.logout()
    client.login_member()
    with freeze_time("2019-01-01"):
        add = client.get('/scan-jobs').click(href='/add')
        add.form['type'].select('normal')
        add.form['dispatch_boxes'] = 1
        add.form['dispatch_date_normal'].select("2019-01-05")
        assert "Scan-Auftrag hinzugefügt." in add.form.submit().follow()

        client.logout()
        client.login_editor()
        add = client.get('/scan-jobs').click(href='/add')
        add.form['type'].select('express')
        add.form['dispatch_date_express'] = "2019-01-04"
        assert "Scan-Auftrag hinzugefügt." in add.form.submit().follow()

        add.form['type'].select('express')
        add.form['dispatch_date_express'] = "2019-01-06"
        assert "Scan-Auftrag hinzugefügt." in add.form.submit().follow()

    # View scan jobs
    view = client.get('/scan-jobs')
    assert view.pyquery('table.scan-jobs td').text() == (
        '06.01.2019 3 express '
        '05.01.2019 1 normal '
        '04.01.2019 2 express')

    view.form.get('type', index=0).checked = False
    view = view.form.submit()
    assert view.pyquery('table.scan-jobs td').text() == (
        '06.01.2019 3 express '
        '04.01.2019 2 express')

    view = view.click("Lieferscheinnummer")
    assert view.pyquery('table.scan-jobs td').text() == (
        '04.01.2019 2 express '
        '06.01.2019 3 express')

    client.logout()
    client.login_admin()
    view = client.get('/scan-jobs/unrestricted')
    assert view.pyquery('table.scan-jobs td').text() == (
        '06.01.2019 3 express My Municipality '
        '05.01.2019 1 normal My Municipality '
        '04.01.2019 2 express My Municipality')
Пример #7
0
 def test_same_skus_within_different_products_warning_file_upload(self):
     range_products_page = self.get(self.url)
     form = range_products_page.form
     form['file_upload'] = Upload('skus.txt', b'123123')
     response = form.submit().follow()
     messages = list(response.context['messages'])
     self.assertEqual(len(messages), 2)
     self.assertEqual(messages[1].level, WARNING)
     self.assertEqual(messages[1].message,
                      'There are more than one product with SKU 123123')
Пример #8
0
 def test_post_upload_empty_files(self):
     app = webtest.TestApp(SingleUploadFileApp())
     resp = app.post('/', upload_files=[('file', 'filename', b'')])
     resp.mustcontain("<p>You selected 'filename'</p>",
                      "<p>with contents: ''</p>")
     resp = app.get('/')
     form = resp.form
     form['file-field'] = Upload('filename', b'', 'text/plain')
     resp = form.submit()
     resp.mustcontain("<p>You selected 'filename'</p>",
                      "<p>with contents: ''</p>")
Пример #9
0
def test_upload_button_do_not_create_backup_with_non_zip_file(
        staffapp, monkeypatch):
    monkeypatch.setattr('ideasbox.serveradmin.backup.Backup.ROOT',
                        BACKUPS_ROOT)
    backup_name = 'musasa_0.1.0_201501241620.zip'
    backup_path = os.path.join(BACKUPS_ROOT, backup_name)
    assert not os.path.exists(backup_path)
    form = staffapp.get(reverse('server:backup')).forms['backup']
    form['upload'] = Upload(backup_name, 'xxx')
    resp = form.submit('do_upload')
    assert resp.status_code == 200
    assert not os.path.exists(backup_path)
Пример #10
0
 def upload_doc(self, basename, content, name, version, indexname=None,
                      code=200, waithooks=False):
     indexname = self._getindexname(indexname)
     form = {":action": "doc_upload", "name": name,
             "content": Upload(basename, content)}
     if version:
         form["version"] = version
     r = self.testapp.post("/%s/" % indexname, form, expect_errors=True)
     assert r.status_code == code
     if waithooks:
         self._wait_for_serial_in_result(r)
     return r
Пример #11
0
def test_upload_button_create_new_backup_with_uploaded_file(
        staffapp, monkeypatch):
    monkeypatch.setattr('ideasbox.serveradmin.backup.Backup.ROOT',
                        BACKUPS_ROOT)
    backup_name = 'musasa_0.1.0_201501241620.zip'
    backup_path = os.path.join(BACKUPS_ROOT, backup_name)
    assert not os.path.exists(backup_path)
    with open(os.path.join(DATA_ROOT, backup_name), mode='rb') as f:
        form = staffapp.get(reverse('server:backup')).forms['backup']
        form['upload'] = Upload(backup_name, f.read())
        form.submit('do_upload')
        assert os.path.exists(backup_path)
        os.remove(backup_path)
Пример #12
0
def test_upload_button_do_not_create_backup_with_bad_file_name(
        staffapp, monkeypatch):
    monkeypatch.setattr('ideascube.serveradmin.backup.Backup.ROOT',
                        BACKUPS_ROOT)
    backup_name = 'musasa-0.1.0-201501241620.zip'
    backup_path = os.path.join(BACKUPS_ROOT, backup_name)
    assert not os.path.exists(backup_path)
    with open(os.path.join(DATA_ROOT, backup_name), mode='rb') as f:
        form = staffapp.get(reverse('server:backup')).forms['backup']
        form['upload'] = Upload('badname.zip', f.read())
        resp = form.submit('do_upload')
        assert resp.status_code == 200
        assert not os.path.exists(backup_path)
Пример #13
0
def test_check_request(check_solver_name, check_user):
    username = '******'
    password = '******'
    files = {'pict': Upload('captcha.png', '\xc9')}
    bad_args = [
        {
            'post': {}
        },  # empty
        {
            'post': {
                'username': username
            },
            'files': files
        },  # no password
        {
            'post': {
                'password': password
            },
            'files': files
        },  # no username
        {
            'post': {
                'username': username,
                'password': password
            }
        },  # no pict
    ]
    good_args = {
        'post': {
            'username': username,
            'password': password
        },
        'files': files
    }

    # если проверка проходит, то возвращается None,
    # иначе - строка с описанием ошибки
    # (булево значение непустой строки = True)
    for args in bad_args:
        bad_request = FakeRequest(**args)
        assert check_request(bad_request)

    good_request = FakeRequest(**good_args)
    assert check_request(good_request) is None
    assert not check_solver_name.called

    solver = 'solver_name'
    request = FakeRequest(query={'upstream_service': solver}, **good_args)
    check_request(request)
    check_solver_name.assert_called_with(solver)
Пример #14
0
 def test_upload_file_with_skus(self):
     range_products_page = self.get(self.url)
     form = range_products_page.form
     form['file_upload'] = Upload('new_skus.txt', b'456')
     form.submit().follow()
     all_products = self.range.all_products()
     self.assertEqual(len(all_products), 1)
     self.assertTrue(self.product3 in all_products)
     range_product_file_upload = RangeProductFileUpload.objects.get()
     self.assertEqual(range_product_file_upload.range, self.range)
     self.assertEqual(range_product_file_upload.num_new_skus, 1)
     self.assertEqual(range_product_file_upload.status,
                      RangeProductFileUpload.PROCESSED)
     self.assertEqual(range_product_file_upload.size, 3)
Пример #15
0
 def test_file_upload_with_content_type(self):
     uploaded_file_name = os.path.join(os.path.dirname(__file__),
                                       "__init__.py")
     with open(uploaded_file_name, 'rb') as f:
         uploaded_file_contents = f.read()
     app = webtest.TestApp(SingleUploadFileApp())
     res = app.get('/')
     single_form = res.forms["file_upload_form"]
     single_form["file-field"].value = Upload(uploaded_file_name,
                                              uploaded_file_contents,
                                              'text/x-custom-type')
     display = single_form.submit("button")
     self.assertFile(uploaded_file_name, uploaded_file_contents, display,
                     content_type='text/x-custom-type')
Пример #16
0
def test_views_user_manual(client, pdf_1, pdf_2):
    with open(pdf_1, 'rb') as file:
        pdf_1 = file.read()
    with open(pdf_2, 'rb') as file:
        pdf_2 = file.read()

    client.login_admin()

    view = client.get('/user-manual')
    client.get('http://localhost/user-manual/pdf', status=503)
    assert "Noch kein Benutzerhandbuch vorhanden." in view

    add = view.click("Bearbeiten")
    add.form['pdf'] = Upload(f'Handbuch.pdf', pdf_1, 'application/pdf')
    added = add.form.submit().follow()
    assert "Benutzerhandbuch geändert." in added
    assert "Benutzerhandbuch (PDF, 8.1 kB)." in added
    assert client.get('http://localhost/user-manual/pdf').body == pdf_1

    # Edit
    edited = view.click("Bearbeiten")
    assert "user_manual.pdf (8.1 kB)" in str(edited.form.html)
    edited.form.get('pdf', 0).select('replace')
    edited.form.get('pdf', 1).value = Upload(f'xx', pdf_2, 'application/pdf')
    editeded = edited.form.submit().follow()
    assert "Benutzerhandbuch geändert." in editeded
    assert "Benutzerhandbuch (PDF, 9.1 kB)." in editeded
    assert client.get('http://localhost/user-manual/pdf').body == pdf_2

    # Delete
    edited = view.click("Bearbeiten")
    assert "user_manual.pdf (9.1 kB)" in str(edited.form.html)
    edited.form.get('pdf', 0).select('delete')
    editeded = edited.form.submit().follow()
    assert "Benutzerhandbuch geändert." in editeded
    assert "Benutzerhandbuch (PDF, 9.1 kB)." not in editeded
    assert client.get('http://localhost/user-manual/pdf', status=503)
Пример #17
0
def test_update_votes_unknown_descriptors(swissvotes_app):
    client = Client(swissvotes_app)
    client.get('/locale/de_CH').follow()

    login = client.get('/auth/login')
    login.form['username'] = '******'
    login.form['password'] = '******'
    login.form.submit()

    file = BytesIO()
    workbook = Workbook(file)
    worksheet = workbook.add_worksheet('DATA')
    workbook.add_worksheet('CITATION')
    worksheet.write_row(0, 0, ColumnMapper().columns.values())
    worksheet.write_row(1, 0, [
        '100.1',  # anr
        '1.2.2008',  # datum
        '1',  # legislatur
        '2004-2008',  # legisjahr
        'kurztitel de',  # titel_kurz_d
        'kurztitel fr',  # titel_kurz_f
        'titel de',  # titel_off_d
        'titel fr',  # titel_off_f
        'stichwort',  # stichwort
        '2',  # anzahl
        '3',  # rechtsform
        '13',  # d1e1
        '',  # d1e2
        '',  # d1e3
        '12',  # d2e1
        '12.6',  # d2e2
        '',  # d2e3
        '12',  # d3e1
        '12.5',  # d3e2
        '12.55',  # d3e3
    ])
    workbook.close()
    file.seek(0)

    manage = client.get('/').maybe_follow().click("Abstimmungen")
    manage = manage.click("Datensatz aktualisieren")
    manage.form['dataset'] = Upload(
        'votes.xlsx',
        file.read(),
        'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
    )
    manage = manage.form.submit().follow()
    assert "Datensatz aktualisiert (1 hinzugefügt, 0 geändert)" in manage
    assert "unbekannte Deskriptoren: 12.55, 12.6, 13" in manage
Пример #18
0
    def test_create_view(self):
        request = testing.DummyRequest()
        name = route_url('sa_create', request, table="user")
        response = self.testapp.get(name)
        self.failUnlessEqual(response.status, '200 OK')

        form = response.form
        form['name'] = "Karlson"
        form['fullname'] = "Karlson the Third"
        form['password'] = 123
        response = form.submit("form.submitted").follow()

        self.failUnlessEqual(response.status, '200 OK')
        user = self.session.query(User).get(1)

        self.assertFalse(user is None)
        self.assertEqual(user.name, "Karlson")
        self.assertEqual(user.fullname, "Karlson the Third")
        self.assertEqual(user.password, "123")
        self.assertEqual(user.position, 0)

        name = route_url('sa_create', request, table="profile")

        response = self.testapp.get(name)
        form = response.form
        form['user_id'] = "1"
        form['phone'] = "123"
        form['cv'] = "Karlson live on the roof"
        field = form.get('married', index=0)
        field.checked = False

        form['salary'] = "200.23"
        upload = Upload('filename.txt', 'data')
        form['photo'] = upload

        response = form.submit("form.submitted").follow()

        self.failUnlessEqual(response.status, '200 OK')

        profile = self.session.query(Profile).get(1)

        self.assertFalse(profile is None)
        self.assertEqual(profile.user.id, 1)
        self.assertEqual(profile.phone, "123")
        self.assertEqual(profile.cv, "Karlson live on the roof")
        self.assertEqual(profile.married, False)
        self.assertEqual(profile.salary, 200.23)
Пример #19
0
    def check_post_photo(self, tags=None):
        self.login("john2", "doe")

        with open(path.join(DOT, "fixtures",
                            "4843655940_d8dd79d602_o.jpg")) as f:
            picture = Upload("4843655940_d8dd79d602_o.jpg", f.read())

        params = OrderedDict([("title", "my title"),
                              ("description", "my description"),
                              ("rating", "1.3"), ("picture", picture)])
        if tags:
            params["tags"] = tags

        res = self.app.post("/api/v1/photos", params)

        assert_equal(res.status_int, 200)
        assert_in("photo", res.json)
        p = res.json["photo"]
        assert_in("id", p)
        assert_equal(p["title"], "my title")
        assert_equal(p["description"], "my description")
        assert_equal(p["rating"], 1.3)

        if tags:
            splited_tags = [x.strip() for x in tags.split(",")]
            assert_in("tags", p)
            assert_is_instance(p["tags"], list)
            assert_equal(len(p["tags"]), len(splited_tags), p["tags"])
            assert_equal(sorted([x["name"] for x in p["tags"]]),
                         sorted(splited_tags))

        photo = models.Photo.get_by(id=int(p["id"]))
        assert_true(photo.s3_path is not None,
                    "s3_path is None: %s" % photo.s3_path)
        assert_true(photo.s3_path.endswith("4843655940_d8dd79d602_o.jpg"))
        # exif checks
        assert_equal(photo.date_time, datetime(2010, 7, 25, 20, 26, 50))
        assert_equal(photo.date_time_original,
                     datetime(2010, 7, 5, 18, 55, 35))
        assert_equal(photo.date_time_digitized,
                     datetime(2010, 7, 5, 18, 55, 35))
        assert_equal(photo.make, u"Canon")
        assert_equal(photo.model, u"Canon EOS 40D")
        assert_equal(photo.software, u'QuickTime 7.6.6')
        assert_equal(photo.host_computer, u'Mac OS X 10.6.4')
        assert_equal(photo.orientation, 1)
Пример #20
0
    def test_bulk_upload(self):
        event_slug = Event.objects.first().slug
        csv = (
            "personal,family,email,event,role\n" "John,,[email protected],{0},learner\n"
        ).format(event_slug)

        upload_page = self.app.get(reverse("person_bulk_add"), user="******")
        upload_form = upload_page.forms["main-form"]
        upload_form["file"] = Upload("people.csv", csv.encode("utf-8"))

        confirm_page = upload_form.submit().maybe_follow()
        confirm_form = confirm_page.forms["main-form"]

        info_page = confirm_form.submit("confirm").maybe_follow()
        self.assertIn("Successfully created 1 persons and 1 tasks", info_page)
        john_created = Person.objects.filter(personal="John", family="").exists()
        self.assertTrue(john_created)
Пример #21
0
    def test_bulk_upload(self):
        event_slug = Event.objects.first().slug
        csv = (
            'personal,family,email,event,role\n'
            'John,,[email protected],{0},learner\n'
        ).format(event_slug)

        upload_page = self.app.get(reverse('person_bulk_add'), user='******')
        upload_form = upload_page.forms['main-form']
        upload_form['file'] = Upload('people.csv', csv.encode('utf-8'))

        confirm_page = upload_form.submit().maybe_follow()
        confirm_form = confirm_page.forms['main-form']

        info_page = confirm_form.submit('confirm').maybe_follow()
        self.assertIn('Successfully created 1 persons and 1 tasks', info_page)
        john_created = Person.objects.filter(personal='John', family='').exists()
        self.assertTrue(john_created)
Пример #22
0
def test_animated_gif_and_clear(app, submission_user):
    app.set_cookie(*db_utils.create_session(submission_user).split("=", 1))

    form = app.get('/manage/avatar').forms['upload-avatar']
    form['image'] = Upload('loader.gif', read_asset('img/loader.gif'),
                           'image/gif')
    resp = form.submit().follow()
    resp = resp.forms['manage-avatar'].submit().follow()
    avatar_url = resp.html.find(id='avatar')['src']

    with Image.open(get_storage_path(avatar_url)) as avatar:
        assert avatar.n_frames == 12
        assert avatar.size == (100, 100)

    form = app.get('/manage/avatar').forms['upload-avatar']
    form['image'] = None
    resp = form.submit().follow()
    avatar_url = resp.html.find(id='avatar')['src']

    assert avatar_url.startswith('/img/default-avatar-')
Пример #23
0
    def test_proposal_attach_more(self, app, db_session):
        pers = PersonFactory()
        prop = ProposalFactory(people=[pers])
        ProposalStatusFactory(name='Withdrawn')  # Required by code
        db_session.commit()

        # we're logged in and this is ours
        do_login(app, pers)
        resp = app.get(
            url_for(controller='proposal', action='view', id=prop.id))
        resp = resp.click('Add an attachment')

        f = resp.form
        f['attachment'] = Upload("test.ini")
        resp = f.submit()
        resp = resp.follow()

        db_session.expunge_all()

        atts = Attachment.find_all()
        assert len(atts) == 1
        assert '[app:main]' in atts[0].content
Пример #24
0
def test_views_scan_job(client):
    # Add municipality dates
    client.login_admin()

    upload = client.get('/municipalities').click("Daten importieren")
    upload.form['file'] = Upload(
        'test.csv', "Gemeinde;1;-1;Normal;5.1.2019".encode('cp1252'),
        'text/csv')
    assert "Gemeindedaten importiert." in upload.form.submit().follow()

    # Add a normal scan job
    client.logout()
    client.login_member()
    with freeze_time("2019-01-01"):
        add = client.get('/scan-jobs').click(href='/add')
        add.form['type'].select("normal")
        add.form['dispatch_date_normal'].select("2019-01-05")
        add.form['dispatch_boxes'] = "1"
        add.form['dispatch_tax_forms_current_year'] = "2"
        add.form['dispatch_tax_forms_last_year'] = "3"
        add.form['dispatch_tax_forms_older'] = "4"
        add.form['dispatch_single_documents'] = "5"
        add.form['dispatch_cantonal_tax_office'] = "6"
        add.form['dispatch_cantonal_scan_center'] = "7"
        add.form['dispatch_note'] = "Bemerkung zur Abholung"
        added = add.form.submit().follow()
        assert "Scan-Auftrag hinzugefügt." in added
        assert "05.01.2019" in added

        message = client.app.smtp.outbox.pop()
        assert message['From'] == '*****@*****.**'
        assert message['To'] == '*****@*****.**'
        assert message['Reply-To'] == '*****@*****.**'
        payload = message.get_payload(1).get_payload(decode=True)
        payload = payload.decode('utf-8')
        assert "am 05.01.2019 Ihre Sendung abholen" in payload

    # View scan job
    view = client.get('/scan-jobs').click("05.01.2019")
    assert "Scan-Auftrag Nr. 1" in view
    assert "My Municipality" in view
    assert "05.01.2019" in view
    assert all([f">{number}<" in view for number in range(1, 7 + 1)])
    assert "Lieferung an das Steueramt Winterthur am 05.01.2019" in view
    assert "Bemerkung zur Abholung" in view

    # Delivery note
    view = view.click("Lieferschein")
    assert "My Municipality" in view
    assert "05.01.2019" in view
    assert all([f">{number}<" in view for number in range(1, 5 + 1)])
    assert "Lieferung an das Steueramt Winterthur" in view

    # Edit scan job
    client.logout()
    client.login_editor()
    edit = client.get('/scan-jobs').click("05.01.2019").click("Bearbeiten")
    edit.form['dispatch_note'] = "Eine Bemerkung zur Abholung"
    assert "Scan-Auftrag geändert." in edit.form.submit().follow()

    view = client.get('/scan-jobs').click("05.01.2019")
    assert "Scan-Auftrag Nr. 1" in view
    assert "My Municipality" in view
    assert "05.01.2019" in view
    assert all([f">{number}<" in view for number in range(1, 7 + 1)])
    assert "Lieferung an das Steueramt Winterthur am 05.01.2019" in view
    assert "Eine Bemerkung zur Abholung" in view

    client.logout()
    client.login_admin()

    with freeze_time("2019-01-02"):
        edit = client.get('/scan-jobs/unrestricted')\
            .click("05.01.2019").click("Bearbeiten")
        edit.form['return_date'] = "2019-01-10"
        edit.form['return_boxes'] = "8"
        edit.form['return_tax_forms_current_year'] = "9"
        edit.form['return_tax_forms_last_year'] = "10"
        edit.form['return_tax_forms_older'] = "11"
        edit.form['return_single_documents'] = "12"
        edit.form['return_unscanned_tax_forms_current_year'] = "13"
        edit.form['return_unscanned_tax_forms_last_year'] = "14"
        edit.form['return_unscanned_tax_forms_older'] = "15"
        edit.form['return_unscanned_single_documents'] = "16"
        edit.form['return_note'] = "Bemerkung zur Rücksendung"
        assert "Scan-Auftrag geändert." in edit.form.submit().follow()

    view = client.get('/scan-jobs/unrestricted').click("05.01.2019")
    assert "Scan-Auftrag Nr. 1" in view
    assert "My Municipality" in view
    assert "05.01.2019" in view
    assert all([f">{number}<" in view for number in range(1, 16 + 1)])
    assert "Lieferung an das Steueramt Winterthur am 05.01.2019" in view
    assert "Rücksendung an My Municipality am 10.01.2019" in view
    assert "Bemerkung zur Abholung" in view
    assert "Bemerkung zur Rücksendung" in view

    # Check the date hints
    with freeze_time("2019-01-01"):
        edit = client.get('/scan-jobs/unrestricted')\
            .click("05.01.2019").click("Bearbeiten")
        dates = client.post(
            '/dispatch-dates', {
                'csrf_token': edit.form['csrf_token'].value,
                'municipality_id': edit.form['municipality_id'].value
            })
        assert "05.01.2019" in dates

    # Delete scan job
    deleted = client.get('/scan-jobs/unrestricted')\
        .click("05.01.2019").click("Löschen")
    assert deleted.status_int == 200
    assert "05.01.2019" not in client.get('/scan-jobs')

    # Check more mails...
    # ... contacts gets an email (normal) if admins add scan jobs
    with freeze_time("2019-01-01"):
        add = client.get('/scan-jobs').follow().click(href='/add-unrestricted')
        add.form['type'].select("normal")
        add.form['dispatch_date'] = "2019-01-01"
        add.form['dispatch_boxes'] = "1"
        add.form['dispatch_tax_forms_current_year'] = "1"
        added = add.form.submit().follow().follow()
        assert "Scan-Auftrag hinzugefügt." in added
        assert "01.01.2019" in added

        message = client.app.smtp.outbox.pop()
        assert message['From'] == '*****@*****.**'
        assert message['To'] == '*****@*****.**'
        assert message['Reply-To'] == '*****@*****.**'
        payload = message.get_payload(1).get_payload(decode=True)
        payload = payload.decode('utf-8')
        assert "Ihre Sendung abholen" in payload

    # ... contacts gets an email (express) if admins add scan jobs
    with freeze_time("2019-01-02"):
        add = client.get('/scan-jobs').follow().click(href='/add-unrestricted')
        add.form['type'].select("express")
        add.form['dispatch_date'] = "2019-01-02"
        add.form['dispatch_boxes'] = "1"
        add.form['dispatch_tax_forms_current_year'] = "1"
        added = add.form.submit().follow().follow()
        assert "Scan-Auftrag hinzugefügt." in added
        assert "02.01.2019" in added

        message = client.app.smtp.outbox.pop()
        assert message['From'] == '*****@*****.**'
        assert message['To'] == '*****@*****.**'
        assert message['Reply-To'] == '*****@*****.**'
        payload = message.get_payload(1).get_payload(decode=True)
        payload = payload.decode('utf-8')
        assert "Ihr Express-Auftrag wurde entgegengenommen" in payload

    # ... express mails are different for normal users, too
    client.logout()
    client.login_editor()
    with freeze_time("2019-01-01"):
        add = client.get('/scan-jobs').click(href='/add')
        add.form['type'].select("express")
        add.form['dispatch_date_express'] = "2019-01-03"
        add.form['dispatch_boxes'] = "1"
        add.form['dispatch_tax_forms_current_year'] = "1"
        added = add.form.submit().follow()
        assert "Scan-Auftrag hinzugefügt." in added
        assert "03.01.2019" in added

        message = client.app.smtp.outbox.pop()
        assert message['From'] == '*****@*****.**'
        assert message['To'] == '*****@*****.**'
        assert message['Reply-To'] == '*****@*****.**'
        payload = message.get_payload(1).get_payload(decode=True)
        payload = payload.decode('utf-8')
        assert "Ihr Express-Auftrag wurde entgegengenommen" in payload
Пример #25
0
    def test_content_management(self, webtest):

        from kotti.resources import Document
        from kotti.resources import File
        from kotti_image.resources import Image

        save_addable_document = Document.type_info.addable_to
        save_addable_file = File.type_info.addable_to
        save_addable_image = Image.type_info.addable_to

        app = webtest.app
        resp = app.get('/')

        # Add a document
        resp = resp.click('Document', index=0)
        assert "Add Document to Welcome to Kotti" in resp.body
        form = resp.forms['deform']
        form['title'] = "Child One"
        resp = form.submit('save').maybe_follow()
        assert "Item was added" in resp.body
        assert resp.request.path == '/child-one/'

        # Edit the document
        resp = resp.click('Edit')
        assert "Edit Child One" in resp.body
        form = resp.forms['deform']
        form['title'] = "First Child"
        resp = form.submit('save').maybe_follow()
        assert "Your changes have been saved" in resp.body
        resp = resp.click('Edit')
        form = resp.forms['deform']
        assert form['title'].value == "First Child"
        resp = resp.click('Edit')
        assert "First Child" in resp.body

        # And now force a validation error:
        resp = resp.click('Edit')
        form = resp.forms['deform']
        form['title'] = ""
        resp = form.submit('save')
        assert "There was a problem" in resp.body
        assert form['title'].value == ''

        # And now click the 'Cancel' button:
        resp = resp.click('Edit')
        form = resp.forms['deform']
        form['title'] = "Firstborn"
        resp = form.submit('cancel').maybe_follow()
        assert 'deform' not in resp.forms
        assert "Firstborn" not in resp.body

        # Now click the 'Cancel' button for an invalid form entry:
        resp = resp.click('Edit')
        form = resp.forms['deform']
        form['title'] = ""
        resp = form.submit('cancel').maybe_follow()
        assert 'deform' not in resp.forms
        assert "Firstborn" not in resp.body

        # Add two more documents, at different levels
        resp = app.get('/')
        resp = resp.click('Document', index=0)
        form = resp.forms['deform']
        form['title'] = "Second Child"
        resp = form.submit('save').maybe_follow()
        assert "Item was added" in resp.body
        assert resp.request.path == '/second-child/'

        resp = resp.click('Document', index=0)
        form = resp.forms['deform']
        form['title'] = "Grandchild"
        resp = form.submit('save').maybe_follow()
        assert "Item was added" in resp.body
        assert resp.request.path == '/second-child/grandchild/'

        # Add another grandchild with the same name:
        resp = app.get('/second-child/')
        resp = resp.click('Document', index=0)
        form = resp.forms['deform']
        form['title'] = "Grandchild"
        resp = form.submit('save').maybe_follow()
        assert "Item was added" in resp.body
        assert resp.request.path == '/second-child/grandchild-1/'

        # There's no Add link if nothing can be added:
        resp = app.get('/second-child/grandchild-1/')
        try:
            Document.type_info.addable_to = ()
            File.type_info.addable_to = ()
            Image.type_info.addable_to = ()
            with pytest.raises(IndexError):
                resp.click(href='add_')
        finally:
            Document.type_info.addable_to = save_addable_document
            File.type_info.addable_to = save_addable_file
            Image.type_info.addable_to = save_addable_image

        # Add a file
        resp = app.get('/')
        resp = resp.click('File', index=0)
        form = resp.forms['deform']
        form['description'] = "A tiny file"
        form['upload'] = Upload('tiny.txt', 'tiny', 'text/plain')
        resp = form.submit('save').maybe_follow()
        assert "Item was added" in resp.body
        assert resp.request.path == '/tiny.txt/'

        # Add a file larger than maximum file size
        resp = app.get('/')
        resp = resp.click('File', index=0)
        form = resp.forms['deform']
        form['title'] = "Huge file"
        form['description'] = "An uge file"
        form['upload'] = Upload('huge.txt', '*' * (10 * 1024 * 1024 + 1),
                                'text/plain')
        resp = form.submit('save')
        assert "There was a problem" in resp.body
        assert "Maximum file size" in resp.body

        # Add tags to a document:
        resp = app.get('/second-child/')
        resp = resp.click('Document', index=0)
        form = resp.forms['deform']
        form['title'] = "Grandchild"
        form['tags'] = ''
        form.submit('save').maybe_follow()
        resp = app.get('/second-child/')
        resp = resp.click('Document', index=0)
        form = resp.forms['deform']
        form['title'] = "Grandchild"
        form['tags'] = 'tag 1, tag 2,tag 3'
        form.submit('save').maybe_follow()
        resp = app.get('/second-child/grandchild-2/@@edit')
        form = resp.forms['deform']
        assert 'tag 1' in resp.body
        assert 'tag 2' in resp.body
        assert 'tag 3' in resp.body
        form['tags'] = 'tag 1, tag 4, tag 5,tag 6, tag 7, übertag'
        form.submit('save').maybe_follow()
        resp = app.get('/second-child/grandchild-2/@@edit')
        assert 'value="tag 1,tag 4,tag 5,tag 6,tag 7,übertag"' in resp.body

        # Delete a document
        resp = app.get('/second-child/grandchild/')
        resp = resp.click('Delete', index=0)
        form = resp.forms['form-delete']
        resp = form.submit('cancel')
        assert "Grandchild was deleted" not in resp.body
        resp = app.get('/second-child/grandchild/')
        resp = resp.click('Delete', index=0)
        form = resp.forms['form-delete']
        resp = form.submit('delete', value='delete').maybe_follow()
        assert "Grandchild was deleted" in resp.body
        assert resp.request.path == '/second-child/'

        # Copy and paste
        resp = app.get('/second-child/')
        resp = resp.click('Cut', index=0).maybe_follow()
        assert "Second Child was cut" in resp.body
        resp = app.get('/child-one/')
        resp = resp.click('Paste', index=0).maybe_follow()
        assert "Second Child was pasted" in resp.body
        app.get('/second-child/', status=404)
        resp = app.get('/child-one/second-child/')
        resp = resp.click('Copy', index=0).maybe_follow()
        assert "Second Child was copied" in resp.body
        resp = app.get('/')
        resp = resp.click('Paste', index=0).maybe_follow()
        assert "Second Child was pasted" in resp.body

        # We can paste twice since we copied:
        resp = app.get('/')
        resp = resp.click('Paste', index=0).maybe_follow()
        assert "Second Child was pasted" in resp.body
        resp = app.get('/second-child/')
        assert "Second Child" in resp.body
        resp = app.get('/second-child-1/')
        assert "Second Child" in resp.body

        # We can also copy and paste items that contain children,
        # like the whole site:
        resp = app.get('/')
        resp = resp.click('Copy', index=0).maybe_follow()
        assert "Welcome to Kotti was copied" in resp.body
        resp = app.get('/second-child/')
        resp = resp.click('Paste', index=0).maybe_follow()
        assert "Welcome to Kotti was pasted" in resp.body
        resp = app.get('/second-child/welcome-to-kotti/')
        assert resp.status_code == 200
        resp = app.get('/second-child/welcome-to-kotti/second-child/')
        assert resp.status_code == 200

        # And finally cut and paste a tree:
        resp = app.get('/second-child/')
        resp.click('Cut', index=0).maybe_follow()
        resp = app.get('/child-one/second-child/')
        resp = resp.click('Paste', index=0).maybe_follow()
        assert "Second Child was pasted" in resp.body
        app.get('/second-child/', status=404)

        # Note how we can't cut and paste an item into itself:
        resp = app.get('/child-one/')
        resp.click('Cut', index=0).maybe_follow()
        with pytest.raises(IndexError):
            resp.click('Paste', index=0).maybe_follow()
        resp = app.get('/child-one/second-child/')
        with pytest.raises(IndexError):
            resp.click('Paste', index=0).maybe_follow()

        # Whether we can paste or not also depends on the
        # ``type_info.addable`` property:
        resp = app.get('/child-one/')
        resp.click('Copy', index=0).maybe_follow()
        resp = app.get('/child-one/second-child/')
        resp.click('Paste', index=0).maybe_follow()
        try:
            Document.type_info.addable_to = ()
            resp = app.get('/child-one/second-child/')
            with pytest.raises(IndexError):
                resp.click('Paste', index=0).maybe_follow()
        finally:
            Document.type_info.addable_to = save_addable_document

        # You can't cut the root of a site:
        resp = app.get('/child-one/')
        resp.click('Cut', index=0)
        resp = app.get('/')
        with pytest.raises(IndexError):
            resp.click('Cut', index=0)

        # We can rename an item. Slashes will be stripped out.:
        resp = app.get('/child-one/second-child/')
        resp = resp.click('Rename', index=0)
        form = resp.forms['form-rename']
        assert form['name'].value == 'second-child'
        assert form['title'].value == 'Second Child'
        form['name'] = 'thi/rd-ch/ild'
        form['title'] = 'My Third Child'
        resp = form.submit('rename').maybe_follow()
        assert "Item was renamed" in resp.body
        assert resp.request.path == '/child-one/third-child/'

        # We cannot rename the root:
        resp = app.get('/')
        with pytest.raises(IndexError):
            resp.click('Rename', index=0)

        # On setup pages we can't use the actions:
        resp = app.get('/')
        resp = resp.click('User Management', index=0)
        with pytest.raises(IndexError):
            resp.click('Copy', index=0)
        resp = resp.click('Preferences', index=0)
        with pytest.raises(IndexError):
            resp.click('Copy', index=0)

        # Contents view actions
        resp = app.get('/child-one')
        resp = resp.click('Contents', index=0)
        assert resp.request.path == '/child-one/@@contents'
        resp = resp.forms['form-contents'].submit('copy').maybe_follow()
        assert 'You have to select items' in resp.body
        form = self._select_children(resp, 0)
        resp = form.submit('copy').maybe_follow()
        assert 'My Third Child was copied.' in resp.body
        resp = app.get('/second-child-1/@@contents')
        assert 'My Third Child' not in resp.body
        resp = resp.forms['form-contents'].submit('paste').maybe_follow()
        assert 'My Third Child' in resp.body
        resp = app.get('/second-child-1/@@contents')
        form = self._select_children(resp, 0)
        resp = form.submit('cut').maybe_follow()
        assert 'cut.' in resp.body
        resp = app.get('/child-one/@@contents')
        assert "Grandchild" not in resp.body
        resp = resp.forms['form-contents'].submit('paste').maybe_follow()
        assert "Grandchild" in resp.body
        with pytest.raises(IndexError):
            resp.click('Paste')
        resp = app.get('/child-one/@@contents')
        form = self._select_children(resp, 0, 1)
        form.submit('cut').maybe_follow()
        resp = app.get('/')
        resp = resp.click('Document', index=0)
        form = resp.forms['deform']
        form['title'] = 'Forth child'
        form.submit('save').maybe_follow()
        resp = app.get('/forth-child/@@contents')
        assert "Grandchild" not in resp.body
        assert "My Third Child" not in resp.body
        resp.forms['form-contents'].submit('paste').maybe_follow()
        resp = app.get('/forth-child/@@contents')
        assert "Grandchild" in resp.body
        assert "My Third Child" in resp.body
        resp = app.get('/child-one/@@contents')
        assert "Grandchild" not in resp.body
        resp = app.get('/forth-child/@@contents')
        assert 'third-child' in resp.body
        assert 'Grandchild' in resp.body
        assert 'child-the-third' not in resp.body
        assert 'Hello Bob' not in resp.body
        form = self._select_children(resp, 0, 1)
        resp = form.submit('rename_nodes').maybe_follow()
        resp = resp.forms['form-rename-nodes'].submit('cancel').maybe_follow()
        assert 'No changes were made.' in resp.body
        assert resp.request.path == '/forth-child/@@contents'
        form = self._select_children(resp, 0, 1)
        resp = form.submit('rename_nodes').maybe_follow()
        form = resp.forms['form-rename-nodes']
        form[form.submit_fields()[1][0]] = 'child-the-third'
        form[form.submit_fields()[2][0]] = 'child, the third'
        form[form.submit_fields()[4][0]] = 'hello-bob'
        form[form.submit_fields()[5][0]] = 'Hello Bob'
        resp = form.submit('rename_nodes').maybe_follow()
        assert resp.request.path == '/forth-child/@@contents'
        assert 'third-child' not in resp.body
        assert 'Grandchild' not in resp.body
        assert 'child-the-third' in resp.body
        assert 'Hello Bob' in resp.body

        resp = resp.click('File', index=0)
        form = resp.forms['deform']
        form['description'] = 'A file'
        form['upload'] = Upload('some.txt', 'something', 'text/plain')
        form.submit('save').maybe_follow()
        resp = app.get('/forth-child/@@contents')
        form = self._select_children(resp, 0, 1, 2)
        resp = form.submit('delete_nodes').maybe_follow()
        resp = resp.forms['form-delete-nodes'].submit('cancel').maybe_follow()
        assert 'No changes were made.' in resp.body
        assert resp.request.path == '/forth-child/@@contents'
        form = self._select_children(resp, 0, 1, 2)
        resp = form.submit('delete_nodes').maybe_follow()
        assert "Are you sure" in resp.body
        resp = resp.forms['form-delete-nodes'].submit(
            'delete_nodes', status=302).maybe_follow()
        assert "child, the third was deleted." in resp.body
        assert "Hello Bob was deleted." in resp.body
        assert "some.txt was deleted." in resp.body
        resp = app.get('/forth-child/@@contents')
        assert "Welcome to Kotti" in resp.body
        assert '<i class="glyphicon glyphicon-home"></i>' in resp.body
        assert '<i class="glyphicon glyphicon-folder-open"></i>' in resp.body
        assert '<i class="glyphicon glyphicon-folder-close"></i>' not in resp.body  # noqa

        # Contents view change state actions
        resp = resp.click("Second Child")
        resp = resp.click("Contents")
        assert '/second-child-1/third-child/@@workflow-change?new_state=public' in resp.body  # noqa
        resp = app.get(
            '/second-child-1/third-child/@@workflow-change?new_state=public'
        ).maybe_follow()  # noqa
        assert '/second-child-1/third-child/@@workflow-change?new_state=private' in resp.body  # noqa
        resp = app.get('/second-child-1/third-child/@@contents')
        form = self._select_children(resp, 0, 1, 2)
        resp = form.submit('change_state').maybe_follow()
        assert 'Change workflow state' in resp.body
        resp = resp.forms['form-change-state'].submit('cancel').maybe_follow()
        assert 'No changes were made.' in resp.body
        assert resp.request.path == '/second-child-1/third-child/@@contents'
        form = self._select_children(resp, 0, 1, 2)
        resp = form.submit('change_state').maybe_follow()
        form = resp.forms['form-change-state']
        form['children-to-change-state'] = []
        resp = form.submit('change_state').maybe_follow()
        assert 'No changes were made.' in resp.body
        form = self._select_children(resp, 0, 1, 2)
        resp = form.submit('change_state').maybe_follow()
        form = resp.forms['form-change-state']
        form['to-state'] = 'public'
        resp = form.submit('change_state').maybe_follow()
        assert 'Your changes have been saved.' in resp.body
        assert '/second-child-1/third-child/grandchild-1/@@workflow-change?new_state=private' in resp.body  # noqa
        assert '/second-child-1/third-child/grandchild-2/@@workflow-change?new_state=private' in resp.body  # noqa
        assert '/second-child-1/third-child/grandchild-3/@@workflow-change?new_state=private' in resp.body  # noqa

        resp = resp.click('My Third Child')
        assert '/second-child-1/third-child/child-one/@@workflow-change?new_state=public' in resp.body  # noqa
        app.get(
            '/second-child-1/third-child/child-one/@@workflow-change?new_state=public'
        )  # noqa
        resp = app.get('/second-child-1/third-child/@@contents')
        assert '/second-child-1/third-child/child-one/@@workflow-change?new_state=private' in resp.body  # noqa
        resp = resp.click('First Child', index=1)
        resp = resp.click('Document', index=0)
        form = resp.forms['deform']
        form['title'] = 'Sub child'
        resp = form.submit('save').maybe_follow()
        assert '/second-child-1/third-child/child-one/sub-child/@@workflow-change?new_state=public' in resp.body  # noqa
        resp = resp.click("Second Child", index=0)
        resp = resp.click("Contents")
        form = self._select_children(resp, 0, 1, 2)
        resp = form.submit('change_state').maybe_follow()
        form = resp.forms['form-change-state']
        form['include-children'] = 'include-children'
        form['to-state'] = 'public'
        resp = form.submit('change_state').maybe_follow()
        assert 'Your changes have been saved.' in resp.body
        assert '/second-child-1/third-child/@@workflow-change?new_state=private' in resp.body
        resp = app.get('/second-child-1/third-child/child-one/sub-child/')
        assert '/second-child-1/third-child/child-one/sub-child/@@workflow-change?new_state=private' in resp.body

        # Navigation
        resp = resp.click("Navigate")
        resp = resp.click("Second Child", index=0)
        assert resp.request.path == '/second-child-1/'
Пример #26
0
 def add_file2(self, resp, contents=b"ABC"):
     form = resp.forms["deform"]
     form["upload"] = Upload("my_image.gif", contents, "image/gif")
     return form.submit().maybe_follow()
Пример #27
0
 def add_file2(self, resp, contents=b'ABC'):
     form = resp.forms['deform']
     form['upload'] = Upload('my_image.gif', contents, 'image/gif')
     return form.submit().maybe_follow()
Пример #28
0
def test_views_report(client):
    # Add a municipality with dates
    client.login_admin()

    add = client.get('/municipalities').click(href='/add')
    add.form['name'] = "Adlikon"
    add.form['bfs_number'] = '1'
    add.form['payment_type'] = 'normal'
    assert "Adlikon" in add.form.submit().follow()

    upload = client.get('/municipalities').click("Daten importieren")
    upload.form['file'] = Upload(
        'test.csv', "Gemeinde;1;-1;Normal;5.1.2019".encode('cp1252'),
        'text/csv')
    assert "Gemeindedaten importiert." in upload.form.submit().follow()

    # Add a scan job
    with freeze_time("2019-01-01"):
        add = client.get('/scan-jobs/unrestricted').click(href='/add')
        add.form['type'].select("normal")
        add.form['municipality_id'].select(text="Adlikon (1)")
        add.form['dispatch_date'] = "2019-01-05"
        add.form['dispatch_boxes'] = "1111"
        add.form['dispatch_cantonal_tax_office'] = "2222"
        add.form['dispatch_cantonal_scan_center'] = "3333"
        add.form['dispatch_tax_forms_older'] = "4444"
        add.form['dispatch_tax_forms_last_year'] = "5555"
        add.form['dispatch_tax_forms_current_year'] = "6666"
        add.form['dispatch_single_documents'] = "7777"
        assert "Scan-Auftrag hinzugefügt." in add.form.submit().maybe_follow()

        edit = client.get('/scan-jobs/unrestricted')\
            .click("05.01.2019").click("Bearbeiten")
        edit.form['return_date'] = "2019-01-10"
        edit.form['return_boxes'] = "8888"
        edit.form['return_tax_forms_older'] = "9600"
        edit.form['return_tax_forms_last_year'] = "9700"
        edit.form['return_tax_forms_current_year'] = "9800"
        edit.form['return_single_documents'] = "9900"
        edit.form['return_unscanned_tax_forms_older'] = "96"
        edit.form['return_unscanned_tax_forms_last_year'] = "97"
        edit.form['return_unscanned_tax_forms_current_year'] = "98"
        edit.form['return_unscanned_single_documents'] = "99"
        assert "Scan-Auftrag geändert." in edit.form.submit().maybe_follow()

    def get_report(report_type, start, end, scan_job_type='all'):
        select = client.get('/report')
        select.form['start'] = start
        select.form['end'] = end
        select.form['report_type'].select(report_type)
        select.form['scan_job_type'].select(scan_job_type)
        select.form['municipality_id'].select(text='Adlikon (1)')
        return select.form.submit().follow()

    # Boxes
    view = get_report('boxes', '2019-01-01', '2019-01-05')
    assert "1111" in view
    assert "2222" in view
    assert "3333" in view
    assert "8888" in view

    view = get_report('boxes', '2019-01-06', '2019-01-10')
    assert "1111" not in view
    assert "2222" not in view
    assert "3333" not in view
    assert "8888" not in view

    # Boxes and forms
    view = get_report('boxes_and_forms', '2019-01-01', '2019-01-05')
    assert "8888" in view
    assert "9504" in view
    assert "9603" in view
    assert "9702" in view
    assert "9801" in view

    view = get_report('boxes_and_forms', '2019-01-06', '2019-01-10')
    assert "8888" not in view
    assert "9504" not in view
    assert "9603" not in view
    assert "9702" not in view
    assert "9801" not in view

    # Forms
    view = get_report('forms', '2019-01-01', '2019-01-05')
    assert "9504" in view
    assert "9603" in view
    assert "9702" in view

    view = get_report('forms', '2019-01-06', '2019-01-10')
    assert "9504" not in view
    assert "9603" not in view
    assert "9702" not in view

    # All forms
    view = get_report('all_forms', '2019-01-01', '2019-01-05')
    assert "9504" in view
    assert "9603" in view
    assert "9702" in view

    view = get_report('all_forms', '2019-01-06', '2019-01-10')
    assert "9504" not in view
    assert "9603" not in view
    assert "9702" not in view

    # By delivery
    view = get_report('delivery', '2019-01-01', '2019-01-05')
    assert "8888" in view
    assert "9504" in view
    assert "9603" in view
    assert "9702" in view
    assert "9801" in view

    view = get_report('delivery', '2019-01-06', '2019-01-10')
    assert "8888" not in view
    assert "9504" not in view
    assert "9603" not in view
    assert "9702" not in view
    assert "9801" not in view
Пример #29
0
class RangeProductViewTest(WebTestCase):
    is_staff = True

    def setUp(self):
        super(RangeProductViewTest, self).setUp()
        self.range = Range.objects.create(name='dummy')
        self.url = reverse('dashboard:range-products', args=(self.range.id, ))
        self.product1 = create_product(title='Product 1',
                                       partner_sku='123123',
                                       partner_name='Partner 1')
        self.product2 = create_product(title='Product 2',
                                       partner_sku='123123',
                                       partner_name='Partner 2')
        self.product3 = create_product(partner_sku='456')
        self.product4 = create_product(partner_sku='789')

    def test_upload_file_with_skus(self):
        range_products_page = self.get(self.url)
        form = range_products_page.form
        form['file_upload'] = Upload('new_skus.txt', b'456')
        form.submit().follow()
        all_products = self.range.all_products()
        self.assertEquals(len(all_products), 1)
        self.assertTrue(self.product3 in all_products)
        range_product_file_upload = RangeProductFileUpload.objects.get()
        self.assertEquals(range_product_file_upload.range, self.range)
        self.assertEquals(range_product_file_upload.num_new_skus, 1)
        self.assertEquals(range_product_file_upload.status,
                          RangeProductFileUpload.PROCESSED)
        self.assertEquals(range_product_file_upload.size, 3)

    def test_dupe_skus_warning(self):
        self.range.add_product(self.product3)
        range_products_page = self.get(self.url)
        form = range_products_page.forms[0]
        form['query'] = '456'
        response = form.submit()
        self.assertEquals(list(response.context['messages']), [])
        self.assertEquals(response.context['form'].errors['query'], [
            'The products with SKUs or UPCs matching 456 are already in this range'
        ])

        form = response.forms[0]
        form['query'] = '456, 789'
        response = form.submit().follow()
        messages = list(response.context['messages'])
        self.assertEquals(len(messages), 2)
        self.assertEquals(messages[0].level, SUCCESS)
        self.assertEquals(messages[0].message, '1 product added to range')
        self.assertEquals(messages[1].level, WARNING)
        self.assertEquals(
            messages[1].message,
            'The products with SKUs or UPCs matching 456 are already in this range'
        )

    def test_missing_skus_warning(self):
        range_products_page = self.get(self.url)
        form = range_products_page.form
        form['query'] = '321'
        response = form.submit()
        self.assertEquals(list(response.context['messages']), [])
        self.assertEquals(response.context['form'].errors['query'],
                          ['No products exist with a SKU or UPC matching 321'])
        form = range_products_page.form
        form['query'] = '456, 321'
        response = form.submit().follow()
        messages = list(response.context['messages'])
        self.assertEquals(len(messages), 2)
        self.assertEquals(messages[0].level, SUCCESS)
        self.assertEquals(messages[0].message, '1 product added to range')
        self.assertEquals(messages[1].level, WARNING)
        self.assertEquals(
            messages[1].message,
            'No product(s) were found with SKU or UPC matching 321')

    @parameterized.expand([('query', '123123'),
                           ('file_upload', Upload('skus.txt', b'123123'))])
    def test_same_skus_within_different_products_warning(
            self, field_name, field_value):
        range_products_page = self.get(self.url)
        form = range_products_page.form
        form[field_name] = field_value
        response = form.submit().follow()
        messages = list(response.context['messages'])
        self.assertEquals(len(messages), 2)
        self.assertEquals(messages[1].level, WARNING)
        self.assertEquals(messages[1].message,
                          'There are more than one product with SKU 123123')
Пример #30
0
def test_vote_upload(swissvotes_app, attachments):
    names = attachments.keys()

    swissvotes_app.session().add(
        SwissVote(
            bfs_number=Decimal('100.1'),
            date=date(1990, 6, 2),
            legislation_number=4,
            legislation_decade=NumericRange(1990, 1994),
            title_de="Vote DE",
            title_fr="Vote FR",
            short_title_de="V D",
            short_title_fr="V F",
            keyword="Keyword",
            votes_on_same_day=2,
            _legal_form=3,
            initiator="Initiator",
        ))
    commit()

    client = Client(swissvotes_app)
    client.get('/locale/de_CH').follow()

    login = client.get('/auth/login')
    login.form['username'] = '******'
    login.form['password'] = '******'
    login.form.submit()

    manage = client.get('/').maybe_follow().click("Abstimmungen")
    manage = manage.click("Details").click("Anhänge verwalten")
    for name in names:
        manage.form[name] = Upload(
            f'{name}.png',  # ignored
            attachments[name].reference.file.read(),
            'image/png'  # ignored
        )
    manage = manage.form.submit().follow()
    assert "Anhänge aktualisiert" in manage

    for name in names:
        name = name.replace('_', '-')
        page = client.get(manage.pyquery(f'a.{name}')[0].attrib['href'])
        assert page.content_type in (
            'application/pdf', 'application/zip', 'application/vnd.ms-office',
            'application/octet-stream',
            'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
        )
        assert page.content_length
        assert page.body
        assert page.content_disposition.startswith('inline; filename=100.1')

    # Fallback
    client.get('/locale/en_US').follow()
    manage = client.get('/').maybe_follow().click("Votes")
    manage = manage.click("Details")
    for name in names:
        name = name.replace('_', '-')
        page = client.get(manage.pyquery(f'a.{name}')[0].attrib['href'])
        assert page.content_type in (
            'application/pdf', 'application/zip', 'application/vnd.ms-office',
            'application/octet-stream',
            'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
        )
        assert page.content_length
        assert page.body
        assert page.content_disposition.startswith('inline; filename=100.1')