Exemple #1
0
    def test_search(self):
        with self.assertRaises(ValueError):
            Plate.search()

        with self.assertRaises(ValueError):
            Plate.search(samples=['1.SKB1.640202'], query_type='WRONG')

        plate21 = Plate(21)
        plate22 = Plate(22)
        plate23 = Plate(23)
        plate27 = Plate(27)
        plate30 = Plate(30)
        plate33 = Plate(33)

        self.assertEqual(
            Plate.search(samples=['1.SKB1.640202', '1.SKB2.640194']),
            [plate21, plate27, plate30, plate33])
        self.assertEqual(Plate.search(samples=['1.SKB1.640202']),
                         [plate21, plate27, plate30, plate33])

        self.assertEqual(Plate.search(plate_notes='interesting'), [])
        # Add comments to a plate so we can actually test the
        # search functionality
        plate22.notes = 'Some interesting notes'
        plate23.notes = 'More boring notes'

        self.assertEqual(Plate.search(plate_notes='interesting'), [plate22])
        self.assertCountEqual(Plate.search(plate_notes='interesting boring'),
                              [])
        self.assertEqual(
            Plate.search(samples=['1.SKB1.640202'], plate_notes='interesting'),
            [])
        # sample '1.SKB1.640202' is on 4 sample plates, plus there is a
        # gdna plate with a note containing the word 'interesting'
        self.assertCountEqual(
            Plate.search(samples=['1.SKB1.640202'],
                         plate_notes='interesting',
                         query_type='UNION'),
            [plate21, plate22, plate27, plate30, plate33])

        # The search engine ignores common english words
        self.assertEqual(Plate.search(plate_notes='more'), [])

        # Add comments to some wells
        plate23.get_well(1, 1).composition.notes = 'What else should I write?'
        self.assertEqual(Plate.search(well_notes='write'), [plate23])
        self.assertEqual(
            Plate.search(plate_notes='interesting', well_notes='write'), [])
        self.assertCountEqual(
            Plate.search(plate_notes='interesting',
                         well_notes='write',
                         query_type='UNION'), [plate22, plate23])
Exemple #2
0
 def test_get_well(self):
     # Plate 21 - Defined in the test DB
     tester = Plate(21)
     self.assertEqual(tester.get_well(1, 1), Well(3073))
     self.assertEqual(tester.get_well(1, 2), Well(3088))
     self.assertEqual(tester.get_well(7, 2), Well(4168))
     self.assertEqual(tester.get_well(8, 12), Well(4498))
     with self.assertRaises(LabmanError):
         tester.get_well(8, 13)
     with self.assertRaises(LabmanError):
         tester.get_well(9, 12)
