def test_run_snp_sites(self): builder = SNPFeatureBuilder() fasta_filename = os.path.join(test_data(), 'file_with_SNPs.aln') with context_aware_tempdir() as output_directory: stdout, stderr = builder._run_snp_sites('snp-sites', {}, fasta_filename, output_directory) expected_output_filename = os.path.join(output_directory, 'all_snps.vcf') self.assertTrue(os.path.isfile(expected_output_filename))
def test_add_record_to_features(self): builder = SNPFeatureBuilder() record = FakeRecord(1,1,['0', '0', '1']) builder._add_record_to_features(record) self.assertItemsEqual(builder.features.keys(), ['sample_0', 'sample_1', 'sample_2']) self.assertEqual(builder.features['sample_0'], [0]) self.assertEqual(builder.features['sample_1'], [0]) self.assertEqual(builder.features['sample_2'], [1]) self.assertEqual(builder.feature_labels, ['SNP:1:1']) record = FakeRecord(1,2,['0', '1', '2']) builder._add_record_to_features(record) self.assertItemsEqual(builder.features.keys(), ['sample_0', 'sample_1', 'sample_2']) self.assertEqual(builder.features['sample_0'], [0,0]) self.assertEqual(builder.features['sample_1'], [0,1]) self.assertEqual(builder.features['sample_2'], [1,1]) self.assertEqual(builder.feature_labels, ['SNP:1:1', 'SNP:1:2']) record = FakeRecord(1,3,['1', '2', '0']) record.samples[1].data.__delattr__('GT') # One of the samples is missing an 'AB' builder._add_record_to_features(record) self.assertItemsEqual(builder.features.keys(), ['sample_0', 'sample_1', 'sample_2']) self.assertEqual(builder.features['sample_0'], [0,0]) self.assertEqual(builder.features['sample_1'], [0,1]) self.assertEqual(builder.features['sample_2'], [1,1]) self.assertEqual(builder.feature_labels, ['SNP:1:1', 'SNP:1:2'])
def test_create_features(self): builder = SNPFeatureBuilder() fake_vcf = [] fake_vcf.append(FakeRecord(1,1,['0', '0', '1'])) fake_vcf.append(FakeRecord(1,2,['0', '1', '2'])) fake_vcf.append(FakeRecord(1,3,['1', '2', '0'])) builder._get_records_from_vcf=MagicMock(return_value=fake_vcf) builder.create_features() self.assertItemsEqual(builder.features.keys(), ['sample_0', 'sample_1', 'sample_2']) self.assertEqual(builder.features['sample_0'], [0,0,1]) self.assertEqual(builder.features['sample_1'], [0,1,1]) self.assertEqual(builder.features['sample_2'], [1,1,0]) self.assertEqual(builder.feature_labels, ['SNP:1:1', 'SNP:1:2', 'SNP:1:3']) fake_vcf = [FakeRecord(2,1,['1', '0'])] builder._get_records_from_vcf=MagicMock(return_value=fake_vcf) builder.create_features() self.assertItemsEqual(builder.features.keys(), ['sample_0', 'sample_1']) self.assertEqual(builder.features['sample_0'], [1]) self.assertEqual(builder.features['sample_1'], [0]) self.assertEqual(builder.feature_labels, ['SNP:2:1'])
def test_create_vcf_from_sequences(self, temp_mock, ctx_tempfile_mock, ctx_tempdir_mock): builder = SNPFeatureBuilder() temp_vcf_file = tempfile.NamedTemporaryFile('w', delete=False) temp_files = [] temp_folders = [] ctx_tempfile_mock.side_effect = create_context_aware_tempfile_mock(temp_files) ctx_tempdir_mock.side_effect = create_context_aware_tempdir_mock(temp_folders) temp_mock.NamedTemporaryFile.return_value = temp_vcf_file fasta_filename = os.path.join(test_data(), 'file_with_SNPs.aln') fasta_file = open(fasta_filename, 'r') builder.load_fasta_sequences(fasta_file) builder.create_vcf_from_sequences() self.assertEqual(len(temp_files), 1) self.assertFalse(os.path.isfile(temp_files[0])) self.assertEqual(len(temp_folders), 1) self.assertFalse(os.path.isdir(temp_folders[0])) self.assertTrue(os.path.isfile(temp_vcf_file.name)) builder.vcf_input_file.seek(0) records = SNPSitesReader(builder.vcf_input_file) number_of_records = sum((1 for record in records)) self.assertEqual(number_of_records, 5) fasta_file.close() temp_vcf_file.close() os.remove(temp_vcf_file.name)
def test_get_records_from_vcf(self): builder = SNPFeatureBuilder() fasta_filename = os.path.join(test_data(), 'file_with_SNPs.aln') fasta_file = open(fasta_filename, 'r') builder.load_fasta_sequences(fasta_file) builder.create_vcf_from_sequences() records = builder._get_records_from_vcf() number_of_records = sum((1 for record in records)) self.assertEqual(number_of_records, 5) records = builder._get_records_from_vcf() number_of_records = sum((1 for record in records)) self.assertEqual(number_of_records, 5)
def test_create_vcf_from_sequences_does_not_delete_existing(self, os_mock): builder = SNPFeatureBuilder() os_mock.remove.side_effect = os.remove with context_aware_tempfile('w', delete=False) as temp_vcf_file: builder.vcf_input_file = temp_vcf_file fasta_filename = os.path.join(test_data(), 'file_with_SNPs.aln') fasta_file = open(fasta_filename, 'r') builder.load_fasta_sequences(fasta_file) builder.create_vcf_from_sequences() self.assertFalse(temp_vcf_file.name in os_mock.remove.call_args_list)
def test_create_vcf_from_sequences_deletes_when_done(self, os_mock): builder = SNPFeatureBuilder() os_mock.remove.side_effect = os.remove fasta_filename = os.path.join(test_data(), 'file_with_SNPs.aln') fasta_file = open(fasta_filename, 'r') builder.load_fasta_sequences(fasta_file) builder.create_vcf_from_sequences() temp_vcf_filename = builder.vcf_input_file.name del(builder) os_mock.remove.assert_any_call(temp_vcf_filename) try: os.remove(temp_vcf_filename) except OSError: # Looks like it's already deleted pass