From 0f53a121944bf7593c979eb7357b0818b482e69f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Koray=20K=C4=B1rl=C4=B1?= Date: Mon, 14 Nov 2016 15:05:09 -0500 Subject: [PATCH 01/16] FF-405 #comment test for build field --- tests/test_fdnDCIC.py | 4 ++-- tests/test_import_data.py | 10 ++++++++++ wranglertools/import_data.py | 17 ++++++----------- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/tests/test_fdnDCIC.py b/tests/test_fdnDCIC.py index 2d1f087a..9f36d4c7 100644 --- a/tests/test_fdnDCIC.py +++ b/tests/test_fdnDCIC.py @@ -213,12 +213,12 @@ def test_order_FDN_mock(connection, mocker, returned_vendor_items): import os try: os.remove("./tests/data_files/Vendor_ordered.xls") - except: + except OSError: pass with mocker.patch('wranglertools.fdnDCIC.requests.get', return_value=returned_vendor_items): fdnDCIC.order_FDN('./tests/data_files/Vendor.xls', connection) assert os.path.isfile('./tests/data_files/Vendor_ordered.xls') try: os.remove("./tests/data_files/Vendor_ordered.xls") - except: + except OSError: pass diff --git a/tests/test_import_data.py b/tests/test_import_data.py index a5429b52..fed543c5 100644 --- a/tests/test_import_data.py +++ b/tests/test_import_data.py @@ -89,6 +89,16 @@ def test_formatter_gets_lists_correctly(): assert ['1', '2', '3'] == imp.data_formatter("'[1,2,3]'", 'array') +def test_build_field_empty_is_skipped(): + assert imp.build_field('some_field', '', 'string') is None + assert imp.build_field('', 'some_data', 'string') is None + + +def test_build_field_old_stype_field(): + old_style = imp.build_field('some_field:int', "5", None) + assert old_style == {'some_field': 5} + + def test_build_patch_json_removes_empty_fields(file_metadata, file_metadata_type): post_json = imp.build_patch_json(file_metadata, file_metadata_type) diff --git a/wranglertools/import_data.py b/wranglertools/import_data.py index c6cc9204..f59116b3 100755 --- a/wranglertools/import_data.py +++ b/wranglertools/import_data.py @@ -200,6 +200,7 @@ def data_formatter(value, val_type): def get_field_name(field_name): """handle type at end, plus embedded objets.""" field = field_name.replace('*', '') + field = field.split(':')[0] return field.split(".")[0] @@ -242,13 +243,11 @@ class FieldInfo(object): def build_field(field, field_data, field_type): - if field_data == '' or field == '': + if not field_data or not field: return None - patch_field_name = get_field_name(field) - if field_type is None: + if not field_type: field_type = get_field_type(field) - if is_embedded_field(field): sub_field = get_sub_field(field) return build_field(sub_field, field_data, 'string') @@ -313,11 +312,13 @@ def excel_reader(datafile, sheet, update, connection, patchall, dict_patch_loadx fields2types = None keys.pop(0) row2name = types.pop(0) + if 'Type' in row2name: fields2types = dict(zip(keys, types)) for field, ftype in fields2types.items(): if 'array' in ftype: fields2types[field] = 'array' + # print(fields2types) # sys.exit() total = 0 @@ -373,7 +374,6 @@ def excel_reader(datafile, sheet, update, connection, patchall, dict_patch_loadx if existing_data.get("uuid"): if not patchall: not_patched += 1 - if patchall: # add the md5 if file_to_upload and not post_json.get('md5sum'): @@ -383,15 +383,10 @@ def excel_reader(datafile, sheet, update, connection, patchall, dict_patch_loadx e = fdnDCIC.patch_FDN(existing_data["uuid"], connection, post_json) if file_to_upload: # get s3 credentials - creds = get_upload_creds( - e['@graph'][0]['accession'], - connection, - e['@graph'][0]) + creds = get_upload_creds(e['@graph'][0]['accession'], connection, e['@graph'][0]) e['@graph'][0]['upload_credentials'] = creds - # upload upload_file(e, filename_to_post) - if e["status"] == "error": error += 1 elif e["status"] == "success": From bf6e0d48c42f022c8c3b8b6d973ee439aa1694e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Koray=20K=C4=B1rl=C4=B1?= Date: Mon, 14 Nov 2016 16:14:14 -0500 Subject: [PATCH 02/16] FF-405 #comment excel reader test without update and paschal --- tests/data_files/Vender_ordered_reference.xls | Bin 13824 -> 34304 bytes tests/data_files/Vendor.xls | Bin 5632 -> 5632 bytes tests/data_files/Vendor_insert.xls | Bin 0 -> 32256 bytes tests/test_import_data.py | 39 +++++++++++++++++- 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 tests/data_files/Vendor_insert.xls diff --git a/tests/data_files/Vender_ordered_reference.xls b/tests/data_files/Vender_ordered_reference.xls index 7988d913b6c43d960b45a31fb8f34c12290d842d..11ab0771c47b6b6887dc92180743af9aae80933d 100644 GIT binary patch literal 34304 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 J{r@Wee*l-#Jplj! diff --git a/tests/data_files/Vendor.xls b/tests/data_files/Vendor.xls index 21078794bd4b2d286917935acd3bafc7211d27ef..43a7ddd1405b23b5c61c0da168c89be7d3b102a2 100644 GIT binary patch delta 19 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 literal 0 HcmV?d00001 diff --git a/tests/test_import_data.py b/tests/test_import_data.py index fed543c5..cdef1088 100644 --- a/tests/test_import_data.py +++ b/tests/test_import_data.py @@ -141,9 +141,46 @@ def test_get_fields_type(): def test_get_existing_uuid(connection, mocker, returned_vendor_existing_item): post_jsons = [{'uuid': 'some_uuid'}, {'accession': 'some_accession'}, - {'aliases': ['some_uuid']}, + {'aliases': ['some_acc']}, {'@id': 'some_@id'}] for post_json in post_jsons: with mocker.patch('wranglertools.fdnDCIC.requests.get', return_value=returned_vendor_existing_item): response = imp.get_existing(post_json, connection) assert response == returned_vendor_existing_item.json() + + +def test_excel_reader_no_update_no_patchall_new_item(capsys, mocker, connection): + test_insert = './tests/data_files/vendor_insert.xls' + dict_load = {} + message = "This looks like a new row but the update flag wasn't passed, use --update to post new data" + post_json = {'lab': 'sample-lab', + 'description': 'Sample description', + 'award': 'SampleAward', + 'title': 'Sample Vendor', + 'url': 'https://www.sample_vendor.com/', + 'aliases': ['dcic:sample_vendor']} + with mocker.patch('wranglertools.import_data.get_existing', return_value={}): + imp.excel_reader(test_insert, 'Vendor', False, connection, False, dict_load) + args = imp.get_existing.call_args + assert args[0][0] == post_json + out, err = capsys.readouterr() + assert out.strip() == message + + +def test_excel_reader_no_update_no_patchall_existing_item(capsys, mocker, connection): + test_insert = './tests/data_files/vendor_insert.xls' + dict_load = {} + message = "VENDOR: 0 out of 1 posted, 0 errors, 0 patched, 1 not patched (use --patchall to patch)." + post_json = {'lab': 'sample-lab', + 'description': 'Sample description', + 'award': 'SampleAward', + 'title': 'Sample Vendor', + 'url': 'https://www.sample_vendor.com/', + 'aliases': ['dcic:sample_vendor']} + existing_vendor = {'uuid': 'sample_uuid'} + with mocker.patch('wranglertools.import_data.get_existing', return_value=existing_vendor): + imp.excel_reader(test_insert, 'Vendor', False, connection, False, dict_load) + args = imp.get_existing.call_args + assert args[0][0] == post_json + out, err = capsys.readouterr() + assert out.strip() == message From bc4be31e6070730c8c0f1dc443dc536fa5348684 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Koray=20K=C4=B1rl=C4=B1?= Date: Mon, 14 Nov 2016 16:25:24 -0500 Subject: [PATCH 03/16] debugging --- tests/test_import_data.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/test_import_data.py b/tests/test_import_data.py index cdef1088..e4ff22d7 100644 --- a/tests/test_import_data.py +++ b/tests/test_import_data.py @@ -164,11 +164,14 @@ def test_excel_reader_no_update_no_patchall_new_item(capsys, mocker, connection) args = imp.get_existing.call_args assert args[0][0] == post_json out, err = capsys.readouterr() - assert out.strip() == message + # assert out.strip() == message def test_excel_reader_no_update_no_patchall_existing_item(capsys, mocker, connection): - test_insert = './tests/data_files/vendor_insert.xls' + import os + cwd = os.getcwd() + print(cwd) + test_insert = "./tests/data_files/vendor_insert.xls" dict_load = {} message = "VENDOR: 0 out of 1 posted, 0 errors, 0 patched, 1 not patched (use --patchall to patch)." post_json = {'lab': 'sample-lab', @@ -183,4 +186,4 @@ def test_excel_reader_no_update_no_patchall_existing_item(capsys, mocker, connec args = imp.get_existing.call_args assert args[0][0] == post_json out, err = capsys.readouterr() - assert out.strip() == message + # assert out.strip() == message From 3e71a92e3f1a85f398660a53e5595e2fe6b63517 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Koray=20K=C4=B1rl=C4=B1?= Date: Mon, 14 Nov 2016 16:27:03 -0500 Subject: [PATCH 04/16] + --- tests/test_import_data.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_import_data.py b/tests/test_import_data.py index e4ff22d7..808e5d67 100644 --- a/tests/test_import_data.py +++ b/tests/test_import_data.py @@ -152,7 +152,7 @@ def test_get_existing_uuid(connection, mocker, returned_vendor_existing_item): def test_excel_reader_no_update_no_patchall_new_item(capsys, mocker, connection): test_insert = './tests/data_files/vendor_insert.xls' dict_load = {} - message = "This looks like a new row but the update flag wasn't passed, use --update to post new data" + # message = "This looks like a new row but the update flag wasn't passed, use --update to post new data" post_json = {'lab': 'sample-lab', 'description': 'Sample description', 'award': 'SampleAward', @@ -173,7 +173,7 @@ def test_excel_reader_no_update_no_patchall_existing_item(capsys, mocker, connec print(cwd) test_insert = "./tests/data_files/vendor_insert.xls" dict_load = {} - message = "VENDOR: 0 out of 1 posted, 0 errors, 0 patched, 1 not patched (use --patchall to patch)." + # message = "VENDOR: 0 out of 1 posted, 0 errors, 0 patched, 1 not patched (use --patchall to patch)." post_json = {'lab': 'sample-lab', 'description': 'Sample description', 'award': 'SampleAward', From a8ba75009698f37cf39a1a15ba40f3b408f596c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Koray=20K=C4=B1rl=C4=B1?= Date: Mon, 14 Nov 2016 16:38:18 -0500 Subject: [PATCH 05/16] + --- tests/data_files/Vendor_insert.xls | Bin 32256 -> 32256 bytes tests/test_import_data.py | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/data_files/Vendor_insert.xls b/tests/data_files/Vendor_insert.xls index bb3cc13a505ced53dc8ba20b548ab71472a3a4bb..62eb269e03083a59005240a5e6ad6d66420ca08b 100644 GIT binary patch delta 20 ccmZqp!`SeLaYGIZ>k*$ Date: Mon, 14 Nov 2016 17:35:44 -0500 Subject: [PATCH 06/16] turn example insert lists into strings --- tests/data_files/Vender_ordered_reference.xls | Bin 34304 -> 34304 bytes tests/data_files/Vendor.xls | Bin 5632 -> 5632 bytes tests/test_fdnDCIC.py | 4 +++ tests/test_get_field_info.py | 2 +- tests/test_import_data.py | 29 +++++++++++++----- wranglertools/fdnDCIC.py | 8 +++-- 6 files changed, 33 insertions(+), 10 deletions(-) diff --git a/tests/data_files/Vender_ordered_reference.xls b/tests/data_files/Vender_ordered_reference.xls index 11ab0771c47b6b6887dc92180743af9aae80933d..7aa4c27c550461f0c13ff6c946cedf97dce0d783 100644 GIT binary patch delta 20 bcmZqZVQT1M+K|J-TDpAwlS7*eS^66RR~!iI delta 20 bcmZqZVQT1M+K|J->M3TTxOH Date: Mon, 14 Nov 2016 18:30:11 -0500 Subject: [PATCH 07/16] FF-405 #comment added xls ordering check --- tests/data_files/Vender_ordered_reference.xls | Bin 34304 -> 0 bytes tests/data_files/Vendor_ordered reference.xls | Bin 0 -> 13824 bytes tests/test_fdnDCIC.py | 38 ++++++++++++++---- 3 files changed, 30 insertions(+), 8 deletions(-) delete mode 100644 tests/data_files/Vender_ordered_reference.xls create mode 100644 tests/data_files/Vendor_ordered reference.xls diff --git a/tests/data_files/Vender_ordered_reference.xls b/tests/data_files/Vender_ordered_reference.xls deleted file mode 100644 index 7aa4c27c550461f0c13ff6c946cedf97dce0d783..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34304 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 VN=&RoJ{ZkVj{W+d*WbGa{txmkhoJxf diff --git a/tests/data_files/Vendor_ordered reference.xls b/tests/data_files/Vendor_ordered reference.xls new file mode 100644 index 0000000000000000000000000000000000000000..8c9839070c632542a4d6ca1477fa4efde2dc12f5 GIT binary patch literal 13824 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 BQcwT@ literal 0 HcmV?d00001 diff --git a/tests/test_fdnDCIC.py b/tests/test_fdnDCIC.py index 65dac37c..29fcb2be 100644 --- a/tests/test_fdnDCIC.py +++ b/tests/test_fdnDCIC.py @@ -209,20 +209,42 @@ def test_fetch_all_items_mock(connection, mocker, returned_vendor_items): assert vendor[0].startswith("#") -# This test needs more assertions -# Check if content of the 2 files are the same +def xls_to_list(xls_file, sheet): + import xlrd + return_list = [] + wb = xlrd.open_workbook(xls_file) + read_sheet = wb.sheet_by_name(sheet) + cols = read_sheet.ncols + rows = read_sheet.nrows + for row_idx in range(rows): + row_val = [] + for col_idx in range(cols): + cell_value = str(read_sheet.cell(row_idx, col_idx)) + + row_val.append(cell_value) + return_list.append(row_val) + return return_list + + def test_order_FDN_mock(connection, mocker, returned_vendor_items): + vendor_file = './tests/data_files/Vendor.xls' + ordered_file = './tests/data_files/Vendor_ordered.xls' + ref_file = './tests/data_files/Vendor_ordered reference.xls' import os - # import xlrd try: - os.remove("./tests/data_files/Vendor_ordered.xls") + os.remove(ordered_file) except OSError: pass - with mocker.patch('wranglertools.fdnDCIC.requests.get', return_value=returned_vendor_items): - fdnDCIC.order_FDN('./tests/data_files/Vendor.xls', connection) - assert os.path.isfile('./tests/data_files/Vendor_ordered.xls') + with mocker.patch('wranglertools.fdnDCIC.requests.get', return_value=returned_vendor_items): + fdnDCIC.order_FDN(vendor_file, connection) + assert os.path.isfile(ordered_file) + ord_list = xls_to_list(ordered_file, "Vendor") + ref_list = xls_to_list(ref_file, "Vendor") + print(ord_list) + print(ref_list) + assert ord_list == ref_list try: - os.remove("./tests/data_files/Vendor_ordered.xls") + os.remove(ordered_file) except OSError: pass From cfb2fe8238fc5e149da52e03ad6f83a1d2126b46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Koray=20K=C4=B1rl=C4=B1?= Date: Tue, 15 Nov 2016 11:53:51 -0500 Subject: [PATCH 08/16] FF-405 #comment test for exp sets combined --- tests/data_files/Exp_HiC_insert.xls | Bin 0 -> 41472 bytes tests/test_import_data.py | 33 ++++++++++++++-------------- 2 files changed, 17 insertions(+), 16 deletions(-) create mode 100644 tests/data_files/Exp_HiC_insert.xls diff --git a/tests/data_files/Exp_HiC_insert.xls b/tests/data_files/Exp_HiC_insert.xls new file mode 100644 index 0000000000000000000000000000000000000000..458e6ad4612534f448803f7dca57e0774cc741d7 GIT binary patch literal 41472 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 Date: Tue, 15 Nov 2016 11:55:50 -0500 Subject: [PATCH 09/16] + --- tests/test_import_data.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_import_data.py b/tests/test_import_data.py index 3111f6d9..deea02c2 100644 --- a/tests/test_import_data.py +++ b/tests/test_import_data.py @@ -202,4 +202,3 @@ def test_excel_reader_no_update_no_patchall_experiment_expset_combined(mocker, c imp.excel_reader(test_insert, 'ExperimentHiC', False, connection, False, dict_load) args = imp.get_existing.call_args assert args[0][0] == post_json - From e8a0f257131df817bdf10c7744ef64da6e7ff167 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Koray=20K=C4=B1rl=C4=B1?= Date: Tue, 15 Nov 2016 15:07:02 -0500 Subject: [PATCH 10/16] FF-405 #comment posting, patching and uploading tests --- tests/data_files/Exp_HiC_insert.xls | Bin 41472 -> 41472 bytes tests/data_files/example.fastq.gz | Bin 0 -> 82375 bytes tests/test_import_data.py | 75 ++++++++++++++++++++++++---- 3 files changed, 66 insertions(+), 9 deletions(-) create mode 100644 tests/data_files/example.fastq.gz diff --git a/tests/data_files/Exp_HiC_insert.xls b/tests/data_files/Exp_HiC_insert.xls index 458e6ad4612534f448803f7dca57e0774cc741d7..5aa20583d25e857275702e417be323b560553595 100644 GIT binary patch delta 1685 zcmah~TWB0r82--A?CwnVzR7m8wcAXS>_cx^FHJGEaiawTg{mNk57szoHqEY^wsBXe zC1uxIuq_6~Ba{}>dILcVTBq%knkW^dAc*8e!CUdc2gM)?6)fvFvlnAFspoJm|M|c3 z{r`W?e`YFIU6re@_Y11~-qB6NQ*uguLHua_rG7266V)Nl{Da3gSl@V55nKeI;bpzm~feXaFao2m#+?hV8f8u|aM8o(t^?4rJB{D2N;_$)L?c z4EsI7)h+7sD789W_^&@T9$nfzy2G;?vgWy?C2}xir--ob|D)^I!#`B!T!)kbWN zM6{u8+Nnj;E@#4V(P2j~KMZ#!VoPvyU2|Oxf7UoG@rHH*CUCLoL8nYccHM5@t6g*$ z&RFZ_jcKg|({>^>%TB!b_9w@z!;$UYbzyte_a@r7+r??QT&{k8@Z61fb*>_>bw1ky z$Ye52fHji%O|&4EQds%h6rs?FJhbkAxZKI%D35$k`hfSzz%jZ~us%&+_sc6g?=JJ5 zm~5kL``E@9&UmhnJz!2|dw{-lDO)TR(_?1I9I@An>Fi;1@=zh$H*OY7Q+@l7RQX0U zyuK0elli_)zy*#!b9{t+VhgP?`rkS3Re+mYfe95TrGf9=K!5igz>F7&-O0P9@&3Dj z*O<(wwlSaEfRTRS8k6aP?YtLSnCH0JIx+Z}KT;V5etHJ@g(3a%k{#6(yN|EW9Hk>Y ztnc_kJoo4M83@uLnsxdVd(GwC4N_Qi)*wR88vR8|Msn?g%Qf`81)c7= z$9FgB)>GWyl)5O{H&}DZpp})<`<&i^03|zi?}W$ zCkL$iryoy>ggk#HW+X5~9{ZQUl0*oK%F|%tl9#hyxo~ES46D%(&R%lq=-{s>^OaEK LbLV!wG3)*Ze{e}z delta 1572 zcmah|UuauZ9RAMDO>%CMrb!!{bWPi|R;Ak6KhDx@N?JGPDk2>YaiFknjV3Xzvs0*0 zOs0ZN5N40KKe#b{@JTl3oj&-ms%%nxlp*MYTHge5lc`kv6Tf?s+*Q`K1+Kvg}en z$sOvn>{yVdx>=^woYk#1u^qQkYMbm)53`?>-3x)F8kIivitJY3SUtj0XJk9S5t5y@ z^ad=!#4R{106y@FG0Y;5Nfa@ND%-ObYqtfw9+6O84e{0lKm4_l0?x7HT;`e7cZeaO zb~ePT8pebFsXV(Td!pvEtbM4VPc*##jBzzaHqI3Ooln&#t{k7Za(vcPRx{TuHKNf` zGOpqIq0VhRpAR(KpeFfkw4TrF(dd!jks!=Nnr&9E(fJuuhy7CexfHF7s zW33FRpUDQVv8mN;&~a#Oth4Sc)wMLKosqZ*J8M_vNTM~eO1Id#*jdj;YL}Kedx>WN zXWa~9YB{nsF)w47=ZU;_ZNcap6F=CyqQm}VqOv%`h5&1CP*N(DD#V}d4q!mNlX&hr zK_-)N1@@NK%i=o4Y72XNn@4zPs2)iEkJobYz9!MDdi!Vmk2Ji%RHp5d{ojY8+@oFD z1J9)Ho!g(C%}-}%ROzmC$q($v&rFSvj|YIEfx&@|`r-dD$+nkmAKO%ge}=@xULZur z?5)7Ne1~oW9wL2HA5i3~TQ&lZd4R6lft(2(?FYW~0^0|HS2!Vp}x$8tsbTz z4c1hR6`B|FrrK7B2*Uxwqoe6WHBn=Hdd#n*)Xb?G6VPKp9YdPAQe(n;tkH>fUtz>! z&rYuhd+w<}jnZGNwaHp<1~Wtzd5HG8$RwI_k(VgzA|KLtoaj6^)P$d$b6Yi^0Q*m9 zHbypBW2>6Yh&rkgi6#;`Eo&iauF2B0uHGAJcI{;H?$jMb1s8P^J?WwpQBgZOX?4|n zZe*Gdf`xRQ)37HF9F-BH*{S@BaPBKG#loQxdtm<2_Tex_DX(8kGKwV@zCNmdqjogH m<42Mr!5v^PsXjf{_x|y7hBf-fRbx-)3)b=A$*pgn@csi)CRj=U diff --git a/tests/data_files/example.fastq.gz b/tests/data_files/example.fastq.gz new file mode 100644 index 0000000000000000000000000000000000000000..54e47c40af042cfcd1027fdf2c36a262be854bd0 GIT binary patch literal 82375 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