Exemple #3
0
    def test_post_plate_search_handler(self):
        # Note: these tests don't exercise all the cases covered in
        # db/tests/test_plate.py test_search; instead, they focus on
        # testing at least one search based on each of the input
        # fields, to verify that these are being passed through
        # correctly to the db's Plate.search method.

        # Test search by sample names:
        post_data = {
            'sample_names': dumps(['1.SKB1.640202', '1.SKB2.640194']),
            'plate_comment_keywords': "",
            'well_comment_keywords': "",
            'operation': "INTERSECT"
        }

        response = self.post('/plate_search', post_data)
        self.assertEqual(response.code, 200)
        obs = json_decode(response.body)
        self.assertCountEqual(obs.keys(), ['data'])
        obs_data = obs['data']
        self.assertEqual(len(obs_data), 1)
        self.assertEqual(obs_data[0], [21, 'Test plate 1'])

        # Test search by plate comment keywords:
        # It looks like none of the plates in the test database have
        # any notes, so it is necessary to add some to be able to
        # test the keywords search functionality; the below is lifted
        # verbatim from db/tests/test_plate.py test_search
        plate22 = Plate(22)
        plate23 = Plate(23)

        # Add comments to a plate so we can actually test the
        # search functionality
        plate22.notes = 'Some interesting notes'
        plate23.notes = 'More boring notes'
        # end verbatim lift

        post_data = {
            'sample_names': dumps([]),
            'plate_comment_keywords': 'interesting boring',
            'well_comment_keywords': "",
            'operation': "INTERSECT"
        }
        response = self.post('/plate_search', post_data)
        self.assertEqual(response.code, 200)
        obs = json_decode(response.body)
        self.assertCountEqual(obs.keys(), ['data'])
        obs_data = obs['data']
        self.assertEqual(len(obs_data), 0)

        # Test search by intersecting or unioning multiple search terms:
        post_data = {
            'sample_names': dumps(['1.SKB1.640202']),
            'plate_comment_keywords': 'interesting boring',
            'well_comment_keywords': "",
            'operation': "INTERSECT"
        }
        response = self.post('/plate_search', post_data)
        self.assertEqual(response.code, 200)
        obs = json_decode(response.body)
        self.assertCountEqual(obs.keys(), ['data'])
        obs_data = obs['data']
        self.assertEqual(len(obs_data), 0)

        post_data = {
            'sample_names': dumps(['1.SKB1.640202']),
            'plate_comment_keywords': 'interesting boring',
            'well_comment_keywords': "",
            'operation': "UNION"
        }
        response = self.post('/plate_search', post_data)
        self.assertEqual(response.code, 200)
        obs = json_decode(response.body)
        self.assertCountEqual(obs.keys(), ['data'])
        obs_data = obs['data']
        self.assertEqual(len(obs_data), 1)
        self.assertEqual(obs_data[0], [21, 'Test plate 1'])

        # Test search by well comment keywords:
        # Add comments to some wells so can test well comment search
        plate23.get_well(1, 1).composition.notes = 'What should I write?'

        post_data = {
            'sample_names': dumps([]),
            'plate_comment_keywords': '',
            'well_comment_keywords': "write",
            'operation': "INTERSECT"
        }
        response = self.post('/plate_search', post_data)
        self.assertEqual(response.code, 200)
        obs = json_decode(response.body)
        self.assertCountEqual(obs.keys(), ['data'])
        obs_data = obs['data']
        self.assertEqual(len(obs_data), 1)
        self.assertEqual(obs_data[0], [23, 'Test 16S plate 1'])
