passerelle/tests/test_csv_datasource.py

138 lines
5.0 KiB
Python

# -*- coding: utf-8 -*-
import pytest
from StringIO import StringIO
from django.core.files import File
data = """121;69981;DELANOUE;Eliot;H
525;6;DANIEL WILLIAMS;Shanone;F
253;67742;MARTIN;Sandra;F
511;38142;MARCHETTI;Lucie;F
235;22;MARTIN;Sandra;F
620;52156;ARNAUD;Mathis;H
902;36;BRIGAND;Coline;F
2179;48548;THEBAULT;Salima;F
3420;46;WILSON-LUZAYADIO;Anaëlle;F
1421;55486;WONE;Fadouma;F
2841;51;FIDJI;Zakia;F
2431;59;BELICARD;Sacha;H
4273;60;GOUBERT;Adrien;H
4049;64;MOVSESSIAN;Dimitri;H
4605;67;ABDOU BACAR;Kyle;H
4135;22231;SAVERIAS;Marius;H
4809;75;COROLLER;Maelys;F
5427;117;KANTE;Aliou;H
116642;118;ZAHMOUM;Yaniss;H
216352;38;Dupont;Benoît;H
"""
data_bom = data.decode('utf-8').encode('utf-8-sig')
from csvdatasource.models import CsvDataSource
pytestmark = pytest.mark.django_db
def test_unfiltered_data():
csv = CsvDataSource.objects.create(csv_file=File(StringIO(data), 'data.csv'),
columns_keynames='field,,another_field,')
result = csv.get_data()
for item in result:
assert 'field' in item
assert 'another_field' in item
def test_good_filter_data():
filter_criteria = 'Zakia'
csv = CsvDataSource.objects.create(csv_file=File(StringIO(data), 'data.csv'),
columns_keynames=',id,,text,')
result = csv.get_data({'text': filter_criteria})
assert len(result)
for item in result:
assert 'id' in item
assert 'text' in item
assert filter_criteria in item['text']
def test_bad_filter_data():
filter_criteria = 'bad'
csv = CsvDataSource.objects.create(csv_file=File(StringIO(data), 'data.csv'),
columns_keynames=',id,,text,')
result = csv.get_data({'text': filter_criteria})
assert len(result) == 0
def test_useless_filter_data():
csv = CsvDataSource.objects.create(csv_file=File(StringIO(data), 'data.csv'),
columns_keynames='id,,nom,prenom,sexe')
result = csv.get_data({'text': 'Ali'})
assert len(result) == 20
def test_columns_keynames_with_spaces():
csv = CsvDataSource.objects.create(csv_file=File(StringIO(data), 'data.csv'),
columns_keynames='id , , nom,text , ')
result = csv.get_data({'text': 'Yaniss'})
assert len(result) == 1
def test_skipped_header_data():
csv = CsvDataSource.objects.create(csv_file=File(StringIO(data), 'data.csv'),
columns_keynames=',id,,text,',
skip_header=True)
result = csv.get_data({'text': 'Eliot'})
assert len(result) == 0
def test_data():
csv = CsvDataSource.objects.create(csv_file=File(StringIO(data), 'data.csv'),
columns_keynames='fam,id,, text,sexe ')
result = csv.get_data({'text': 'Sacha'})
assert result[0] == {'id': '59', 'text': 'Sacha',
'fam': '2431', 'sexe': 'H'}
def test_unicode_filter_data():
csv = CsvDataSource.objects.create(csv_file=File(StringIO(data), 'data.csv'),
columns_keynames=',id,,text,')
filter_criteria = u'Benoît'
result = csv.get_data({'text': filter_criteria})
assert len(result)
for item in result:
assert 'id' in item
assert 'text' in item
assert filter_criteria in item['text'].decode('utf-8')
def test_unicode_case_insensitive_filter_data():
csv = CsvDataSource.objects.create(csv_file=File(StringIO(data), 'data.csv'),
columns_keynames=',id,,text,')
filter_criteria = u'anaëlle'
result = csv.get_data({'text': filter_criteria}, case_insensitive=True)
assert len(result)
for item in result:
assert 'id' in item
assert 'text' in item
assert filter_criteria.lower() in item['text'].decode('utf-8').lower()
def test_data_bom():
csv = CsvDataSource.objects.create(csv_file=File(StringIO(data_bom), 'data.csv'),
columns_keynames='fam,id,, text,sexe ')
result = csv.get_data({'text': 'Eliot'})
assert result[0] == {'id': '69981', 'text': 'Eliot',
'fam': '121', 'sexe': 'H'}
def test_multi_filter():
csv = CsvDataSource.objects.create(csv_file=File(StringIO(data), 'data.csv'),
columns_keynames='fam,id,, text,sexe ')
result = csv.get_data({'sexe': 'F'})
assert result[0] == {'id': '6', 'text': 'Shanone',
'fam': '525', 'sexe': 'F'}
assert len(result) == 10
def test_query():
csv = CsvDataSource.objects.create(csv_file=File(StringIO(data), 'data.csv'),
columns_keynames='fam,id,, text,sexe ')
result = csv.get_data(query='liot')
assert result[0]['text'] == 'Eliot'
assert len(result) == 1
def test_query_insensitive():
csv = CsvDataSource.objects.create(csv_file=File(StringIO(data), 'data.csv'),
columns_keynames='fam,id,, text,sexe ')
result = csv.get_data(query='elIo', case_insensitive=True)
assert result[0]['text'] == 'Eliot'
assert len(result) == 1