def test_download_raw_data(self): # it's possible that one of the tests is deleting the raw data # so we will make sure that the files exists so this test passes study = Study(1) all_files = [x['fp'] for a in study.artifacts() for x in a.filepaths] for fp in all_files: if not exists(fp): with open(fp, 'w') as f: f.write('') response = self.get('/download_raw_data/1') self.assertEqual(response.code, 200) exp = ( '2125826711 58 /protected/raw_data/1_s_G1_L001_sequences.fastq.gz ' 'raw_data/1_s_G1_L001_sequences.fastq.gz\n' '2125826711 58 /protected/raw_data/' '1_s_G1_L001_sequences_barcodes.fastq.gz ' 'raw_data/1_s_G1_L001_sequences_barcodes.fastq.gz\n' '- [0-9]* /protected/templates/1_prep_1_qiime_[0-9]*-[0-9]*.txt ' 'mapping_files/1_mapping_file.txt\n' '1756512010 1093210 /protected/BIOM/7/biom_table.biom ' 'BIOM/7/biom_table.biom\n' '- [0-9]* /protected/templates/1_prep_2_qiime_[0-9]*-[0-9]*.txt ' 'mapping_files/7_mapping_file.txt\n') self.assertRegex(response.body.decode('ascii'), exp) response = self.get('/download_study_bioms/200') self.assertEqual(response.code, 405) # changing user so we can test the failures BaseHandler.get_current_user = Mock( return_value=User("*****@*****.**")) response = self.get('/download_study_bioms/1') self.assertEqual(response.code, 405) # now, let's make sure that when artifacts are public AND the # public_raw_download any user can download the files study.public_raw_download = True BaseHandler.get_current_user = Mock( return_value=User("*****@*****.**")) response = self.get('/download_study_bioms/1') self.assertEqual(response.code, 405) # 7 is an uploaded biom, which should now be available but as it's a # biom, only the prep info file will be retrieved Artifact(7).visibility = 'public' BaseHandler.get_current_user = Mock( return_value=User("*****@*****.**")) response = self.get('/download_study_bioms/1') self.assertEqual(response.code, 200) exp = ( '- [0-9]* /protected/templates/1_prep_2_qiime_[0-9]*-[0-9]*.txt ' 'mapping_files/7_mapping_file.txt\n') self.assertRegex(response.body.decode('ascii'), exp)
def study_patch_request(user_id, study_id, req_op, req_path, req_value=None, req_from=None): """Modifies an attribute of the study object Parameters ---------- user_id : int The id of the user performing the patch operation study_id : int The id of the study on which we will be performing the patch operation req_op : str The operation to perform on the study req_path : str The attribute to patch req_value : str, optional The value that needs to be modified req_from : str, optional The original path of the element Returns ------- dict of {str, str} A dictionary with the following keys: - status: str, whether if the request is successful or not - message: str, if the request is unsuccessful, a human readable error """ if req_op == 'replace': req_path = [v for v in req_path.split('/') if v] if len(req_path) != 1: return {'status': 'error', 'message': 'Incorrect path parameter'} attribute = req_path[0] # Check if the user actually has access to the study access_error = check_access(study_id, user_id) if access_error: return access_error study = Study(study_id) if attribute == 'tags': message = study.update_tags(User(user_id), req_value) return {'status': 'success', 'message': message} elif attribute == 'specimen_id_column': try: study.specimen_id_column = req_value return { 'status': 'success', 'message': 'Successfully updated specimen id column' } except (QiitaDBLookupError, QiitaDBColumnError) as e: return {'status': 'error', 'message': str(e)} elif attribute == 'toggle_public_raw_download': try: study.public_raw_download = not study.public_raw_download return { 'status': 'success', 'message': 'Successfully updated public_raw_download' } except (QiitaDBLookupError, QiitaDBColumnError) as e: return {'status': 'error', 'message': str(e)} else: # We don't understand the attribute so return an error return { 'status': 'error', 'message': 'Attribute "%s" not found. ' 'Please, check the path parameter' % attribute } else: return { 'status': 'error', 'message': 'Operation "%s" not supported. ' 'Current supported operations: replace' % req_op }