From c64ac54a91d00db68235f58b0b1b2c3d14218665 Mon Sep 17 00:00:00 2001 From: Colin Date: Tue, 28 Jun 2022 20:28:42 -0600 Subject: [PATCH 1/7] Reduce some flaky tests --- .../components/TracksContainer.tsx | 2 +- .../src/tests/BasicLinearGenomeView.test.js | 76 +++++++------------ 2 files changed, 30 insertions(+), 48 deletions(-) diff --git a/plugins/linear-genome-view/src/LinearGenomeView/components/TracksContainer.tsx b/plugins/linear-genome-view/src/LinearGenomeView/components/TracksContainer.tsx index 66f3bdaa38..dbdcc08928 100644 --- a/plugins/linear-genome-view/src/LinearGenomeView/components/TracksContainer.tsx +++ b/plugins/linear-genome-view/src/LinearGenomeView/components/TracksContainer.tsx @@ -162,7 +162,7 @@ function TracksContainer({ return (
{ const pm = getPluginManager() const state = pm.rootModel - const { findByTestId, findAllByTestId } = render( - , - ) - fireEvent.click( - await findByTestId('htsTrackEntry-volvox_alignments', {}, delay), - ) + const { findByTestId } = render() - const start = state.session.views[0].offsetPx - const track = await findByTestId( - 'display-volvox_alignments_alignments', - {}, - delay, - ) + const view = state.session.views[0] + const start = view.offsetPx + const track = await findByTestId('trackContainer', {}, delay) fireEvent.mouseDown(track, { clientX: 250, clientY: 20 }) fireEvent.mouseMove(track, { clientX: 100, clientY: 20 }) fireEvent.mouseUp(track, { clientX: 100, clientY: 20 }) - // wait for requestAnimationFrame - await waitFor( - () => expect(state.session.views[0].offsetPx - start).toEqual(150), - delay, - ) - - // wait for this unrelated thing because otherwise it warns about prerendered - // canvas still running after jest is torn down - await findAllByTestId(/prerendered_canvas/, {}, delay) + await waitFor(() => expect(view.offsetPx - start).toEqual(150), delay) }, total, ) @@ -83,13 +66,13 @@ test( const state = pm.rootModel const { findByTestId, findByText } = render() const track = await findByTestId('rubberBand_controls', {}, delay) - - expect(state.session.views[0].bpPerPx).toEqual(0.05) + const view = state.session.views[0] + expect(view.bpPerPx).toEqual(0.05) fireEvent.mouseDown(track, { clientX: 100, clientY: 0 }) fireEvent.mouseMove(track, { clientX: 250, clientY: 0 }) fireEvent.mouseUp(track, { clientX: 250, clientY: 0 }) fireEvent.click(await findByText('Zoom to region')) - expect(state.session.views[0].bpPerPx).toEqual(0.02) + expect(view.bpPerPx).toEqual(0.02) }, total, ) @@ -100,19 +83,16 @@ test( const pm = getPluginManager() const state = pm.rootModel const { findByTestId, findByText } = render() - const rubberBandComponent = await findByTestId( - 'rubberBand_controls', - {}, - delay, - ) + const rubberband = await findByTestId('rubberBand_controls', {}, delay) - expect(state.session.views[0].bpPerPx).toEqual(0.05) - fireEvent.mouseDown(rubberBandComponent, { clientX: 100, clientY: 0 }) - fireEvent.mouseMove(rubberBandComponent, { clientX: 250, clientY: 0 }) - fireEvent.mouseUp(rubberBandComponent, { clientX: 250, clientY: 0 }) + const view = state.session.views[0] + expect(view.bpPerPx).toEqual(0.05) + fireEvent.mouseDown(rubberband, { clientX: 100, clientY: 0 }) + fireEvent.mouseMove(rubberband, { clientX: 250, clientY: 0 }) + fireEvent.mouseUp(rubberband, { clientX: 250, clientY: 0 }) fireEvent.click(await findByText('Get sequence')) - expect(state.session.views[0].leftOffset).toBeTruthy() - expect(state.session.views[0].rightOffset).toBeTruthy() + expect(view.leftOffset).toBeTruthy() + expect(view.rightOffset).toBeTruthy() }, total, ) @@ -181,15 +161,15 @@ test( 'opens track selector', async () => { const pm = getPluginManager() - const state = pm.rootModel + const { session } = pm.rootModel const { findByTestId } = render() - await findByTestId('htsTrackEntry-volvox_alignments', {}, delay) - expect(state.session.views[0].tracks.length).toBe(0) - fireEvent.click( - await findByTestId('htsTrackEntry-volvox_alignments', {}, delay), - ) - expect(state.session.views[0].tracks.length).toBe(1) + const view = session.views[0] + const trackId = 'htsTrackEntry-volvox_alignments' + await findByTestId(trackId, {}, delay) + expect(view.tracks.length).toBe(0) + fireEvent.click(await findByTestId(trackId, {}, delay)) + expect(view.tracks.length).toBe(1) }, total, ) @@ -198,14 +178,15 @@ test( 'opens reference sequence track and expects zoom in message', async () => { const pm = getPluginManager() - const state = pm.rootModel + const { session } = pm.rootModel const { findAllByText, findByTestId } = render( , ) + const view = session.views[0] fireEvent.click( await findByTestId('htsTrackEntry-volvox_refseq', {}, delay), ) - state.session.views[0].setNewView(20, 0) + view.setNewView(20, 0) await findByTestId( 'display-volvox_refseq-LinearReferenceSequenceDisplay', {}, @@ -220,8 +201,9 @@ test( 'click to display center line with correct value', async () => { const pm = getPluginManager() - const state = pm.rootModel + const { session } = pm.rootModel const { findByTestId, findByText } = render() + const view = session.views[0] fireEvent.click( await findByTestId('htsTrackEntry-volvox_alignments', {}, delay), @@ -231,7 +213,7 @@ test( // opens the view menu and selects show center line fireEvent.click(await findByTestId('view_menu_icon')) fireEvent.click(await findByText('Show center line')) - expect(state.session.views[0].showCenterLine).toBe(true) + expect(view.showCenterLine).toBe(true) const { centerLineInfo } = state.session.views[0] expect(centerLineInfo.refName).toBe('ctgA') From c54a62d9101176ca90e912bcd4a65f4393f39518 Mon Sep 17 00:00:00 2001 From: Colin Date: Tue, 28 Jun 2022 20:40:48 -0600 Subject: [PATCH 2/7] Typescriptify some tests --- ...test.js => BasicLinearGenomeView.test.tsx} | 80 +++++++------------ .../tests/TextSearchingImportForm.test.tsx | 50 +++++------- 2 files changed, 45 insertions(+), 85 deletions(-) rename products/jbrowse-web/src/tests/{BasicLinearGenomeView.test.js => BasicLinearGenomeView.test.tsx} (76%) diff --git a/products/jbrowse-web/src/tests/BasicLinearGenomeView.test.js b/products/jbrowse-web/src/tests/BasicLinearGenomeView.test.tsx similarity index 76% rename from products/jbrowse-web/src/tests/BasicLinearGenomeView.test.js rename to products/jbrowse-web/src/tests/BasicLinearGenomeView.test.tsx index 1069e6d536..e8d49b1f09 100644 --- a/products/jbrowse-web/src/tests/BasicLinearGenomeView.test.js +++ b/products/jbrowse-web/src/tests/BasicLinearGenomeView.test.tsx @@ -10,6 +10,9 @@ import { LocalFile } from 'generic-filehandle' import { clearCache } from '@jbrowse/core/util/io/RemoteFileWithRangeCache' import { clearAdapterCache } from '@jbrowse/core/data_adapters/dataAdapterCache' import { JBrowse, setup, generateReadBuffer, getPluginManager } from './util' +import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' + +type LGV = LinearGenomeViewModel setup() @@ -24,14 +27,21 @@ beforeEach(() => { ) }) +function createView() { + const pm = getPluginManager() + const { session } = pm.rootModel! + const rest = render() + const view = session!.views[0] as LGV + return { view, ...rest } +} + const delay = { timeout: 20000 } const total = 30000 test( 'access about menu', async () => { - const pm = getPluginManager() - const { findByText } = render() + const { findByText } = createView() fireEvent.click(await findByText('Help')) fireEvent.click(await findByText('About')) @@ -44,11 +54,7 @@ test( test( 'click and drag to move sideways', async () => { - const pm = getPluginManager() - const state = pm.rootModel - const { findByTestId } = render() - - const view = state.session.views[0] + const { view, findByTestId } = createView() const start = view.offsetPx const track = await findByTestId('trackContainer', {}, delay) fireEvent.mouseDown(track, { clientX: 250, clientY: 20 }) @@ -62,11 +68,8 @@ test( test( 'click and drag to rubberband', async () => { - const pm = getPluginManager() - const state = pm.rootModel - const { findByTestId, findByText } = render() + const { view, findByTestId, findByText } = createView() const track = await findByTestId('rubberBand_controls', {}, delay) - const view = state.session.views[0] expect(view.bpPerPx).toEqual(0.05) fireEvent.mouseDown(track, { clientX: 100, clientY: 0 }) fireEvent.mouseMove(track, { clientX: 250, clientY: 0 }) @@ -80,12 +83,8 @@ test( test( 'click and drag rubberBand, click get sequence to open sequenceDialog', async () => { - const pm = getPluginManager() - const state = pm.rootModel - const { findByTestId, findByText } = render() + const { view, findByTestId, findByText } = createView() const rubberband = await findByTestId('rubberBand_controls', {}, delay) - - const view = state.session.views[0] expect(view.bpPerPx).toEqual(0.05) fireEvent.mouseDown(rubberband, { clientX: 100, clientY: 0 }) fireEvent.mouseMove(rubberband, { clientX: 250, clientY: 0 }) @@ -100,9 +99,7 @@ test( test( 'click and drag to reorder tracks', async () => { - const pm = getPluginManager() - const state = pm.rootModel - const { findByTestId } = render() + const { view, findByTestId } = createView() fireEvent.click( await findByTestId('htsTrackEntry-volvox_alignments', {}, delay), ) @@ -110,7 +107,6 @@ test( await findByTestId('htsTrackEntry-volvox_filtered_vcf', {}, delay), ) - const view = state.session.views[0] const trackId1 = view.tracks[1].id const dragHandle0 = await findByTestId( 'dragHandle-integration_test-volvox_alignments', @@ -141,13 +137,8 @@ test( test( 'click and zoom in and back out', async () => { - const pm = getPluginManager() - const { session } = pm.rootModel - const { findByTestId, findAllByText } = render( - , - ) + const { view, findByTestId, findAllByText } = createView() await findAllByText('ctgA', {}, delay) - const view = session.views[0] const before = view.bpPerPx fireEvent.click(await findByTestId('zoom_in')) await waitFor(() => expect(view.bpPerPx).toBe(before / 2), delay) @@ -160,11 +151,7 @@ test( test( 'opens track selector', async () => { - const pm = getPluginManager() - const { session } = pm.rootModel - const { findByTestId } = render() - - const view = session.views[0] + const { view, findByTestId } = createView() const trackId = 'htsTrackEntry-volvox_alignments' await findByTestId(trackId, {}, delay) expect(view.tracks.length).toBe(0) @@ -177,12 +164,7 @@ test( test( 'opens reference sequence track and expects zoom in message', async () => { - const pm = getPluginManager() - const { session } = pm.rootModel - const { findAllByText, findByTestId } = render( - , - ) - const view = session.views[0] + const { view, findByTestId, findAllByText } = createView() fireEvent.click( await findByTestId('htsTrackEntry-volvox_refseq', {}, delay), ) @@ -200,11 +182,7 @@ test( test( 'click to display center line with correct value', async () => { - const pm = getPluginManager() - const { session } = pm.rootModel - const { findByTestId, findByText } = render() - const view = session.views[0] - + const { view, findByTestId, findByText } = createView() fireEvent.click( await findByTestId('htsTrackEntry-volvox_alignments', {}, delay), ) @@ -214,10 +192,8 @@ test( fireEvent.click(await findByTestId('view_menu_icon')) fireEvent.click(await findByText('Show center line')) expect(view.showCenterLine).toBe(true) - - const { centerLineInfo } = state.session.views[0] - expect(centerLineInfo.refName).toBe('ctgA') - expect(centerLineInfo.offset).toEqual(120) + expect(view.centerLineInfo?.refName).toBe('ctgA') + expect(view.centerLineInfo?.offset).toEqual(120) }, total, ) @@ -225,15 +201,14 @@ test( test( 'test choose option from dropdown refName autocomplete', async () => { - const pm = getPluginManager() - const state = pm.rootModel const { + view, findByText, findByTestId, getByPlaceholderText, findByPlaceholderText, - } = render() - const view = state.session.views[0] + } = createView() + expect(view.displayedRegions[0].refName).toEqual('ctgA') fireEvent.click(await findByText('Help')) // need this to complete before we can try to search @@ -265,9 +240,8 @@ test( ) await waitFor(() => { - expect(getByPlaceholderText('Search for location').value).toEqual( - expect.stringContaining('ctgB'), - ) + const n = getByPlaceholderText('Search for location') as HTMLInputElement + expect(n.value).toEqual(expect.stringContaining('ctgB')) }, delay) }, total, diff --git a/products/jbrowse-web/src/tests/TextSearchingImportForm.test.tsx b/products/jbrowse-web/src/tests/TextSearchingImportForm.test.tsx index 186e9af76b..ae2c1c1866 100644 --- a/products/jbrowse-web/src/tests/TextSearchingImportForm.test.tsx +++ b/products/jbrowse-web/src/tests/TextSearchingImportForm.test.tsx @@ -20,9 +20,10 @@ beforeEach(() => { fetch.resetMocks() // @ts-ignore fetch.mockResponse( - generateReadBuffer((url: string) => { - return new LocalFile(require.resolve(`../../test_data/volvox/${url}`)) - }), + generateReadBuffer( + (url: string) => + new LocalFile(require.resolve(`../../test_data/volvox/${url}`)), + ), ) }) @@ -32,7 +33,7 @@ const total = 30000 async function doSetup(val?: unknown) { const pluginManager = getPluginManager(val) - const state = pluginManager.rootModel + const { session } = pluginManager.rootModel! const { findByText, findByTestId, @@ -41,8 +42,7 @@ async function doSetup(val?: unknown) { getByPlaceholderText, } = render() - // @ts-ignore - const view = state.session.views[0] as LGV + const view = session!.views[0] as LGV view.clearView() const autocomplete = await findByTestId('autocomplete') @@ -61,7 +61,6 @@ async function doSetup(val?: unknown) { findAllByText, findByPlaceholderText, getByPlaceholderText, - state, } } @@ -73,15 +72,10 @@ test( fireEvent.change(input, { target: { value: 'eden.1' } }) fireEvent.keyDown(input, { key: 'Enter', code: 'Enter' }) fireEvent.click(await findByText('Open')) - - await waitFor( - () => - expect( - (getByPlaceholderText('Search for location') as HTMLInputElement) - .value, - ).toBe('ctgA:1,055..9,005'), - delay, - ) + await waitFor(() => { + const n = getByPlaceholderText('Search for location') as HTMLInputElement + expect(n.value).toBe('ctgA:1,055..9,005') + }, delay) }, total, ) @@ -98,14 +92,10 @@ test( fireEvent.keyDown(autocomplete, { key: 'Enter', code: 'Enter' }) fireEvent.click(await findByText('Open')) - await waitFor( - () => - expect( - (getByPlaceholderText('Search for location') as HTMLInputElement) - .value, - ).toBe('ctgA:1,055..9,005'), - delay, - ) + await waitFor(() => { + const n = getByPlaceholderText('Search for location') as HTMLInputElement + expect(n.value).toBe('ctgA:1,055..9,005') + }, delay) }, total, ) @@ -122,14 +112,10 @@ test( fireEvent.keyDown(autocomplete, { key: 'Enter', code: 'Enter' }) fireEvent.click(await findByText('Open')) - await waitFor( - () => - expect( - (getByPlaceholderText('Search for location') as HTMLInputElement) - .value, - ).toBe('ctgB:1..6,079'), - delay, - ) + await waitFor(() => { + const n = getByPlaceholderText('Search for location') as HTMLInputElement + expect(n.value).toBe('ctgB:1..6,079') + }, delay) }, total, ) From f87334b83dff6c9f37988ccd7fbc850b29adc24e Mon Sep 17 00:00:00 2001 From: Colin Date: Tue, 28 Jun 2022 21:05:53 -0600 Subject: [PATCH 3/7] Typescriptify some integration tests --- ...Alignments.test.js => Alignments.test.tsx} | 66 ++++++-------- ...es.test.js => AlignmentsFeatures.test.tsx} | 82 +++++++---------- .../src/tests/BasicLinearGenomeView.test.tsx | 35 ++++--- .../tests/{BigWig.test.js => BigWig.test.tsx} | 34 ++++--- .../{Dotplot.test.js => Dotplot.test.tsx} | 15 ++- ...erWidget.test.js => DrawerWidget.test.tsx} | 51 ++++++----- .../{JBrowse.test.js => JBrowse.test.tsx} | 86 ++++++++++-------- ...atures-test-tsx-color-by-strand-1-snap.png | Bin 0 -> 557 bytes ...-features-test-tsx-color-by-tag-1-snap.png | Bin 0 -> 22372 bytes ...-menu-and-enables-soft-clipping-1-snap.png | Bin 0 -> 31958 bytes ...x-selects-a-sort-sort-by-strand-1-snap.png | Bin 0 -> 552 bytes ...t-tsx-opens-an-alignments-track-1-snap.png | Bin 0 -> 73494 bytes ...t-tsx-opens-an-alignments-track-2-snap.png | Bin 0 -> 11781 bytes ...verage-doesnt-count-snpcoverage-1-snap.png | Bin 0 -> 1753 bytes ...verage-doesnt-count-snpcoverage-2-snap.png | Bin 0 -> 1289 bytes ...tsx-open-a-bigwig-density-track-1-snap.png | Bin 0 -> 2036 bytes ...-tsx-open-a-bigwig-line-track-2-1-snap.png | Bin 0 -> 3617 bytes ...ig-test-tsx-open-a-bigwig-track-1-snap.png | Bin 0 -> 2448 bytes ...ot-test-tsx-open-a-dotplot-view-1-snap.png | Bin 0 -> 29922 bytes ...a-dotplot-view-with-import-form-1-snap.png | Bin 0 -> 29329 bytes products/jbrowse-web/src/tests/util.tsx | 7 +- 21 files changed, 187 insertions(+), 189 deletions(-) rename products/jbrowse-web/src/tests/{Alignments.test.js => Alignments.test.tsx} (64%) rename products/jbrowse-web/src/tests/{AlignmentsFeatures.test.js => AlignmentsFeatures.test.tsx} (68%) rename products/jbrowse-web/src/tests/{BigWig.test.js => BigWig.test.tsx} (75%) rename products/jbrowse-web/src/tests/{Dotplot.test.js => Dotplot.test.tsx} (89%) rename products/jbrowse-web/src/tests/{DrawerWidget.test.js => DrawerWidget.test.tsx} (71%) rename products/jbrowse-web/src/tests/{JBrowse.test.js => JBrowse.test.tsx} (68%) create mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/alignments-features-test-tsx-color-by-strand-1-snap.png create mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/alignments-features-test-tsx-color-by-tag-1-snap.png create mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/alignments-features-test-tsx-opens-the-track-menu-and-enables-soft-clipping-1-snap.png create mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/alignments-features-test-tsx-selects-a-sort-sort-by-strand-1-snap.png create mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/alignments-test-tsx-opens-an-alignments-track-1-snap.png create mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/alignments-test-tsx-opens-an-alignments-track-2-snap.png create mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/alignments-test-tsx-test-snpcoverage-doesnt-count-snpcoverage-1-snap.png create mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/alignments-test-tsx-test-snpcoverage-doesnt-count-snpcoverage-2-snap.png create mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/big-wig-test-tsx-open-a-bigwig-density-track-1-snap.png create mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/big-wig-test-tsx-open-a-bigwig-line-track-2-1-snap.png create mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/big-wig-test-tsx-open-a-bigwig-track-1-snap.png create mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/dotplot-test-tsx-open-a-dotplot-view-1-snap.png create mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/dotplot-test-tsx-open-a-dotplot-view-with-import-form-1-snap.png diff --git a/products/jbrowse-web/src/tests/Alignments.test.js b/products/jbrowse-web/src/tests/Alignments.test.tsx similarity index 64% rename from products/jbrowse-web/src/tests/Alignments.test.js rename to products/jbrowse-web/src/tests/Alignments.test.tsx index e8093456fb..333bf5c05e 100644 --- a/products/jbrowse-web/src/tests/Alignments.test.js +++ b/products/jbrowse-web/src/tests/Alignments.test.tsx @@ -12,15 +12,22 @@ import { expectCanvasMatch, generateReadBuffer, getPluginManager, + hts, + pc, } from './util' +import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' + +type LGV = LinearGenomeViewModel expect.extend({ toMatchImageSnapshot }) setup() beforeEach(() => { clearCache() clearAdapterCache() + // @ts-ignore fetch.resetMocks() + // @ts-ignore fetch.mockResponse( generateReadBuffer( url => new LocalFile(require.resolve(`../../test_data/volvox/${url}`)), @@ -28,44 +35,36 @@ beforeEach(() => { ) }) +function createView() { + const pm = getPluginManager() + const { session } = pm.rootModel! + const rest = render() + const view = session!.views[0] as LGV + return { view, ...rest } +} + const delay = { timeout: 20000 } test('opens an alignments track', async () => { - const pm = getPluginManager() - const state = pm.rootModel - const { findByTestId, findByText, findAllByTestId } = render( - , - ) + const { view, findByTestId, findByText, findAllByTestId } = createView() await findByText('Help') - state.session.views[0].setNewView(5, 100) + view.setNewView(5, 100) fireEvent.click( - await findByTestId( - 'htsTrackEntry-volvox_alignments_pileup_coverage', - {}, - delay, - ), + await findByTestId(hts('volvox_alignments_pileup_coverage'), {}, delay), ) const { findByTestId: findByTestId1 } = within( await findByTestId('Blockset-pileup', {}, delay), ) expectCanvasMatch( - await findByTestId1( - 'prerendered_canvas_{volvox}ctgA:1..4,000-0_done', - {}, - delay, - ), + await findByTestId1(pc('{volvox}ctgA:1..4,000-0'), {}, delay), ) const { findByTestId: findByTestId2 } = within( await findByTestId('Blockset-snpcoverage', {}, delay), ) expectCanvasMatch( - await findByTestId2( - 'prerendered_canvas_{volvox}ctgA:1..4,000-0_done', - {}, - delay, - ), + await findByTestId2(pc('{volvox}ctgA:1..4,000-0'), {}, delay), ) const track = await findAllByTestId('pileup_overlay_canvas') @@ -81,25 +80,22 @@ test('opens an alignments track', async () => { }, 20000) test('test that bam with small max height displays message', async () => { - const pm = getPluginManager() - const { findByTestId, findAllByText } = render() + const { findByTestId, findAllByText } = createView() fireEvent.click( - await findByTestId('htsTrackEntry-volvox_bam_small_max_height', {}, delay), + await findByTestId(hts('volvox_bam_small_max_height'), {}, delay), ) await findAllByText('Max height reached', {}, delay) }, 30000) test('test snpcoverage doesnt count snpcoverage', async () => { - const pm = getPluginManager() - const state = pm.rootModel - const { findByText, findByTestId } = render() + const { view, findByTestId, findByText } = createView() await findByText('Help') - state.session.views[0].setNewView(0.03932, 67884.16536402702) + view.setNewView(0.03932, 67884.16536402702) // load track fireEvent.click( - await findByTestId('htsTrackEntry-volvox-long-reads-sv-cram', {}, delay), + await findByTestId(hts('volvox-long-reads-sv-cram'), {}, delay), ) const { findByTestId: findByTestId1 } = within( @@ -107,17 +103,9 @@ test('test snpcoverage doesnt count snpcoverage', async () => { ) expectCanvasMatch( - await findByTestId1( - 'prerendered_canvas_{volvox}ctgA:2,657..2,688-0_done', - {}, - delay, - ), + await findByTestId1(pc('{volvox}ctgA:2,657..2,688-0'), {}, delay), ) expectCanvasMatch( - await findByTestId1( - 'prerendered_canvas_{volvox}ctgA:2,689..2,720-0_done', - {}, - delay, - ), + await findByTestId1(pc('{volvox}ctgA:2,689..2,720-0'), {}, delay), ) }, 30000) diff --git a/products/jbrowse-web/src/tests/AlignmentsFeatures.test.js b/products/jbrowse-web/src/tests/AlignmentsFeatures.test.tsx similarity index 68% rename from products/jbrowse-web/src/tests/AlignmentsFeatures.test.js rename to products/jbrowse-web/src/tests/AlignmentsFeatures.test.tsx index fc690a0e79..949f9c83d7 100644 --- a/products/jbrowse-web/src/tests/AlignmentsFeatures.test.js +++ b/products/jbrowse-web/src/tests/AlignmentsFeatures.test.tsx @@ -13,15 +13,23 @@ import { expectCanvasMatch, generateReadBuffer, getPluginManager, + pc, + hts, } from './util' +import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' + +type LGV = LinearGenomeViewModel + expect.extend({ toMatchImageSnapshot }) setup() beforeEach(() => { clearCache() clearAdapterCache() + // @ts-ignore fetch.resetMocks() + // @ts-ignore fetch.mockResponse( generateReadBuffer( url => new LocalFile(require.resolve(`../../test_data/volvox/${url}`)), @@ -29,26 +37,32 @@ beforeEach(() => { ) }) +function createView() { + const pm = getPluginManager() + const { session } = pm.rootModel! + const rest = render() + const view = session!.views[0] as LGV + return { view, ...rest } +} + const delay = { timeout: 20000 } test('opens the track menu and enables soft clipping', async () => { console.error = jest.fn() - const pm = getPluginManager() - const { session } = pm.rootModel - const { findByTestId, findByText } = render() + const { view, findByTestId, findByText } = createView() await findByText('Help') - act(() => session.views[0].setNewView(0.02, 142956)) + view.setNewView(0.02, 142956) // load track fireEvent.click( - await findByTestId('htsTrackEntry-volvox-long-reads-sv-bam', {}, delay), + await findByTestId(hts('volvox-long-reads-sv-bam'), {}, delay), ) await findByTestId( 'display-volvox-long-reads-sv-bam-LinearAlignmentsDisplay', {}, delay, ) - expect(session.views[0].tracks[0]).toBeTruthy() + expect(view.tracks[0]).toBeTruthy() // opens the track menu fireEvent.click(await findByTestId('track_menu_icon')) @@ -61,7 +75,7 @@ test('opens the track menu and enables soft clipping', async () => { expectCanvasMatch( await findByTestId1( - 'prerendered_canvas_softclipped_{volvox}ctgA:2,849..2,864-0_done', + pc('softclipped_{volvox}ctgA:2,849..2,864-0'), {}, delay, ), @@ -70,24 +84,18 @@ test('opens the track menu and enables soft clipping', async () => { test('selects a sort, sort by strand', async () => { console.error = jest.fn() - const pm = getPluginManager() - const { session } = pm.rootModel - const { findByTestId, findByText, findAllByTestId } = render( - , - ) + const { view, findByTestId, findByText, findAllByTestId } = createView() await findByText('Help') - act(() => session.views[0].setNewView(0.02, 2086500)) + view.setNewView(0.02, 2086500) // load track - fireEvent.click( - await findByTestId('htsTrackEntry-volvox-long-reads-cram', {}, delay), - ) + fireEvent.click(await findByTestId(hts('volvox-long-reads-cram'), {}, delay)) await findByTestId( 'display-volvox-long-reads-cram-LinearAlignmentsDisplay', {}, delay, ) - expect(session.views[0].tracks[0]).toBeTruthy() + expect(view.tracks[0]).toBeTruthy() fireEvent.click(await findByTestId('track_menu_icon')) fireEvent.click(await findByText('Sort by')) @@ -101,28 +109,18 @@ test('selects a sort, sort by strand', async () => { ) expectCanvasMatch( - await findByTestId1( - 'prerendered_canvas_{volvox}ctgA:41,729..41,744-0_done', - {}, - delay, - ), + await findByTestId1(pc('{volvox}ctgA:41,729..41,744-0'), {}, delay), ) }, 35000) test('color by strand', async () => { console.error = jest.fn() - const pm = getPluginManager() - const { session } = pm.rootModel - const { findByTestId, findByText, findAllByTestId } = render( - , - ) + const { view, findByTestId, findByText, findAllByTestId } = createView() await findByText('Help') - act(() => session.views[0].setNewView(0.02, 2086500)) + view.setNewView(0.02, 2086500) // load track - fireEvent.click( - await findByTestId('htsTrackEntry-volvox-long-reads-cram', {}, delay), - ) + fireEvent.click(await findByTestId(hts('volvox-long-reads-cram'), {}, delay)) await findByTestId( 'display-volvox-long-reads-cram-LinearAlignmentsDisplay', {}, @@ -141,28 +139,20 @@ test('color by strand', async () => { await findByTestId('Blockset-pileup'), ) expectCanvasMatch( - await findByTestId1( - 'prerendered_canvas_{volvox}ctgA:41,729..41,744-0_done', - {}, - delay, - ), + await findByTestId1(pc('{volvox}ctgA:41,729..41,744-0'), {}, delay), ) }, 30000) test('color by tag', async () => { console.error = jest.fn() - const pm = getPluginManager() - const { session } = pm.rootModel - const { findByTestId, findByText, findAllByTestId } = render( - , - ) + const { view, findByTestId, findByText, findAllByTestId } = createView() await findByText('Help') - act(() => session.views[0].setNewView(0.465, 85055)) + view.setNewView(0.465, 85055) // load track fireEvent.click(await findByTestId('htsTrackEntry-volvox_cram', {}, delay)) await findByTestId('display-volvox_cram-LinearAlignmentsDisplay', {}, delay) - expect(session.views[0].tracks[0]).toBeTruthy() + expect(view.tracks[0]).toBeTruthy() // colors by HP tag fireEvent.click(await findByTestId('track_menu_icon')) @@ -181,10 +171,6 @@ test('color by tag', async () => { ) expectCanvasMatch( - await findByTestId1( - 'prerendered_canvas_{volvox}ctgA:39,805..40,176-0_done', - {}, - delay, - ), + await findByTestId1(pc('{volvox}ctgA:39,805..40,176-0'), {}, delay), ) }, 30000) diff --git a/products/jbrowse-web/src/tests/BasicLinearGenomeView.test.tsx b/products/jbrowse-web/src/tests/BasicLinearGenomeView.test.tsx index e8d49b1f09..81f4c3a0d8 100644 --- a/products/jbrowse-web/src/tests/BasicLinearGenomeView.test.tsx +++ b/products/jbrowse-web/src/tests/BasicLinearGenomeView.test.tsx @@ -9,7 +9,13 @@ import { import { LocalFile } from 'generic-filehandle' import { clearCache } from '@jbrowse/core/util/io/RemoteFileWithRangeCache' import { clearAdapterCache } from '@jbrowse/core/data_adapters/dataAdapterCache' -import { JBrowse, setup, generateReadBuffer, getPluginManager } from './util' +import { + JBrowse, + setup, + generateReadBuffer, + getPluginManager, + hts, +} from './util' import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' type LGV = LinearGenomeViewModel @@ -19,7 +25,9 @@ setup() beforeEach(() => { clearCache() clearAdapterCache() + // @ts-ignore fetch.resetMocks() + // @ts-ignore fetch.mockResponse( generateReadBuffer(url => { return new LocalFile(require.resolve(`../../test_data/volvox/${url}`)) @@ -100,12 +108,8 @@ test( 'click and drag to reorder tracks', async () => { const { view, findByTestId } = createView() - fireEvent.click( - await findByTestId('htsTrackEntry-volvox_alignments', {}, delay), - ) - fireEvent.click( - await findByTestId('htsTrackEntry-volvox_filtered_vcf', {}, delay), - ) + fireEvent.click(await findByTestId(hts('volvox_alignments'), {}, delay)) + fireEvent.click(await findByTestId(hts('volvox_filtered_vcf'), {}, delay)) const trackId1 = view.tracks[1].id const dragHandle0 = await findByTestId( @@ -152,10 +156,9 @@ test( 'opens track selector', async () => { const { view, findByTestId } = createView() - const trackId = 'htsTrackEntry-volvox_alignments' - await findByTestId(trackId, {}, delay) + await findByTestId(hts('volvox_alignments'), {}, delay) expect(view.tracks.length).toBe(0) - fireEvent.click(await findByTestId(trackId, {}, delay)) + fireEvent.click(await findByTestId(hts('volvox_alignments'), {}, delay)) expect(view.tracks.length).toBe(1) }, total, @@ -165,9 +168,7 @@ test( 'opens reference sequence track and expects zoom in message', async () => { const { view, findByTestId, findAllByText } = createView() - fireEvent.click( - await findByTestId('htsTrackEntry-volvox_refseq', {}, delay), - ) + fireEvent.click(await findByTestId(hts('volvox_refseq'), {}, delay)) view.setNewView(20, 0) await findByTestId( 'display-volvox_refseq-LinearReferenceSequenceDisplay', @@ -183,9 +184,7 @@ test( 'click to display center line with correct value', async () => { const { view, findByTestId, findByText } = createView() - fireEvent.click( - await findByTestId('htsTrackEntry-volvox_alignments', {}, delay), - ) + fireEvent.click(await findByTestId(hts('volvox_alignments'), {}, delay)) await findByTestId('display-volvox_alignments_alignments', {}, delay) // opens the view menu and selects show center line @@ -212,9 +211,7 @@ test( expect(view.displayedRegions[0].refName).toEqual('ctgA') fireEvent.click(await findByText('Help')) // need this to complete before we can try to search - fireEvent.click( - await findByTestId('htsTrackEntry-volvox_alignments', {}, delay), - ) + fireEvent.click(await findByTestId(hts('volvox_alignments'), {}, delay)) await findByTestId( 'trackRenderingContainer-integration_test-volvox_alignments', {}, diff --git a/products/jbrowse-web/src/tests/BigWig.test.js b/products/jbrowse-web/src/tests/BigWig.test.tsx similarity index 75% rename from products/jbrowse-web/src/tests/BigWig.test.js rename to products/jbrowse-web/src/tests/BigWig.test.tsx index 96994b5011..6ecf449611 100644 --- a/products/jbrowse-web/src/tests/BigWig.test.js +++ b/products/jbrowse-web/src/tests/BigWig.test.tsx @@ -13,13 +13,19 @@ import { getPluginManager, } from './util' +import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' + +type LGV = LinearGenomeViewModel + expect.extend({ toMatchImageSnapshot }) setup() beforeEach(() => { clearCache() clearAdapterCache() + // @ts-ignore fetch.resetMocks() + // @ts-ignore fetch.mockResponse( generateReadBuffer( url => new LocalFile(require.resolve(`../../test_data/volvox/${url}`)), @@ -29,12 +35,18 @@ beforeEach(() => { const delay = { timeout: 10000 } -test('open a bigwig track', async () => { +function createView() { const pm = getPluginManager() - const state = pm.rootModel - const { findByTestId, findByText } = render() + const { session } = pm.rootModel! + const rest = render() + const view = session!.views[0] as LGV + return { view, ...rest } +} + +test('open a bigwig track', async () => { + const { view, findByTestId, findByText } = createView() await findByText('Help') - state.session.views[0].setNewView(5, 0) + view.setNewView(5, 0) fireEvent.click( await findByTestId('htsTrackEntry-volvox_microarray', {}, delay), ) @@ -47,11 +59,10 @@ test('open a bigwig track', async () => { ) }, 15000) test('open a bigwig line track 2', async () => { - const pm = getPluginManager() - const state = pm.rootModel - const { findByTestId, findByText } = render() + const { view, findByTestId, findByText } = createView() + await findByText('Help') - state.session.views[0].setNewView(10, 0) + view.setNewView(10, 0) fireEvent.click( await findByTestId('htsTrackEntry-volvox_microarray_line', {}, delay), ) @@ -64,11 +75,10 @@ test('open a bigwig line track 2', async () => { ) }, 15000) test('open a bigwig density track', async () => { - const pm = getPluginManager() - const state = pm.rootModel - const { findByTestId, findByText } = render() + const { view, findByTestId, findByText } = createView() + await findByText('Help') - state.session.views[0].setNewView(5, 0) + view.setNewView(5, 0) fireEvent.click( await findByTestId('htsTrackEntry-volvox_microarray_density', {}, delay), ) diff --git a/products/jbrowse-web/src/tests/Dotplot.test.js b/products/jbrowse-web/src/tests/Dotplot.test.tsx similarity index 89% rename from products/jbrowse-web/src/tests/Dotplot.test.js rename to products/jbrowse-web/src/tests/Dotplot.test.tsx index def8323e74..6dcbfb104a 100644 --- a/products/jbrowse-web/src/tests/Dotplot.test.js +++ b/products/jbrowse-web/src/tests/Dotplot.test.tsx @@ -21,9 +21,12 @@ if (!window.TextEncoder) { if (!window.TextDecoder) { window.TextDecoder = TextDecoder } -dotplotConfig.configuration = { - rpc: { - defaultDriver: 'MainThreadRpcDriver', +const config = { + ...dotplotConfig, + configuration: { + rpc: { + defaultDriver: 'MainThreadRpcDriver', + }, }, } @@ -35,7 +38,9 @@ setup() beforeEach(() => { clearCache() clearAdapterCache() + // @ts-ignore fetch.resetMocks() + // @ts-ignore fetch.mockResponse( generateReadBuffer( url => new LocalFile(require.resolve(`../../test_data/${url}`)), @@ -44,13 +49,13 @@ beforeEach(() => { }) test('open a dotplot view', async () => { - const pm = getPluginManager(dotplotConfig, false) + const pm = getPluginManager(config, false) const { findByTestId } = render() expectCanvasMatch(await findByTestId('prerendered_canvas_done', {}, delay)) }, 20000) test('open a dotplot view with import form', async () => { - const pm = getPluginManager(dotplotConfig, false) + const pm = getPluginManager(config, false) const { findByTestId, findAllByTestId, findByText } = render( , ) diff --git a/products/jbrowse-web/src/tests/DrawerWidget.test.js b/products/jbrowse-web/src/tests/DrawerWidget.test.tsx similarity index 71% rename from products/jbrowse-web/src/tests/DrawerWidget.test.js rename to products/jbrowse-web/src/tests/DrawerWidget.test.tsx index b3965c423e..6f7005b31a 100644 --- a/products/jbrowse-web/src/tests/DrawerWidget.test.js +++ b/products/jbrowse-web/src/tests/DrawerWidget.test.tsx @@ -1,19 +1,23 @@ import React from 'react' import '@testing-library/jest-dom/extend-expect' -import { act } from 'react-dom/test-utils' import { LocalFile } from 'generic-filehandle' import { clearCache } from '@jbrowse/core/util/io/RemoteFileWithRangeCache' import { clearAdapterCache } from '@jbrowse/core/data_adapters/dataAdapterCache' import { fireEvent, render, getByRole } from '@testing-library/react' -import { JBrowse, getPluginManager, generateReadBuffer } from './util' +import { JBrowse, getPluginManager, generateReadBuffer, hts } from './util' +import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' + +type LGV = LinearGenomeViewModel const delay = { timeout: 15000 } beforeEach(() => { clearCache() clearAdapterCache() + // @ts-ignore fetch.resetMocks() + // @ts-ignore fetch.mockResponse( generateReadBuffer( url => new LocalFile(require.resolve(`../../test_data/volvox/${url}`)), @@ -21,21 +25,21 @@ beforeEach(() => { ) }) -test('variant track test - opens feature detail view', async () => { +function createView() { const pm = getPluginManager() const state = pm.rootModel - const { findByTestId, findAllByTestId, findByText } = render( - , - ) + const { session } = state! + const rest = render() + const view = session!.views[0] as LGV + return { view, state, ...rest } +} + +test('variant track test - opens feature detail view', async () => { + const { view, findByTestId, findAllByTestId, findByText } = createView() await findByText('Help') - const view = state.session.views[0] - act(() => view.setNewView(0.05, 5000)) - fireEvent.click( - await findByTestId('htsTrackEntry-volvox_filtered_vcf', {}, delay), - ) - act(() => - view.tracks[0].displays[0].setFeatureIdUnderMouse('test-vcf-604452'), - ) + view.setNewView(0.05, 5000) + fireEvent.click(await findByTestId(hts('volvox_filtered_vcf'), {}, delay)) + view.tracks[0].displays[0].setFeatureIdUnderMouse('test-vcf-604452') const feats1 = await findAllByTestId('test-vcf-604452', {}, delay) fireEvent.click(feats1[0]) @@ -48,18 +52,12 @@ test('variant track test - opens feature detail view', async () => { }, 20000) test('widget drawer navigation', async () => { - const pm = getPluginManager(undefined, true) - const state = pm.rootModel - const { findByTestId, findByText } = render() + const { view, state, findByTestId, findByText } = createView() await findByText('Help') - act(() => state.session.views[0].setNewView(0.05, 5000)) + view.setNewView(0.05, 5000) // opens a config editor widget - fireEvent.click( - await findByTestId('htsTrackEntry-volvox_filtered_vcf', {}, delay), - ) - fireEvent.click( - await findByTestId('htsTrackEntryMenu-volvox_filtered_vcf', {}, delay), - ) + fireEvent.click(await findByTestId(hts('volvox_filtered_vcf'), {}, delay)) + fireEvent.click(await findByTestId(hts('volvox_filtered_vcf'), {}, delay)) fireEvent.click(await findByText('Settings')) await findByTestId('configEditor', {}, delay) // shows up when there active widgets @@ -74,20 +72,25 @@ test('widget drawer navigation', async () => { await findByTestId('hierarchical_track_selector') // test minimize and maximize widget drawer + // @ts-ignore expect(state.session.minimized).toBeFalsy() await findByTestId('drawer-minimize') fireEvent.click(await findByTestId('drawer-minimize')) + // @ts-ignore expect(state.session.minimized).toBeTruthy() fireEvent.click(await findByTestId('drawer-maximize')) + // @ts-ignore expect(state.session.minimized).toBeFalsy() // test deleting widget from select dropdown using trash icon + // @ts-ignore expect(state.session.activeWidgets.size).toEqual(2) fireEvent.mouseDown( getByRole(await findByTestId('widget-drawer-selects'), 'button'), ) fireEvent.click(await findByTestId('ConfigurationEditorWidget-drawer-delete')) + // @ts-ignore expect(state.session.activeWidgets.size).toEqual(1) }, 20000) diff --git a/products/jbrowse-web/src/tests/JBrowse.test.js b/products/jbrowse-web/src/tests/JBrowse.test.tsx similarity index 68% rename from products/jbrowse-web/src/tests/JBrowse.test.js rename to products/jbrowse-web/src/tests/JBrowse.test.tsx index a9200bcd4e..d92e7a6db9 100644 --- a/products/jbrowse-web/src/tests/JBrowse.test.js +++ b/products/jbrowse-web/src/tests/JBrowse.test.tsx @@ -13,8 +13,19 @@ import JBrowseRootModelFactory from '../rootModel' import corePlugins from '../corePlugins' import * as sessionSharing from '../sessionSharing' import volvoxConfigSnapshot from '../../test_data/volvox/config.json' -import { JBrowse, setup, getPluginManager, generateReadBuffer } from './util' +import { + JBrowse, + setup, + getPluginManager, + generateReadBuffer, + hts, +} from './util' import TestPlugin from './TestPlugin' + +import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' + +type LGV = LinearGenomeViewModel + jest.mock('../makeWorkerInstance', () => () => {}) window.TextEncoder = TextEncoder @@ -25,7 +36,9 @@ const delay = { timeout: 15000 } beforeEach(() => { clearCache() clearAdapterCache() + // @ts-ignore fetch.resetMocks() + // @ts-ignore fetch.mockResponse( generateReadBuffer( url => new LocalFile(require.resolve(`../../test_data/volvox/${url}`)), @@ -33,26 +46,31 @@ beforeEach(() => { ) }) -describe('', () => { - it('renders with an empty config', async () => { - const pm = getPluginManager({}) - const { findByText } = render() - await findByText('Help') - }) - it('renders with an initialState', async () => { - const pm = getPluginManager() - const { findByText } = render() - await findByText('Help') - }) +function createView() { + const pm = getPluginManager() + const state = pm.rootModel + const { session } = state! + const rest = render() + const view = session!.views[0] as LGV + return { view, state, ...rest } +} + +test('renders with an empty config', async () => { + const pm = getPluginManager({}) + const { findByText } = render() + await findByText('Help') +}) +test('renders with an initialState', async () => { + const pm = getPluginManager() + const { findByText } = render() + await findByText('Help') }) test('lollipop track test', async () => { - const pm = getPluginManager() - const state = pm.rootModel - const { findByTestId, findByText } = render() + const { view, findByTestId, findByText } = createView() await findByText('Help') - state.session.views[0].setNewView(1, 150) - fireEvent.click(await findByTestId('htsTrackEntry-lollipop_track', {}, delay)) + view.setNewView(1, 150) + fireEvent.click(await findByTestId(hts('lollipop_track'), {}, delay)) await findByTestId('display-lollipop_track_linear', {}, delay) await findByTestId('three', {}, delay) @@ -70,7 +88,7 @@ test('toplevel configuration', () => { pm.setRootModel(rootModel) pm.configure() const state = pm.rootModel - const { jbrowse } = state + const { jbrowse } = state! const { configuration } = jbrowse // test reading top level configurations added by Test Plugin const test = getConf(jbrowse, ['TestPlugin', 'topLevelTest']) @@ -80,30 +98,20 @@ test('toplevel configuration', () => { }) test('assembly aliases', async () => { - const pm = getPluginManager() - const state = pm.rootModel - const { findByTestId, findByText } = render() + const { view, findByTestId, findByText } = createView() await findByText('Help') - state.session.views[0].setNewView(0.05, 5000) + view.setNewView(0.05, 5000) fireEvent.click( - await findByTestId( - 'htsTrackEntry-volvox_filtered_vcf_assembly_alias', - {}, - delay, - ), + await findByTestId(hts('volvox_filtered_vcf_assembly_alias'), {}, delay), ) await findByTestId('box-test-vcf-604452', {}, delay) }, 15000) test('nclist track test with long name', async () => { - const pm = getPluginManager() - const state = pm.rootModel - const { findByTestId, findByText } = render() + const { view, findByTestId, findByText } = createView() await findByText('Help') - state.session.views[0].setNewView(1, -539) - fireEvent.click( - await findByTestId('htsTrackEntry-nclist_long_names', {}, delay), - ) + view.setNewView(1, -539) + fireEvent.click(await findByTestId(hts('nclist_long_names'), {}, delay)) await findByText( 'This is a gene with a very long name it is crazy abcdefghijklmnopqrstuvwxyz1...', @@ -113,6 +121,7 @@ test('nclist track test with long name', async () => { }, 15000) test('test sharing', async () => { + // @ts-ignore sessionSharing.shareSessionToDynamo = jest.fn().mockReturnValue({ encryptedSession: 'A', json: { @@ -127,19 +136,16 @@ test('test sharing', async () => { // check the share dialog has the above session shared await findByTestId('share-dialog') - const url = await findByTestId('share-url-text') + const url = (await findByTestId('share-url-text')) as HTMLInputElement expect(url.value).toBe('http://localhost/?session=share-abc&password=123') }) test('looks at about this track dialog', async () => { - const pm = getPluginManager() - const { findByTestId, findAllByText, findByText } = render( - , - ) + const { findByTestId, findAllByText, findByText } = createView() await findByText('Help') // load track - fireEvent.click(await findByTestId('htsTrackEntry-volvox-long-reads-cram')) + fireEvent.click(await findByTestId(hts('volvox-long-reads-cram'))) fireEvent.click(await findByTestId('track_menu_icon', {}, delay)) fireEvent.click(await findByText('About track')) await findAllByText(/SQ/, {}, delay) diff --git a/products/jbrowse-web/src/tests/__image_snapshots__/alignments-features-test-tsx-color-by-strand-1-snap.png b/products/jbrowse-web/src/tests/__image_snapshots__/alignments-features-test-tsx-color-by-strand-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..6dfe5b1c3d4f3f147d64526dbf62bbbbc3b8d120 GIT binary patch literal 557 zcmeAS@N?(olHy`uVBq!ia0y~yU~>Sn%{bVAi(0|VnD zPZ!6KiaBp@Zsa|pz;NII|Lf%mdwD)utC-pfO)52Std1|Xd(RKl%D|wIGKUY$V7PIX zff39q;t>GT3dd<60I>@TnNWE4=bq)t5ScQm<;+l)u>+XVAj8Z8W}GmjfdJTKY(zxN z|KD}~?hvUrCVuQtR$2puVadh;W=u$?fdIq`EaZkC3=g(*+9o}HVhED;boFyt=akR{ E0LCOxp#T5? literal 0 HcmV?d00001 diff --git a/products/jbrowse-web/src/tests/__image_snapshots__/alignments-features-test-tsx-color-by-tag-1-snap.png b/products/jbrowse-web/src/tests/__image_snapshots__/alignments-features-test-tsx-color-by-tag-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..27ad37fbebdb5d712c875401e7f64f4606e029ce GIT binary patch literal 22372 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 literal 0 HcmV?d00001 diff --git a/products/jbrowse-web/src/tests/__image_snapshots__/alignments-features-test-tsx-opens-the-track-menu-and-enables-soft-clipping-1-snap.png b/products/jbrowse-web/src/tests/__image_snapshots__/alignments-features-test-tsx-opens-the-track-menu-and-enables-soft-clipping-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..b540b7bfb9556325194cb106a47430fa04f6c5f8 GIT binary patch literal 31958 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⩔1*s<=g7S1n#W5yhNBgN?1) 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

ArogiEu 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 literal 0 HcmV?d00001 diff --git a/products/jbrowse-web/src/tests/__image_snapshots__/alignments-test-tsx-test-snpcoverage-doesnt-count-snpcoverage-1-snap.png b/products/jbrowse-web/src/tests/__image_snapshots__/alignments-test-tsx-test-snpcoverage-doesnt-count-snpcoverage-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..2d7a2c967e76d3463ffa12fb418c5f2296923850 GIT binary patch literal 1753 zcmeAS@N?(olHy`uVBq!ia0y~yV2cK_qd3@rr2YK|^+1X($=lt9;Xep2*t>i(P@vD# z#WAE}&f7ct^JAaN9{>3M@54VE)=yOCxUytb_XJN_k(EVCZC$4n)Q*I#^q%gvmZhV< z>COl7k_AE=7?K=3QeTR+h4p3xdP;c*MtHC^dTd>4X3w$BK=Gkm+pI8AW|#ZIa`%s~ zzh1)5KVLceyyf-$-)=y6kO%%RH||Ni-23if`s16ImmU`|?0Fb0`0>%R*M1KzH4jVd z6A|=xJMuD-hkyFL$w0Z69T7bp)7uPdc72)Gb86kvn>9bbJUcHPuyfWsUDK5>ZPq=F zn%DiDuQ%ySe+S3;U(xNxJ-63RGv?VLdba+(uAuC9u^VhQuk&N)KIgZ;FC!(_b@0xD zFJekbUyo$XseT&c;-a&6Pe_IDxlbFP?)cEoZCIS3CRhD<M7m=0_S(k6die@4CwPho%Rmu_bW zVE-=0z>uK*+BH8_WN~u*e!acz|6l$H4@)>xEB3F5KS6s1F!*0aHN0KE%=k@`%bu7j z7w^7lat?F%{p0w4vUc)xIs1P<-h014`KrW<-^90g-IqSIDeK$u{c~85+)U$imJs+l?&9lxup0$qkMqQTG;jCR^ zJ9Mwv$MyHt=N>t7#pR653{BhiD$D+d)*lR$K*`adjjgy@;ta3Xc?JcgT}#;^Nwmj! zBP*Dt;F!Y*W_SpIaupB=9Rd0g2pU*Ml>mcbIETxxrR*Pk_xjs+zAX2fGVkK7t@Cw{ zPA@+*WgcU}>2)<1ySIle_dcI-bl<(|k4MgYym420>by%`+Sc`g=DVxC&wE%`R+iUn z*thvhPuQQ&pF3rLm)+H{T`VencYFDtj92%Urf+%FZvFkJ|FUn>=P@!Ikf{ECIr#6^ z+1Vh8iTi6s%6;!dR=H^}6FYaLcXxdNka?}_kBwOs_tNwwox0Hh|8H%*QT(SLs66fQ z!TDXf2O@U;a4UEe=P z3+NQ??|=5z|NC|Hl5y0>3$pD;fhjx4FV6aE{LXz*K{pWA2I1GJli(0|U!G zPZ!6KiaBrZD)z^uiX4CVS+84DRV7sCtLf~>(8j|dP6AgWv;_Y$^tdmG?sSsrwp~^K(tL zAXv?TrYF&YKM(6|skyrs6b=jw35}orcKk6@y8kYY3CKO*lbc*!E`9sXv2S(X#o|tM zu?<#(MEp2@i#>A$NC zGIfUiM%I7nZb#O>o|~m4*coVjhP|%_;*i@#QFc$G9aZ4VJ{12EzAAh zQEOpgv1886_i4}c??$h>Rx-`-SYTS*K1p-&|5nn;F{jVW-(CLZblT>~KgA%IG8nM8 z3w}%m>9e;D#;33q#+_ zQSV%(9A0RpZgVqm&~>3Rp_0qq_`yP3;gHoub% zP3~EI#-_XDIM9{HB-{l*R+P^>x~uT<`o-@3H6qLm3=O6q#O)aN+&aGd_@dNxPt#{z zE1squKCcbzgx3$G457wCT*SnPjIjS$qn|p8bFFI$=lt9;Xep2*t>i(0|Wa? zPZ!6KiaBp@8hQyZNVGlVn#G&7mARw3dUCZ%3DZk~%9eKz)EdJ%lr}6Z?g(z4t&w8> zWBG&W)1O-&WWWEzuKw$*j~{Oee|vcNThq<6XMx1)>$kbnrcVbF^X+o=XZ-!Kac@Fd z(Wbo#-`?H^O22&zBzBhrrP@!Q4E%=@+P_irHQ^JgIO`ZbW)yctN$w+G6_IU(8=z7Hc6RA=k7M<{dkqtyu;;-o@Y#>#0W*+Pmqhk? zVha>3Z;Z+X#A*CsRk036BK0J^&A!ipK?-xVaMdTkFlORwSF@KUb_~D zQf);AhHbH2xr;It_MRg)ai0isW>yB6H5P9^xbZ-V5{Pve$w!(uv~7ZBAwGFszm3}r)G5ma z8*u>wW<*WlC%fX;E|<^kVP~+$HE-3~4&3eMp&0SnyJ*vt{G8u4K07E6l1w8WNI&iD zK7>t#cP1?@aSX(;WQ%L~4C}I4ogM|mhG+}#KV_LjK^;{np+j?Kz1kNkxw;pv4lwNg zhl8Wg1EmjdD}H0QvX)%7^r?)Q$cfZa_{Mo=vyw=zoOqe}VNaD|9&bJp32UDJ75`j9L#N{(hJhmGcU@kZuJ_Ol8<-vZ z$yx*1nU2Wy;XB4;#H5>6Y#O4x*W{U;#KChOt~fGD4xvQh{w}{>BZx$MCbEdRvhyv^ z-k9b0YR|O*F4u8?wN)qsdQ0I@Q})ouFq5!Tr9&Pp$tHstA@jQV!q&7DxdMG`f{-8N zJXzu09$IL;3aqqfN}q33F8sMn6rDGk&f)D!6F3Rpb#cDK87|r^Ze+Sd!RBbh`s*9Z z3X$_0v^Zm-uWnR59A8ji)`oAo@wLJe+v}waSF$wx!&m*SP&0Rfg7vN>QsuvL8fsr8 zTNLbfQ4vbkEGsb7uLrAwsg}n1HPgQ`QA{9R?O0El3AWb(KLbzSKI~eo%=#r|?+T7t zH^7dlwjf!kQ9qR22%Oc4LRUndARW!nU;yxegaOYdYgEd%^v6AV_9XoDln%IH``bq( zZ$+Wqv=(z!S-L&r0h%;o->{qCF3KQNa^QBaN@^fGB3TJZBm+eprKYb9)g=x-i`Sj( zHvs;jzY~gY>2si@`P%Q09*4k78F>})eDkXW(nAYZLTu# z^w7@m1?B#nfs=~rb#qm$XPvSe*3MXh6rT($pj?Z?3oCP#JBv8-st{%!9kfIQYL_uc z`g6?3vGjvRJiOGcNP&2r-g5u+?m45H%l{oES})z;D{6YQtmSYr!rL6e|x=2NRrFDVVP%cLUsp7;3x0hcLv3KO{r!2WL6QSkL z;@Cx+W^w%_^R65o-`Q@KwQTUwxji!geWmMGj>@emTHZ14-zm2b74@bX_vNRdR1DukF-CW4dIP;v6ln3zAtJ?yck7 zPu1UFN2Ubr*#6fxgQsPyUc@E*0F~rb308<%182L<~u=bHl}=WA46u^9z&eG^H`S zD1UQ1OK9q2-qK0WzUNqY_=T316MOu2jB=ZgiJL z7mNB2{v}piv;N5iykKf>J^rw9BKXrs_NeZtlLa_E}D|fAiW5t~-uK;PYcU z^S>5n(|As$+mELpy|uqxK}wRf2R3jIv9M1Z2zPKhul-e>aaLh#P5 zq=Il2g(`Ms?xpD_WobvEdnSk-=;}CxppJ8kj{i6ns|E!mF1Wsn(E9V$7CQ*=k|D?U zyU=y5LKA9l+q7@~4ppi_P`#}4;t6iPAerE{zSByHRo=SKN!I89@^#Ei36sjx#a;+f zX$|o@dL#^;hc|5S3_pP)pE~)_qXYH*vW28|Es6o(e96ePbbIA#1Pim6Xgr5d6cizE z4xS;aVbPfS?HJXq6hUWqOPCBM;FrmQ_48k*e_opd2eK1A0AJYdB~imB>OU;~ENpTY zZ?+X)@x)$AUVT4U(;1sBS4o;W`AkC@0@Uk z6G^auJt^@YFFku{rr!jx+BaR>c3wCmi@Y(59n`LhrmkL_%`!6`{+BNuP*@`*=7c~l-9Z!MOQU}DrN`gRFm~j)q&M#6cycwr5 z(VDUk88{n_s8krZuNFm~nF3vqFIQopz+h&=hN(goafID_AEE~I50m|~?7ZaNd(S=R z+;e~DcW!26xMG5Enh*dcC|8B70dS+xyh`AP{>4Fl^U&a?RVhMX2!H0Xli2|7p~{dI zQE7QSH{@%i%9lT>kM)W8+H1O`)i zIY8azAjdd1k@V(h7hFqOu3mWfj%oFFhm@%MXK;3Zc&?j67JX70kIau*J6*fHGfZ9E zT>^Tu7loDWJH!R!s{>>rigwt-DiU4$yi@Ic7CpIX^pv4NAzS-z(+R~iWKEZQQuO5M54-vJH0A?= zg!xJyH4!f$JQzrV!UL5!im6NO614a7CgDAE!%i3Ny;sH+td($3GW6$DYaJfz&daXG zxda3kWOPldmZPoS2PYAHSeOX*RzPoK!+?1v_C~V4QhIAseZ^*kz(V^LwH#jsVrFr8 z{w+nUH{*%2$8zSECXD9XoOHF(8pRb5W~p%uZ8 zW&P-*&U3hodZS4fEAQBMKS__{GdACWjCa6H1K!GB9&HThICROV0ooOFcPJkyj#|T# zr6+(xpkXqt#}2(QeEE|dpRWA*IVX;QZ8T@Jq!ppW=j7ZjP~iOb|4>G!&H(3pZq@ys z0s@@js?P--)MWveQa9S0)JAM)-h-FRlw#H`@+avntOn}M;T-A?68Zsr$I=;~Cyh4~ ztW;t`nWo}s(m))k>9y4edjI-hmOZOtJ8h_WzDz2$V3Z@@Mw@i)uhE!*ny;5p_yk0j zJgkmiYPS}Ob(eN5Dti~FG~h)IoKvEfKm@2+m;3u^TrQdFr6mSq+bjUzJqI7>yi!6e;)1k3_y_1U=QZ;DSad`nJdK!!u zNjc^25@!C!v(Cg#@aGaSeqL1h3B=8sjBsTJuB#^=)~%XNqu5TrR&*AY$E;oZF&~`0 z+w4<`kLC)_=4p$O(xarXjKRleo7f7(*hi*(8v6cuB-j`4Jpnqv&~HLtZ2d$}kH9>t z6NlRj808IFXNjK2*xV(kW>;|6@qm&xDsNj9ke9oln1p-z;yYB=V=9l6a%FytTqLrFm{{XsEO7#E$ literal 0 HcmV?d00001 diff --git a/products/jbrowse-web/src/tests/__image_snapshots__/dotplot-test-tsx-open-a-dotplot-view-1-snap.png b/products/jbrowse-web/src/tests/__image_snapshots__/dotplot-test-tsx-open-a-dotplot-view-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..f8f9d0367576eb32918edf61be01ff18f7a700ea GIT binary patch literal 29922 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 T<`G2kF+}^c{%<*_Y<~YAXGGBn literal 0 HcmV?d00001 diff --git a/products/jbrowse-web/src/tests/__image_snapshots__/dotplot-test-tsx-open-a-dotplot-view-with-import-form-1-snap.png b/products/jbrowse-web/src/tests/__image_snapshots__/dotplot-test-tsx-open-a-dotplot-view-with-import-form-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..0a470f86fe55a9efa203f89b5b834a6e2fa7f448 GIT binary patch literal 29329 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 literal 0 HcmV?d00001 diff --git a/products/jbrowse-web/src/tests/util.tsx b/products/jbrowse-web/src/tests/util.tsx index 5663794835..fd3caab797 100644 --- a/products/jbrowse-web/src/tests/util.tsx +++ b/products/jbrowse-web/src/tests/util.tsx @@ -117,8 +117,8 @@ export function canvasToBuffer(canvas: HTMLCanvasElement) { ) } -export function expectCanvasMatch(canvas: HTMLCanvasElement) { - expect(canvasToBuffer(canvas)).toMatchImageSnapshot({ +export function expectCanvasMatch(canvas: HTMLElement) { + expect(canvasToBuffer(canvas as HTMLCanvasElement)).toMatchImageSnapshot({ failureThreshold: 0.05, failureThresholdType: 'percent', }) @@ -132,3 +132,6 @@ export function JBrowse(props: any) { ) } + +export const hts = (str: string) => 'htsTrackEntry-' + str +export const pc = (str: string) => `prerendered_canvas_${str}_done` From a399731c4f4bf4315058fcf5af6cb26df533ef38 Mon Sep 17 00:00:00 2001 From: Colin Date: Tue, 28 Jun 2022 21:24:43 -0600 Subject: [PATCH 4/7] Commit --- .../jbrowse-web/src/tests/Alignments.test.tsx | 16 +- .../src/tests/AlignmentsFeatures.test.tsx | 18 +- .../src/tests/BasicLinearGenomeView.test.tsx | 28 +-- .../src/tests/DrawerWidget.test.tsx | 20 +- .../jbrowse-web/src/tests/JBrowse.test.tsx | 32 +-- products/jbrowse-web/src/tests/Reload.test.js | 17 ++ .../jbrowse-web/src/tests/Reload.test.tsx | 205 ++++++++++++++++++ ...ation.test.js => StatsEstimation.test.tsx} | 71 +++--- products/jbrowse-web/src/tests/util.tsx | 14 ++ 9 files changed, 279 insertions(+), 142 deletions(-) create mode 100644 products/jbrowse-web/src/tests/Reload.test.tsx rename products/jbrowse-web/src/tests/{StatsEstimation.test.js => StatsEstimation.test.tsx} (59%) diff --git a/products/jbrowse-web/src/tests/Alignments.test.tsx b/products/jbrowse-web/src/tests/Alignments.test.tsx index 333bf5c05e..f8da99cdea 100644 --- a/products/jbrowse-web/src/tests/Alignments.test.tsx +++ b/products/jbrowse-web/src/tests/Alignments.test.tsx @@ -1,5 +1,5 @@ import React from 'react' -import { fireEvent, render, within } from '@testing-library/react' +import { fireEvent, within } from '@testing-library/react' import { LocalFile } from 'generic-filehandle' // locals @@ -7,18 +7,14 @@ import { clearCache } from '@jbrowse/core/util/io/RemoteFileWithRangeCache' import { clearAdapterCache } from '@jbrowse/core/data_adapters/dataAdapterCache' import { toMatchImageSnapshot } from 'jest-image-snapshot' import { - JBrowse, setup, expectCanvasMatch, generateReadBuffer, - getPluginManager, + createView, hts, pc, } from './util' -import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' - -type LGV = LinearGenomeViewModel expect.extend({ toMatchImageSnapshot }) setup() @@ -35,14 +31,6 @@ beforeEach(() => { ) }) -function createView() { - const pm = getPluginManager() - const { session } = pm.rootModel! - const rest = render() - const view = session!.views[0] as LGV - return { view, ...rest } -} - const delay = { timeout: 20000 } test('opens an alignments track', async () => { diff --git a/products/jbrowse-web/src/tests/AlignmentsFeatures.test.tsx b/products/jbrowse-web/src/tests/AlignmentsFeatures.test.tsx index 949f9c83d7..e50439e498 100644 --- a/products/jbrowse-web/src/tests/AlignmentsFeatures.test.tsx +++ b/products/jbrowse-web/src/tests/AlignmentsFeatures.test.tsx @@ -1,6 +1,5 @@ import React from 'react' -import { fireEvent, render, within } from '@testing-library/react' -import { act } from 'react-dom/test-utils' +import { fireEvent, within } from '@testing-library/react' import { LocalFile } from 'generic-filehandle' // locals @@ -8,19 +7,14 @@ import { clearCache } from '@jbrowse/core/util/io/RemoteFileWithRangeCache' import { clearAdapterCache } from '@jbrowse/core/data_adapters/dataAdapterCache' import { toMatchImageSnapshot } from 'jest-image-snapshot' import { - JBrowse, setup, expectCanvasMatch, generateReadBuffer, - getPluginManager, + createView, pc, hts, } from './util' -import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' - -type LGV = LinearGenomeViewModel - expect.extend({ toMatchImageSnapshot }) setup() @@ -37,14 +31,6 @@ beforeEach(() => { ) }) -function createView() { - const pm = getPluginManager() - const { session } = pm.rootModel! - const rest = render() - const view = session!.views[0] as LGV - return { view, ...rest } -} - const delay = { timeout: 20000 } test('opens the track menu and enables soft clipping', async () => { diff --git a/products/jbrowse-web/src/tests/BasicLinearGenomeView.test.tsx b/products/jbrowse-web/src/tests/BasicLinearGenomeView.test.tsx index 81f4c3a0d8..98a127fb37 100644 --- a/products/jbrowse-web/src/tests/BasicLinearGenomeView.test.tsx +++ b/products/jbrowse-web/src/tests/BasicLinearGenomeView.test.tsx @@ -1,25 +1,9 @@ import React from 'react' -import { - createEvent, - fireEvent, - render, - waitFor, - screen, -} from '@testing-library/react' +import { createEvent, fireEvent, waitFor, screen } from '@testing-library/react' import { LocalFile } from 'generic-filehandle' import { clearCache } from '@jbrowse/core/util/io/RemoteFileWithRangeCache' import { clearAdapterCache } from '@jbrowse/core/data_adapters/dataAdapterCache' -import { - JBrowse, - setup, - generateReadBuffer, - getPluginManager, - hts, -} from './util' -import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' - -type LGV = LinearGenomeViewModel - +import { setup, createView, generateReadBuffer, hts } from './util' setup() beforeEach(() => { @@ -35,14 +19,6 @@ beforeEach(() => { ) }) -function createView() { - const pm = getPluginManager() - const { session } = pm.rootModel! - const rest = render() - const view = session!.views[0] as LGV - return { view, ...rest } -} - const delay = { timeout: 20000 } const total = 30000 diff --git a/products/jbrowse-web/src/tests/DrawerWidget.test.tsx b/products/jbrowse-web/src/tests/DrawerWidget.test.tsx index 6f7005b31a..f9ca36c9d7 100644 --- a/products/jbrowse-web/src/tests/DrawerWidget.test.tsx +++ b/products/jbrowse-web/src/tests/DrawerWidget.test.tsx @@ -4,11 +4,8 @@ import '@testing-library/jest-dom/extend-expect' import { LocalFile } from 'generic-filehandle' import { clearCache } from '@jbrowse/core/util/io/RemoteFileWithRangeCache' import { clearAdapterCache } from '@jbrowse/core/data_adapters/dataAdapterCache' -import { fireEvent, render, getByRole } from '@testing-library/react' -import { JBrowse, getPluginManager, generateReadBuffer, hts } from './util' -import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' - -type LGV = LinearGenomeViewModel +import { fireEvent, getByRole } from '@testing-library/react' +import { createView, generateReadBuffer, hts } from './util' const delay = { timeout: 15000 } @@ -25,15 +22,6 @@ beforeEach(() => { ) }) -function createView() { - const pm = getPluginManager() - const state = pm.rootModel - const { session } = state! - const rest = render() - const view = session!.views[0] as LGV - return { view, state, ...rest } -} - test('variant track test - opens feature detail view', async () => { const { view, findByTestId, findAllByTestId, findByText } = createView() await findByText('Help') @@ -57,7 +45,9 @@ test('widget drawer navigation', async () => { view.setNewView(0.05, 5000) // opens a config editor widget fireEvent.click(await findByTestId(hts('volvox_filtered_vcf'), {}, delay)) - fireEvent.click(await findByTestId(hts('volvox_filtered_vcf'), {}, delay)) + fireEvent.click( + await findByTestId('htsTrackEntryMenu-volvox_filtered_vcf', {}, delay), + ) fireEvent.click(await findByText('Settings')) await findByTestId('configEditor', {}, delay) // shows up when there active widgets diff --git a/products/jbrowse-web/src/tests/JBrowse.test.tsx b/products/jbrowse-web/src/tests/JBrowse.test.tsx index d92e7a6db9..35bf316591 100644 --- a/products/jbrowse-web/src/tests/JBrowse.test.tsx +++ b/products/jbrowse-web/src/tests/JBrowse.test.tsx @@ -1,7 +1,7 @@ import React from 'react' import '@testing-library/jest-dom/extend-expect' -import { fireEvent, render } from '@testing-library/react' +import { fireEvent } from '@testing-library/react' import { LocalFile } from 'generic-filehandle' import { TextEncoder } from 'web-encoding' import { clearCache } from '@jbrowse/core/util/io/RemoteFileWithRangeCache' @@ -13,19 +13,9 @@ import JBrowseRootModelFactory from '../rootModel' import corePlugins from '../corePlugins' import * as sessionSharing from '../sessionSharing' import volvoxConfigSnapshot from '../../test_data/volvox/config.json' -import { - JBrowse, - setup, - getPluginManager, - generateReadBuffer, - hts, -} from './util' +import { setup, generateReadBuffer, createView, hts } from './util' import TestPlugin from './TestPlugin' -import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' - -type LGV = LinearGenomeViewModel - jest.mock('../makeWorkerInstance', () => () => {}) window.TextEncoder = TextEncoder @@ -46,23 +36,12 @@ beforeEach(() => { ) }) -function createView() { - const pm = getPluginManager() - const state = pm.rootModel - const { session } = state! - const rest = render() - const view = session!.views[0] as LGV - return { view, state, ...rest } -} - test('renders with an empty config', async () => { - const pm = getPluginManager({}) - const { findByText } = render() + const { findByText } = createView() await findByText('Help') }) test('renders with an initialState', async () => { - const pm = getPluginManager() - const { findByText } = render() + const { findByText } = createView() await findByText('Help') }) @@ -129,8 +108,7 @@ test('test sharing', async () => { }, password: '123', }) - const pm = getPluginManager() - const { findByTestId, findByText } = render() + const { findByTestId, findByText } = createView() await findByText('Help') fireEvent.click(await findByText('Share')) diff --git a/products/jbrowse-web/src/tests/Reload.test.js b/products/jbrowse-web/src/tests/Reload.test.js index 59ef65310e..cde3ec3142 100644 --- a/products/jbrowse-web/src/tests/Reload.test.js +++ b/products/jbrowse-web/src/tests/Reload.test.js @@ -10,8 +10,16 @@ import { getPluginManager, expectCanvasMatch, generateReadBuffer, + hts, + pc } from './util' +import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' + +type LGV = LinearGenomeViewModel + + + expect.extend({ toMatchImageSnapshot }) const readBuffer = generateReadBuffer( @@ -27,6 +35,15 @@ beforeEach(() => { fetch.mockResponse(readBuffer) }) + +function createView() { + const pm = getPluginManager() + const { session } = pm.rootModel! + const rest = render() + const view = session!.views[0] as LGV + return { view, ...rest } +} + const delay = { timeout: 10000 } // this tests reloading after an initial track error diff --git a/products/jbrowse-web/src/tests/Reload.test.tsx b/products/jbrowse-web/src/tests/Reload.test.tsx new file mode 100644 index 0000000000..d64b4bf147 --- /dev/null +++ b/products/jbrowse-web/src/tests/Reload.test.tsx @@ -0,0 +1,205 @@ +import React from 'react' +import { fireEvent } from '@testing-library/react' +import { toMatchImageSnapshot } from 'jest-image-snapshot' +import { LocalFile } from 'generic-filehandle' +import { clearCache } from '@jbrowse/core/util/io/RemoteFileWithRangeCache' +import { clearAdapterCache } from '@jbrowse/core/data_adapters/dataAdapterCache' +import { + setup, + expectCanvasMatch, + generateReadBuffer, + hts, + pc, + createView, +} from './util' +expect.extend({ toMatchImageSnapshot }) + +const readBuffer = generateReadBuffer( + url => new LocalFile(require.resolve(`../../test_data/volvox/${url}`)), +) + +setup() + +beforeEach(() => { + clearCache() + clearAdapterCache() + // @ts-ignore + fetch.resetMocks() + // @ts-ignore + fetch.mockResponse(readBuffer) +}) + +const delay = { timeout: 10000 } + +// this tests reloading after an initial track error +// it performs a full image snapshot test to ensure that the features are rendered and not +// just that an empty canvas is rendered (empty canvas can result if ref name renaming failed) +test('reloads alignments track (CRAI 404)', async () => { + console.error = jest.fn() + + // @ts-ignore + fetch.mockResponse(async request => { + if (request.url === 'volvox-sorted-altname.cram.crai') { + return { status: 404 } + } + return readBuffer(request) + }) + + const { view, findByTestId, findByText, findAllByTestId, findAllByText } = + createView() + await findByText('Help') + view.setNewView(0.5, 0) + fireEvent.click(await findByTestId(hts('volvox_cram_pileup'), {}, delay)) + await findAllByText(/HTTP 404/, {}, delay) + + // @ts-ignore + fetch.mockResponse(readBuffer) + const buttons = await findAllByTestId('reload_button') + fireEvent.click(buttons[0]) + expectCanvasMatch(await findByTestId(pc('{volvox}ctgA:1..400-0'), {}, delay)) +}, 20000) + +test('reloads alignments track (CRAM 404)', async () => { + console.error = jest.fn() + + // @ts-ignore + fetch.mockResponse(async request => { + if (request.url === 'volvox-sorted-altname.cram') { + return { status: 404 } + } + return generateReadBuffer( + url => new LocalFile(require.resolve(`../../test_data/volvox/${url}`)), + )(request) + }) + + const { view, findByTestId, findByText, findAllByTestId, findAllByText } = + createView() + await findByText('Help') + view.setNewView(0.5, 0) + fireEvent.click(await findByTestId(hts('volvox_cram_snpcoverage'), {}, delay)) + await findAllByText(/HTTP 404/, {}, delay) + // @ts-ignore + fetch.mockResponse(readBuffer) + const buttons = await findAllByTestId('reload_button') + fireEvent.click(buttons[0]) + expectCanvasMatch(await findByTestId(pc('{volvox}ctgA:1..400-0'), {}, delay)) +}, 20000) +test('reloads alignments track (BAI 404)', async () => { + // @ts-ignore + fetch.mockResponse(async request => { + if (request.url === 'volvox-sorted-altname.bam.bai') { + return { status: 404 } + } + return readBuffer(request) + }) + + const { view, findByTestId, findByText, findAllByTestId, findAllByText } = + createView() + await findByText('Help') + view.setNewView(0.5, 0) + fireEvent.click(await findByTestId(hts('volvox_bam_snpcoverage'), {}, delay)) + await findAllByText(/HTTP 404/, {}, delay) + // @ts-ignore + fetch.mockResponse(readBuffer) + const buttons = await findAllByTestId('reload_button') + fireEvent.click(buttons[0]) + expectCanvasMatch(await findByTestId(pc('{volvox}ctgA:1..400-0'), {}, delay)) +}, 20000) +test('reloads alignments track (BAM 404)', async () => { + // @ts-ignore + fetch.mockResponse(async request => { + if (request.url === 'volvox-sorted-altname.bam') { + return { status: 404 } + } + return readBuffer(request) + }) + + const { view, findByTestId, findByText, findAllByTestId, findAllByText } = + createView() + await findByText('Help') + view.setNewView(0.5, 0) + fireEvent.click(await findByTestId(hts('volvox_bam_pileup'), {}, delay)) + await findAllByText(/HTTP 404/, {}, delay) + + // @ts-ignore + fetch.mockResponse(readBuffer) + const buttons = await findAllByTestId('reload_button') + fireEvent.click(buttons[0]) + expectCanvasMatch(await findByTestId(pc('{volvox}ctgA:1..400-0'), {}, delay)) +}, 20000) + +test('reloads bigwig (BW 404)', async () => { + console.error = jest.fn() + + // @ts-ignore + fetch.mockResponse(async request => { + if (request.url === 'volvox_microarray.bw') { + return { status: 404 } + } + return readBuffer(request) + }) + + const { view, findByTestId, findByText, findAllByTestId, findAllByText } = + createView() + await findByText('Help') + view.setNewView(10, 0) + fireEvent.click(await findByTestId(hts('volvox_microarray'), {}, delay)) + await findAllByText(/HTTP 404/, {}, delay) + // @ts-ignore + fetch.mockResponse(readBuffer) + const buttons = await findAllByTestId('reload_button') + fireEvent.click(buttons[0]) + expectCanvasMatch( + await findByTestId(pc('{volvox}ctgA:1..8,000-0'), {}, delay), + ) +}, 20000) + +test('reloads vcf (VCF.GZ 404)', async () => { + console.error = jest.fn() + + // @ts-ignore + fetch.mockResponse(async request => { + if (request.url === 'volvox.filtered.vcf.gz') { + return { status: 404 } + } + return readBuffer(request) + }) + + const { view, findByTestId, findByText, findAllByTestId, findAllByText } = + createView() + await findByText('Help') + view.setNewView(0.05, 5000) + fireEvent.click(await findByTestId(hts('volvox_filtered_vcf'), {}, delay)) + await findAllByText(/HTTP 404/, {}, delay) + + // @ts-ignore + fetch.mockResponse(readBuffer) + const buttons = await findAllByTestId('reload_button') + fireEvent.click(buttons[0]) + + await findAllByTestId('box-test-vcf-604452', {}, delay) +}, 20000) + +test('reloads vcf (VCF.GZ.TBI 404)', async () => { + console.error = jest.fn() + // @ts-ignore + fetch.mockResponse(async request => { + if (request.url === 'volvox.filtered.vcf.gz.tbi') { + return { status: 404 } + } + return readBuffer(request) + }) + + const { view, findByTestId, findByText, findAllByTestId, findAllByText } = + createView() + await findByText('Help') + view.setNewView(0.05, 5000) + fireEvent.click(await findByTestId(hts('volvox_filtered_vcf'), {}, delay)) + await findAllByText(/HTTP 404/, {}, delay) + // @ts-ignore + fetch.mockResponse(readBuffer) + const buttons = await findAllByTestId('reload_button') + fireEvent.click(buttons[0]) + + await findAllByTestId('box-test-vcf-604452', {}, delay) +}, 20000) diff --git a/products/jbrowse-web/src/tests/StatsEstimation.test.js b/products/jbrowse-web/src/tests/StatsEstimation.test.tsx similarity index 59% rename from products/jbrowse-web/src/tests/StatsEstimation.test.js rename to products/jbrowse-web/src/tests/StatsEstimation.test.tsx index a7bec0b6e2..9e2a7d80a4 100644 --- a/products/jbrowse-web/src/tests/StatsEstimation.test.js +++ b/products/jbrowse-web/src/tests/StatsEstimation.test.tsx @@ -12,61 +12,55 @@ import { expectCanvasMatch, generateReadBuffer, getPluginManager, + hts, + pc, } from './util' +import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' + +type LGV = LinearGenomeViewModel + expect.extend({ toMatchImageSnapshot }) setup() beforeEach(() => { clearCache() clearAdapterCache() + // @ts-ignore fetch.resetMocks() + // @ts-ignore fetch.mockResponse( - generateReadBuffer(url => { - return new LocalFile(require.resolve(`../../test_data/volvox/${url}`)) - }), + generateReadBuffer( + url => new LocalFile(require.resolve(`../../test_data/volvox/${url}`)), + ), ) }) const delay = { timeout: 20000 } test('test stats estimation pileup, zoom in to see', async () => { - const pluginManager = getPluginManager() - const { session } = pluginManager.rootModel - const { findByText, findAllByText, findByTestId } = render( - , - ) + const { view, findByText, findAllByText, findByTestId } = createView() await findByText('Help') - session.views[0].setNewView(30, 183) + view.setNewView(30, 183) - fireEvent.click( - await findByTestId('htsTrackEntry-volvox_cram_pileup', {}, delay), - ) + fireEvent.click(await findByTestId(hts('volvox_cram_pileup'), {}, delay)) await findAllByText(/Requested too much data/, {}, delay) - const before = session.views[0].bpPerPx + const before = view.bpPerPx fireEvent.click(await findByTestId('zoom_in')) // found it helps avoid flaky test to check that it is zoomed in before // checking snapshot (even though it seems like it is unneeded) #2673 - await waitFor(() => expect(session.views[0].bpPerPx).toBe(before / 2), delay) + await waitFor(() => expect(view.bpPerPx).toBe(before / 2), delay) expectCanvasMatch( - await findByTestId( - 'prerendered_canvas_{volvox}ctgA:1..12,000-0_done', - {}, - delay, - ), + await findByTestId(pc('{volvox}ctgA:1..12,000-0'), {}, delay), ) }, 30000) test('test stats estimation pileup, force load to see', async () => { - const pluginManager = getPluginManager() - const { session } = pluginManager.rootModel - const { findByText, findAllByText, findByTestId } = render( - , - ) + const { view, findByText, findAllByText, findByTestId } = createView() await findByText('Help') - session.views[0].setNewView(25.07852564102564, 283) + view.setNewView(25.07852564102564, 283) fireEvent.click( await findByTestId('htsTrackEntry-volvox_cram_pileup', {}, delay), @@ -77,43 +71,32 @@ test('test stats estimation pileup, force load to see', async () => { fireEvent.click(buttons[0]) expectCanvasMatch( - await findByTestId( - 'prerendered_canvas_{volvox}ctgA:1..20,063-0_done', - {}, - delay, - ), + await findByTestId(pc('{volvox}ctgA:1..20,063-0'), {}, delay), ) }, 30000) test('test stats estimation on vcf track, zoom in to see', async () => { - const pluginManager = getPluginManager() - const { session } = pluginManager.rootModel - const { findByText, findAllByText, findAllByTestId, findByTestId } = render( - , - ) + const { view, findByText, findAllByText, findAllByTestId, findByTestId } = + createView() await findByText('Help') - session.views[0].setNewView(34, 5) + view.setNewView(34, 5) fireEvent.click(await findByTestId('htsTrackEntry-variant_colors', {}, delay)) await findAllByText(/Zoom in to see features/, {}, delay) - const before = session.views[0].bpPerPx + const before = view.bpPerPx fireEvent.click(await findByTestId('zoom_in')) // found it helps avoid flaky test to check that it is zoomed in before // checking snapshot (even though it seems like it is unneeded) #2673 - await waitFor(() => expect(session.views[0].bpPerPx).toBe(before / 2), delay) + await waitFor(() => expect(view.bpPerPx).toBe(before / 2), delay) await findAllByTestId('box-test-vcf-605560', {}, delay) }, 30000) test('test stats estimation on vcf track, force load to see', async () => { - const pluginManager = getPluginManager() - const state = pluginManager.rootModel - const { findByText, findAllByText, findByTestId } = render( - , - ) + const { view, findByText, findAllByText, findByTestId } = createView() await findByText('Help') - state.session.views[0].setNewView(34, 5) + view.setNewView(34, 5) await findAllByText('ctgA', {}, delay) fireEvent.click(await findByTestId('htsTrackEntry-variant_colors', {}, delay)) diff --git a/products/jbrowse-web/src/tests/util.tsx b/products/jbrowse-web/src/tests/util.tsx index fd3caab797..aa9a369a60 100644 --- a/products/jbrowse-web/src/tests/util.tsx +++ b/products/jbrowse-web/src/tests/util.tsx @@ -1,4 +1,5 @@ import React from 'react' +import { render } from '@testing-library/react' // eslint-disable-next-line import/no-extraneous-dependencies import { GenericFilehandle } from 'generic-filehandle' @@ -16,6 +17,10 @@ import corePlugins from '../corePlugins' // eslint-disable-next-line import/no-extraneous-dependencies import { Image, createCanvas } from 'canvas' +import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' + +type LGV = LinearGenomeViewModel + jest.mock('../makeWorkerInstance', () => () => {}) // @ts-ignore @@ -135,3 +140,12 @@ export function JBrowse(props: any) { export const hts = (str: string) => 'htsTrackEntry-' + str export const pc = (str: string) => `prerendered_canvas_${str}_done` + +export function createView() { + const pm = getPluginManager() + const state = pm.rootModel + const { session } = state! + const rest = render() + const view = session!.views[0] as LGV + return { view, state, ...rest } +} From 18727975c2407bfebbf67e17585df5936903e478 Mon Sep 17 00:00:00 2001 From: Colin Date: Tue, 28 Jun 2022 21:27:30 -0600 Subject: [PATCH 5/7] More --- .../jbrowse-web/src/tests/BigWig.test.tsx | 47 +--- products/jbrowse-web/src/tests/Reload.test.js | 265 ------------------ .../src/tests/StatsEstimation.test.tsx | 9 +- 3 files changed, 12 insertions(+), 309 deletions(-) delete mode 100644 products/jbrowse-web/src/tests/Reload.test.js diff --git a/products/jbrowse-web/src/tests/BigWig.test.tsx b/products/jbrowse-web/src/tests/BigWig.test.tsx index 6ecf449611..b401440972 100644 --- a/products/jbrowse-web/src/tests/BigWig.test.tsx +++ b/products/jbrowse-web/src/tests/BigWig.test.tsx @@ -1,22 +1,19 @@ import React from 'react' -import { fireEvent, render } from '@testing-library/react' +import { fireEvent } from '@testing-library/react' import { LocalFile } from 'generic-filehandle' import { clearCache } from '@jbrowse/core/util/io/RemoteFileWithRangeCache' import { clearAdapterCache } from '@jbrowse/core/data_adapters/dataAdapterCache' import { toMatchImageSnapshot } from 'jest-image-snapshot' import { - JBrowse, setup, generateReadBuffer, expectCanvasMatch, - getPluginManager, + createView, + pc, + hts, } from './util' -import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' - -type LGV = LinearGenomeViewModel - expect.extend({ toMatchImageSnapshot }) setup() @@ -35,27 +32,13 @@ beforeEach(() => { const delay = { timeout: 10000 } -function createView() { - const pm = getPluginManager() - const { session } = pm.rootModel! - const rest = render() - const view = session!.views[0] as LGV - return { view, ...rest } -} - test('open a bigwig track', async () => { const { view, findByTestId, findByText } = createView() await findByText('Help') view.setNewView(5, 0) - fireEvent.click( - await findByTestId('htsTrackEntry-volvox_microarray', {}, delay), - ) + fireEvent.click(await findByTestId(hts('volvox_microarray'), {}, delay)) expectCanvasMatch( - await findByTestId( - 'prerendered_canvas_{volvox}ctgA:1..4,000-0_done', - {}, - delay, - ), + await findByTestId(pc('{volvox}ctgA:1..4,000-0'), {}, delay), ) }, 15000) test('open a bigwig line track 2', async () => { @@ -63,15 +46,9 @@ test('open a bigwig line track 2', async () => { await findByText('Help') view.setNewView(10, 0) - fireEvent.click( - await findByTestId('htsTrackEntry-volvox_microarray_line', {}, delay), - ) + fireEvent.click(await findByTestId(hts('volvox_microarray_line'), {}, delay)) expectCanvasMatch( - await findByTestId( - 'prerendered_canvas_{volvox}ctgA:1..8,000-0_done', - {}, - delay, - ), + await findByTestId(pc('{volvox}ctgA:1..8,000-0'), {}, delay), ) }, 15000) test('open a bigwig density track', async () => { @@ -80,13 +57,9 @@ test('open a bigwig density track', async () => { await findByText('Help') view.setNewView(5, 0) fireEvent.click( - await findByTestId('htsTrackEntry-volvox_microarray_density', {}, delay), + await findByTestId(hts('volvox_microarray_density'), {}, delay), ) expectCanvasMatch( - await findByTestId( - 'prerendered_canvas_{volvox}ctgA:1..4,000-0_done', - {}, - delay, - ), + await findByTestId(pc('{volvox}ctgA:1..4,000-0'), {}, delay), ) }, 15000) diff --git a/products/jbrowse-web/src/tests/Reload.test.js b/products/jbrowse-web/src/tests/Reload.test.js deleted file mode 100644 index cde3ec3142..0000000000 --- a/products/jbrowse-web/src/tests/Reload.test.js +++ /dev/null @@ -1,265 +0,0 @@ -import React from 'react' -import { fireEvent, render } from '@testing-library/react' -import { toMatchImageSnapshot } from 'jest-image-snapshot' -import { LocalFile } from 'generic-filehandle' -import { clearCache } from '@jbrowse/core/util/io/RemoteFileWithRangeCache' -import { clearAdapterCache } from '@jbrowse/core/data_adapters/dataAdapterCache' -import { - JBrowse, - setup, - getPluginManager, - expectCanvasMatch, - generateReadBuffer, - hts, - pc -} from './util' - -import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' - -type LGV = LinearGenomeViewModel - - - -expect.extend({ toMatchImageSnapshot }) - -const readBuffer = generateReadBuffer( - url => new LocalFile(require.resolve(`../../test_data/volvox/${url}`)), -) - -setup() - -beforeEach(() => { - clearCache() - clearAdapterCache() - fetch.resetMocks() - fetch.mockResponse(readBuffer) -}) - - -function createView() { - const pm = getPluginManager() - const { session } = pm.rootModel! - const rest = render() - const view = session!.views[0] as LGV - return { view, ...rest } -} - -const delay = { timeout: 10000 } - -// this tests reloading after an initial track error -// it performs a full image snapshot test to ensure that the features are rendered and not -// just that an empty canvas is rendered (empty canvas can result if ref name renaming failed) -test('reloads alignments track (CRAI 404)', async () => { - console.error = jest.fn() - - const pluginManager = getPluginManager() - const state = pluginManager.rootModel - fetch.mockResponse(async request => { - if (request.url === 'volvox-sorted-altname.cram.crai') { - return { status: 404 } - } - return readBuffer(request) - }) - - const { findByTestId, findByText, findAllByTestId, findAllByText } = render( - , - ) - await findByText('Help') - state.session.views[0].setNewView(0.5, 0) - fireEvent.click( - await findByTestId('htsTrackEntry-volvox_cram_pileup', {}, delay), - ) - await findAllByText(/HTTP 404/, {}, delay) - fetch.mockResponse(readBuffer) - const buttons = await findAllByTestId('reload_button') - fireEvent.click(buttons[0]) - expectCanvasMatch( - await findByTestId( - 'prerendered_canvas_{volvox}ctgA:1..400-0_done', - {}, - delay, - ), - ) -}, 20000) - -test('reloads alignments track (CRAM 404)', async () => { - console.error = jest.fn() - - const pluginManager = getPluginManager() - const state = pluginManager.rootModel - fetch.mockResponse(async request => { - if (request.url === 'volvox-sorted-altname.cram') { - return { status: 404 } - } - return generateReadBuffer( - url => new LocalFile(require.resolve(`../../test_data/volvox/${url}`)), - )(request) - }) - - const { findByTestId, findByText, findAllByTestId, findAllByText } = render( - , - ) - await findByText('Help') - state.session.views[0].setNewView(0.5, 0) - fireEvent.click( - await findByTestId('htsTrackEntry-volvox_cram_snpcoverage', {}, delay), - ) - await findAllByText(/HTTP 404/, {}, delay) - fetch.mockResponse(readBuffer) - const buttons = await findAllByTestId('reload_button') - fireEvent.click(buttons[0]) - expectCanvasMatch( - await findByTestId( - 'prerendered_canvas_{volvox}ctgA:1..400-0_done', - {}, - delay, - ), - ) -}, 20000) -test('reloads alignments track (BAI 404)', async () => { - const pluginManager = getPluginManager() - const state = pluginManager.rootModel - fetch.mockResponse(async request => { - if (request.url === 'volvox-sorted-altname.bam.bai') { - return { status: 404 } - } - return readBuffer(request) - }) - - const { findByTestId, findByText, findAllByTestId, findAllByText } = render( - , - ) - await findByText('Help') - state.session.views[0].setNewView(0.5, 0) - fireEvent.click( - await findByTestId('htsTrackEntry-volvox_bam_snpcoverage', {}, delay), - ) - await findAllByText(/HTTP 404/, {}, delay) - fetch.mockResponse(readBuffer) - const buttons = await findAllByTestId('reload_button') - fireEvent.click(buttons[0]) - expectCanvasMatch( - await findByTestId( - 'prerendered_canvas_{volvox}ctgA:1..400-0_done', - {}, - delay, - ), - ) -}, 20000) -test('reloads alignments track (BAM 404)', async () => { - const pluginManager = getPluginManager() - const state = pluginManager.rootModel - fetch.mockResponse(async request => { - if (request.url === 'volvox-sorted-altname.bam') { - return { status: 404 } - } - return readBuffer(request) - }) - - const { findByTestId, findByText, findAllByTestId, findAllByText } = render( - , - ) - await findByText('Help') - state.session.views[0].setNewView(0.5, 0) - fireEvent.click( - await findByTestId('htsTrackEntry-volvox_bam_pileup', {}, delay), - ) - await findAllByText(/HTTP 404/, {}, delay) - fetch.mockResponse(readBuffer) - const buttons = await findAllByTestId('reload_button') - fireEvent.click(buttons[0]) - expectCanvasMatch( - await findByTestId( - 'prerendered_canvas_{volvox}ctgA:1..400-0_done', - {}, - delay, - ), - ) -}, 20000) - -test('reloads bigwig (BW 404)', async () => { - console.error = jest.fn() - - const pluginManager = getPluginManager() - const state = pluginManager.rootModel - fetch.mockResponse(async request => { - if (request.url === 'volvox_microarray.bw') { - return { status: 404 } - } - return readBuffer(request) - }) - - const { findByTestId, findByText, findAllByTestId, findAllByText } = render( - , - ) - await findByText('Help') - state.session.views[0].setNewView(10, 0) - fireEvent.click( - await findByTestId('htsTrackEntry-volvox_microarray', {}, delay), - ) - await findAllByText(/HTTP 404/, {}, delay) - fetch.mockResponse(readBuffer) - const buttons = await findAllByTestId('reload_button') - fireEvent.click(buttons[0]) - expectCanvasMatch( - await findByTestId( - 'prerendered_canvas_{volvox}ctgA:1..8,000-0_done', - {}, - delay, - ), - ) -}, 20000) - -test('reloads vcf (VCF.GZ 404)', async () => { - console.error = jest.fn() - const pluginManager = getPluginManager() - const state = pluginManager.rootModel - fetch.mockResponse(async request => { - if (request.url === 'volvox.filtered.vcf.gz') { - return { status: 404 } - } - return readBuffer(request) - }) - - const { findByTestId, findByText, findAllByTestId, findAllByText } = render( - , - ) - await findByText('Help') - state.session.views[0].setNewView(0.05, 5000) - fireEvent.click( - await findByTestId('htsTrackEntry-volvox_filtered_vcf', {}, delay), - ) - await findAllByText(/HTTP 404/, {}, delay) - fetch.mockResponse(readBuffer) - const buttons = await findAllByTestId('reload_button') - fireEvent.click(buttons[0]) - - await findAllByTestId('box-test-vcf-604452', {}, delay) -}, 20000) - -test('reloads vcf (VCF.GZ.TBI 404)', async () => { - console.error = jest.fn() - const pluginManager = getPluginManager() - const state = pluginManager.rootModel - fetch.mockResponse(async request => { - if (request.url === 'volvox.filtered.vcf.gz.tbi') { - return { status: 404 } - } - return readBuffer(request) - }) - - const { findByTestId, findByText, findAllByTestId, findAllByText } = render( - , - ) - await findByText('Help') - state.session.views[0].setNewView(0.05, 5000) - fireEvent.click( - await findByTestId('htsTrackEntry-volvox_filtered_vcf', {}, delay), - ) - await findAllByText(/HTTP 404/, {}, delay) - fetch.mockResponse(readBuffer) - const buttons = await findAllByTestId('reload_button') - fireEvent.click(buttons[0]) - - await findAllByTestId('box-test-vcf-604452', {}, delay) -}, 20000) diff --git a/products/jbrowse-web/src/tests/StatsEstimation.test.tsx b/products/jbrowse-web/src/tests/StatsEstimation.test.tsx index 9e2a7d80a4..539a092757 100644 --- a/products/jbrowse-web/src/tests/StatsEstimation.test.tsx +++ b/products/jbrowse-web/src/tests/StatsEstimation.test.tsx @@ -1,5 +1,5 @@ import React from 'react' -import { fireEvent, render, waitFor } from '@testing-library/react' +import { fireEvent, waitFor } from '@testing-library/react' import { LocalFile } from 'generic-filehandle' // locals @@ -7,19 +7,14 @@ import { clearCache } from '@jbrowse/core/util/io/RemoteFileWithRangeCache' import { clearAdapterCache } from '@jbrowse/core/data_adapters/dataAdapterCache' import { toMatchImageSnapshot } from 'jest-image-snapshot' import { - JBrowse, setup, expectCanvasMatch, generateReadBuffer, - getPluginManager, + createView, hts, pc, } from './util' -import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' - -type LGV = LinearGenomeViewModel - expect.extend({ toMatchImageSnapshot }) setup() From e8da876b323067bf972bd63e114f2416a858503e Mon Sep 17 00:00:00 2001 From: Colin Date: Tue, 28 Jun 2022 21:31:24 -0600 Subject: [PATCH 6/7] Couple more --- .../LinearGenomeView.test.js.snap | 4 +- .../JBrowseLinearGenomeView.test.tsx.snap | 2 +- .../jbrowse-web/src/tests/Dotplot.test.tsx | 13 ++--- products/jbrowse-web/src/tests/Hic.test.js | 49 ------------------ products/jbrowse-web/src/tests/Hic.test.tsx | 43 +++++++++++++++ .../tests/TextSearchingImportForm.test.tsx | 13 ++--- ...eatures-test-js-color-by-strand-1-snap.png | Bin 557 -> 0 bytes ...s-features-test-js-color-by-tag-1-snap.png | Bin 22372 -> 0 bytes ...-menu-and-enables-soft-clipping-1-snap.png | Bin 31958 -> 0 bytes ...s-selects-a-sort-sort-by-strand-1-snap.png | Bin 552 -> 0 bytes ...st-js-opens-an-alignments-track-1-snap.png | Bin 73494 -> 0 bytes ...st-js-opens-an-alignments-track-2-snap.png | Bin 11781 -> 0 bytes ...verage-doesnt-count-snpcoverage-1-snap.png | Bin 1753 -> 0 bytes ...verage-doesnt-count-snpcoverage-2-snap.png | Bin 1289 -> 0 bytes ...-js-open-a-bigwig-density-track-1-snap.png | Bin 2036 -> 0 bytes ...t-js-open-a-bigwig-line-track-2-1-snap.png | Bin 3617 -> 0 bytes ...wig-test-js-open-a-bigwig-track-1-snap.png | Bin 2448 -> 0 bytes ...lot-test-js-open-a-dotplot-view-1-snap.png | Bin 29922 -> 0 bytes ...lot-test-js-open-a-dotplot-view-2-snap.png | Bin 29922 -> 0 bytes ...a-dotplot-view-with-import-form-1-snap.png | Bin 29329 -> 0 bytes ...1-snap.png => hic-test-tsx-hic-1-snap.png} | Bin ...loads-alignments-track-bai-404-1-snap.png} | Bin ...loads-alignments-track-bam-404-1-snap.png} | Bin ...oads-alignments-track-crai-404-1-snap.png} | Bin ...oads-alignments-track-cram-404-1-snap.png} | Bin ...test-tsx-reloads-bigwig-bw-404-1-snap.png} | Bin ...ation-pileup-force-load-to-see-1-snap.png} | Bin ...timation-pileup-zoom-in-to-see-1-snap.png} | Bin products/jbrowse-web/src/tests/util.tsx | 5 +- 29 files changed, 57 insertions(+), 72 deletions(-) delete mode 100644 products/jbrowse-web/src/tests/Hic.test.js create mode 100644 products/jbrowse-web/src/tests/Hic.test.tsx delete mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/alignments-features-test-js-color-by-strand-1-snap.png delete mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/alignments-features-test-js-color-by-tag-1-snap.png delete mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/alignments-features-test-js-opens-the-track-menu-and-enables-soft-clipping-1-snap.png delete mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/alignments-features-test-js-selects-a-sort-sort-by-strand-1-snap.png delete mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/alignments-test-js-opens-an-alignments-track-1-snap.png delete mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/alignments-test-js-opens-an-alignments-track-2-snap.png delete mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/alignments-test-js-test-snpcoverage-doesnt-count-snpcoverage-1-snap.png delete mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/alignments-test-js-test-snpcoverage-doesnt-count-snpcoverage-2-snap.png delete mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/big-wig-test-js-open-a-bigwig-density-track-1-snap.png delete mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/big-wig-test-js-open-a-bigwig-line-track-2-1-snap.png delete mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/big-wig-test-js-open-a-bigwig-track-1-snap.png delete mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/dotplot-test-js-open-a-dotplot-view-1-snap.png delete mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/dotplot-test-js-open-a-dotplot-view-2-snap.png delete mode 100644 products/jbrowse-web/src/tests/__image_snapshots__/dotplot-test-js-open-a-dotplot-view-with-import-form-1-snap.png rename products/jbrowse-web/src/tests/__image_snapshots__/{hic-test-js-hic-1-snap.png => hic-test-tsx-hic-1-snap.png} (100%) rename products/jbrowse-web/src/tests/__image_snapshots__/{reload-test-js-reloads-alignments-track-bai-404-1-snap.png => reload-test-tsx-reloads-alignments-track-bai-404-1-snap.png} (100%) rename products/jbrowse-web/src/tests/__image_snapshots__/{reload-test-js-reloads-alignments-track-bam-404-1-snap.png => reload-test-tsx-reloads-alignments-track-bam-404-1-snap.png} (100%) rename products/jbrowse-web/src/tests/__image_snapshots__/{reload-test-js-reloads-alignments-track-crai-404-1-snap.png => reload-test-tsx-reloads-alignments-track-crai-404-1-snap.png} (100%) rename products/jbrowse-web/src/tests/__image_snapshots__/{reload-test-js-reloads-alignments-track-cram-404-1-snap.png => reload-test-tsx-reloads-alignments-track-cram-404-1-snap.png} (100%) rename products/jbrowse-web/src/tests/__image_snapshots__/{reload-test-js-reloads-bigwig-bw-404-1-snap.png => reload-test-tsx-reloads-bigwig-bw-404-1-snap.png} (100%) rename products/jbrowse-web/src/tests/__image_snapshots__/{stats-estimation-test-js-test-stats-estimation-pileup-force-load-to-see-1-snap.png => stats-estimation-test-tsx-test-stats-estimation-pileup-force-load-to-see-1-snap.png} (100%) rename products/jbrowse-web/src/tests/__image_snapshots__/{stats-estimation-test-js-test-stats-estimation-pileup-zoom-in-to-see-1-snap.png => stats-estimation-test-tsx-test-stats-estimation-pileup-zoom-in-to-see-1-snap.png} (100%) diff --git a/plugins/linear-genome-view/src/LinearGenomeView/components/__snapshots__/LinearGenomeView.test.js.snap b/plugins/linear-genome-view/src/LinearGenomeView/components/__snapshots__/LinearGenomeView.test.js.snap index 401b76c0f3..69240c7fce 100644 --- a/plugins/linear-genome-view/src/LinearGenomeView/components/__snapshots__/LinearGenomeView.test.js.snap +++ b/plugins/linear-genome-view/src/LinearGenomeView/components/__snapshots__/LinearGenomeView.test.js.snap @@ -328,7 +328,7 @@ exports[` renders one track, one region 1`] = `