passerelle/tests/test_gesbac.py

158 lines
6.2 KiB
Python

# -*- coding: utf-8 -*-
# tests/test_gesbac.py
# Copyright (C) 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 datetime
import pytest
from django.utils.timezone import now
from .utils import make_resource
from passerelle.utils import SFTP
from passerelle.apps.gesbac.models import Gesbac, Form
@pytest.fixture
def resource(db, sftpserver):
return make_resource(
Gesbac,
slug='test',
title='Gesbac',
description='gesbac',
outcoming_sftp=SFTP(
'sftp://foo:bar@{server.host}:{server.port}/output/'.format(server=sftpserver)),
incoming_sftp=SFTP(
'sftp://foo:bar@{server.host}:{server.port}/input/'.format(server=sftpserver)),
output_files_prefix='output-',
input_files_prefix='input-')
def test_check_status(app, resource, sftpserver):
with sftpserver.serve_content({'input': {'test': 'content'},
'output': {'file': 'content'}}):
resource.check_status()
def test_create_demand(app, resource, freezer, sftpserver):
assert resource.form_set.count() == 0
timestamp = now()
payload = {
'form_id': '42-42',
'demand_date': timestamp.strftime('%Y%m%d'),
'demand_time': timestamp.strftime('%H%M%S'),
'producer_code': 1,
'city_insee_code': '75114',
'street_name': 'Château',
'street_rivoli_code': 'xxxx',
'producer_social_reason': 'SCOP',
'producer_last_name': 'Bar',
'producer_first_name': 'Foo',
'producer_email': 'foo@example.com',
'owner_last_name': 'Bar',
'owner_first_name': 'Foo',
'owner_email': 'foo@example.com',
'family_members_number': 5,
'houses_number': 1,
'card_type': 1,
'card_subject': 1,
'card_demand_reason': 1,
'card_demand_purpose': 1,
'cards_quantity': 1
}
response = app.post_json('/gesbac/test/create-demand/', params=payload)
assert resource.form_set.filter(status='new').count() == 1
form = resource.form_set.get(status='new')
assert len(form.demand_data) == 2
expected_filename = '%s%s-%s.csv' % (resource.output_files_prefix,
timestamp.strftime('%y%m%d-%H%M%S'),
form.get_gesbac_id())
assert response.json['data']['filename'] == expected_filename
assert resource.form_set.filter(status='new').count() == 1
with sftpserver.serve_content({'output': {expected_filename: 'content'}}):
resource.jobs()
assert resource.form_set.filter(status='sent').count() == 1
payload['owner_email'] = 'bar@example.com'
response = app.post_json('/gesbac/test/create-demand/', params=payload)
assert resource.form_set.filter(status='new').count() == 1
form = resource.form_set.get(status='new')
assert len(form.demand_data) == 2
expected_filename = '%s%s-%s.csv' % (resource.output_files_prefix,
timestamp.strftime('%y%m%d-%H%M%S'),
form.get_gesbac_id())
assert response.json['data']['filename'] == expected_filename
with sftpserver.serve_content({'output': {response.json['data']['filename']: 'content'}}):
resource.jobs()
assert resource.form_set.filter(status='sent').count() == 2
def test_get_demand_response(app, resource, freezer, sftpserver):
response = app.get('/gesbac/test/get-response/',
params={'form_id': '42-43'}, status=404)
timestamp = now()
payload = {
'form_id': '42-43',
'demand_date': timestamp.strftime('%Y%m%d'),
'demand_time': timestamp.strftime('%H%M%S'),
'producer_code': 1,
'city_insee_code': '75114',
'street_name': 'Château',
'street_rivoli_code': 'xxxx',
'producer_social_reason': 'SCOP',
'producer_last_name': 'Bar',
'producer_first_name': 'Foo',
'producer_email': 'foo@example.com',
'owner_last_name': 'Bar',
'owner_first_name': 'Foo',
'owner_email': 'foo@example.com',
'family_members_number': 5,
'houses_number': 1,
'card_type': 1,
'card_subject': 1,
'card_demand_reason': 1,
'card_demand_purpose': 1,
'cards_quantity': 1
}
response = app.post_json('/gesbac/test/create-demand/', params=payload)
data = response.json['data']
with sftpserver.serve_content({'output': {data['filename']: 'content'},
'input': {}}):
resource.jobs()
assert resource.form_set.filter(status='closed').count() == 0
assert resource.form_set.filter(status='sent').count() == 1
data = resource.form_set.get(status='sent')
gesbac_id = data.get_gesbac_id()
response_filename = '%s91001-090300-%s.csv' % (
resource.input_files_prefix, gesbac_id)
assert resource.form_set.filter(
form_id='42-43', filename=response_filename, status='closed').count() == 0
with sftpserver.serve_content({'input': {response_filename: 'CARTE;%s;3;2;1234;;;;;;;;' % gesbac_id}}):
resource.hourly()
assert resource.form_set.filter(
form_id='42-43', status='closed').count() == 1
response = resource.form_set.get(status='closed')
assert response.card_data == ['CARTE', gesbac_id,
'3', '2', '1234', '', '', '', '', '', '', '', '']
response = app.get('/gesbac/test/get-response/',
params={'form_id': '42-43'})
assert response.json['err'] == 0
assert response.json['data'] == ['CARTE', gesbac_id,
'3', '2', '1234', '', '', '', '', '', '', '', '']