Exemple #4
0
    def test_properties(self):
        # Plate 21 - Defined in the test DB
        tester = Plate(21)
        self.assertEqual(tester.external_id, 'Test plate 1')
        self.assertEqual(tester.plate_configuration, PlateConfiguration(1))
        self.assertFalse(tester.discarded)
        tester.discarded = True
        self.assertTrue(tester.discarded)
        self.assertIsNone(tester.notes)
        obs_layout = tester.layout
        self.assertEqual(len(obs_layout), 8)
        for row in obs_layout:
            self.assertEqual(len(row), 12)
        self.assertEqual(tester.studies, {Study(1)})
        self.assertIsNone(tester.quantification_process)
        self.assertEqual(tester.process, SamplePlatingProcess(10))

        # Test changing the name of the plate
        tester.external_id = 'Some new name'
        self.assertEqual(tester.external_id, 'Some new name')
        tester.external_id = 'Test plate 1'
        self.assertEqual(tester.external_id, 'Test plate 1')

        self.assertEqual(
            Plate(23).quantification_process, QuantificationProcess(1))
        self.assertEqual(Plate(22).process, GDNAExtractionProcess(1))

        exp = {
            '1.SKB1.640202': [[Well(3073), '1.SKB1.640202.21.A1'],
                              [Well(3253), '1.SKB1.640202.21.B1'],
                              [Well(3433), '1.SKB1.640202.21.C1'],
                              [Well(3613), '1.SKB1.640202.21.D1'],
                              [Well(3793), '1.SKB1.640202.21.E1'],
                              [Well(3973), '1.SKB1.640202.21.F1']],
            '1.SKB2.640194': [[Well(3088), '1.SKB2.640194.21.A2'],
                              [Well(3268), '1.SKB2.640194.21.B2'],
                              [Well(3448), '1.SKB2.640194.21.C2'],
                              [Well(3628), '1.SKB2.640194.21.D2'],
                              [Well(3808), '1.SKB2.640194.21.E2'],
                              [Well(3988), '1.SKB2.640194.21.F2']],
            '1.SKB3.640195': [[Well(3103), '1.SKB3.640195.21.A3'],
                              [Well(3283), '1.SKB3.640195.21.B3'],
                              [Well(3463), '1.SKB3.640195.21.C3'],
                              [Well(3643), '1.SKB3.640195.21.D3'],
                              [Well(3823), '1.SKB3.640195.21.E3'],
                              [Well(4003), '1.SKB3.640195.21.F3']],
            '1.SKB4.640189': [[Well(3118), '1.SKB4.640189.21.A4'],
                              [Well(3298), '1.SKB4.640189.21.B4'],
                              [Well(3478), '1.SKB4.640189.21.C4'],
                              [Well(3658), '1.SKB4.640189.21.D4'],
                              [Well(3838), '1.SKB4.640189.21.E4'],
                              [Well(4018), '1.SKB4.640189.21.F4']],
            '1.SKB5.640181': [[Well(3133), '1.SKB5.640181.21.A5'],
                              [Well(3313), '1.SKB5.640181.21.B5'],
                              [Well(3493), '1.SKB5.640181.21.C5'],
                              [Well(3673), '1.SKB5.640181.21.D5'],
                              [Well(3853), '1.SKB5.640181.21.E5'],
                              [Well(4033), '1.SKB5.640181.21.F5']],
            '1.SKB6.640176': [[Well(3148), '1.SKB6.640176.21.A6'],
                              [Well(3328), '1.SKB6.640176.21.B6'],
                              [Well(3508), '1.SKB6.640176.21.C6'],
                              [Well(3688), '1.SKB6.640176.21.D6'],
                              [Well(3868), '1.SKB6.640176.21.E6'],
                              [Well(4048), '1.SKB6.640176.21.F6']],
            '1.SKB7.640196': [[Well(3163), '1.SKB7.640196.21.A7'],
                              [Well(3343), '1.SKB7.640196.21.B7'],
                              [Well(3523), '1.SKB7.640196.21.C7'],
                              [Well(3703), '1.SKB7.640196.21.D7'],
                              [Well(3883), '1.SKB7.640196.21.E7'],
                              [Well(4063), '1.SKB7.640196.21.F7']],
            '1.SKB8.640193': [[Well(3178), '1.SKB8.640193.21.A8'],
                              [Well(3358), '1.SKB8.640193.21.B8'],
                              [Well(3538), '1.SKB8.640193.21.C8'],
                              [Well(3718), '1.SKB8.640193.21.D8'],
                              [Well(3898), '1.SKB8.640193.21.E8'],
                              [Well(4078), '1.SKB8.640193.21.F8']],
            '1.SKB9.640200': [[Well(3193), '1.SKB9.640200.21.A9'],
                              [Well(3373), '1.SKB9.640200.21.B9'],
                              [Well(3553), '1.SKB9.640200.21.C9'],
                              [Well(3733), '1.SKB9.640200.21.D9'],
                              [Well(3913), '1.SKB9.640200.21.E9'],
                              [Well(4093), '1.SKB9.640200.21.F9']],
            '1.SKD1.640179': [[Well(3208), '1.SKD1.640179.21.A10'],
                              [Well(3388), '1.SKD1.640179.21.B10'],
                              [Well(3568), '1.SKD1.640179.21.C10'],
                              [Well(3748), '1.SKD1.640179.21.D10'],
                              [Well(3928), '1.SKD1.640179.21.E10'],
                              [Well(4108), '1.SKD1.640179.21.F10']],
            '1.SKD2.640178': [[Well(3223), '1.SKD2.640178.21.A11'],
                              [Well(3403), '1.SKD2.640178.21.B11'],
                              [Well(3583), '1.SKD2.640178.21.C11'],
                              [Well(3763), '1.SKD2.640178.21.D11'],
                              [Well(3943), '1.SKD2.640178.21.E11'],
                              [Well(4123), '1.SKD2.640178.21.F11']],
            '1.SKD3.640198': [[Well(3238), '1.SKD3.640198.21.A12'],
                              [Well(3418), '1.SKD3.640198.21.B12'],
                              [Well(3598), '1.SKD3.640198.21.C12'],
                              [Well(3778), '1.SKD3.640198.21.D12'],
                              [Well(3958), '1.SKD3.640198.21.E12'],
                              [Well(4138), '1.SKD3.640198.21.F12']]
        }
        self.assertEqual(tester.duplicates, exp)
        self.assertEqual(tester.unknown_samples, [])
        exp = tester.get_well(1, 1)
        exp.composition.update('Unknown')
        self.assertEqual(tester.unknown_samples, [exp])
        exp.composition.update('1.SKB1.640202')
