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
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
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
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
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')
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')
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')
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>")
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)
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
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)
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)
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)
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)
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')
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)
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
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)
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)
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)
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)
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-')
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
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
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/'
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()
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()
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
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')
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')