# 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 . 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)