Merge pull request #1815 from github/robertbrignull/view_paths

Add theme provider when rendering code flows
This commit is contained in:
Robert
2022-11-30 17:26:52 +00:00
committed by GitHub
4 changed files with 91 additions and 17 deletions

View File

@@ -3,7 +3,7 @@ import { useRef, useState } from "react";
import styled from "styled-components";
import { VSCodeLink } from "@vscode/webview-ui-toolkit/react";
import { Overlay } from "@primer/react";
import { Overlay, ThemeProvider } from "@primer/react";
import {
AnalysisMessage,
@@ -16,7 +16,7 @@ const ShowPathsLink = styled(VSCodeLink)`
cursor: pointer;
`;
type Props = {
export type CodePathsProps = {
codeFlows: CodeFlow[];
ruleDescription: string;
message: AnalysisMessage;
@@ -28,7 +28,7 @@ export const CodePaths = ({
ruleDescription,
message,
severity,
}: Props) => {
}: CodePathsProps) => {
const [isOpen, setIsOpen] = useState(false);
const linkRef = useRef<HTMLAnchorElement>(null);
@@ -41,20 +41,22 @@ export const CodePaths = ({
Show paths
</ShowPathsLink>
{isOpen && (
<Overlay
returnFocusRef={linkRef}
onEscape={closeOverlay}
onClickOutside={closeOverlay}
anchorSide="outside-top"
>
<CodePathsOverlay
codeFlows={codeFlows}
ruleDescription={ruleDescription}
message={message}
severity={severity}
onClose={closeOverlay}
/>
</Overlay>
<ThemeProvider colorMode="auto">
<Overlay
returnFocusRef={linkRef}
onEscape={closeOverlay}
onClickOutside={closeOverlay}
anchorSide="outside-top"
>
<CodePathsOverlay
codeFlows={codeFlows}
ruleDescription={ruleDescription}
message={message}
severity={severity}
onClose={closeOverlay}
/>
</Overlay>
</ThemeProvider>
)}
</>
);

View File

@@ -0,0 +1,37 @@
import * as React from "react";
import { render as reactRender, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { CodePaths, CodePathsProps } from "../CodePaths";
import { createMockCodeFlows } from "../../../../vscode-tests/factories/remote-queries/shared/CodeFlow";
import { createMockAnalysisMessage } from "../../../../vscode-tests/factories/remote-queries/shared/AnalysisMessage";
describe(CodePaths.name, () => {
const render = (props?: CodePathsProps) =>
reactRender(
<CodePaths
codeFlows={createMockCodeFlows()}
ruleDescription="Rule description"
message={createMockAnalysisMessage()}
severity="Recommendation"
{...props}
/>,
);
it("renders correctly when unexpanded", () => {
render();
expect(screen.getByText("Show paths")).toBeInTheDocument();
expect(screen.queryByText("Code snippet text")).not.toBeInTheDocument();
expect(screen.queryByText("Rule description")).not.toBeInTheDocument();
});
it("renders correctly when expanded", async () => {
render();
await userEvent.click(screen.getByText("Show paths"));
expect(screen.getByText("Code snippet text")).toBeInTheDocument();
expect(screen.getByText("Rule description")).toBeInTheDocument();
});
});

View File

@@ -0,0 +1,12 @@
import { AnalysisMessage } from "../../../../remote-queries/shared/analysis-result";
export function createMockAnalysisMessage(): AnalysisMessage {
return {
tokens: [
{
t: "text",
text: "Token text",
},
],
};
}

View File

@@ -0,0 +1,23 @@
import { CodeFlow } from "../../../../remote-queries/shared/analysis-result";
import { createMockAnalysisMessage } from "./AnalysisMessage";
export function createMockCodeFlows(): CodeFlow[] {
return [
{
threadFlows: [
{
fileLink: {
fileLinkPrefix: "/prefix",
filePath: "filePath",
},
codeSnippet: {
startLine: 123,
endLine: 456,
text: "Code snippet text",
},
message: createMockAnalysisMessage(),
},
],
},
];
}