5E5CZwlz?K&wD|Q2 zOH1V8VWz(fxRHYhP z+QgO|{t&`3lE^c=*JTYd0Tmj6n=(^_oEaG5Ea;3^Oq3YKufFhPY(sRq?WJYhYn}`y zsh7(f0FPcwovvmx*);fhxpc&wo6Es+ZEf~W!;^W@9Jl@hK*keQlZ^2)3_D;i-dr(xOVpwK41R4T#u!$W-581I4ei@fWj(iat zzJzN7sCbAh=|}N}ozRv=KW=istM%=a_llEux1GxAJOamROqi(;A!C$8Du(;Sd&niC z+K{}`(3c}NPS7GKPE(c8FY2-nyoJ7?UKzM9N+LcA0_wt=d><;zD`|{yV2@8Y9|Oi8 zI8VG1yOM_%y=X!38*X%g}b8!zp9|-q^9R>-SA)C_U6FRTRLy|0X7=& z>5pU%n(1gg!fB3a4U#pEJ?1|eF<{o^WF_l@;q~`NU^81bHT2bk-8pcmwlJbNn$>Rl z5)mI0`U@zw1ErOtzv!RJA;y%T3Q%ScG%CzjFneoyD_S__gi(a}5{Kkw;)p`^({h2NgGIcWb4`PDT5j?W_ z9S`QrB>v%MkoNKb<~r8$*$G8y!B4Cw#RebUo8V0oWQqiq2x27KH)c*BdV2$H zL_6U0YnW6=_ai!0vSU&t5yofQucV-rQZTaoFO`TdF_p}*PbyD82sQBr|HLu^oq?Zg zbyZPLuYEaa@4lRU69{$jU|o5g(CzCJtKjMJ=>x~+&=qD~{{-U891mwD>x6<5OCnOv z*q9ITdc1@WyhlhXK*-0?Pf?>393ilRYk_nJj`!obCx` z%|RfOK$n7N?L>^QJtbOz`{7*=a^!XDI_cC}^qS(-2(z~TnUv6&lC8@8WH$(!7S8V< l$EllKcVR^(S0j$-=z7&=l%~6M?tlCL{y*PbDTV#$1OP;vOz{8! literal 0 HcmV?d00001 diff --git a/tests/test_import_data.py b/tests/test_import_data.py index deea02c2..bd268865 100644 --- a/tests/test_import_data.py +++ b/tests/test_import_data.py @@ -150,6 +150,7 @@ def test_get_existing_uuid(connection, mocker, returned_vendor_existing_item): def test_excel_reader_no_update_no_patchall_new_item(capsys, mocker, connection): + # test new item submission without patchall update tags and check the return message test_insert = './tests/data_files/Vendor_insert.xls' dict_load = {} message = "This looks like a new row but the update flag wasn't passed, use --update to post new data" @@ -168,6 +169,7 @@ def test_excel_reader_no_update_no_patchall_new_item(capsys, mocker, connection) def test_excel_reader_no_update_no_patchall_existing_item(capsys, mocker, connection): + # test exisiting item submission without patchall update tags and check the return message test_insert = "./tests/data_files/Vendor_insert.xls" dict_load = {} message = "VENDOR: 0 out of 1 posted, 0 errors, 0 patched, 1 not patched (use --patchall to patch)." @@ -186,19 +188,74 @@ def test_excel_reader_no_update_no_patchall_existing_item(capsys, mocker, connec assert out.strip() == message -def test_excel_reader_no_update_no_patchall_experiment_expset_combined(mocker, connection): +def test_excel_reader_no_update_no_patchall_new_experiment_expset_combined(mocker, connection): # check if the separated exp set fields in experiments get combined. test_insert = './tests/data_files/Exp_HiC_insert.xls' dict_load = {} - post_json = {'experiment_type': 'in situ Hi-C', - 'description': 'Test Experiment', - 'experiment_sets': ['a', 'b', 'c', 'd'], - 'biosample': 'test-biosample', - 'aliases': ['dcic:test'], 'award': 'test-award', - 'lab': 'test-lab', - 'digestion_enzyme': 'HindIII', - 'library_preparation_date': '2010-10-10'} + post_json = {'experiment_sets': ['a', 'b', 'c', 'd'], 'aliases': ['dcic:test'], 'award': 'test-award', + 'experiment_type': 'in situ Hi-C', 'lab': 'test-lab', 'filename': 'example.fastq.gz', + 'biosample': 'test-biosample'} with mocker.patch('wranglertools.import_data.get_existing', return_value={}): imp.excel_reader(test_insert, 'ExperimentHiC', False, connection, False, dict_load) args = imp.get_existing.call_args + print(args[0][0]) assert args[0][0] == post_json + + +def test_excel_reader_update_new_experiment_post_and_file_upload(capsys, mocker, connection): + # check if the separated exp set fields in experiments get combined + test_insert = './tests/data_files/Exp_HiC_insert.xls' + dict_load = {} + message0 = "calculating md5 sum for file ./tests/data_files/example.fastq.gz" + message1 = "EXPERIMENTHIC: 1 out of 1 posted, 0 errors, 0 patched." + e = {'status': 'success', '@graph': [{'uuid': 'some_uuid'}]} + # mock fetching existing info, return None + with mocker.patch('wranglertools.import_data.get_existing', return_value={}): + # mock upload file and skip + with mocker.patch('wranglertools.import_data.upload_file', return_value={}): + # mock posting new items + with mocker.patch('wranglertools.fdnDCIC.new_FDN', return_value=e): + imp.excel_reader(test_insert, 'ExperimentHiC', True, connection, False, dict_load) + args = imp.fdnDCIC.new_FDN.call_args + out, err = capsys.readouterr() + outlist = [i.strip() for i in out.split('\n') if i is not ""] + post_json_arg = args[0][2] + assert post_json_arg['md5sum'] == '8f8cc612e5b2d25c52b1d29017e38f2b' + assert message0 == outlist[0] + assert message1 == outlist[1] + + +def test_excel_reader_patch_experiment_post_and_file_upload(capsys, mocker, connection): + # check if the separated exp set fields in experiments get combined + test_insert = './tests/data_files/Exp_HiC_insert.xls' + dict_load = {} + message0 = "calculating md5 sum for file ./tests/data_files/example.fastq.gz" + message1 = "EXPERIMENTHIC: 1 out of 1 posted, 0 errors, 1 patched." + existing_exp = {'uuid': 'sample_uuid'} + e = {'status': 'success', + '@graph': [{'uuid': 'some_uuid', + 'upload_credentials': 'old_creds', + 'accession': 'some_accession'}]} + # mock fetching existing info, return None + with mocker.patch('wranglertools.import_data.get_existing', return_value=existing_exp): + # mock upload file and skip + with mocker.patch('wranglertools.import_data.upload_file', return_value={}): + # mock posting new items + with mocker.patch('wranglertools.fdnDCIC.patch_FDN', return_value=e): + # mock get upload creds + with mocker.patch('wranglertools.import_data.get_upload_creds', return_value="new_creds"): + imp.excel_reader(test_insert, 'ExperimentHiC', False, connection, True, dict_load) + # check for md5sum + args = imp.fdnDCIC.patch_FDN.call_args + post_json_arg = args[0][2] + assert post_json_arg['md5sum'] == '8f8cc612e5b2d25c52b1d29017e38f2b' + # check for cred getting updated (from old_creds to new_creds) + args_upload = imp.upload_file.call_args + updated_post = args_upload[0][0] + print(updated_post) + assert updated_post['@graph'][0]['upload_credentials'] == 'new_creds' + # check for output message + out, err = capsys.readouterr() + outlist = [i.strip() for i in out.split('\n') if i is not ""] + assert message0 == outlist[0] + assert message1 == outlist[1] From e86f3e413a10b58bc54b37400b417dfb7c827238 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Koray=20K=C4=B1rl=C4=B1?= Date: Tue, 15 Nov 2016 15:24:52 -0500 Subject: [PATCH 11/16] FF-405 #comment test for order sorter --- tests/test_import_data.py | 14 ++++++++++++++ wranglertools/import_data.py | 10 +++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/tests/test_import_data.py b/tests/test_import_data.py index bd268865..4dc931d1 100644 --- a/tests/test_import_data.py +++ b/tests/test_import_data.py @@ -259,3 +259,17 @@ def test_excel_reader_patch_experiment_post_and_file_upload(capsys, mocker, conn outlist = [i.strip() for i in out.split('\n') if i is not ""] assert message0 == outlist[0] assert message1 == outlist[1] + + +def test_order_sorter(capsys): + test_list = ["ExperimentHiC", "BiosampleCellCulture", "Biosource", "Document", "Modification", + "IndividualMouse", "Biosample", "Lab", "User", "Trouble"] + ordered_list = ['User', 'Lab', 'Document', 'IndividualMouse', 'Biosource', 'Modification', + 'BiosampleCellCulture', 'Biosample', 'ExperimentHiC'] + message0 = "WARNING! Trouble sheet(s) are not loaded" + message1 = '''WARNING! Check the sheet names and the reference list "sheet_order"''' + assert ordered_list == imp.order_sorter(test_list) + out, err = capsys.readouterr() + outlist = [i.strip() for i in out.split('\n') if i is not ""] + assert message0 == outlist[0] + assert message1 == outlist[1] diff --git a/wranglertools/import_data.py b/wranglertools/import_data.py index f59116b3..02ad87b9 100755 --- a/wranglertools/import_data.py +++ b/wranglertools/import_data.py @@ -345,7 +345,7 @@ def excel_reader(datafile, sheet, update, connection, patchall, dict_patch_loadx for set_key in ["experiment_sets|0", "experiment_sets|1", "experiment_sets|2", "experiment_sets|3"]: try: comb_sets.extend(post_json.get(set_key)) - except: + except: # pragma: no cover continue post_json.pop(set_key, None) post_json['experiment_sets'] = comb_sets @@ -387,7 +387,7 @@ def excel_reader(datafile, sheet, update, connection, patchall, dict_patch_loadx e['@graph'][0]['upload_credentials'] = creds # upload upload_file(e, filename_to_post) - if e["status"] == "error": + if e["status"] == "error": # pragma: no cover error += 1 elif e["status"] == "success": success += 1 @@ -406,7 +406,7 @@ def excel_reader(datafile, sheet, update, connection, patchall, dict_patch_loadx if file_to_upload: # upload the file upload_file(e, filename_to_post) - if e["status"] == "error": + if e["status"] == "error": # pragma: no cover error += 1 elif e["status"] == "success": success += 1 @@ -448,12 +448,12 @@ def upload_file(metadata_post_response, path): #################### # POST file to S3 - env = os.environ.copy() + env = os.environ.copy() # pragma: no cover env.update({ 'AWS_ACCESS_KEY_ID': creds['access_key'], 'AWS_SECRET_ACCESS_KEY': creds['secret_key'], 'AWS_SECURITY_TOKEN': creds['session_token'], - }) + }) # pragma: no cover # ~10s/GB from Stanford - AWS Oregon # ~12-15s/GB from AWS Ireland - AWS Oregon From b523a2584699d1e40a8c6c264da8f2b0abcce92a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Koray=20K=C4=B1rl=C4=B1?= Date: Tue, 15 Nov 2016 15:39:54 -0500 Subject: [PATCH 12/16] FF-405 #comment test for attachment in excel file --- tests/data_files/Document_insert.xls | Bin 0 -> 27136 bytes tests/test_import_data.py | 11 +++++++++++ 2 files changed, 11 insertions(+) create mode 100644 tests/data_files/Document_insert.xls diff --git a/tests/data_files/Document_insert.xls b/tests/data_files/Document_insert.xls new file mode 100644 index 0000000000000000000000000000000000000000..33c7d16f256609aeead786a7f4a4047562e6de20 GIT binary patch literal 27136 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 literal 0 HcmV?d00001 diff --git a/tests/test_import_data.py b/tests/test_import_data.py index 4dc931d1..07e1b9ba 100644 --- a/tests/test_import_data.py +++ b/tests/test_import_data.py @@ -149,6 +149,17 @@ def test_get_existing_uuid(connection, mocker, returned_vendor_existing_item): assert response == returned_vendor_existing_item.json() +def test_excel_reader_no_update_no_patchall_new_doc_with_attachment(capsys, mocker, connection): + # test new item submission without patchall update tags and check the return message + test_insert = './tests/data_files/Document_insert.xls' + dict_load = {} + with mocker.patch('wranglertools.import_data.get_existing', return_value={}): + imp.excel_reader(test_insert, 'Document', False, connection, False, dict_load) + args = imp.get_existing.call_args + attach = args[0][0]['attachment'] + assert attach['href'].startswith('data:image/jpeg;base64') + + def test_excel_reader_no_update_no_patchall_new_item(capsys, mocker, connection): # test new item submission without patchall update tags and check the return message test_insert = './tests/data_files/Vendor_insert.xls' From 3e22e2cd35b04a1bc2bbcfb3f8f8353701c291c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Koray=20K=C4=B1rl=C4=B1?= Date: Tue, 15 Nov 2016 15:50:00 -0500 Subject: [PATCH 13/16] + --- tests/data_files/Exp_HiC_insert.xls | Bin 41472 -> 41984 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/data_files/Exp_HiC_insert.xls b/tests/data_files/Exp_HiC_insert.xls index 5aa20583d25e857275702e417be323b560553595..a21d603219f4a2ff73a0bec286d8987d614fe76e 100644 GIT binary patch delta 378 zcmZoT!qjkrX@U)-??&6>jEw%9S((%sMSU0;82C~%-W2c-J517H`-rf z^qXAD(#&KqW%DnV8;l$VOa@FB5_@bW-(s_8l%KqTU6vqu4y?w3Q-X_=VFDx25+(-u z$w2OAHI8ZlrWuNp7fVbAQkyL#IhjDTv-C_x5PeU^ONh~6vZj6>doynfP+#8WdHT`3 z%DfB=$@zIDMfo{7sVNFcl>$J1QDRkPd}>8OYEfoxYF^3apEee}f{T+F7>vsp7_6Ha z7@Q|CFznv!T}=I2F>oct2P z3=BC;Y(V&f@dLxZ$&AxXH|x}N$nvQ%$N_aQGN=KeoZRF?Gwn7PESSJJS%5`x)2uB_ SoC<-EfMcHAIL~>}Tvh;C?r`e> delta 301 zcmZoT!PIbsX@U)-&qmwhjEsJpS((%s1^@m3{~v_?85kJA?1_PgC$Z#k+9heZ7usK9 z^qpMF(#-U5^5$PGHyAlO{yVT8@M}?=e2dMVQFQVKc3FbtIj|ZBP6;kfh6#*7TbLL` zCj+^g)i|mJn0|;)UMw*gNNu)|ka+u~mw{C|Xif=p~c_=E8S!=uRo v(@Zy4*L2A8u`s9r&0=I=0YVj($%3=&HqF_>#K|B6@h Date: Tue, 15 Nov 2016 17:58:37 -0500 Subject: [PATCH 14/16] clean print statements --- tests/test_fdnDCIC.py | 2 -- tests/test_import_data.py | 3 --- 2 files changed, 5 deletions(-) diff --git a/tests/test_fdnDCIC.py b/tests/test_fdnDCIC.py index 29fcb2be..c03fd1ea 100644 --- a/tests/test_fdnDCIC.py +++ b/tests/test_fdnDCIC.py @@ -241,8 +241,6 @@ def test_order_FDN_mock(connection, mocker, returned_vendor_items): assert os.path.isfile(ordered_file) ord_list = xls_to_list(ordered_file, "Vendor") ref_list = xls_to_list(ref_file, "Vendor") - print(ord_list) - print(ref_list) assert ord_list == ref_list try: os.remove(ordered_file) diff --git a/tests/test_import_data.py b/tests/test_import_data.py index 07e1b9ba..99bf4fce 100644 --- a/tests/test_import_data.py +++ b/tests/test_import_data.py @@ -70,7 +70,6 @@ def test_reader_wrong_sheetname(): def test_cell_value(): readxls = imp.reader('./tests/data_files/test_cell_values.xls') list_readxls = list(readxls) - print(list_readxls) assert list_readxls == [['BOOLEAN', '1'], ['NUMBER', '10'], ['DATE', '2016-09-02']] @@ -209,7 +208,6 @@ def test_excel_reader_no_update_no_patchall_new_experiment_expset_combined(mocke with mocker.patch('wranglertools.import_data.get_existing', return_value={}): imp.excel_reader(test_insert, 'ExperimentHiC', False, connection, False, dict_load) args = imp.get_existing.call_args - print(args[0][0]) assert args[0][0] == post_json @@ -263,7 +261,6 @@ def test_excel_reader_patch_experiment_post_and_file_upload(capsys, mocker, conn # check for cred getting updated (from old_creds to new_creds) args_upload = imp.upload_file.call_args updated_post = args_upload[0][0] - print(updated_post) assert updated_post['@graph'][0]['upload_credentials'] == 'new_creds' # check for output message out, err = capsys.readouterr() From cbb4d0f885a6f7bdb9ec02aba1b884b6af7e0f29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Koray=20K=C4=B1rl=C4=B1?= Date: Wed, 16 Nov 2016 10:44:52 -0500 Subject: [PATCH 15/16] FF-405 #comment added file operation and webtest marks --- README.md | 21 +++++++++++++++++++++ tests/test_fdnDCIC.py | 5 +++++ tests/test_get_field_info.py | 7 ++----- tests/test_import_data.py | 16 ++++++++++++++++ 4 files changed, 44 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 0afa459a..d80390ec 100644 --- a/README.md +++ b/README.md @@ -119,3 +119,24 @@ you to update the release number, then tag the code with that version number and push it to github, which will trigger travis to build and test and if tests pass it will deploy to production version of pypi. Note that travis will automatically deploy the new version if you push a tag to git. + +# Pytest +Every function is tested by pytest implementation. It can be run in terminal in submit4dn folder by: + + py.test + +Some tests need internet access, and labeled with "webtest" mark. + +Some tests have file operations, and labeled with "file_operation" mark. + +To run the mark tests, or exclude them from the tests you can use the following commands: + + # Run all tests + py.test + + # Run only webtest + py.test -m webtest + + # Run only tests with file_opration + py.test -m file_operation + diff --git a/tests/test_fdnDCIC.py b/tests/test_fdnDCIC.py index c03fd1ea..630f0b39 100644 --- a/tests/test_fdnDCIC.py +++ b/tests/test_fdnDCIC.py @@ -1,5 +1,6 @@ import wranglertools.fdnDCIC as fdnDCIC import json +import pytest # test data is in conftest.py keypairs = { @@ -23,6 +24,7 @@ def test_key(): assert isinstance(key.authid, str) +@pytest.mark.file_operation def test_key_file(): key = fdnDCIC.FDN_Key('./tests/data_files/keypairs.json', "default") assert(key) @@ -57,11 +59,13 @@ def test_FDN_url(): assert t_url == expected_url[n] +@pytest.mark.file_operation def test_md5(): md5_keypairs = fdnDCIC.md5('./tests/data_files/keypairs.json') assert md5_keypairs == "19d43267b642fe1868e3c136a2ee06f2" +@pytest.mark.webtest def test_get_FDN(connection_public): # test the schema retrival with public connection award_schema = fdnDCIC.get_FDN("/profiles/award.json", connection_public, frame="object") @@ -226,6 +230,7 @@ def xls_to_list(xls_file, sheet): return return_list +@pytest.mark.file_operation def test_order_FDN_mock(connection, mocker, returned_vendor_items): vendor_file = './tests/data_files/Vendor.xls' ordered_file = './tests/data_files/Vendor_ordered.xls' diff --git a/tests/test_get_field_info.py b/tests/test_get_field_info.py index 3669c10e..26a44f5b 100644 --- a/tests/test_get_field_info.py +++ b/tests/test_get_field_info.py @@ -1,4 +1,5 @@ import wranglertools.get_field_info as gfi +import pytest # test data is in conftest.py @@ -93,11 +94,6 @@ def test_build_field_list_embeds_with_dots(embed_properties): assert field_list[1].name.startswith('experiment_relation') -def test_get_uploadable_fields(connection_public): - field_dict = gfi.get_uploadable_fields(connection_public, ['Vendor']) - assert field_dict - - def test_get_uploadable_fields_mock(connection, mocker, returned_vendor_schema): with mocker.patch('wranglertools.fdnDCIC.requests.get', return_value=returned_vendor_schema): field_dict = gfi.get_uploadable_fields(connection, ['Vendor']) @@ -109,6 +105,7 @@ def test_get_uploadable_fields_mock(connection, mocker, returned_vendor_schema): assert field.enum is not None +@pytest.mark.file_operation def test_create_xls(connection, mocker, returned_vendor_schema): xls_file = "./tests/data_files/Vendor_gfi_test.xls" import os diff --git a/tests/test_import_data.py b/tests/test_import_data.py index 99bf4fce..cdb5a826 100644 --- a/tests/test_import_data.py +++ b/tests/test_import_data.py @@ -3,6 +3,7 @@ # test data is in conftest.py +@pytest.mark.file_operation def test_attachment_image(): attach = imp.attachment("./tests/data_files/test.jpg") assert attach['height'] == 1080 @@ -12,6 +13,7 @@ def test_attachment_image(): assert attach['href'].startswith('data:image/jpeg;base64') +@pytest.mark.file_operation def test_attachment_pdf(): attach = imp.attachment("./tests/data_files/test.pdf") assert attach['download'] == 'test.pdf' @@ -19,18 +21,21 @@ def test_attachment_pdf(): assert attach['href'].startswith('data:application/pdf;base64') +@pytest.mark.file_operation def test_attachment_image_wrong_extension(): with pytest.raises(ValueError) as excinfo: imp.attachment("./tests/data_files/test_jpeg.tiff") assert str(excinfo.value) == 'Wrong extension for image/jpeg: test_jpeg.tiff' +@pytest.mark.file_operation def test_attachment_text_wrong_extension(): with pytest.raises(ValueError) as excinfo: imp.attachment("./tests/data_files/test_txt.pdf") assert str(excinfo.value) == 'Wrong extension for text/plain: test_txt.pdf' +@pytest.mark.webtest def test_attachment_url(): import os attach = imp.attachment("https://wordpress.org/plugins/about/readme.txt") @@ -43,30 +48,35 @@ def test_attachment_url(): pass +@pytest.mark.file_operation def test_attachment_not_accepted(): with pytest.raises(ValueError) as excinfo: imp.attachment("./tests/data_files/test.mp3") assert str(excinfo.value) == 'Unknown file type for test.mp3' +@pytest.mark.file_operation def test_reader(vendor_raw_xls_fields): readxls = imp.reader('./tests/data_files/Vendor.xls') for n, row in enumerate(readxls): assert row == vendor_raw_xls_fields[n] +@pytest.mark.file_operation def test_reader_with_sheetname(vendor_raw_xls_fields): readxls = imp.reader('./tests/data_files/Vendor.xls', 'Vendor') for n, row in enumerate(readxls): assert row == vendor_raw_xls_fields[n] +@pytest.mark.file_operation def test_reader_wrong_sheetname(): readxls = imp.reader('./tests/data_files/Vendor.xls', 'Enzyme') list_readxls = list(readxls) assert list_readxls == [] +@pytest.mark.file_operation def test_cell_value(): readxls = imp.reader('./tests/data_files/test_cell_values.xls') list_readxls = list(readxls) @@ -148,6 +158,7 @@ def test_get_existing_uuid(connection, mocker, returned_vendor_existing_item): assert response == returned_vendor_existing_item.json() +@pytest.mark.file_operation def test_excel_reader_no_update_no_patchall_new_doc_with_attachment(capsys, mocker, connection): # test new item submission without patchall update tags and check the return message test_insert = './tests/data_files/Document_insert.xls' @@ -159,6 +170,7 @@ def test_excel_reader_no_update_no_patchall_new_doc_with_attachment(capsys, mock assert attach['href'].startswith('data:image/jpeg;base64') +@pytest.mark.file_operation def test_excel_reader_no_update_no_patchall_new_item(capsys, mocker, connection): # test new item submission without patchall update tags and check the return message test_insert = './tests/data_files/Vendor_insert.xls' @@ -178,6 +190,7 @@ def test_excel_reader_no_update_no_patchall_new_item(capsys, mocker, connection) assert out.strip() == message +@pytest.mark.file_operation def test_excel_reader_no_update_no_patchall_existing_item(capsys, mocker, connection): # test exisiting item submission without patchall update tags and check the return message test_insert = "./tests/data_files/Vendor_insert.xls" @@ -198,6 +211,7 @@ def test_excel_reader_no_update_no_patchall_existing_item(capsys, mocker, connec assert out.strip() == message +@pytest.mark.file_operation def test_excel_reader_no_update_no_patchall_new_experiment_expset_combined(mocker, connection): # check if the separated exp set fields in experiments get combined. test_insert = './tests/data_files/Exp_HiC_insert.xls' @@ -211,6 +225,7 @@ def test_excel_reader_no_update_no_patchall_new_experiment_expset_combined(mocke assert args[0][0] == post_json +@pytest.mark.file_operation def test_excel_reader_update_new_experiment_post_and_file_upload(capsys, mocker, connection): # check if the separated exp set fields in experiments get combined test_insert = './tests/data_files/Exp_HiC_insert.xls' @@ -234,6 +249,7 @@ def test_excel_reader_update_new_experiment_post_and_file_upload(capsys, mocker, assert message1 == outlist[1] +@pytest.mark.file_operation def test_excel_reader_patch_experiment_post_and_file_upload(capsys, mocker, connection): # check if the separated exp set fields in experiments get combined test_insert = './tests/data_files/Exp_HiC_insert.xls' From 1eb91b89a796ab7570a60ebba10fe8edb3678373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Koray=20K=C4=B1rl=C4=B1?= Date: Wed, 16 Nov 2016 15:04:01 -0500 Subject: [PATCH 16/16] change fileset types in Rao data --- Data_Files/Rao_et_al_2014/fieldsRao.xls | Bin 309248 -> 309248 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Data_Files/Rao_et_al_2014/fieldsRao.xls b/Data_Files/Rao_et_al_2014/fieldsRao.xls index ea5ec5b47d9bde8f5f8e4b5368c514a62fa41e0f..ad44531545e5ed91c00048f94598d0c5e46b4598 100644 GIT binary patch delta 1211 zcmah}e{2&~9RGaZyI!|$tn0>)Z4CAUnMk&@o6a!kECOzZfQ-yxFbJ#bAtl|q{@B=J za7(lsi9!q)IbGB(5{fYkqD^)fha)je6HO3;k{Lxp;`9&5sw__BkNIv*PZAQ%%iVo` zz0bSc-Mju|UVk$0Y(SFV9~tP_vQZ671GF>omo!6JPro$!GkoKZt%Fs)BfH6|x~wby z`&{C*(BlZh4=)0!#!4gsWZ-oY7Y65XTY)X}UY2lY_;QP@XD7ZC2W(g@Qb1o{-+ayN z#N=)pn$+=v-unU`kH-uob{5XieTjQ35_^_&;$i{y`QrcSnk#P1qrX*;vxuhDXPrg$ zA5POD}`lfw`m4T*k zFdA$N24b+|ywA|AXz&M=W+iGg91o=$45`5ziH2fWg3nZP6%_sM1q6+LOU+eDK+)J(D#s-(3!<>H9| zgmN(~7R_-+D$zVI&{A!%mvS2G#QvE%P55G*@Zn{`wQ0gHcL`Pp!~AN7iS-Qn4u(OW z*kip6*N!suy~psN&T#1~hC??PYHu;kTPMDfPuzU(qWBSFnxlmu(TBJ4Pwj){L!_4v zvEe=Tsw|HB0*;HTIJP_a!W>P^IT-(wG3}>0R;FjaNVC~mZjAi;b5{Q5BPF4yILcn( zXg|l1b&I30RKlHR32zNbNW3kX>sIWDzs5z$tGsOB7#}+()vmCvc~`>C;f2hUzGPJT noEVsPV;w!D^E1*9G3{PoYUEMTj;jMbSVpEA_Su)-36*tiwlC(i>fs>5QxDRb}E}}+3t3M zHYBzet~HGm=(tQkCO<9*jlWNRWhtq`k1w$WOQ^;V&%_+bW4T!)8Y!iQddS z@6UYSxj54?QP?q2cq$~6`_nypv}Jl!d`RBZA7Y$x2P1bz5g2%RIdb*ilqyQ-UdP=3 zewHS(XceLeq5&cJFb@*|vay%U7ek`Q>2~Hku2NOm0hh;RrpWyaPRue}Kzn=p!wccw zX=Cbahd$tLd!pd?`|U#Nt=Z%BMC0)hsdwgZ;^q>4v*&+iO?j#d>89>4FQE(i#`2OC z2gcU%V7Mi`J-S7+%uiqX$82b74wEI(;GsizvZmV=lu2;mG2i4 zJY{L;@?yHDD0>zY&U({MUj?1vS!GMij%==^dZ#l{MfjnHFuLAqj2Qldlr6tmLwDyW zn>P^7ZF*$Owg!5TrBu`te1Y_+x3|)6p&Zi)KQ*VF;U-!lL?srHu`fU+h8i{XBROu# zh%H~&OgUuBFD+Tnk||fWP)+(X!=@WHy%5W!oi>fyv}k)K-D%U0HWly4r0>}zZF20) zr0Z=uVbhdN)vcMHVbhIPsxulV*>gs1J*_srXrr0cZu57zbb^o^AaoBC`o{?89}vb| z3|AI1^uEZj|4oL*0K?2ShW_0Qn~pIklA-S+!@6q>v+gi?Z<6Jc%-cox^9)y<)Z|CR zI@Kg#-x2TxwaP$fc9TA3ku;a%3 zt+dQAubv{SPKq-`iZQXAo|Oyw#IK~ggxY^f9A!D)V&8Ykr6a_362)@xYq2uxZ%yM* Am;e9(