812 lines
27 KiB
Python
812 lines
27 KiB
Python
import tempfile
|
|
import uuid
|
|
import zipfile
|
|
|
|
from django.contrib.auth.models import Group, User
|
|
from django.utils import translation
|
|
|
|
import pytest
|
|
from webtest import Upload
|
|
|
|
from docbow_project.docbow.models import (
|
|
AttachedFile,
|
|
DeletedDocument,
|
|
Document,
|
|
FileType,
|
|
MailingList,
|
|
FileTypeAttachedFileKind,
|
|
)
|
|
from utils import assert_can_see_doc, assert_cannot_see_doc, send_file
|
|
|
|
MEDIA_ROOT = tempfile.mkdtemp()
|
|
|
|
|
|
def assert_field_not_in_form(field, form):
|
|
with pytest.raises(AssertionError):
|
|
form[field]
|
|
|
|
|
|
def delete_doc(app, user):
|
|
app.login(user.username)
|
|
resp = app.get('/inbox/')
|
|
assert resp.status_code == 200
|
|
delete_form = resp.forms[1]
|
|
resp = delete_form.submit()
|
|
assert resp.status_code == 302
|
|
app.logout()
|
|
|
|
|
|
def find_delegate_form(forms):
|
|
for form in forms.values():
|
|
if 'delegate-create' in form.fields:
|
|
return form
|
|
|
|
|
|
def create_delegate(app, user, delegate):
|
|
app.login(username=user.username)
|
|
resp = app.get('/profile/')
|
|
assert resp.status_code == 200
|
|
delegate_form = find_delegate_form(resp.forms)
|
|
delegate_form['delegate-existing_user'] = '%s' % delegate.pk
|
|
resp = delegate_form.submit('delegate-create')
|
|
assert resp.status_code == 302
|
|
delegate = User.objects.get(pk=delegate.pk)
|
|
assert not delegate.docbowprofile.is_guest
|
|
assert delegate.delegations_by.count() == 1
|
|
assert delegate.delegations_by.first().by == user
|
|
app.logout()
|
|
return delegate
|
|
|
|
|
|
def create_guest_delegate(app, user, first_name, last_name, email):
|
|
app.login(username=user.username)
|
|
resp = app.get('/profile/')
|
|
assert resp.status_code == 200
|
|
delegate_form = find_delegate_form(resp.forms)
|
|
delegate_form['delegate-first_name'] = first_name
|
|
delegate_form['delegate-last_name'] = last_name
|
|
delegate_form['delegate-email'] = email
|
|
resp = delegate_form.submit('delegate-create')
|
|
assert resp.status_code == 302
|
|
delegate = User.objects.get(email=email)
|
|
assert delegate.docbowprofile.is_guest
|
|
assert delegate.delegations_by.count() == 1
|
|
assert delegate.delegations_by.first().by == user
|
|
app.logout()
|
|
delegate.set_password('password')
|
|
delegate.save()
|
|
return delegate
|
|
|
|
|
|
def test_login_logout(app, users):
|
|
resp = app.get('/')
|
|
assert resp.status_code == 302
|
|
assert resp.url.endswith('/accounts/login/?next=/')
|
|
|
|
resp = app.login()
|
|
assert resp.location.endswith('/inbox')
|
|
resp = app.get('/')
|
|
assert resp.status_code == 302
|
|
assert resp.url.endswith('/inbox/')
|
|
|
|
resp = app.get('/inbox/')
|
|
assert resp.status_code == 200
|
|
|
|
resp = app.logout()
|
|
assert resp.url.endswith('/inbox/')
|
|
|
|
|
|
def test_sendfile_selector(app, filetypes, users):
|
|
app.login()
|
|
resp = app.get('/send_file/')
|
|
for ft in FileType.objects.all():
|
|
assert ft.name in resp.text
|
|
assert u'<a href="/send_file/%s/?">' % ft.pk in resp.text
|
|
|
|
|
|
def test_sendfile(app, filetypes, users, settings):
|
|
settings.DEBUG = True
|
|
settings.MEDIA_ROOT = MEDIA_ROOT
|
|
sender = User.objects.get(username='user-1')
|
|
recipient1, recipient2 = User.objects.get(username='user-2'), User.objects.get(username='user-3')
|
|
app.login()
|
|
ft = FileType.objects.first()
|
|
resp = app.get('/send_file/%s/' % ft.pk)
|
|
form = resp.form
|
|
form['content_1'] = Upload('readme.rst', b'data')
|
|
form['recipients'] = ['user-%s' % recipient1.pk, 'user-%s' % recipient2.pk]
|
|
resp = form.submit('send')
|
|
|
|
assert resp.status_code == 302
|
|
assert resp.location.endswith('/outbox/')
|
|
|
|
doc = Document.objects.first()
|
|
assert len(doc.delivered_to()) == 2
|
|
assert recipient1 in doc.delivered_to()
|
|
assert recipient2 in doc.delivered_to()
|
|
assert doc.filenames() == 'readme.rst'
|
|
assert doc.sender == sender
|
|
|
|
|
|
def test_sendfile_extra_senders(app, filetypes, users, settings):
|
|
settings.MEDIA_ROOT = MEDIA_ROOT
|
|
settings.EXTRA_SENDERS = True
|
|
sender = User.objects.get(username='user-1')
|
|
recipient1, recipient2 = User.objects.get(username='user-2'), User.objects.get(username='user-3')
|
|
extra_sender1, extra_sender2 = User.objects.get(username='user-4'), User.objects.get(username='user-5')
|
|
app.login()
|
|
ft = FileType.objects.first()
|
|
resp = app.get('/send_file/%s/' % ft.pk)
|
|
form = resp.form
|
|
form['content_1'] = Upload('readme.rst', b'data')
|
|
form['recipients'] = ['user-%s' % recipient1.pk, 'user-%s' % recipient2.pk]
|
|
form['extra_senders'] = ['%s' % extra_sender1.pk, '%s' % extra_sender2.pk]
|
|
resp = form.submit('send')
|
|
|
|
assert resp.status_code == 302
|
|
assert resp.location.endswith('/outbox/')
|
|
|
|
doc = Document.objects.first()
|
|
assert len(doc.delivered_to()) == 2
|
|
assert recipient1 in doc.delivered_to()
|
|
assert recipient2 in doc.delivered_to()
|
|
assert doc.filenames() == 'readme.rst'
|
|
assert doc.sender == sender
|
|
assert doc.extra_senders.count() == 2
|
|
assert doc.extra_senders.filter(pk=extra_sender1.pk).exists()
|
|
assert doc.extra_senders.filter(pk=extra_sender2.pk).exists()
|
|
|
|
# extra senders in outbox column
|
|
resp = app.get('/outbox/')
|
|
assert extra_sender1.username in resp.text
|
|
assert extra_sender2.username in resp.text
|
|
|
|
# extra senders in outbox message title
|
|
resp = app.get('/outbox/%s/' % doc.pk)
|
|
assert extra_sender1.username in resp.text
|
|
assert extra_sender2.username in resp.text
|
|
|
|
# delete doc
|
|
resp = app.get('/outbox/')
|
|
assert resp.status_code == 200
|
|
delete_form = resp.forms[2]
|
|
delete_form['selection'] = doc.pk
|
|
resp = delete_form.submit('delete')
|
|
assert resp.status_code == 302
|
|
assert resp.location.endswith('/outbox/')
|
|
|
|
# extra senders in trash outbox column
|
|
resp = app.get('/outbox/trash/')
|
|
assert extra_sender1.username in resp.text
|
|
assert extra_sender2.username in resp.text
|
|
|
|
# doc show up in extra sender outbox
|
|
assert_can_see_doc(app, doc, extra_sender1, inbox=False)
|
|
assert_can_see_doc(app, doc, extra_sender2, inbox=False)
|
|
|
|
# extra senders in inbox column
|
|
app.login(recipient1.username)
|
|
resp = app.get('/inbox/')
|
|
assert extra_sender1.username in resp.text
|
|
assert extra_sender2.username in resp.text
|
|
|
|
# extra senders in inbox message title
|
|
resp = app.get('/inbox/%s/' % doc.pk)
|
|
assert extra_sender1.username in resp.text
|
|
assert extra_sender2.username in resp.text
|
|
|
|
# delete doc
|
|
resp = app.get('/inbox/')
|
|
assert resp.status_code == 200
|
|
delete_form = resp.forms[2]
|
|
delete_form['selection'] = doc.pk
|
|
resp = delete_form.submit('delete')
|
|
assert resp.status_code == 302
|
|
assert resp.location.endswith('/inbox/')
|
|
|
|
# extra senders in trash inbox column
|
|
resp = app.get('/inbox/trash/')
|
|
assert extra_sender1.username in resp.text
|
|
assert extra_sender2.username in resp.text
|
|
|
|
|
|
def test_extra_senders_disabled_by_default(app, filetypes, users, settings):
|
|
settings.MEDIA_ROOT = MEDIA_ROOT
|
|
recipient = User.objects.get(username='user-2')
|
|
app.login()
|
|
ft = FileType.objects.first()
|
|
resp = app.get('/send_file/%s/' % ft.pk)
|
|
form = resp.form
|
|
assert 'extra_senders' not in form.fields
|
|
form['content_1'] = Upload('readme.rst', b'data')
|
|
form['recipients'] = ['user-%s' % recipient.pk]
|
|
resp = form.submit('send')
|
|
|
|
assert resp.status_code == 302
|
|
assert resp.location.endswith('/outbox/')
|
|
resp = app.get('/outbox/')
|
|
assert 'Additional senders' not in resp.text
|
|
resp = app.get('/outbox/trash/')
|
|
assert 'Additional senders' not in resp.text
|
|
resp = app.get('/inbox/')
|
|
assert 'Additional senders' not in resp.text
|
|
resp = app.get('/inbox/trash/')
|
|
assert 'Additional senders' not in resp.text
|
|
|
|
|
|
def test_sendfile_reply_to(app, filetypes, users, settings):
|
|
settings.MEDIA_ROOT = MEDIA_ROOT
|
|
sender = User.objects.get(username='user-1')
|
|
recipient = User.objects.get(username='user-2')
|
|
app.login()
|
|
ft = FileType.objects.first()
|
|
resp = app.get('/send_file/%s/' % ft.pk)
|
|
form = resp.form
|
|
form['content_1'] = Upload('readme.rst', b'data')
|
|
form['recipients'] = ['user-%s' % recipient.pk]
|
|
resp = form.submit('send')
|
|
|
|
assert resp.status_code == 302
|
|
assert resp.location.endswith('/outbox/')
|
|
|
|
doc = Document.objects.first()
|
|
assert len(doc.delivered_to()) == 1
|
|
assert recipient in doc.delivered_to()
|
|
assert doc.filenames() == 'readme.rst'
|
|
assert doc.sender == sender
|
|
|
|
app.login(recipient.username)
|
|
resp = app.get('/inbox/%s/' % doc.pk)
|
|
assert resp.status_code == 200
|
|
|
|
# reply
|
|
resp = resp.forms[0].submit()
|
|
assert resp.status_code == 200
|
|
resp = resp.click(filetypes[0].name)
|
|
form = resp.form
|
|
form['content_1'] = Upload('readme.rst', b'data')
|
|
resp = form.submit('send')
|
|
assert resp.status_code == 302
|
|
assert resp.location.endswith('/outbox/')
|
|
doc = Document.objects.exclude(pk=doc.pk).first()
|
|
assert len(doc.delivered_to()) == 1
|
|
assert sender in doc.delivered_to()
|
|
assert doc.filenames() == 'readme.rst'
|
|
assert doc.sender == recipient
|
|
|
|
assert_can_see_doc(app, doc, recipient, inbox=False)
|
|
assert_can_see_doc(app, doc, sender, inbox=True)
|
|
|
|
|
|
def test_sendfile_reply_to_extra_senders(app, filetypes, users, settings):
|
|
settings.MEDIA_ROOT = MEDIA_ROOT
|
|
settings.EXTRA_SENDERS = True
|
|
sender = User.objects.get(username='user-1')
|
|
recipient = User.objects.get(username='user-2')
|
|
extra_sender1, extra_sender2 = User.objects.get(username='user-4'), User.objects.get(username='user-5')
|
|
app.login()
|
|
ft = FileType.objects.first()
|
|
resp = app.get('/send_file/%s/' % ft.pk)
|
|
form = resp.form
|
|
form['content_1'] = Upload('readme.rst', b'data')
|
|
form['recipients'] = ['user-%s' % recipient.pk]
|
|
form['extra_senders'] = ['%s' % extra_sender1.pk, '%s' % extra_sender2.pk]
|
|
resp = form.submit('send')
|
|
|
|
assert resp.status_code == 302
|
|
assert resp.location.endswith('/outbox/')
|
|
|
|
doc = Document.objects.first()
|
|
assert len(doc.delivered_to()) == 1
|
|
assert recipient in doc.delivered_to()
|
|
assert doc.filenames() == 'readme.rst'
|
|
assert doc.sender == sender
|
|
|
|
app.login(recipient.username)
|
|
resp = app.get('/inbox/%s/' % doc.pk)
|
|
assert resp.status_code == 200
|
|
|
|
# reply
|
|
resp = resp.forms[0].submit()
|
|
assert resp.status_code == 200
|
|
resp = resp.click(filetypes[0].name)
|
|
form = resp.form
|
|
form['content_1'] = Upload('readme.rst', b'data')
|
|
# no extra sender on reply
|
|
assert 'extra_senders' not in form.fields
|
|
resp = form.submit('send')
|
|
assert resp.status_code == 302
|
|
assert resp.location.endswith('/outbox/')
|
|
doc = Document.objects.exclude(pk=doc.pk).first()
|
|
assert len(doc.delivered_to()) == 3
|
|
assert sender in doc.delivered_to()
|
|
assert extra_sender1 in doc.delivered_to()
|
|
assert extra_sender2 in doc.delivered_to()
|
|
assert doc.filenames() == 'readme.rst'
|
|
assert doc.sender == recipient
|
|
|
|
assert_can_see_doc(app, doc, sender, inbox=True)
|
|
assert_can_see_doc(app, doc, extra_sender1, inbox=True)
|
|
assert_can_see_doc(app, doc, extra_sender2, inbox=True)
|
|
|
|
|
|
def test_sendfile_mailing_list(app, filetypes, users, settings):
|
|
settings.MEDIA_ROOT = MEDIA_ROOT
|
|
sender = User.objects.get(username='user-1')
|
|
ml = MailingList.objects.create(name='test')
|
|
recipient1, recipient2 = User.objects.get(username='user-2'), User.objects.get(username='user-3')
|
|
ml.members.add(recipient1, recipient2)
|
|
ft = FileType.objects.first()
|
|
|
|
app.login()
|
|
resp = app.get('/send_file/%s/' % ft.pk)
|
|
form = resp.form
|
|
form['content_1'] = Upload('readme.rst', b'data')
|
|
form['recipients'] = ['list-%s' % ml.pk]
|
|
resp = form.submit('send')
|
|
|
|
assert resp.status_code == 302
|
|
assert resp.location.endswith('/outbox/')
|
|
doc = Document.objects.first()
|
|
assert len(doc.delivered_to()) == 2
|
|
assert recipient1 in doc.delivered_to()
|
|
assert recipient2 in doc.delivered_to()
|
|
assert doc.filenames() == 'readme.rst'
|
|
assert doc.sender == sender
|
|
|
|
|
|
def test_outbox_doc(app, filetypes, users, settings):
|
|
sender = User.objects.get(username='user-1')
|
|
recipient = User.objects.get(username='user-2')
|
|
send_file(app, settings, sender, recipient)
|
|
|
|
doc = Document.objects.get(sender=sender)
|
|
af = AttachedFile.objects.first()
|
|
app.login(sender.username)
|
|
resp = app.get('/outbox/%s/' % doc.pk)
|
|
assert resp.status_code == 200
|
|
assert '%s/readme.rst' % af.pk in resp.text
|
|
|
|
# download doc
|
|
resp = app.get('/outbox/%s/%s/readme.rst' % (doc.pk, af.pk))
|
|
assert resp.status_code == 200
|
|
assert resp.content_type == 'application/octet-stream'
|
|
assert resp.content == b'data'
|
|
|
|
# delete doc
|
|
resp = app.get('/outbox/')
|
|
assert resp.status_code == 200
|
|
delete_form = resp.forms[2]
|
|
delete_form['selection'] = doc.pk
|
|
resp = delete_form.submit('delete')
|
|
assert resp.status_code == 302
|
|
assert resp.location.endswith('/outbox/')
|
|
|
|
assert DeletedDocument.objects.get(user=sender, document=doc, soft_delete=True)
|
|
assert_can_see_doc(app, doc, sender, inbox=False, trash=True)
|
|
|
|
# go to trash and restore
|
|
app.login(sender.username)
|
|
resp = app.get('/outbox/trash/')
|
|
assert '/outbox/%s/restore' % doc.pk in resp.text
|
|
restore_form = resp.forms[0]
|
|
resp = restore_form.submit()
|
|
assert resp.location.endswith('/outbox/trash/')
|
|
assert_can_see_doc(app, doc, sender, inbox=False)
|
|
|
|
|
|
def test_outbox_trash_link(app, filetypes, users, settings):
|
|
settings.LANGUAGE_CODE = 'en-us'
|
|
sender = User.objects.get(username='user-1')
|
|
recipient = User.objects.get(username='user-2')
|
|
send_file(app, settings, sender, recipient)
|
|
Document.objects.get(sender=sender)
|
|
AttachedFile.objects.first()
|
|
app.login(sender.username)
|
|
|
|
# trash disabled by default, no link
|
|
resp = app.get('/outbox/')
|
|
assert 'Trash' not in resp.text
|
|
|
|
# enable trash
|
|
settings.TRASH_DURATION = 1
|
|
resp = app.get('/outbox/')
|
|
assert 'Trash' in resp.text
|
|
|
|
|
|
def test_inbox_doc(app, filetypes, users, settings):
|
|
sender = User.objects.get(username='user-1')
|
|
recipient = User.objects.get(username='user-2')
|
|
send_file(app, settings, sender, recipient)
|
|
|
|
doc = Document.objects.get(sender=sender)
|
|
af = AttachedFile.objects.first()
|
|
app.login(recipient.username)
|
|
resp = app.get('/inbox/%s/' % doc.pk)
|
|
assert resp.status_code == 200
|
|
doc = Document.objects.first()
|
|
assert '%s/readme.rst' % af.pk in resp.text
|
|
|
|
# download doc
|
|
resp = app.get('/inbox/%s/%s/readme.rst' % (doc.pk, af.pk))
|
|
assert resp.status_code == 200
|
|
assert resp.content_type == 'application/octet-stream'
|
|
assert resp.content == b'data'
|
|
|
|
# delete doc
|
|
resp = app.get('/inbox/')
|
|
assert resp.status_code == 200
|
|
delete_form = resp.forms[1]
|
|
resp = delete_form.submit()
|
|
assert resp.status_code == 302
|
|
assert resp.location.endswith('/inbox/?page=1')
|
|
|
|
assert DeletedDocument.objects.get(user=recipient, document=doc)
|
|
assert_can_see_doc(app, doc, recipient, inbox=True, trash=True)
|
|
|
|
# go to trash and restore
|
|
app.login(recipient.username)
|
|
resp = app.get('/inbox/trash/')
|
|
assert '/inbox/%s/restore' % doc.pk in resp.text
|
|
restore_form = resp.forms[0]
|
|
resp = restore_form.submit()
|
|
assert resp.location.endswith('/inbox/trash/')
|
|
assert_can_see_doc(app, doc, recipient)
|
|
|
|
|
|
def test_inbox_trash_link(app, filetypes, users, settings):
|
|
settings.LANGUAGE_CODE = 'en-us'
|
|
sender = User.objects.get(username='user-1')
|
|
recipient = User.objects.get(username='user-2')
|
|
send_file(app, settings, sender, recipient)
|
|
Document.objects.get(sender=sender)
|
|
AttachedFile.objects.first()
|
|
app.login(recipient.username)
|
|
|
|
# trash disabled by default, no link
|
|
resp = app.get('/inbox/')
|
|
assert 'Trash' not in resp.text
|
|
|
|
# enable trash
|
|
settings.TRASH_DURATION = 1
|
|
resp = app.get('/inbox/')
|
|
assert 'Trash' in resp.text
|
|
|
|
|
|
def test_inbox_unseen_doc(app, filetypes, users, settings):
|
|
sender = User.objects.get(username='user-1')
|
|
recipient = User.objects.get(username='user-2')
|
|
stranger = User.objects.get(username='user-3')
|
|
send_file(app, settings, sender, recipient)
|
|
doc = Document.objects.first()
|
|
af = AttachedFile.objects.first()
|
|
send_file(app, settings, sender, recipient)
|
|
send_file(app, settings, sender, stranger)
|
|
|
|
app.login(recipient.username)
|
|
with translation.override('en'):
|
|
resp = app.get('/inbox/')
|
|
assert 'inbox_menu (2)' in resp.text
|
|
resp = app.get('/inbox/%s/%s/readme.rst' % (doc.pk, af.pk))
|
|
resp = app.get('/inbox/')
|
|
assert 'inbox_menu (1)' in resp.text
|
|
|
|
|
|
def test_delete_doc(app, filetypes, users, settings):
|
|
sender = User.objects.get(username='user-1')
|
|
recipient = User.objects.get(username='user-2')
|
|
send_file(app, settings, sender, recipient)
|
|
|
|
doc = Document.objects.get(sender=sender)
|
|
assert DeletedDocument.objects.count() == 0
|
|
app.login(recipient.username)
|
|
resp = app.get('/inbox/')
|
|
assert 'data-id="%s"' % doc.pk in resp.text
|
|
resp = app.get('/inbox/%s/delete/' % doc.pk)
|
|
assert resp.status_code == 200
|
|
resp = resp.form.submit()
|
|
assert resp.status_code == 302
|
|
assert resp.location.endswith('/inbox/?page=1')
|
|
# soft delete, doc still available
|
|
resp = app.get('/inbox/%s/' % doc.pk)
|
|
assert resp.status_code == 200
|
|
# not showing up in inbox
|
|
resp = app.get('/inbox/')
|
|
assert 'data-id="%s"' % doc.pk not in resp.text
|
|
# showing up in trash
|
|
resp = app.get('/inbox/trash/')
|
|
assert 'data-id="%s"' % doc.pk in resp.text
|
|
|
|
deleted_document = DeletedDocument.objects.get(document=doc, user=recipient)
|
|
assert deleted_document.soft_delete
|
|
assert deleted_document.soft_delete_date
|
|
|
|
|
|
def test_delete_doc_through_inbox(app, filetypes, users, settings):
|
|
sender = User.objects.get(username='user-1')
|
|
recipient = User.objects.get(username='user-2')
|
|
send_file(app, settings, sender, recipient)
|
|
|
|
doc = Document.objects.get(sender=sender)
|
|
assert DeletedDocument.objects.count() == 0
|
|
app.login(recipient.username)
|
|
resp = app.get('/inbox/')
|
|
delete_form = resp.forms[2]
|
|
delete_form['selection'] = doc.pk
|
|
resp = delete_form.submit('delete')
|
|
assert resp.status_code == 302
|
|
|
|
# soft delete
|
|
deleted_document = DeletedDocument.objects.get(document=doc, user=recipient)
|
|
assert deleted_document.soft_delete
|
|
assert deleted_document.soft_delete_date
|
|
|
|
|
|
def test_forward_doc(app, filetypes, users, settings):
|
|
sender = User.objects.get(username='user-1')
|
|
recipient1 = User.objects.get(username='user-2')
|
|
recipient2 = User.objects.get(username='user-3')
|
|
send_file(app, settings, sender, recipient1)
|
|
|
|
doc = Document.objects.get(sender=sender)
|
|
app.login(recipient1.username)
|
|
resp = app.get('/inbox/%s/' % doc.pk)
|
|
assert resp.status_code == 200
|
|
form = resp.forms[1]
|
|
form['recipients'] = ['user-%s' % recipient2.pk]
|
|
resp = form.submit('forward')
|
|
assert resp.status_code == 302
|
|
assert resp.location.endswith('/inbox/%s/' % doc.pk)
|
|
app.logout()
|
|
|
|
doc = Document.objects.get(sender=recipient1)
|
|
app.login(recipient2.username)
|
|
resp = app.get('/inbox/%s/' % doc.pk)
|
|
assert resp.status_code == 200
|
|
|
|
|
|
def test_upload_file(app, users, settings):
|
|
settings.MEDIA_ROOT = MEDIA_ROOT
|
|
app.login(username='user-1')
|
|
upload_id = str(uuid.uuid4())
|
|
resp = app.post(
|
|
'/upload/%s/' % upload_id,
|
|
headers={'Accept': 'application/json'},
|
|
upload_files=[('file', 'readme.rst', b'data')],
|
|
)
|
|
assert resp.status_code == 200
|
|
json = resp.json
|
|
assert len(json) == 1
|
|
data = json[0]
|
|
assert data['name'] == 'readme.rst'
|
|
url = '/upload/%s/readme.rst' % upload_id
|
|
assert data['url'] == url
|
|
|
|
resp = app.get(url)
|
|
assert resp.status_code == 200
|
|
assert resp.content_type == 'application/octet-stream'
|
|
assert resp.content == b'data'
|
|
|
|
|
|
def test_zip_download(app, filetypes, users, settings, tmp_path):
|
|
settings.MEDIA_ROOT = MEDIA_ROOT
|
|
settings.ZIP_DOWNLOAD = True
|
|
|
|
sender = User.objects.get(username='user-1')
|
|
recipient = User.objects.get(username='user-2')
|
|
|
|
settings.MEDIA_ROOT = MEDIA_ROOT
|
|
ft = FileType.objects.first()
|
|
kind0 = FileTypeAttachedFileKind.objects.create(name='kind0', file_type=ft, position=0)
|
|
kind1 = FileTypeAttachedFileKind.objects.create(name='kind1', file_type=ft, position=1)
|
|
app.login(username=sender.username)
|
|
resp = app.get('/send_file/%s/' % ft.pk)
|
|
form = resp.form
|
|
form['content-%s_1' % kind0.pk] = Upload('readme.rst', b'data')
|
|
form['content-%s_1' % kind1.pk] = Upload('another.rst', b'otherdata')
|
|
form['recipients'] = ['user-%s' % recipient.pk]
|
|
form['private'] = False
|
|
resp = form.submit('send')
|
|
assert resp.status_code == 302
|
|
assert resp.location.endswith('/outbox/')
|
|
app.logout()
|
|
|
|
doc = Document.objects.get(sender=sender)
|
|
app.login(recipient.username)
|
|
resp = app.get('/inbox/%s/' % doc.pk)
|
|
assert resp.status_code == 200
|
|
assert 'allfiles/' in resp.text
|
|
|
|
# download zip
|
|
resp = app.get('/inbox/%s/allfiles/' % doc.pk)
|
|
assert resp.status_code == 200
|
|
assert resp.content_type == 'application/octet-stream'
|
|
zip_path = tmp_path / 'zipfile'
|
|
zip_path.write_bytes(resp.content)
|
|
|
|
# check zip
|
|
zip_ = zipfile.ZipFile(zip_path.as_posix(), 'r')
|
|
namelist = zip_.namelist()
|
|
assert len(namelist) == 2
|
|
assert 'readme.rst' in namelist
|
|
assert 'another.rst' in namelist
|
|
assert zip_.open('readme.rst', 'r').read() == b'data'
|
|
assert zip_.open('another.rst', 'r').read() == b'otherdata'
|
|
|
|
|
|
def test_document_acces(app, filetypes, settings, users):
|
|
user = users[0]
|
|
delegate = create_delegate(app, user, users[1])
|
|
guest_delegate = create_guest_delegate(app, user, 'john', 'doe', 'john@localhost')
|
|
sender = users[2]
|
|
stranger = users[3]
|
|
|
|
# Doc recieved by user and delegates
|
|
send_file(app, settings, sender, user)
|
|
doc = Document.objects.get(sender=sender)
|
|
|
|
assert_can_see_doc(app, doc, user)
|
|
assert_can_see_doc(app, doc, delegate)
|
|
assert_can_see_doc(app, doc, guest_delegate)
|
|
assert_cannot_see_doc(app, doc, stranger)
|
|
assert_can_see_doc(app, doc, sender, inbox=False)
|
|
|
|
# Visibility after deletion by user
|
|
delete_doc(app, user)
|
|
assert_can_see_doc(app, doc, user, trash=True)
|
|
assert_can_see_doc(app, doc, delegate) # yes it's strange
|
|
assert_can_see_doc(app, doc, guest_delegate, trash=True)
|
|
assert_cannot_see_doc(app, doc, stranger)
|
|
assert_can_see_doc(app, doc, sender, inbox=False)
|
|
|
|
# reset
|
|
doc.delete()
|
|
|
|
# Visibility after deletion by delegate
|
|
send_file(app, settings, sender, user)
|
|
doc = Document.objects.get(sender=sender)
|
|
delete_doc(app, delegate)
|
|
assert_can_see_doc(app, doc, user)
|
|
assert_can_see_doc(app, doc, delegate, trash=True)
|
|
assert_can_see_doc(app, doc, guest_delegate)
|
|
assert_can_see_doc(app, doc, sender, inbox=False)
|
|
|
|
# reset
|
|
doc.delete()
|
|
|
|
# Visibility after deletion by guest delegate
|
|
send_file(app, settings, sender, user)
|
|
doc = Document.objects.get(sender=sender)
|
|
delete_doc(app, guest_delegate)
|
|
assert_can_see_doc(app, doc, user, trash=True)
|
|
assert_can_see_doc(app, doc, delegate)
|
|
assert_can_see_doc(app, doc, guest_delegate, trash=True)
|
|
assert_can_see_doc(app, doc, sender, inbox=False)
|
|
|
|
|
|
def test_private_document_access(app, filetypes, settings, users):
|
|
user = users[0]
|
|
delegate = create_delegate(app, user, users[1])
|
|
guest_delegate = create_guest_delegate(app, user, 'john', 'doe', 'john@localhost')
|
|
sender = users[2]
|
|
stranger = users[3]
|
|
|
|
# Doc recieved by user and delegates
|
|
send_file(app, settings, sender, user, private=True)
|
|
doc = Document.objects.get(sender=sender)
|
|
|
|
assert_can_see_doc(app, doc, user)
|
|
assert_cannot_see_doc(app, doc, delegate)
|
|
assert_cannot_see_doc(app, doc, guest_delegate)
|
|
assert_cannot_see_doc(app, doc, stranger)
|
|
assert_can_see_doc(app, doc, sender, inbox=False)
|
|
|
|
# Visibility after deletion by user
|
|
delete_doc(app, user)
|
|
assert_can_see_doc(app, doc, user, trash=True)
|
|
assert_cannot_see_doc(app, doc, delegate)
|
|
assert_cannot_see_doc(app, doc, guest_delegate)
|
|
assert_cannot_see_doc(app, doc, stranger)
|
|
assert_can_see_doc(app, doc, sender, inbox=False)
|
|
|
|
|
|
def test_document_seen(app, filetypes, settings, users):
|
|
user = users[0]
|
|
sender = users[1]
|
|
send_file(app, settings, sender, user)
|
|
|
|
doc = Document.objects.get(sender=sender)
|
|
app.login(user.username)
|
|
box_url = '/inbox/'
|
|
doc_url = box_url + '%s/' % doc.pk
|
|
|
|
# not seen
|
|
resp = app.get(box_url)
|
|
assert '<span class="false">' in resp.text
|
|
|
|
# get file
|
|
attached_file = doc.attached_files.first()
|
|
file_url = doc_url + '%s/%s' % (attached_file.pk, attached_file.name)
|
|
resp = app.get(file_url)
|
|
assert resp.status_code == 200
|
|
|
|
# seen
|
|
resp = app.get(box_url)
|
|
assert '<span class="true">' in resp.text
|
|
|
|
|
|
def test_contact_no_contact(app, users):
|
|
app.login(username='user-1')
|
|
resp = app.get('/contact/')
|
|
assert resp.status_code == 302
|
|
assert resp.location.endswith('/inbox/')
|
|
|
|
|
|
def test_contact(app, settings, users):
|
|
settings.CONTACT_GROUPS = ('Contact',)
|
|
contact_group = Group.objects.create(name='Contact')
|
|
user_1 = User.objects.get(username='user-1')
|
|
user_1.groups.add(contact_group)
|
|
user_1.save()
|
|
|
|
app.login(username='user-2')
|
|
resp = app.get('/contact/')
|
|
form = resp.form
|
|
form['subject'] = 'help'
|
|
form['message'] = 'help message'
|
|
resp = form.submit('send')
|
|
assert resp.status_code == 302
|
|
assert resp.location.endswith('/inbox/')
|
|
|
|
|
|
def test_send_file_no_private(app, settings, users, filetypes):
|
|
settings.MEDIA_ROOT = MEDIA_ROOT
|
|
settings.DOCBOW_PRIVATE_DOCUMENTS = False
|
|
ft = FileType.objects.first()
|
|
sender = users[0]
|
|
recipient = users[1]
|
|
app.login(username=sender.username)
|
|
resp = app.get('/send_file/%s/' % ft.pk)
|
|
form = resp.form
|
|
form['content_1'] = Upload('readme.rst', b'data')
|
|
form['recipients'] = ['user-%s' % recipient.pk]
|
|
assert_field_not_in_form('private', form)
|
|
resp = form.submit('send')
|
|
assert resp.status_code == 302
|
|
assert resp.location.endswith('/outbox/')
|
|
app.logout()
|
|
|
|
|
|
def test_is_staff_kept_on_superuser(app, settings, admin):
|
|
staffuser = User.objects.create(username='staffuser', is_staff=True, is_superuser=True)
|
|
app.login(username=admin.username)
|
|
resp = app.get('/admin/auth/user/%s/' % staffuser.pk)
|
|
if resp.status_code == 302:
|
|
resp = resp.follow() # django 1.11 redirects to /admin/auth/user/%s/change/
|
|
|
|
form = resp.forms[0]
|
|
form['email'] = 'newmail@localhost'
|
|
resp = form.submit()
|
|
assert resp.status_code == 302
|
|
|
|
staffuser = User.objects.get(username='staffuser')
|
|
assert staffuser.is_staff
|
|
|
|
|
|
def test_mailbox_pagination(app, filetypes, users, settings):
|
|
settings.LANGUAGE_CODE = 'en-us'
|
|
sender = User.objects.get(username='user-1')
|
|
recipient = User.objects.get(username='user-2')
|
|
for i in range(40):
|
|
send_file(app, settings, sender, recipient)
|
|
|
|
app.login(username='user-1')
|
|
resp = app.get('/outbox/')
|
|
assert 'Page 1 of 2' in resp.text
|
|
assert '20 de 40 documents' in resp.text
|
|
|
|
app.login(username='user-2')
|
|
resp = app.get('/inbox/')
|
|
assert 'Page 1 of 2' in resp.text
|
|
assert '20 de 40 documents' in resp.text
|