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