Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,22 @@ SucceededDownloading.args = {
downloadStatus: VariantAnalysisScannedRepositoryDownloadStatus.InProgress,
};

export const SucceededSuccessfulDownload = Template.bind({});
SucceededSuccessfulDownload.args = {
...Pending.args,
status: VariantAnalysisRepoStatus.Succeeded,
resultCount: 198,
downloadStatus: VariantAnalysisScannedRepositoryDownloadStatus.Succeeded,
};

export const SucceededFailedDownload = Template.bind({});
SucceededFailedDownload.args = {
...Pending.args,
status: VariantAnalysisRepoStatus.Succeeded,
resultCount: 198,
downloadStatus: VariantAnalysisScannedRepositoryDownloadStatus.Failed,
};

export const InterpretedResults = Template.bind({});
InterpretedResults.args = {
...Pending.args,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@ import styled from 'styled-components';
import { AnalysisAlert, AnalysisRawResults } from '../../remote-queries/shared/analysis-result';
import AnalysisAlertResult from '../remote-queries/AnalysisAlertResult';
import RawResultsTable from '../remote-queries/RawResultsTable';
import { VariantAnalysisRepoStatus } from '../../remote-queries/shared/variant-analysis';
import {
VariantAnalysisRepoStatus,
VariantAnalysisScannedRepositoryDownloadStatus,
} from '../../remote-queries/shared/variant-analysis';
import { Alert } from '../common';

const ContentContainer = styled.div`
Expand Down Expand Up @@ -32,14 +35,16 @@ const RawResultsContainer = styled.div`
`;

export type AnalyzedRepoItemContentProps = {
status: VariantAnalysisRepoStatus;
status?: VariantAnalysisRepoStatus;
downloadStatus?: VariantAnalysisScannedRepositoryDownloadStatus;

interpretedResults?: AnalysisAlert[];
rawResults?: AnalysisRawResults;
}

export const AnalyzedRepoItemContent = ({
status,
downloadStatus,
interpretedResults,
rawResults,
}: AnalyzedRepoItemContentProps) => {
Expand All @@ -66,6 +71,13 @@ export const AnalyzedRepoItemContent = ({
message="The variant analysis or this repository was canceled."
/>
</AlertContainer>}
{downloadStatus === VariantAnalysisScannedRepositoryDownloadStatus.Failed && <AlertContainer>
<Alert
type="error"
title="Download failed"
message="The query was successful on this repository, but the extension failed to download the results for this repository."
/>
</AlertContainer>}
{interpretedResults && (
<InterpretedResultsContainer>
{interpretedResults.map((r, i) =>
Expand Down
63 changes: 57 additions & 6 deletions extensions/ql-vscode/src/view/variant-analysis/RepoRow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,50 @@ export type RepoRowProps = {
rawResults?: AnalysisRawResults;
}

const canExpand = (
status: VariantAnalysisRepoStatus | undefined,
downloadStatus: VariantAnalysisScannedRepositoryDownloadStatus | undefined,
): boolean => {
if (!status) {
return false;
}

if (!isCompletedAnalysisRepoStatus(status)) {
return false;
}

if (status !== VariantAnalysisRepoStatus.Succeeded) {
return true;
}

return downloadStatus === VariantAnalysisScannedRepositoryDownloadStatus.Succeeded || downloadStatus === VariantAnalysisScannedRepositoryDownloadStatus.Failed;
};

const isExpandableContentLoaded = (
status: VariantAnalysisRepoStatus | undefined,
downloadStatus: VariantAnalysisScannedRepositoryDownloadStatus | undefined,
resultsLoaded: boolean,
): boolean => {
if (!canExpand(status, downloadStatus)) {
return false;
}

if (!status) {
return false;
}

if (status !== VariantAnalysisRepoStatus.Succeeded) {
return true;
}

if (downloadStatus === VariantAnalysisScannedRepositoryDownloadStatus.Failed) {
// If the download has failed, we allow expansion to show the error
return true;
}

return resultsLoaded;
};

export const RepoRow = ({
repository,
status,
Expand All @@ -99,7 +143,7 @@ export const RepoRow = ({
return;
}

if (resultsLoaded || status !== VariantAnalysisRepoStatus.Succeeded) {
if (resultsLoaded || status !== VariantAnalysisRepoStatus.Succeeded || downloadStatus !== VariantAnalysisScannedRepositoryDownloadStatus.Succeeded) {
setExpanded(oldIsExpanded => !oldIsExpanded);
return;
}
Expand All @@ -110,7 +154,7 @@ export const RepoRow = ({
});

setResultsLoading(true);
}, [resultsLoading, resultsLoaded, repository.fullName, status]);
}, [resultsLoading, resultsLoaded, repository.fullName, status, downloadStatus]);

useEffect(() => {
if (resultsLoaded && resultsLoading) {
Expand All @@ -119,8 +163,8 @@ export const RepoRow = ({
}
}, [resultsLoaded, resultsLoading]);

const disabled = !status || !isCompletedAnalysisRepoStatus(status) || (status === VariantAnalysisRepoStatus.Succeeded && downloadStatus !== VariantAnalysisScannedRepositoryDownloadStatus.Succeeded);
const expandableContentLoaded = status && (status !== VariantAnalysisRepoStatus.Succeeded || resultsLoaded);
const disabled = !canExpand(status, downloadStatus);
const expandableContentLoaded = isExpandableContentLoaded(status, downloadStatus, resultsLoaded);

return (
<div>
Expand All @@ -139,13 +183,20 @@ export const RepoRow = ({
{!status && <WarningIcon />}
</span>
{downloadStatus === VariantAnalysisScannedRepositoryDownloadStatus.InProgress && <LoadingIcon label="Downloading" />}
{downloadStatus === VariantAnalysisScannedRepositoryDownloadStatus.Failed && <WarningIcon label="Failed to download the results" />}
<MetadataContainer>
<div><StarCount starCount={repository.stargazersCount} /></div>
<LastUpdated lastUpdated={repository.updatedAt} />
</MetadataContainer>
</TitleContainer>
{isExpanded && expandableContentLoaded &&
<AnalyzedRepoItemContent status={status} interpretedResults={interpretedResults} rawResults={rawResults} />}
{isExpanded && expandableContentLoaded && (
<AnalyzedRepoItemContent
status={status}
downloadStatus={downloadStatus}
interpretedResults={interpretedResults}
rawResults={rawResults}
/>
)}
</div>
);
};
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import * as React from 'react';
import { render as reactRender, screen } from '@testing-library/react';
import { VariantAnalysisRepoStatus } from '../../../remote-queries/shared/variant-analysis';
import {
VariantAnalysisRepoStatus,
VariantAnalysisScannedRepositoryDownloadStatus
} from '../../../remote-queries/shared/variant-analysis';
import { AnalyzedRepoItemContent, AnalyzedRepoItemContentProps } from '../AnalyzedRepoItemContent';

describe(AnalyzedRepoItemContent.name, () => {
Expand Down Expand Up @@ -112,4 +115,13 @@ describe(AnalyzedRepoItemContent.name, () => {

expect(screen.getByText('Error: Canceled')).toBeInTheDocument();
});

it('renders the failed download state', () => {
render({
status: VariantAnalysisRepoStatus.Succeeded,
downloadStatus: VariantAnalysisScannedRepositoryDownloadStatus.Failed,
});

expect(screen.getByText('Error: Download failed')).toBeInTheDocument();
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,21 @@ describe(RepoRow.name, () => {
})).toBeEnabled();
});

it('renders the succeeded state with failed download status', () => {
render({
status: VariantAnalysisRepoStatus.Succeeded,
resultCount: 178,
downloadStatus: VariantAnalysisScannedRepositoryDownloadStatus.Failed,
});

expect(screen.getByRole<HTMLButtonElement>('button', {
expanded: false
})).toBeEnabled();
expect(screen.getByRole('img', {
name: 'Failed to download the results',
})).toBeInTheDocument();
});

it('renders the failed state', () => {
render({
status: VariantAnalysisRepoStatus.Failed,
Expand Down