Exemple #5
0
    def test_properties(self):
        # Plate 21 - Defined in the test DB
        tester = Plate(21)
        self.assertEqual(tester.external_id, 'Test plate 1')
        self.assertEqual(tester.plate_configuration, PlateConfiguration(1))
        self.assertFalse(tester.discarded)
        tester.discarded = True
        self.assertTrue(tester.discarded)
        self.assertIsNone(tester.notes)
        obs_layout = tester.layout
        self.assertEqual(len(obs_layout), 8)
        for row in obs_layout:
            self.assertEqual(len(row), 12)
        self.assertEqual(tester.studies, {Study(1)})
        self.assertListEqual(tester.quantification_processes, [])
        self.assertEqual(tester.process, SamplePlatingProcess(10))

        # Test changing the name of the plate
        tester.external_id = 'Some new name'
        self.assertEqual(tester.external_id, 'Some new name')
        tester.external_id = 'Test plate 1'
        self.assertEqual(tester.external_id, 'Test plate 1')

        self.assertEqual(len(Plate(23).quantification_processes), 1)
        self.assertEqual(
            Plate(23).quantification_processes[0], QuantificationProcess(1))
        self.assertEqual(Plate(22).process, GDNAExtractionProcess(1))

        exp = {
            '1.SKB1.640202': [[Well(3073), '1.SKB1.640202.21.A1'],
                              [Well(3121), '1.SKB1.640202.21.A2'],
                              [Well(3169), '1.SKB1.640202.21.A3'],
                              [Well(3217), '1.SKB1.640202.21.A4'],
                              [Well(3265), '1.SKB1.640202.21.A5'],
                              [Well(3313), '1.SKB1.640202.21.A6'],
                              [Well(3361), '1.SKB1.640202.21.A7'],
                              [Well(3409), '1.SKB1.640202.21.A8'],
                              [Well(3457), '1.SKB1.640202.21.A9'],
                              [Well(3505), '1.SKB1.640202.21.A10'],
                              [Well(3553), '1.SKB1.640202.21.A11'],
                              [Well(3601), '1.SKB1.640202.21.A12']],
            '1.SKB2.640194': [[Well(3079), '1.SKB2.640194.21.B1'],
                              [Well(3127), '1.SKB2.640194.21.B2'],
                              [Well(3175), '1.SKB2.640194.21.B3'],
                              [Well(3223), '1.SKB2.640194.21.B4'],
                              [Well(3271), '1.SKB2.640194.21.B5'],
                              [Well(3319), '1.SKB2.640194.21.B6'],
                              [Well(3367), '1.SKB2.640194.21.B7'],
                              [Well(3415), '1.SKB2.640194.21.B8'],
                              [Well(3463), '1.SKB2.640194.21.B9'],
                              [Well(3511), '1.SKB2.640194.21.B10'],
                              [Well(3559), '1.SKB2.640194.21.B11'],
                              [Well(3607), '1.SKB2.640194.21.B12']],
            '1.SKB3.640195': [[Well(3085), '1.SKB3.640195.21.C1'],
                              [Well(3133), '1.SKB3.640195.21.C2'],
                              [Well(3181), '1.SKB3.640195.21.C3'],
                              [Well(3229), '1.SKB3.640195.21.C4'],
                              [Well(3277), '1.SKB3.640195.21.C5'],
                              [Well(3325), '1.SKB3.640195.21.C6'],
                              [Well(3373), '1.SKB3.640195.21.C7'],
                              [Well(3421), '1.SKB3.640195.21.C8'],
                              [Well(3469), '1.SKB3.640195.21.C9'],
                              [Well(3517), '1.SKB3.640195.21.C10'],
                              [Well(3565), '1.SKB3.640195.21.C11'],
                              [Well(3613), '1.SKB3.640195.21.C12']],
            '1.SKB4.640189': [[Well(3091), '1.SKB4.640189.21.D1'],
                              [Well(3139), '1.SKB4.640189.21.D2'],
                              [Well(3187), '1.SKB4.640189.21.D3'],
                              [Well(3235), '1.SKB4.640189.21.D4'],
                              [Well(3283), '1.SKB4.640189.21.D5'],
                              [Well(3331), '1.SKB4.640189.21.D6'],
                              [Well(3379), '1.SKB4.640189.21.D7'],
                              [Well(3427), '1.SKB4.640189.21.D8'],
                              [Well(3475), '1.SKB4.640189.21.D9'],
                              [Well(3523), '1.SKB4.640189.21.D10'],
                              [Well(3571), '1.SKB4.640189.21.D11'],
                              [Well(3619), '1.SKB4.640189.21.D12']],
            '1.SKB5.640181': [[Well(3097), '1.SKB5.640181.21.E1'],
                              [Well(3145), '1.SKB5.640181.21.E2'],
                              [Well(3193), '1.SKB5.640181.21.E3'],
                              [Well(3241), '1.SKB5.640181.21.E4'],
                              [Well(3289), '1.SKB5.640181.21.E5'],
                              [Well(3337), '1.SKB5.640181.21.E6'],
                              [Well(3385), '1.SKB5.640181.21.E7'],
                              [Well(3433), '1.SKB5.640181.21.E8'],
                              [Well(3481), '1.SKB5.640181.21.E9'],
                              [Well(3529), '1.SKB5.640181.21.E10'],
                              [Well(3577), '1.SKB5.640181.21.E11'],
                              [Well(3625), '1.SKB5.640181.21.E12']],
            '1.SKB6.640176': [[Well(3103), '1.SKB6.640176.21.F1'],
                              [Well(3151), '1.SKB6.640176.21.F2'],
                              [Well(3199), '1.SKB6.640176.21.F3'],
                              [Well(3247), '1.SKB6.640176.21.F4'],
                              [Well(3295), '1.SKB6.640176.21.F5'],
                              [Well(3343), '1.SKB6.640176.21.F6'],
                              [Well(3391), '1.SKB6.640176.21.F7'],
                              [Well(3439), '1.SKB6.640176.21.F8'],
                              [Well(3487), '1.SKB6.640176.21.F9'],
                              [Well(3535), '1.SKB6.640176.21.F10'],
                              [Well(3583), '1.SKB6.640176.21.F11'],
                              [Well(3631), '1.SKB6.640176.21.F12']]
        }
        self.assertEqual(tester.duplicates, exp)
        self.assertEqual(tester.unknown_samples, [])
        exp = tester.get_well(1, 1)
        exp.composition.update('Unknown')
        self.assertEqual(tester.unknown_samples, [exp])
        exp.composition.update('1.SKB1.640202')

        # test that the quantification_processes attribute correctly
        # orders multiple processes in order from oldest to newest
        tester2 = Plate(26)
        self.assertEqual(len(tester2.quantification_processes), 2)
        self.assertEqual(
            tester2.quantification_processes[0].date,
            datetime.strptime("2017-10-25 19:10:25-0700",
                              '%Y-%m-%d %H:%M:%S%z'))
        self.assertEqual(
            tester2.quantification_processes[1].date,
            datetime.strptime("2017-10-26 03:10:25-0700",
                              '%Y-%m-%d %H:%M:%S%z'))