fargo/tests/test_api.py

179 lines
7.4 KiB
Python

# fargo - document box
# Copyright (C) 2016-2019 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import base64
import pytest
from django.utils.http import urlencode
from fargo.fargo import utils, models
from test_manager import login
pytestmark = pytest.mark.django_db
def test_create_validation(settings, app, admin_user, john_doe, jane_doe):
login(app)
data = {
'user_email': john_doe.email,
}
schema = utils.get_document_type_schema(settings, 'avis-d-imposition')
url = '/api/validation/avis-d-imposition/'
assert models.Validation.objects.count() == 0
response = app.post_json(url, params=data, status=400)
assert response.json['result'] == 0
assert set(response.json['errors'].keys()) == set([field['varname'] for field in
schema['metadata']] + ['creator', 'origin'])
assert models.Validation.objects.count() == 0
data.update({
'personnes_concernees': 'John and Lisa Doe',
'annee': '2016',
'revenu_fiscal_de_reference': '32455',
'creator': 'FooBar',
'origin': 'wcs.example.com',
})
response1 = app.post_json(url, params=data, status=201)
assert set(response1.json.keys()) == set(['result', 'data'])
assert response1.json['result'] == 1
assert set(data.keys()) - set(['user_email']) < set(response1.json['data'].keys())
assert models.Validation.objects.count() == 1
data['user_email'] = jane_doe.email
response2 = app.post_json(url, params=data, status=201)
assert models.Validation.objects.count() == 2
response3 = app.get(url)
assert response3.json['data']['count'] == 2
response4 = app.get(url + '?%s' % urlencode({'user_email': john_doe.email}))
assert response4.json['data']['count'] == 1
response5 = app.get(response2.json['data']['url'], status=200)
assert response5.json['result'] == 1
assert response5.json['data'] == response2.json['data']
def test_push_document(app, admin_user, john_doe):
login(app)
data = {
'user_email': john_doe.email,
}
url = '/api/documents/push/'
# error checking test
assert models.Origin.objects.count() == 0
assert models.UserDocument.objects.count() == 0
assert models.Document.objects.count() == 0
response = app.post_json(url, params=data, status=400)
assert models.Origin.objects.count() == 0
assert models.UserDocument.objects.count() == 0
assert models.Document.objects.count() == 0
assert response.json['result'] == 0
assert (set(response.json['errors'].keys())
== set(['origin', 'file_b64_content']))
data.update({
'origin': 'wcs',
'file_b64_content': base64.b64encode(b'coin').decode(),
'file_name': 'monfichier.pdf',
})
response = app.post_json(url, params=data, status=200)
assert response.json['result'] == 1
assert models.Origin.objects.count() == 1
assert models.Origin.objects.get().label == 'wcs'
assert models.Origin.objects.get().slug == 'wcs'
assert models.UserDocument.objects.count() == 1
assert models.UserDocument.objects.get().user == john_doe
assert models.UserDocument.objects.get().deletable_by_user is True
assert models.Document.objects.count() == 1
assert models.Document.objects.get().content.read() == b'coin'
assert (models.UserDocument.objects.get().document
== models.Document.objects.get())
assert (models.UserDocument.objects.get().origin
== models.Origin.objects.get())
data['file_b64_content'] = base64.b64encode(b'coin2').decode()
data['deletable_by_user'] = False
response = app.post_json(url, params=data, status=200)
assert response.json['result'] == 1
assert models.Origin.objects.count() == 1 # same origin
assert models.UserDocument.objects.count() == 2 # new document
assert models.UserDocument.objects.filter(deletable_by_user=False).count() == 1
data['file_b64_content'] = base64.b64encode(b'coin3').decode()
data['deletable_by_user'] = True
response = app.post_json(url, params=data, status=200)
assert response.json['result'] == 1
assert models.UserDocument.objects.count() == 3 # new document
assert models.UserDocument.objects.filter(deletable_by_user=True).count() == 2
# same document
data['file_b64_content'] = base64.b64encode(b'coin3').decode()
data['deletable_by_user'] = True
response = app.post_json(url, params=data, status=400)
assert response.json['result'] == 0
assert response.json['errors'][0]['code'] == 'document-exists'
assert models.UserDocument.objects.count() == 3 # no new document
def test_push_document_max_document_size(app, private_settings, admin_user, john_doe):
private_settings.FARGO_MAX_DOCUMENT_SIZE = 1
login(app)
url = '/api/documents/push/'
data = {
'user_email': john_doe.email,
'origin': 'wcs',
'file_b64_content': base64.b64encode(b'coin').decode(),
'file_name': 'monfichier.pdf',
}
response = app.post_json(url, params=data, status=400)
assert response.json['result'] == 0
assert list(response.json['errors'].keys()) == ['file_b64_content']
assert response.json['errors']['file_b64_content'][0]['code'] == 'too-big'
assert response.json['errors']['file_b64_content'][0]['limit'] == '1'
def test_push_document_max_document_box_size(app, private_settings, admin_user, john_doe):
private_settings.FARGO_MAX_DOCUMENT_BOX_SIZE = 4
login(app)
url = '/api/documents/push/'
data = {
'user_email': john_doe.email,
'origin': 'wcs',
'file_b64_content': base64.b64encode(b'coin').decode(),
'file_name': 'monfichier.pdf',
}
response = app.post_json(url, params=data, status=200)
assert response.json['result'] == 1
assert models.Document.objects.count() == 1
response = app.post_json(url, params=data, status=400)
assert response.json['result'] == 0
assert list(response.json['errors'].keys()) == ['__all__']
assert response.json['errors']['__all__'][0]['code'] == 'box-is-full'
assert response.json['errors']['__all__'][0]['limit'] == '4'
def test_push_document_slashed_name(app, admin_user, john_doe):
login(app)
url = '/api/documents/push/'
data = {
'user_email': john_doe.email,
'origin': 'wcs',
'file_b64_content': base64.b64encode(b'whatever').decode(),
'file_name': 'monfichier 18/06/2017.pdf',
}
response = app.post_json(url, params=data, status=200)
assert response.json['result'] == 1
assert models.Document.objects.count() == 1
doc = models.UserDocument.objects.first()
assert doc.filename == 'monfichier 18/06/2017.pdf'
assert doc.get_download_url() == '/%s/download/monfichier%%252018%%252F06%%252F2017.pdf' % doc.pk
login(app, user=john_doe)
app.get(doc.get_download_url(), status=200)