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])
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(3121)) self.assertEqual(tester.get_well(7, 2), Well(3157)) self.assertEqual(tester.get_well(8, 12), Well(3643)) with self.assertRaises(LabControlError): tester.get_well(8, 13) with self.assertRaises(LabControlError): tester.get_well(9, 12)
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), 4) 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), 4) 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'])
def test_properties(self): # Plate 21 - Defined in the test DB tester = Plate(21) obs = tester.creation_timestamp obs = str(datetime.datetime(obs.year, obs.month, obs.day)) exp = datetime.datetime.now() exp = str(datetime.datetime(exp.year, exp.month, exp.day)) self.assertEqual(obs, exp) 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(11)) # 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.Test.plate.1.A1'], [Well(3121), '1.SKB1.640202.Test.plate.1.A2'], [Well(3169), '1.SKB1.640202.Test.plate.1.A3'], [Well(3217), '1.SKB1.640202.Test.plate.1.A4'], [Well(3265), '1.SKB1.640202.Test.plate.1.A5'], [Well(3313), '1.SKB1.640202.Test.plate.1.A6'], [Well(3361), '1.SKB1.640202.Test.plate.1.A7'], [Well(3409), '1.SKB1.640202.Test.plate.1.A8'], [Well(3457), '1.SKB1.640202.Test.plate.1.A9'], [Well(3505), '1.SKB1.640202.Test.plate.1.A10'], [Well(3553), '1.SKB1.640202.Test.plate.1.A11'], [Well(3601), '1.SKB1.640202.Test.plate.1.A12']], '1.SKB2.640194': [[Well(3079), '1.SKB2.640194.Test.plate.1.B1'], [Well(3127), '1.SKB2.640194.Test.plate.1.B2'], [Well(3175), '1.SKB2.640194.Test.plate.1.B3'], [Well(3223), '1.SKB2.640194.Test.plate.1.B4'], [Well(3271), '1.SKB2.640194.Test.plate.1.B5'], [Well(3319), '1.SKB2.640194.Test.plate.1.B6'], [Well(3367), '1.SKB2.640194.Test.plate.1.B7'], [Well(3415), '1.SKB2.640194.Test.plate.1.B8'], [Well(3463), '1.SKB2.640194.Test.plate.1.B9'], [Well(3511), '1.SKB2.640194.Test.plate.1.B10'], [Well(3559), '1.SKB2.640194.Test.plate.1.B11'], [Well(3607), '1.SKB2.640194.Test.plate.1.B12']], '1.SKB3.640195': [[Well(3085), '1.SKB3.640195.Test.plate.1.C1'], [Well(3133), '1.SKB3.640195.Test.plate.1.C2'], [Well(3181), '1.SKB3.640195.Test.plate.1.C3'], [Well(3229), '1.SKB3.640195.Test.plate.1.C4'], [Well(3277), '1.SKB3.640195.Test.plate.1.C5'], [Well(3325), '1.SKB3.640195.Test.plate.1.C6'], [Well(3373), '1.SKB3.640195.Test.plate.1.C7'], [Well(3421), '1.SKB3.640195.Test.plate.1.C8'], [Well(3469), '1.SKB3.640195.Test.plate.1.C9'], [Well(3517), '1.SKB3.640195.Test.plate.1.C10'], [Well(3565), '1.SKB3.640195.Test.plate.1.C11'], [Well(3613), '1.SKB3.640195.Test.plate.1.C12']], '1.SKB4.640189': [[Well(3091), '1.SKB4.640189.Test.plate.1.D1'], [Well(3139), '1.SKB4.640189.Test.plate.1.D2'], [Well(3187), '1.SKB4.640189.Test.plate.1.D3'], [Well(3235), '1.SKB4.640189.Test.plate.1.D4'], [Well(3283), '1.SKB4.640189.Test.plate.1.D5'], [Well(3331), '1.SKB4.640189.Test.plate.1.D6'], [Well(3379), '1.SKB4.640189.Test.plate.1.D7'], [Well(3427), '1.SKB4.640189.Test.plate.1.D8'], [Well(3475), '1.SKB4.640189.Test.plate.1.D9'], [Well(3523), '1.SKB4.640189.Test.plate.1.D10'], [Well(3571), '1.SKB4.640189.Test.plate.1.D11'], [Well(3619), '1.SKB4.640189.Test.plate.1.D12']], '1.SKB5.640181': [[Well(3097), '1.SKB5.640181.Test.plate.1.E1'], [Well(3145), '1.SKB5.640181.Test.plate.1.E2'], [Well(3193), '1.SKB5.640181.Test.plate.1.E3'], [Well(3241), '1.SKB5.640181.Test.plate.1.E4'], [Well(3289), '1.SKB5.640181.Test.plate.1.E5'], [Well(3337), '1.SKB5.640181.Test.plate.1.E6'], [Well(3385), '1.SKB5.640181.Test.plate.1.E7'], [Well(3433), '1.SKB5.640181.Test.plate.1.E8'], [Well(3481), '1.SKB5.640181.Test.plate.1.E9'], [Well(3529), '1.SKB5.640181.Test.plate.1.E10'], [Well(3577), '1.SKB5.640181.Test.plate.1.E11'], [Well(3625), '1.SKB5.640181.Test.plate.1.E12']], '1.SKB6.640176': [[Well(3103), '1.SKB6.640176.Test.plate.1.F1'], [Well(3151), '1.SKB6.640176.Test.plate.1.F2'], [Well(3199), '1.SKB6.640176.Test.plate.1.F3'], [Well(3247), '1.SKB6.640176.Test.plate.1.F4'], [Well(3295), '1.SKB6.640176.Test.plate.1.F5'], [Well(3343), '1.SKB6.640176.Test.plate.1.F6'], [Well(3391), '1.SKB6.640176.Test.plate.1.F7'], [Well(3439), '1.SKB6.640176.Test.plate.1.F8'], [Well(3487), '1.SKB6.640176.Test.plate.1.F9'], [Well(3535), '1.SKB6.640176.Test.plate.1.F10'], [Well(3583), '1.SKB6.640176.Test.plate.1.F11']] } 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) # we are going to test the dates as string because in the database we # have the full date (including seconds) obs_date = str(tester2.quantification_processes[0].date) self.assertEqual(obs_date, "2017-10-25 19:10:25") obs_date = str(tester2.quantification_processes[1].date) self.assertEqual(obs_date, "2017-10-26 03:10:25")