2013-10-27 18:33:30 -04:00
|
|
|
import os
|
|
|
|
|
import nose
|
|
|
|
|
from nose.tools import raises
|
|
|
|
|
import mercy.models
|
|
|
|
|
import mercy.importers.fda
|
|
|
|
|
import mercy.exceptions
|
|
|
|
|
|
2013-10-27 18:35:35 -04:00
|
|
|
COMPARISON_KEYS={
|
|
|
|
|
'productid': 'PRODUCTID',
|
|
|
|
|
'ndc': 'PRODUCTNDC',
|
|
|
|
|
'type': 'PRODUCTTYPENAME',
|
|
|
|
|
'proprietaryName': 'PROPRIETARYNAME',
|
|
|
|
|
'proprietaryNameSuffix': 'PROPRIETARYNAMESUFFIX',
|
|
|
|
|
'genericName': 'NONPROPRIETARYNAME',
|
|
|
|
|
'marketingCategoryName': 'MARKETINGCATEGORYNAME',
|
|
|
|
|
'labelerName': 'LABELERNAME',
|
|
|
|
|
'deaSchedule': 'DEASCHEDULE'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CSV_KEYS=[
|
|
|
|
|
'PRODUCTID',
|
|
|
|
|
'PRODUCTNDC',
|
|
|
|
|
'PRODUCTTYPENAME',
|
|
|
|
|
'PROPRIETARYNAME',
|
|
|
|
|
'PROPRIETARYNAMESUFFIX',
|
|
|
|
|
'NONPROPRIETARYNAME',
|
|
|
|
|
'DOSAGEFORMNAME',
|
|
|
|
|
'ROUTENAME',
|
|
|
|
|
'STARTMARKETINGDATE',
|
|
|
|
|
'ENDMARKETINGDATE',
|
|
|
|
|
'MARKETINGCATEGORYNAME',
|
|
|
|
|
'APPLICATIONNUMBER',
|
|
|
|
|
'LABELERNAME',
|
|
|
|
|
'SUBSTANCENAME',
|
|
|
|
|
'ACTIVE_NUMERATOR_STRENGTH',
|
|
|
|
|
'ACTIVE_INGRED_UNIT',
|
|
|
|
|
'PHARM_CLASSES',
|
|
|
|
|
'DEASCHEDULE'
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
CANNED_ROWS=[
|
|
|
|
|
{'PRODUCTID': '0002-3230_b1642902-4a44-495a-8790-39598b168276',
|
|
|
|
|
'PRODUCTNDC': '0002-3230',
|
|
|
|
|
'PRODUCTTYPENAME': 'HUMAN PRESCRIPTION DRUG',
|
|
|
|
|
'PROPRIETARYNAME': 'Symbyax',
|
|
|
|
|
'PROPRIETARYNAMESUFFIX': '',
|
|
|
|
|
'NONPROPRIETARYNAME': 'Olanzapine and Fluoxetine hydrochloride',
|
|
|
|
|
'DOSAGEFORMNAME': 'CAPSULE',
|
|
|
|
|
'ROUTENAME': 'ORAL',
|
|
|
|
|
'STARTMARKETINGDATE': '20070409',
|
|
|
|
|
'ENDMARKETINGDATE': '',
|
|
|
|
|
'MARKETINGCATEGORYNAME': 'NDA',
|
|
|
|
|
'APPLICATIONNUMBER': 'NDA021520',
|
|
|
|
|
'LABELERNAME': 'Eli Lilly and Company',
|
|
|
|
|
'SUBSTANCENAME': 'FLUOXETINE HYDROCHLORIDE; OLANZAPINE',
|
|
|
|
|
'ACTIVE_NUMERATOR_STRENGTH': '25; 3',
|
|
|
|
|
'ACTIVE_INGRED_UNIT': 'mg/1; mg/1',
|
|
|
|
|
'PHARM_CLASSES': 'Atypical Antipsychotic [EPC],Serotonin Reuptake Inhibitor [EPC],Serotonin Uptake Inhibitors [MoA]',
|
|
|
|
|
'DEASCHEDULE': ''
|
|
|
|
|
},
|
|
|
|
|
{'PRODUCTID': '0002-3231_b1642902-4a44-495a-8790-39598b168276',
|
|
|
|
|
'PRODUCTNDC': '0002-3231',
|
|
|
|
|
'PRODUCTTYPENAME': 'HUMAN PRESCRIPTION DRUG',
|
|
|
|
|
'PROPRIETARYNAME': 'Symbyax',
|
|
|
|
|
'PROPRIETARYNAMESUFFIX': '',
|
|
|
|
|
'NONPROPRIETARYNAME': 'Olanzapine and Fluoxetine hydrochloride',
|
|
|
|
|
'DOSAGEFORMNAME': 'CAPSULE',
|
|
|
|
|
'ROUTENAME': 'ORAL',
|
|
|
|
|
'STARTMARKETINGDATE': '20070409',
|
|
|
|
|
'ENDMARKETINGDATE': '',
|
|
|
|
|
'MARKETINGCATEGORYNAME': 'NDA',
|
|
|
|
|
'APPLICATIONNUMBER': 'NDA021521',
|
|
|
|
|
'LABELERNAME': 'Eli Lilly and Company',
|
|
|
|
|
'SUBSTANCENAME': 'FLUOXETINE HYDROCHLORIDE; OLANZAPINE',
|
|
|
|
|
'ACTIVE_NUMERATOR_STRENGTH': '25; 6',
|
|
|
|
|
'ACTIVE_INGRED_UNIT': 'mg/1; mg/1',
|
|
|
|
|
'PHARM_CLASSES': 'Atypical Antipsychotic [EPC],Serotonin Reuptake Inhibitor [EPC],Serotonin Uptake Inhibitors [MoA]',
|
|
|
|
|
'DEASCHEDULE': ''
|
|
|
|
|
}
|
|
|
|
|
]
|
2013-10-27 18:33:30 -04:00
|
|
|
|
|
|
|
|
FIXTUREFILE=os.path.abspath(
|
|
|
|
|
os.path.join(
|
2013-10-27 18:35:35 -04:00
|
|
|
os.path.dirname(__file__),
|
2013-10-27 18:33:30 -04:00
|
|
|
"..",
|
|
|
|
|
"fixtures",
|
2013-10-27 18:35:35 -04:00
|
|
|
"fda_database.txt"
|
2013-10-27 18:33:30 -04:00
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
FIXTUREFILE_BAD=os.path.abspath(
|
|
|
|
|
os.path.join(
|
2013-10-27 18:35:35 -04:00
|
|
|
os.path.dirname(__file__),
|
2013-10-27 18:33:30 -04:00
|
|
|
"..",
|
|
|
|
|
"fixtures",
|
2013-10-27 18:35:35 -04:00
|
|
|
"fda_database_bad.txt"
|
2013-10-27 18:33:30 -04:00
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def test_fda_import_populates_table():
|
2013-10-27 18:35:35 -04:00
|
|
|
with open(FIXTUREFILE, 'w') as ofile:
|
|
|
|
|
ofile.write("{}\n".format('\t'.join(CSV_KEYS)))
|
|
|
|
|
for row in CANNED_ROWS:
|
|
|
|
|
values = []
|
|
|
|
|
for key in CSV_KEYS:
|
|
|
|
|
values.append(row[key])
|
|
|
|
|
ofile.write("{}\n".format('\t'.join(values)))
|
2013-10-27 18:33:30 -04:00
|
|
|
importer = mercy.importers.fda.FDAImporter()
|
2013-10-27 18:35:35 -04:00
|
|
|
importer.read(FIXTUREFILE)
|
|
|
|
|
for row in CANNED_ROWS:
|
|
|
|
|
product = mercy.models.fda.Product.query.filter_by(productid = row['PRODUCTID']).first()
|
|
|
|
|
assert(product)
|
|
|
|
|
for (k, v) in COMPARISON_KEYS.iteritems():
|
|
|
|
|
assert(getattr(product, k) == row[v])
|
|
|
|
|
mapquery = mercy.models.fda.ProductSubstanceMap.query
|
|
|
|
|
substanceMaps = [x for x in mapquery.filter_by(product_id=product.id)]
|
|
|
|
|
assert(len(substanceMaps) == len(row['ACTIVE_NUMERATOR_STRENGTH'].split(';')))
|
|
|
|
|
# TO DO : This test doesn't look at the contents of the
|
|
|
|
|
# substances or substance maps, only that the right
|
|
|
|
|
# number of substance maps come out
|