Beispiel #1
0
 def test_get_runs(self):
     run_date = datetime.date(2019, 1, 10)
     run = SequencingRun(id=1, run_date=run_date, machine_id='M00123',
                         run_number='1', flowcell_id='000000001',
                         experiment_name='PHIX3 test',
                         s3_run_folder_path='s3://somebucket/PHIX3_test')
     db.session.add(run)
     run_date = datetime.date(2019, 2, 15)
     run = SequencingRun(id=2, run_date=run_date, machine_id='M00123',
                         run_number='2', flowcell_id='A',
                         experiment_name='PHIX3 test',
                         s3_run_folder_path='s3://somebucket/PHIX3_test')
     db.session.add(run)
     db.session.commit()
     # Get all runs
     response = self.client.get('/api/v0/runs')
     assert len(response.json['runs']) == 2
     # Get a specific run
     response = self.client.get('/api/v0/runs?run_barcode=190110_M00123_0001_000000001')
     assert len(response.json['runs']) == 1
     # Assert invalid barcode is caught
     response = self.client.get('/api/v0/runs?run_barcode=1')
     assert response.status_code == 400
     # Fetch an unknown run
     response = self.client.get('/api/v0/runs?run_barcode=190110_M00124_0001_000000001')
     assert response.status_code == 404
Beispiel #2
0
    def test_download_file(self):
        ''' Test GET /<sequencing_run_id>/file works '''
        run_date = datetime.date(2019, 1, 10)
        run = SequencingRun(id=1, run_date=run_date, machine_id='M00123',
                            run_number='1', flowcell_id='000000001',
                            experiment_name='PHIX3 test',
                            s3_run_folder_path='s3://somebucket/PHIX3_test')
        db.session.add(run)
        db.session.commit()

        boto3.resources['s3'].create_bucket(Bucket='somebucket')
        boto3.clients['s3'].upload_file(Filename="test_data/SampleSheet.csv",
                                        Bucket='somebucket',
                                        Key="/PHIX3_test/SampleSheet.csv")

        # Test if we don't provide a file, the response is http 400
        response = self.client.get('/api/v0/runs/1/file')
        assert response.status_code == 400

        # Test if we don't provide a valid run, the response is http 404
        response = self.client.get('/api/v0/runs/2/file?file=SampleSheet.csv')
        assert response.status_code == 404

        # Test we can download a file
        response = self.client.get('/api/v0/runs/1/file?file=SampleSheet.csv')
        # Check
        assert response.status_code == 200

        # Test if we don't provide a valid file, the response is http 404
        response = self.client.get('/api/v0/runs/1/file?file=nofile')
        assert response.status_code == 404
Beispiel #3
0
    def test_post_demultiplex_scrnaseq(self):
        # Set up test case
        data = {'ASSAY': 'scRNASeq'}
        # Set up supporting mocks
        resp = boto3.clients["iam"].create_role(
            RoleName="TestRole", AssumeRolePolicyDocument="some_policy")
        iam_arn = resp["Role"]["Arn"]
        boto3.clients['lambda'].create_function(
            FunctionName="somelambdafn",
            Runtime="python3.6",
            Role=iam_arn,
            Handler="lambda_function.lambda_handler",
            Code={"ZipFile": get_test_zip_file1()},
            Description="test lambda function",
            Timeout=3,
            MemorySize=128,
            Publish=True)

        self.app.config['SCRNASEQ_LAMBDA_FN'] = "somelambdafn"
        run_date = datetime.date(2019, 1, 10)
        run = SequencingRun(id=1, run_date=run_date, machine_id='M00123',
                            run_number='1', flowcell_id='000000001',
                            experiment_name='PHIX3 test',
                            s3_run_folder_path='s3://somebucket/PHIX3_test')
        db.session.add(run)
        db.session.commit()
        # Test
        response = self.client.post('/api/v0/runs/1/demultiplex?user=testuser', json=data)
        # Check results
        self.assertEqual(response.status_code, 200)
Beispiel #4
0
    def test_get_samplesheet_runexists_nosamplesheet(self):
        run_date = datetime.date(2019, 1, 10)
        run = SequencingRun(id=1, run_date=run_date, machine_id='M00123',
                            run_number='1', flowcell_id='000000001',
                            experiment_name='PHIX3 test',
                            s3_run_folder_path='s3://somebucket/PHIX3_test')
        db.session.add(run)
        db.session.commit()
        boto3.resources['s3'].create_bucket(Bucket='somebucket')

        response = self.client.get('/api/v0/runs/1/sample_sheet')
        assert response.status_code == 404
