def test_dbci002_inner_outer_radii(dash_duo): app = dash.Dash(__name__) app.layout = html.Div(simple_app_layout( dash_bio.Circos( id=_COMPONENT_ID, layout=_data['GRCh37'] ) )) change_radii_config = {'innerRadius': 20, 'outerRadius': 100} simple_app_callback( app, dash_duo, component_id=_COMPONENT_ID, test_prop_name='config', test_prop_value=json.dumps(change_radii_config), prop_value_type='dict', validation_fn=lambda x: x['innerRadius'] == change_radii_config['innerRadius'] and x['outerRadius'] == change_radii_config['outerRadius'] ) chr_one_div = dash_duo.find_element('path#chr1') assert int(chr_one_div.size['width']) == 41 assert int(chr_one_div.size['height']) == 81
def test_dbsp006_custom_view(dash_duo): app = dash.Dash(__name__) app.layout = html.Div( simple_app_layout(dash_bio.Speck(id=_COMPONENT_ID, data=_data))) new_view = { 'ao': 0.1, 'outline': 1, 'dofStrength': 0.4, 'resolution': 600, 'atomScale': 0.15, 'relativeAtomScale': 0.51, 'bonds': True, 'bondScale': 0.75 } simple_app_callback( app, dash_duo, component_id=_COMPONENT_ID, test_prop_name='view', test_prop_value=json.dumps(new_view), prop_value_type='dict', validation_fn=lambda x: json.dumps(x) == json.dumps(new_view), take_snapshot=True)
def test_dbci001_graph_type(dash_duo): app = dash.Dash(__name__) app.layout = html.Div(simple_app_layout( dash_bio.Circos( id=_COMPONENT_ID, layout=_data['GRCh37'], ) )) histogram_layout = [ {'type': 'HISTOGRAM', 'data': _data['histogram'][:5]} ] simple_app_callback( app, dash_duo, component_id=_COMPONENT_ID, test_prop_name='tracks', test_prop_value=json.dumps(histogram_layout), prop_value_type='dict', validation_fn=lambda x: json.dumps(x) == json.dumps(histogram_layout) ) # there should be five bins in the histogram assert len(dash_duo.find_elements('path.bin')) == 5
def test_dbm2003_select_atoms_via_callback(dash_duo): app = dash.Dash(__name__) app.layout = html.Div( simple_app_layout( dash_bio.Molecule2dViewer(id=_COMPONENT_ID, modelData=_data))) simple_app_callback( app, dash_duo, component_id=_COMPONENT_ID, test_prop_name='selectedAtomIds', test_prop_value=json.dumps([1, 4]), prop_value_type='list', validation_fn=lambda x: json.dumps(x) == json.dumps([1, 4])) assert len( dash_duo.find_elements( 'g.nodes-container > g.node.selected[index="1"]')) == 1 assert len( dash_duo.find_elements( 'g.nodes-container > g.node.selected[index="2"]')) == 0 assert len( dash_duo.find_elements( 'g.nodes-container > g.node.selected[index="3"]')) == 0 assert len( dash_duo.find_elements( 'g.nodes-container > g.node.selected[index="4"]')) == 1
def test_dbav003_change_conservation_colorscale(dash_duo): app = dash.Dash(__name__) app.layout = html.Div( simple_app_layout(dash_bio.AlignmentChart(id=_COMPONENT_ID, data=_data))) simple_app_callback(app, dash_duo, component_id=_COMPONENT_ID, test_prop_name='conservationcolorscale', test_prop_value='Blackbody', prop_value_type='string') bars = dash_duo.find_elements('g.cartesianlayer g.subplot.xy2 g.plot path') # first bar should be black match = re.search(r'.*fill: ([\w\s,\(\)]+);.*', bars[0].get_attribute('style')) assert match.group(1) == 'rgb(0, 0, 0)' # second bar should be orange match = re.search(r'.*fill: ([\w\s,\(\)]+);.*', bars[1].get_attribute('style')) assert match.group(1) == 'rgb(230, 103, 0)'
def test_dbid001_displayed_chromosomes(dash_duo): app = dash.Dash(__name__) app.layout = html.Div(simple_app_layout( dash_bio.Ideogram( id=_COMPONENT_ID ) )) chromosome_set_new = [str(i+1) for i in range(5)] simple_app_callback( app, dash_duo, component_id=_COMPONENT_ID, test_prop_name='chromosomes', test_prop_value=json.dumps(chromosome_set_new), prop_value_type='dict', validation_fn=lambda x: json.dumps(x) == json.dumps(chromosome_set_new) ) WebDriverWait(dash_duo.driver, 1).until( lambda _: len(dash_duo.find_elements('g.chromosome-set-container')) == 5 )
def test_dbsv002_selection(dash_duo): app = dash.Dash(__name__) app.layout = html.Div(simple_app_layout( dash_bio.SequenceViewer( id=_COMPONENT_ID, sequence=_data ) )) new_selection = [50, 75, 'rgb(120, 0, 200)'] simple_app_callback( app, dash_duo, component_id=_COMPONENT_ID, test_prop_name='selection', test_prop_value=json.dumps(new_selection), prop_value_type='list', validation_fn=lambda x: json.dumps(x) == json.dumps(new_selection), take_snapshot=True ) selection = dash_duo.find_element('.fastaSeq span.stringSelected') match = re.search( r'.*background:\s*([\w\s,\(\)]+);.*', selection.get_attribute('style') ) assert match.group(1) == new_selection[2] assert selection.get_attribute('innerHTML').replace( ' ', ''.replace('<br>', '')) == \ _data[new_selection[0]:new_selection[1]]
def test_dbm3001_selection_type(dash_duo): app = dash.Dash(__name__) app.layout = html.Div( simple_app_layout( dash_bio.Molecule3dViewer(id=_COMPONENT_ID, modelData=_model_data, styles=_styles_data))) simple_app_callback(app, dash_duo, component_id=_COMPONENT_ID, test_prop_name='selectionType', test_prop_value='chain', prop_value_type='string') # find and click on one of the DNA strands mol3d = dash_duo.find_element('#test-mol3d canvas') ac = ActionChains(dash_duo.driver) ac.move_to_element(mol3d).move_by_offset(0, -50).click().perform() dash_duo.wait_for_element_by_css_selector('.molecule-3d') dash_duo.percy_snapshot('test-mol3d_selectionType_chain' + generate_identifier(), convert_canvases=True)
def test_dbpu004_no_tracks(dash_duo): app = dash.Dash(__name__) TWOBIT_URL = os.path.join(app.get_asset_url(''), "pileup", "chr17_little.2bit") app.layout = html.Div( simple_app_layout( dash_bio.Pileup(id=_COMPONENT_ID, range={ "contig": 'chr17', "start": 7512284, "stop": 7512644 }, reference={ "label": _GENOME, "url": TWOBIT_URL }), )) dash_duo.start_server(app) # Check that the genome loaded dash_duo.wait_for_text_to_equal('.reference>.track-label', _GENOME) # Check that reference track loaded tracks = dash_duo.find_elements('.reference') assert len(tracks) == 1 # track-label and track-content assert tracks[0].text == _GENOME
def test_dbid002_click_rotation(dash_duo): app = dash.Dash(__name__) app.layout = html.Div(simple_app_layout( dash_bio.Ideogram( id=_COMPONENT_ID ) )) simple_app_callback( app, dash_duo, component_id=_COMPONENT_ID, test_prop_name='rotatable', test_prop_value=str(True), prop_value_type='bool', validation_fn=lambda x: x is True ) # ensure that it loads un-rotated WebDriverWait(dash_duo.driver, 1).until( lambda _: 'rotate(90)' in dash_duo.find_element( '#chr1-9606-chromosome-set').get_attribute('transform')) # click to rotate and ensure that the correct chromosome is rotated dash_duo.find_element('#chr1-9606-chromosome-set').click() # rotation shouldn't take more than 1-2 seconds WebDriverWait(dash_duo.driver, 1).until( lambda _: 'rotate(0)' in dash_duo.find_element( '#chr1-9606-chromosome-set').get_attribute('transform'))
def test_dbid003_click_rotation_disabled(dash_duo): app = dash.Dash(__name__) app.layout = html.Div(simple_app_layout( dash_bio.Ideogram( id=_COMPONENT_ID ) )) simple_app_callback( app, dash_duo, component_id=_COMPONENT_ID, test_prop_name='rotatable', test_prop_value=str(False), prop_value_type='bool', validation_fn=lambda x: x is False ) WebDriverWait(dash_duo.driver, 1).until( lambda _: 'rotate(90)' in dash_duo.find_element( '#chr1-9606-chromosome-set').get_attribute('transform')) # click to rotate and ensure that the correct chromosome is rotated dash_duo.find_element('#chr1-9606-chromosome-set').click() WebDriverWait(dash_duo.driver, 1) assert 'rotate(90)' in dash_duo.find_element( '#chr1-9606-chromosome-set').get_attribute('transform')
def test_dbigv002_ASM985889v3_tracks(dash_duo): app = dash.Dash(__name__) try: requests.get('https://www.google.com/').status_code data_path = 'https://s3.amazonaws.com/igv.org.genomes/' except requests.exceptions.ConnectionError: print("Running test with local datasets") data_path = app.get_asset_url('') app.layout = html.Div( simple_app_layout( dash_bio.Igv( id=_COMPONENT_ID, reference={ "id": "ASM985889v3", "name": "Sars-CoV-2 (ASM985889v3)", "fastaURL": data_path + "covid_ASM985889v3/GCF_009858895.2_ASM985889v3_genomic.fna", "indexURL": data_path + "covid_ASM985889v3/GCF_009858895.2_ASM985889v3_genomic.fna.fai", "order": 1000000, "tracks": [{ "name": "Annotations", "url": data_path + "covid_ASM985889v3/GCF_009858895.2_ASM985889v3_genomic.gff.gz", "displayMode": "EXPANDED", "nameField": "gene", "height": 150 }] }, tracks= [{ # normally, tracks listed here would not duplicate those already present above "name": "Genes", "type": "annotation", "url": data_path + "covid_ASM985889v3/GCF_009858895.2_ASM985889v3_genomic.gff.gz", "displayMode": "EXPANDED" }], minimumBases=100, style=igvStyle), )) dash_duo.start_server(app) # Check that the genome loaded dash_duo.wait_for_text_to_equal('.igv-current-genome', 'ASM985889v3') # Check that track(s) loaded tracks = dash_duo.find_elements('.igv-track-label') assert tracks[0].text == 'Annotations' assert tracks[1].text == 'Genes'
def test_dbdn001_viewer_loaded(dash_duo): app = dash.Dash(__name__) app.layout = html.Div(simple_app_layout(viewer, )) dash_duo.start_server(app) dash_duo.wait_for_element("#" + _COMPONENT_ID + " canvas") assert dash_duo.find_element("#" + _COMPONENT_ID + " canvas")
def test_dbpu002_json(dash_duo): app = dash.Dash(__name__) TWOBIT_URL = os.path.join(app.get_asset_url(''), "pileup", "chr17_little.2bit") # read in JSON as string: local file dir_path = os.path.dirname(os.path.realpath(__file__)) file = os.path.join(dir_path, "assets", "pileup", "alignments.ga4gh.chr17.1-250.json") with open(file, "r") as f: json = re.sub(r'\s+', '', f.read()) pileup_label = 'bam file in GA4GH json' tracks = [{ 'viz': 'pileup', 'label': pileup_label, 'source': 'alignmentJson', 'sourceOptions': json }] app.layout = html.Div( simple_app_layout( dash_bio.Pileup(id=_COMPONENT_ID, range={ "contig": 'chr17', "start": 7512284, "stop": 7512644 }, reference={ "label": _GENOME, "url": TWOBIT_URL }, tracks=tracks), )) dash_duo.start_server(app) # Check that the genome loaded dash_duo.wait_for_text_to_equal('.reference>.track-label', _GENOME) # Check that reference track loaded tracks = dash_duo.find_elements('.reference') assert len(tracks) == 1 # track-label and track-content assert tracks[0].text == _GENOME # Check that pileup track loaded tracks = dash_duo.find_elements('.pileup') assert len(tracks) == 1 # track-label and track-content # gear and track name should be printed assert pileup_label in tracks[0].text assert _GEAR_ICON in tracks[0].text
def test_dbsp005_preset_view_stickball(dash_duo): app = dash.Dash(__name__) app.layout = html.Div( simple_app_layout(dash_bio.Speck(id=_COMPONENT_ID, data=_data))) simple_app_callback(app, dash_duo, component_id=_COMPONENT_ID, test_prop_name='presetView', test_prop_value='stickball', prop_value_type='string', take_snapshot=True)
def test_dbav002_change_colorscale(dash_duo): app = dash.Dash(__name__) app.layout = html.Div( simple_app_layout(dash_bio.AlignmentChart(id=_COMPONENT_ID, data=_data))) simple_app_callback(app, dash_duo, component_id=_COMPONENT_ID, test_prop_name='colorscale', test_prop_value='hydro', prop_value_type='string', take_snapshot=True)
def test_dbav001_hide_conservation(dash_duo): app = dash.Dash(__name__) app.layout = html.Div( simple_app_layout(dash_bio.AlignmentChart(id=_COMPONENT_ID, data=_data))) simple_app_callback(app, dash_duo, component_id=_COMPONENT_ID, test_prop_name='showconservation', test_prop_value=str(False), prop_value_type='bool', validation_fn=lambda x: x is False) assert len(dash_duo.find_elements('g.cartesianlayer.xy3')) == 0
def test_ASM985889v3_tracks(dash_duo): app = dash.Dash(__name__) app.layout = html.Div(simple_app_layout( dash_bio.Igv( id=_COMPONENT_ID, reference={ "id": "ASM985889v3", "name": "Sars-CoV-2 (ASM985889v3)", "fastaURL": "https://s3.amazonaws.com/igv.org.genomes/covid_ASM985889v3/GCF_009858895.2_ASM985889v3_genomic.fna", "indexURL": "https://s3.amazonaws.com/igv.org.genomes/covid_ASM985889v3/GCF_009858895.2_ASM985889v3_genomic.fna.fai", "order": 1000000, "tracks": [ { "name": "Annotations", "url": "https://s3.amazonaws.com/igv.org.genomes/covid_ASM985889v3/GCF_009858895.2_ASM985889v3_genomic.gff.gz", "displayMode": "EXPANDED", "nameField": "gene", "height": 150 } ] }, tracks=[{ # normally, tracks listed here would not duplicate those already present above "name": "Genes", "type": "annotation", "url": "https://s3.amazonaws.com/igv.org.genomes/covid_ASM985889v3/GCF_009858895.2_ASM985889v3_genomic.gff.gz", "displayMode": "EXPANDED" }], minimumBases=100, style=igvStyle ), )) dash_duo.start_server(app) # Check that the genome loaded dash_duo.wait_for_text_to_equal('#igv-current_genome', 'ASM985889v3') # Check that track(s) loaded tracks = dash_duo.find_elements('.igv-track-label') assert tracks[0].text == 'Annotations' assert tracks[1].text == 'Genes'
def test_dbigv003_sacCer3(dash_duo): app = dash.Dash(__name__) try: requests.get('https://www.google.com/').status_code data_path = 'https://s3.dualstack.us-east-1.amazonaws.com/igv.org.genomes/' except requests.exceptions.ConnectionError: print("Running test with local datasets") data_path = app.get_asset_url('') app.layout = html.Div( simple_app_layout( dash_bio.Igv(id=_COMPONENT_ID, reference={ "id": "sacCer3", "name": "S. cerevisiae (sacCer3)", "fastaURL": data_path + "sacCer3/sacCer3.fa", "indexURL": data_path + "sacCer3/sacCer3.fa.fai", "tracks": [{ "name": "Ensembl Genes", "type": "annotation", "format": "ensgene", "displayMode": "EXPANDED", "url": data_path + "sacCer3/ensGene.txt.gz", "indexed": False, "supportsWholeGenome": False }] }, minimumBases=100, style=igvStyle), )) dash_duo.start_server(app) # Check that the genome loaded dash_duo.wait_for_text_to_equal('.igv-current-genome', 'sacCer3') # Check that track(s) loaded tracks = dash_duo.find_elements('.igv-track-label') assert len(tracks) == 1 assert tracks[0].text == 'Ensembl Genes'
def test_dbm2002_preselected_atoms(dash_duo): app = dash.Dash(__name__) app.layout = html.Div( simple_app_layout( dash_bio.Molecule2dViewer(id=_COMPONENT_ID, modelData=_data, selectedAtomIds=[1, 3]))) dash_duo.start_server(app) dash_duo.wait_for_element('#test-mol2d') assert len( dash_duo.find_elements( 'g.nodes-container > g.node.selected[index="1"]')) == 1 assert len( dash_duo.find_elements( 'g.nodes-container > g.node.selected[index="3"]')) == 1
def test_dbop002_colorscale(dash_duo): app = dash.Dash(__name__) new_colorscale = { 'AMP': 'rgb(10, 200, 100)', 'FUSION': 'rgb(100, 10, 20)', 'HOMDEL': 'rgb(200, 50, 60)' } # fusion deep del amp app.layout = html.Div( simple_app_layout(dash_bio.OncoPrint(id=_COMPONENT_ID, data=_data))) simple_app_callback( app, dash_duo, component_id=_COMPONENT_ID, test_prop_name='colorscale', test_prop_value=json.dumps(new_colorscale), prop_value_type='dict', validation_fn=lambda x: json.dumps(x) == json.dumps(new_colorscale), take_snapshot=True) fus = dash_duo.find_elements( 'g.cartesianlayer g.plot g.trace.bars:nth-child(2) g.point > path') for point in fus: match = re.search(r'.*fill: ([\w\s,\(\)]+);.*', point.get_attribute('style')) assert match.group(1) == 'rgb(100, 10, 20)' deep_del = dash_duo.find_elements( 'g.cartesianlayer g.plot g.trace.bars:nth-child(3) g.point > path') for point in deep_del: match = re.search(r'.*fill: ([\w\s,\(\)]+);.*', point.get_attribute('style')) assert match.group(1) == 'rgb(200, 50, 60)' amp = dash_duo.find_elements( 'g.cartesianlayer g.plot g.trace.bars:nth-child(4) g.point > path') for point in amp: match = re.search(r'.*fill: ([\w\s,\(\)]+);.*', point.get_attribute('style')) assert match.group(1) == 'rgb(10, 200, 100)'
def test_dbm3003_selected_atom_ids(dash_duo): app = dash.Dash(__name__) app.layout = html.Div( simple_app_layout( dash_bio.Molecule3dViewer(id=_COMPONENT_ID, modelData=_model_data, styles=_styles_data))) simple_app_callback(app, dash_duo, component_id=_COMPONENT_ID, test_prop_name='selectedAtomIds', test_prop_value=json.dumps([1306, 1371, 1339, 1404]), prop_value_type='list', validation_fn=lambda x: json.dumps(x) == json.dumps( [1306, 1371, 1339, 1404]), take_snapshot=True)
def test_dbnp002_domainStyle(dash_duo): app = dash.Dash(__name__) app.layout = html.Div(simple_app_layout( dash_bio.NeedlePlot( id=_COMPONENT_ID, mutationData=_data ) )) new_domain_style = { 'domainColor': ['rgb(200, 100, 0)', 'rgb(120, 246, 100)', 'rgb(150, 245, 170)', 'rgb(0, 200, 150)', 'rgb(100, 70, 25)'], 'displayMinorDomains': False } simple_app_callback( app, dash_duo, component_id=_COMPONENT_ID, test_prop_name='domainStyle', test_prop_value=json.dumps(new_domain_style), prop_value_type='dict', validation_fn=lambda x: json.dumps(x) == json.dumps(new_domain_style), take_snapshot=True ) domains = dash_duo.find_elements('g.overplot g.scatterlayer.mlayer path.js-fill') for domain in domains: match = re.search( r'.*fill: ([\w\s,\(\)]+);.*', domain.get_attribute('style') ) assert match.group(1) in new_domain_style['domainColor']
def test_dbdn002_change_background(dash_duo): stage_config = { "backgroundColor": "black", "quality": "medium", "cameraType": "perspective", } app = dash.Dash(__name__) app.layout = html.Div(simple_app_layout(viewer, )) simple_app_callback( app, dash_duo, component_id=_COMPONENT_ID, test_prop_name="stageParameters", test_prop_value=json.dumps(stage_config), prop_value_type="dict", validation_fn=lambda x: json.dumps(x) == json.dumps(stage_config), take_snapshot=True, )
def test_dbm2001_load_mol_data(dash_duo): app = dash.Dash(__name__) app.layout = html.Div( simple_app_layout(dash_bio.Molecule2dViewer(id=_COMPONENT_ID))) def compare_nodes_links(computed_props): given_nodes = _data['nodes'] given_links = _data['links'] computed_nodes = computed_props['nodes'] computed_links = computed_props['links'] defined_node_props = ['id', 'atom'] for i in range(len(given_nodes)): for key in defined_node_props: if given_nodes[i][key] != computed_nodes[i][key]: return False defined_link_props = ['bond', 'strength', 'distance'] for i in range(len(given_links)): for key in defined_link_props: if given_links[i][key] != computed_links[i][key]: return False if given_links[i]['source'] != \ computed_links[i]['source']['id']: return False if given_links[i]['target'] != \ computed_links[i]['target']['id']: return False return True simple_app_callback(app, dash_duo, component_id=_COMPONENT_ID, test_prop_name='modelData', test_prop_value=json.dumps(_data), prop_value_type='dict', validation_fn=lambda x: compare_nodes_links(x))
def test_dbop001_background_color(dash_duo): app = dash.Dash(__name__) app.layout = html.Div( simple_app_layout(dash_bio.OncoPrint(id=_COMPONENT_ID, data=_data))) simple_app_callback(app, dash_duo, component_id=_COMPONENT_ID, test_prop_name='backgroundcolor', test_prop_value='rgb(25, 211, 243)', prop_value_type='string', take_snapshot=True) background = dash_duo.find_elements( 'g.cartesianlayer g.plot g.trace.bars:nth-child(1) g.point > path') for point in background: match = re.search(r'.*fill: ([\w\s,\(\)]+);.*', point.get_attribute('style')) assert match.group(1) == 'rgb(25, 211, 243)'
def test_sacCer3(dash_duo): app = dash.Dash(__name__) app.layout = html.Div(simple_app_layout( dash_bio.Igv( id=_COMPONENT_ID, reference={ "id": "sacCer3", "name": "S. cerevisiae (sacCer3)", "fastaURL": "https://s3.dualstack.us-east-1.amazonaws.com/igv.org.genomes/sacCer3/sacCer3.fa", "indexURL": "https://s3.dualstack.us-east-1.amazonaws.com/igv.org.genomes/sacCer3/sacCer3.fa.fai", "tracks": [ { "name": "Ensembl Genes", "type": "annotation", "format": "ensgene", "displayMode": "EXPANDED", "url": "https://s3.dualstack.us-east-1.amazonaws.com/igv.org.genomes/sacCer3/ensGene.txt.gz", "indexed": False, "supportsWholeGenome": False } ] }, minimumBases=100, style=igvStyle ), )) dash_duo.start_server(app) # Check that the genome loaded dash_duo.wait_for_text_to_equal('#igv-current_genome', 'sacCer3') # Check that track(s) loaded tracks = dash_duo.find_elements('.igv-track-label') assert len(tracks) == 1 assert tracks[0].text == 'Ensembl Genes'
def test_dbpu001_reference(dash_duo): app = dash.Dash(__name__) TWOBIT_URL = os.path.join(app.get_asset_url(''), "pileup", "chr17_little.2bit") pileup_label = 'bam file' feature_label = 'features' tracks = [{ 'viz': 'scale', 'label': 'Scale' }, { 'viz': 'location', 'label': 'Location' }, { 'viz': 'genes', 'label': 'genes', 'source': 'bigBed', 'sourceOptions': { 'url': 'http://www.biodalliance.org/datasets/ensGene.bb' } }, { 'viz': 'variants', 'label': 'variants', 'source': 'vcf', 'sourceOptions': { 'url': os.path.join(app.get_asset_url(''), "pileup", "snv.chr17.vcf") } }, { 'viz': 'pileup', 'label': pileup_label, 'source': 'bam', 'sourceOptions': { 'url': os.path.join(app.get_asset_url(''), "pileup", "synth3.normal.17.7500000-7515000.bam"), 'indexUrl': os.path.join(app.get_asset_url(''), "pileup", "synth3.normal.17.7500000-7515000.bam.bai") } }, { 'viz': 'features', 'label': feature_label, 'source': 'bigBed', 'sourceOptions': { 'url': os.path.join(app.get_asset_url(''), "pileup", "chr17.22.10000-21000.bb") } }] app.layout = html.Div( simple_app_layout( dash_bio.Pileup(id=_COMPONENT_ID, range={ "contig": 'chr17', "start": 7512284, "stop": 7512644 }, reference={ "label": _GENOME, "url": TWOBIT_URL }, tracks=tracks), )) dash_duo.start_server(app) # Check that the genome loaded dash_duo.wait_for_text_to_equal('.reference>.track-label', _GENOME) # Check that reference track loaded tracks = dash_duo.find_elements('.reference') assert len(tracks) == 1 # track-label and track-content assert tracks[0].text == _GENOME # check dropdown menu tracks = dash_duo.find_elements('.controls') assert "chr17" in tracks[0].text # Check that pileup track loaded tracks = dash_duo.find_elements('.pileup') assert len(tracks) == 1 # track-label and track-content # gear and track name should be printed assert pileup_label in tracks[0].text assert _GEAR_ICON in tracks[0].text # Take a Percy snapshot to check that tracks are rendered correctly dash_duo.percy_snapshot('test-pileup_reference', convert_canvases=True) # Check that feature track loaded tracks = dash_duo.find_elements('.features') assert len(tracks) == 1 # track-label and track-content # gear and track name should be printed assert feature_label in tracks[0].text assert _GEAR_ICON in tracks[0].text
def test_dbnp001_needle_style(dash_duo): app = dash.Dash(__name__) app.layout = html.Div(simple_app_layout( dash_bio.NeedlePlot( id=_COMPONENT_ID, mutationData=_data ) )) new_needle_style = { 'stemConstHeight': True, 'stemColor': 'rgb(99, 110, 250)', 'stemThickness': 4, 'headColor': 'rgb(239, 85, 59)', 'headSize': 10 } simple_app_callback( app, dash_duo, component_id=_COMPONENT_ID, test_prop_name='needleStyle', test_prop_value=json.dumps(new_needle_style), prop_value_type='dict', validation_fn=lambda x: json.dumps(x) == json.dumps(new_needle_style), take_snapshot=True ) # points should all be at the same height (y-value) points = dash_duo.find_elements('g.trace.scatter > g.points > path') lines = dash_duo.find_elements('g.trace.scatter > g.errorbars > g.errorbar > path') y_location = points[0].get_attribute('transform').strip( 'translate(').strip( ')').split(',')[1] for point in points[1:]: point_y_location = point.get_attribute('transform').strip( 'translate').strip( '(').strip(')').split(',')[1] assert point_y_location == y_location match = re.search( r'.*fill: ([\w\s,\(\)]+);.*', point.get_attribute('style') ) assert match.group(1) == 'rgb(239, 85, 59)' for line in lines: match = re.search( r'.*stroke: ([\w\s,\(\)]+);.*', line.get_attribute('style') ) assert match.group(1) == 'rgb(99, 110, 250)' match = re.search( r'.*stroke-width: ([\w]+);.*', line.get_attribute('style') ) assert match.group(1) == '4px'
def test_dbsv001_coverage(dash_duo): app = dash.Dash(__name__) app.layout = html.Div(simple_app_layout( dash_bio.SequenceViewer( id=_COMPONENT_ID, sequence=_data ) )) new_coverage = [ {'start': 0, 'end': 10, 'color': 'rgb(255, 0, 0)', 'bgcolor': 'rgb(0, 0, 255)', 'underscore': True, 'tooltip': 'Coverage one'}, {'start': 45, 'end': 80, 'color': 'rgb(200, 150, 150)', 'bgcolor': 'rgb(0, 0, 0)', 'underscore': False} ] simple_app_callback( app, dash_duo, component_id=_COMPONENT_ID, test_prop_name='coverage', test_prop_value=json.dumps(new_coverage), prop_value_type='list', validation_fn=lambda x: json.dumps(x) == json.dumps(new_coverage), take_snapshot=True ) coverage_1 = dash_duo.find_element( '.sequenceBody .fastaSeq span:nth-child(1)') match = re.search( r'.*color:\s*([\w\s,\(\)]+);.*', coverage_1.get_attribute('style') ) assert match.group(1) == new_coverage[0]['color'] match = re.search( r'.*background:\s*([\w\s,\(\)]+);.*', coverage_1.get_attribute('style') ) assert match.group(1) == new_coverage[0]['bgcolor'] assert coverage_1.get_attribute('title') == new_coverage[0]['tooltip'] assert coverage_1.get_attribute('innerHTML').replace( ' ', '').replace('<br>', '') == \ _data[new_coverage[0]['start']:new_coverage[0]['end']] coverage_2 = dash_duo.find_element( '.sequenceBody .fastaSeq span:nth-child(3)') match = re.search( r'.*color:\s*([\w\s,\(\)]+);.*', coverage_2.get_attribute('style') ) assert match.group(1) == new_coverage[1]['color'] match = re.search( r'.*background:\s*([\w\s,\(\)]+);.*', coverage_2.get_attribute('style') ) assert match.group(1) == new_coverage[1]['bgcolor'] assert coverage_2.get_attribute('title') == '' assert coverage_2.get_attribute('innerHTML').replace( ' ', '').replace('<br>', '') == \ _data[new_coverage[1]['start']:new_coverage[1]['end']]