Beispiel #5
0
    def post(self):
        # TODO: Secure with auth_tokens
        if not request.json:
            abort(400)
        if not SequencingRun.is_data_valid(request.json):
            abort(403)

        # 1.  Make sure the run doesn't exist in ngs360
        s3_run_folder_path = request.json['s3_run_folder_path']
        run = SequencingRun.query.filter_by(
            s3_run_folder_path=s3_run_folder_path).first()
        if run is None:
            if len(request.json['run_date']) == 6:
                # assume format is YYMMDD
                run_date = datetime.datetime.strptime(request.json['run_date'],
                                                      '%y%m%d')
            else:
                # assume format is m/d/y h:m:s eg 2/2/2018 2:06:49 PM
                run_date = datetime.datetime.strptime(request.json['run_date'],
                                                      '%m/%d/%Y %I:%M:%S %p')
            machine_id = request.json['machine_id']
            run_number = request.json['run_number']
            flowcell_id = request.json['flowcell_id']
            experiment_name = request.json['experiment_name']

            run = SequencingRun(run_date=run_date,
                                machine_id=machine_id,
                                run_number=run_number,
                                flowcell_id=flowcell_id,
                                experiment_name=experiment_name,
                                s3_run_folder_path=s3_run_folder_path)
            db.session.add(run)
            db.session.commit()
        else:
            abort(409)
        run = SequencingRun.query.filter_by(
            s3_run_folder_path=s3_run_folder_path).first()
        return {'run': run.to_dict()}, 201
Beispiel #6
0
 def test_get_samplesheet(self):
     run_date = datetime.date(2019, 1, 10)
     run = SequencingRun(id=1, run_date=run_date, machine_id='M00123',
                         run_number='1', flowcell_id='000000001',
                         experiment_name='PHIX3 test',
                         s3_run_folder_path='s3://somebucket/PHIX3_test')
     db.session.add(run)
     db.session.commit()
     boto3.resources['s3'].create_bucket(Bucket='somebucket')
     boto3.clients['s3'].upload_file(Filename="test_data/SampleSheet.csv",
                                     Bucket='somebucket',
                                     Key="/PHIX3_test/SampleSheet.csv")
     # Test
     response = self.client.get('/api/v0/runs/1/sample_sheet')
     # Check
     assert response.status_code == 200
     assert response.json == {'Summary': {'experiment_name': 'PHIX3 test',
                                          'flowcell_id': '000000001',
                                          'id': 1,
                                          'machine_id': 'M00123',
                                          'run_date': '2019-01-10',
                                          'run_number': '1',
                                          's3_run_folder_path': 's3://somebucket/PHIX3_test'},
                              'Header': {'Application': 'FASTQ Only',
                                         'Assay': 'someassay',
                                         'Chemistry': 'Amplicon',
                                         'Date': '1/8/2018',
                                         'Description': 'PHIX3 test',
                                         'Experiment Name': 'PHIX3 test',
                                         'IEMFileVersion': '4',
                                         'Investigator Name': 'John',
                                         'Workflow': 'GenerateFASTQ'},
                              'Reads': [151, 151],
                              'Settings': {'Adapter': 'CTGTCTCTTATACACATCT',
                                           'ReverseComplement': '0'},
                              'DataCols': ['Sample_ID', 'Sample_Name', 'Sample_Plate',
                                           'Sample_Well', 'I7_Index_ID', 'index', 'I5_Index_ID',
                                           'index2', 'Sample_Project', 'Description'],
                              'Data': [{'Description': '',
                                        'I5_Index_ID': 'S502-A',
                                        'I7_Index_ID': 'N701-A',
                                        'Sample_ID': 'sample1',
                                        'Sample_Name': 'sample1',
                                        'Sample_Plate': '',
                                        'Sample_Project': 'P-00000000-0001',
                                        'Sample_Well': '',
                                        'index': 'TAAGGCGA',
                                        'index2': 'CTCTCTAT'}]
                             }
Beispiel #7
0
 def test_put_samples(self):
     # Set up test parameters
     data = [{'sampleid': 'samplea', 'projectid': 'P-00000000-0001'}]
     # Set up supporting mocks
     run_date = datetime.date(2019, 1, 10)
     run = SequencingRun(id=1, run_date=run_date, machine_id='M00123',
                         run_number='1', flowcell_id='000000001',
                         experiment_name='PHIX3 test',
                         s3_run_folder_path='s3://somebucket/PHIX3_test')
     db.session.add(run)
     db.session.commit()
     # Test
     response = self.client.put('/api/v0/runs/1/samples', json=data)
     # Check Results
     self.assertEqual(response.json['Status'], "OK")
Beispiel #8
0
    def test_get_run_metrics_notdemuxed(self):
        run_date = datetime.date(2019, 1, 10)
        run = SequencingRun(id=1, run_date=run_date, machine_id='M00123',
                            run_number='1', flowcell_id='000000001',
                            experiment_name='PHIX3 test',
                            s3_run_folder_path='s3://somebucket/PHIX3_test')
        db.session.add(run)
        db.session.commit()

        boto3.resources['s3'].create_bucket(Bucket='somebucket')

        response = self.client.get('/api/v0/runs/1/metrics')
        assert response.status_code == 404
        assert response.json == {"Status": "error",
                                 "Message": "s3://somebucket/PHIX3_test/Stats/Stats.json not found"}
Beispiel #9
0
    def test_upload_file(self):
        ''' Test POST /<sequencing_run_id>/file works '''
        run_date = datetime.date(2019, 1, 10)
        run = SequencingRun(id=1, run_date=run_date, machine_id='M00123',
                            run_number='1', flowcell_id='000000001',
                            experiment_name='PHIX3 test',
                            s3_run_folder_path='s3://somebucket/PHIX3_test')
        db.session.add(run)
        db.session.commit()

        boto3.resources['s3'].create_bucket(Bucket='somebucket')

        files = {"file": (open("test_data/SampleSheet.csv", 'rb'), 'SampleSheet.csv'),
                 "filename": "SampleSheet.csv"
                }
        response = self.client.post('/api/v0/runs/1/file', data=files, content_type='multipart/form-data')
        assert response.json['status'] == 'File, SampleSheet.csv, uploaded'
Beispiel #10
0
    def test_get_run_metrics(self):
        run_date = datetime.date(2019, 1, 10)
        run = SequencingRun(id=1, run_date=run_date, machine_id='M00123',
                            run_number='1', flowcell_id='000000001',
                            experiment_name='PHIX3 test',
                            s3_run_folder_path='s3://somebucket/PHIX3_test')
        db.session.add(run)
        db.session.commit()

        boto3.resources['s3'].create_bucket(Bucket='somebucket')
        boto3.clients['s3'].put_object(Bucket='somebucket',
                                       Key="/PHIX3_test/Stats/Stats.json",
                                       Body='{"metrics": "test"}')

        response = self.client.get('/api/v0/runs/1/metrics')
        assert response.status_code == 200
        assert response.json == {"metrics": "test"}
    def test_get_project(self):
        # Set up test case
        # Set up supporting mocks
        project = Project(id='P-00000000-0001', xpress_project_id=12345)
        db.session.add(project)

        run_date = datetime.date(2019, 1, 10)
        run = SequencingRun(id=1,
                            run_date=run_date,
                            machine_id='M00123',
                            run_number='1',
                            flowcell_id='000000001',
                            experiment_name='PHIX3 test',
                            s3_run_folder_path='s3://somebucket/PHIX3_test')
        db.session.add(run)

        run_to_samples = RunToSamples(id=1,
                                      sequencing_run_id=1,
                                      sample_id='sample_a',
                                      project_id='P-00000000-0001')
        db.session.add(run_to_samples)

        db.session.commit()
        # Test
        response = self.client.get('/api/v0/projects/P-00000000-0001')
        # Check
        assert response.status_code == 200
        assert response.json['id'] == 'P-00000000-0001'
        assert response.json['sequencing_runs'] == [{
            'experiment_name':
            'PHIX3 test',
            'flowcell_id':
            '000000001',
            'id':
            1,
            'machine_id':
            'M00123',
            'run_date':
            '2019-01-10',
            'run_number':
            '1',
            's3_run_folder_path':
            's3://somebucket/PHIX3_test'
        }]
        assert response.json['xpress_project_id'] == 12345
        assert 'project_details' in response.json
Beispiel #12
0
    def test_post_demultiplex_edgeseq(self):
        # Set up test case
        data = {'ASSAY': 'EdgeSeq'}
        # Set up supporting mocks
        boto3.clients['batch'].register_job_definition(
            jobDefinitionName="job",
            type="container",
            containerProperties={
                "image": "busybox",
                "vcpus": 1,
                "memory": 128,
                "command": ["sleep", "10"],
            })
        resp = boto3.clients["iam"].create_role(
            RoleName="TestRole", AssumeRolePolicyDocument="some_policy")
        iam_arn = resp["Role"]["Arn"]
        env = boto3.clients['batch'].create_compute_environment(
            computeEnvironmentName='compute_name',
            type="UNMANAGED",
            state="ENABLED",
            serviceRole=iam_arn)
        boto3.clients['batch'].create_job_queue(
            jobQueueName="queue",
            state="ENABLED",
            priority=123,
            computeEnvironmentOrder=[{"order": 123, "computeEnvironment": env['computeEnvironmentArn']}])

        self.app.config['BCL2FASTQ_JOB'] = "job"
        self.app.config['BCL2FASTQ_QUEUE'] = "queue"
        run_date = datetime.date(2019, 1, 10)
        run = SequencingRun(id=1, run_date=run_date, machine_id='M00123',
                            run_number='1', flowcell_id='000000001',
                            experiment_name='PHIX3 test',
                            s3_run_folder_path='s3://somebucket/PHIX3_test')
        db.session.add(run)
        db.session.commit()
        # Test
        response = self.client.post('/api/v0/runs/1/demultiplex?user=testuser', json=data)
        # Check results
        self.assertEqual(response.status_code, 200)
        self.assertTrue('jobName' in response.json)
        self.assertTrue('jobId' in response.json)