-
Notifications
You must be signed in to change notification settings - Fork 7
feat: add test for the section challenge #1245
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
Samantha-KY
wants to merge
15
commits into
dev
Choose a base branch
from
test/section-challenge-testing
base: dev
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from 14 commits
Commits
Show all changes
15 commits
Select commit
Hold shift + click to select a range
5cd79af
feat: add test for the section challenge
Samantha-KY 60e2c68
fix: dev merge conflicts
Samantha-KY 4497816
feat: add test for the rubric rating component
Samantha-KY af05de7
feat: add team challenge test
Samantha-KY 74f4e3d
feat: implement coderabbit review
Samantha-KY 2738796
feat: format files
Samantha-KY f244726
feat: implement coderabbit review
Samantha-KY da463de
feat: mock the state object
Samantha-KY 04991ec
feat: add missing test and refactor style changes
Samantha-KY 089b0f2
feat: merge with dev
Samantha-KY d67f9c6
fix: submission test error
Samantha-KY e9f58b3
refactor: remove unused mock
Samantha-KY 2f35e1b
feat: implement reviews
Samantha-KY f923607
fix: merge conflicts
Samantha-KY 4246476
feat: set the testId with a default string
Samantha-KY File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
import ChallengeHeader from "@/components/sections/challenges/Header"; | ||
import "@testing-library/jest-dom"; | ||
import { screen } from "@testing-library/react"; | ||
import { renderWithRedux } from "@__mocks__/renderWithRedux"; | ||
import { challenge, submission } from "@__mocks__/fixtures/challenge"; | ||
|
||
describe("ChallengeHeader", () => { | ||
it("should render the ChallengeHeader", () => { | ||
renderWithRedux(<ChallengeHeader testId="challengeHeaderId" />); | ||
const challengeheader = screen.getByTestId("challengeHeaderId"); | ||
expect(challengeheader).toBeInTheDocument(); | ||
}); | ||
|
||
it("should render the challenge header with section", () => { | ||
renderWithRedux(<ChallengeHeader />, { challenges: { current: challenge, list: [challenge], loading: false, submission: submission } }); | ||
expect(screen.getByText("communities.challenge.title")).toBeInTheDocument(); | ||
expect(screen.getByText(challenge.name)).toBeInTheDocument(); | ||
expect(screen.getByText(challenge.description)).toBeInTheDocument(); | ||
}); | ||
}); |
43 changes: 43 additions & 0 deletions
43
__tests__/components/sections/challenges/Learning.test.tsx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
import Learning from "@/components/sections/challenges/Learning"; | ||
import "@testing-library/jest-dom"; | ||
import { screen } from "@testing-library/react"; | ||
import { renderWithRedux } from "@__mocks__/renderWithRedux"; | ||
import { challenge, submission } from "@__mocks__/fixtures/challenge"; | ||
import { mockCourse, mockLearningModule } from "@__mocks__/fixtures/course"; | ||
import { mockCommunity } from "@__mocks__/fixtures/community"; | ||
|
||
describe("Learning", () => { | ||
it("should render Learning", () => { | ||
renderWithRedux(<Learning testId="learningId" courses={[]} learningModules={[]} community={mockCommunity} />); | ||
const learning = screen.getByTestId("learningId"); | ||
expect(learning).toBeInTheDocument(); | ||
expect(screen.getByText("communities.overview.challenge.learning.title")).toBeInTheDocument(); | ||
}); | ||
|
||
it("should render with course cards when they the challenge has them", () => { | ||
const coursesArray = [mockCourse]; | ||
renderWithRedux(<Learning courses={[mockCourse]} learningModules={[mockLearningModule]} community={mockCommunity} />, { | ||
challenges: { current: challenge, list: [challenge], loading: false, submission: submission }, | ||
}); | ||
coursesArray.forEach((course) => { | ||
const courseNameElement = screen.getByText(course.name); | ||
const courseDescriptionElement = screen.getByText(course.description); | ||
expect(courseNameElement).toBeInTheDocument(); | ||
expect(courseDescriptionElement).toBeInTheDocument(); | ||
expect(courseDescriptionElement).toHaveTextContent(course.description); | ||
}); | ||
}); | ||
|
||
it("should render with learning module card", () => { | ||
const learningArray = [mockLearningModule]; | ||
renderWithRedux(<Learning courses={[mockCourse]} learningModules={[mockLearningModule]} community={mockCommunity} />); | ||
learningArray.forEach((learningModule) => { | ||
const learningTitleElement = screen.getByText(learningModule.title); | ||
const learningDescriptionElement = screen.getByText(learningModule.description); | ||
expect(learningTitleElement).toBeInTheDocument(); | ||
expect(learningTitleElement).toHaveTextContent(learningModule.title); | ||
expect(learningDescriptionElement).toBeInTheDocument(); | ||
expect(learningDescriptionElement).toHaveTextContent(learningModule.description); | ||
}); | ||
}); | ||
}); |
49 changes: 49 additions & 0 deletions
49
__tests__/components/sections/challenges/Objectives.test.tsx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
import Objectives from "@/components/sections/challenges/Objectives"; | ||
import "@testing-library/jest-dom"; | ||
import { screen } from "@testing-library/react"; | ||
import { renderWithRedux } from "@__mocks__/renderWithRedux"; | ||
import DateManager from "@/utilities/DateManager"; | ||
import { challenge, submission } from "@__mocks__/fixtures/challenge"; | ||
|
||
describe("Objectives", () => { | ||
const challenges = challenge; | ||
const submissions = submission; | ||
const mockObjectivesStates = { challenges: { current: challenges, list: [challenges], loading: false, submission: submissions } }; | ||
it("should render objectives", () => { | ||
renderWithRedux(<Objectives testId="objectiveId" />); | ||
expect(screen.getByTestId("objectiveId")).toBeInTheDocument(); | ||
expect(screen.getByText("communities.overview.challenge.objective.title")).toBeInTheDocument(); | ||
}); | ||
|
||
it("should render the objective list", () => { | ||
renderWithRedux(<Objectives />, mockObjectivesStates); | ||
const objectiveValue = challenge.objectives.find((objective) => objective); | ||
expect(screen.getByText(objectiveValue || "objectives 1")).toBeInTheDocument(); | ||
}); | ||
|
||
it("should display challenge expiry date, when applicable", () => { | ||
renderWithRedux(<Objectives />, mockObjectivesStates); | ||
const expirationDate = challenge.expiresAt && DateManager.format(challenge.expiresAt, "MMMM d, yyyy", "en"); | ||
if (expirationDate) { | ||
const expirationDateElement = screen.getByText(expirationDate); | ||
expect(expirationDateElement).toBeInTheDocument(); | ||
expect(expirationDateElement).toHaveTextContent(expirationDate); | ||
} | ||
}); | ||
|
||
it("should display challenge hint", () => { | ||
renderWithRedux(<Objectives />, { challenges: { current: challenges, list: [challenges], loading: false, submission: submissions } }); | ||
const containsLink = new RegExp(/<a.*?>.*?<\/a>/g); | ||
expect(containsLink.test('<a href="http://example.com">Example</a>')).toBe(true); | ||
expect(containsLink.test("This is a test string without a link.")).toBe(false); | ||
expect(containsLink.test('<a href="http://example.com">Example')).toBe(false); | ||
expect(containsLink.test('<a href="http://example.com"><a>Nested</a></a>')).toBe(true); | ||
|
||
expect(containsLink.test("<div>Not a link</div>")).toBe(false); | ||
if (containsLink.test(challenge.hint as string)) { | ||
expect(screen.getByText(challenge.hint as string)).toBeInTheDocument(); | ||
} else { | ||
expect(screen.getByText(challenge.hint)).toBeInTheDocument(); | ||
} | ||
}); | ||
}); |
serapieTuyishime marked this conversation as resolved.
Show resolved
Hide resolved
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
import "@testing-library/jest-dom"; | ||
import { screen } from "@testing-library/react"; | ||
import { renderWithRedux } from "@__mocks__/renderWithRedux"; | ||
import RubricRating from "@/components/sections/challenges/Rating"; | ||
import type { RubricRatingProps } from "@/components/sections/challenges/Rating"; | ||
import { mockCommunity } from "@__mocks__/fixtures/community"; | ||
import { mockCourse } from "@__mocks__/fixtures/course"; | ||
type MockRubricRating = Pick<RubricRatingProps, "rubricRating">; | ||
|
||
const fixtureRubricRating: MockRubricRating = { | ||
rubricRating: { | ||
relevance: 2, | ||
originality: 2, | ||
quality: 8, | ||
total: 12, | ||
available: 2, | ||
reward: 6, | ||
rewardCoin: "ICP", | ||
}, | ||
}; | ||
describe("RubricRating", () => { | ||
const rubricRatings = fixtureRubricRating.rubricRating; | ||
it("should render ratings with title", () => { | ||
renderWithRedux(<RubricRating testId="rubricRatingId" hideTitle={false} />); | ||
expect(screen.getByTestId("rubricRatingId")).toBeInTheDocument(); | ||
expect(screen.getByTestId("coin")).toBeInTheDocument(); | ||
expect(screen.getByText("communities.challenge.criteria.title")).toBeInTheDocument(); | ||
}); | ||
|
||
it("should render ratings with rating criterias", () => { | ||
renderWithRedux(<RubricRating rubricRating={rubricRatings} />, { | ||
community: { current: mockCommunity, list: [mockCommunity], courses: [mockCourse], status: "succeeded", error: "error message" }, | ||
}); | ||
|
||
mockCommunity.challenge?.ratingCriteria.forEach((criteria) => { | ||
expect(screen.getByText(criteria.name)).toBeInTheDocument(); | ||
expect(screen.getByText(criteria.name).textContent).toBe("rating criteria"); | ||
criteria.rubric.forEach((rubric) => { | ||
if (rubricRatings) { | ||
if (rubricRatings[criteria.name] === rubric.points) { | ||
expect(screen.getByText(rubric.points)).toBeInTheDocument(); | ||
expect(screen.getByText(rubric.text)).toBeInTheDocument(); | ||
} | ||
} | ||
}); | ||
}); | ||
}); | ||
}); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
import "@testing-library/jest-dom"; | ||
import { screen } from "@testing-library/react"; | ||
import { OverviewRewards } from "@/components/sections/challenges/Rewards"; | ||
import { renderWithRedux } from "@__mocks__/renderWithRedux"; | ||
import { challenge, submission } from "@__mocks__/fixtures/challenge"; | ||
|
||
jest.mock("next/router", () => ({ | ||
useRouter: () => ({ | ||
query: "query", | ||
}), | ||
})); | ||
|
||
describe("Reward", () => { | ||
it("should render a reward", () => { | ||
renderWithRedux(<OverviewRewards testId="overviewRewardId" />); | ||
expect(screen.getByTestId("overviewRewardId")).toBeInTheDocument(); | ||
}); | ||
|
||
it("should render reward with the challenge", () => { | ||
renderWithRedux(<OverviewRewards testId="overviewRewardId" />, { challenges: { current: challenge, list: [challenge], loading: false, submission: submission } }); | ||
if (challenge.rewards) { | ||
challenge.rewards.forEach((reward) => { | ||
expect(screen.getByText(`${reward.amount} ${reward.token}`)).toBeInTheDocument(); | ||
}); | ||
} | ||
if (challenge.isHackathon) { | ||
const challengeCertificate = screen.getByText("communities.overview.challenge.participate"); | ||
expect(challengeCertificate).toBeInTheDocument(); | ||
expect(challengeCertificate.textContent).toContain(challenge.reward?.token || challenge?.rewards[0]?.token || ""); | ||
} | ||
}); | ||
}); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
import "@testing-library/jest-dom"; | ||
import { screen } from "@testing-library/react"; | ||
import { renderWithRedux } from "@__mocks__/renderWithRedux"; | ||
import RubricHeader from "@/components/sections/challenges/Rubric"; | ||
import { challenge, submission } from "@__mocks__/fixtures/challenge"; | ||
import { mockRatingCriteria, Rubric } from "@__mocks__/fixtures/course"; | ||
|
||
describe("Rubric", () => { | ||
it("should render the Rubric header", () => { | ||
renderWithRedux(<RubricHeader testId="rubricId" ratingCriteria={[]} selected={[]} />); | ||
expect(screen.getByTestId("rubricId")).toBeInTheDocument(); | ||
}); | ||
|
||
it("should render the Rubric with ratings", () => { | ||
renderWithRedux(<RubricHeader ratingCriteria={[mockRatingCriteria]} selected={[Rubric]} />, { | ||
challenges: { current: challenge, list: [challenge], loading: false, submission: submission }, | ||
}); | ||
const rubricHeaderName = screen.getByText(mockRatingCriteria.name); | ||
expect(rubricHeaderName).toBeInTheDocument(); | ||
|
||
const selectedRubric = (id: string) => [Rubric].find((rubric) => rubric.id === id); | ||
Samantha-KY marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
[mockRatingCriteria].forEach((criteria) => { | ||
expect(screen.getByText(criteria.name)).toBeInTheDocument(); | ||
criteria.rubric.forEach((rubric) => { | ||
if (selectedRubric(rubric.id)) { | ||
const rubricPoints = selectedRubric(rubric.id)?.points; | ||
expect(screen.getByText(rubricPoints || "id")).toBeInTheDocument(); | ||
} else { | ||
expect(screen.getByText(rubric.points)).toBeInTheDocument(); | ||
} | ||
expect(screen.getByText(rubric.text)).toBeInTheDocument(); | ||
}); | ||
}); | ||
Samantha-KY marked this conversation as resolved.
Show resolved
Hide resolved
|
||
}); | ||
}); |
35 changes: 35 additions & 0 deletions
35
__tests__/components/sections/challenges/SetupTeamChallenge.test.tsx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
import "@testing-library/jest-dom"; | ||
import { screen } from "@testing-library/react"; | ||
import SetupTeamChallenge from "@/components/sections/challenges/SetupTeamChallenge"; | ||
import { renderWithRedux } from "@__mocks__/renderWithRedux"; | ||
import { challenge, mockInvite, submission } from "@__mocks__/fixtures/challenge"; | ||
|
||
describe("SetUpTeamChallenge", () => { | ||
const mockTeamChallengeStates = { | ||
challenges: { current: challenge, list: [challenge], loading: false, submission: submission }, | ||
invites: { data: mockInvite }, | ||
}; | ||
it("renders without crashing", () => { | ||
renderWithRedux(<SetupTeamChallenge testid="challengeId" />); | ||
expect(screen.getByTestId("challengeId")).toBeInTheDocument(); | ||
}); | ||
|
||
it("renders content correctly", () => { | ||
renderWithRedux(<SetupTeamChallenge />, mockTeamChallengeStates); | ||
expect(screen.getByText("Submission")).toBeInTheDocument(); | ||
expect(screen.getByText("communities.overview.challenge.team.setup.info")).toBeInTheDocument(); | ||
expect(screen.getByText("Form your team")).toBeInTheDocument(); | ||
expect(screen.getByText(challenge?.additionalInfo?.TEAM_FORMATION.text || " ") || "communities.overview.challenge.team.organization").toBeInTheDocument(); | ||
}); | ||
|
||
it("renders CreateTeamCard when there is no invitation or comfirmTeamInvitation when there is invitation", () => { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This description is not clear enough |
||
renderWithRedux(<SetupTeamChallenge />, mockTeamChallengeStates); | ||
if (!mockInvite) { | ||
expect(screen.getByText("communities.overview.challenge.team.setup.submit-title")).toBeInTheDocument(); | ||
expect(screen.getByText("communities.overview.challenge.team.setup.description")).toBeInTheDocument(); | ||
} else { | ||
expect(screen.getByText("Submit your team")).toBeInTheDocument(); | ||
expect(screen.getByText(`The maximum team members for this challenge is ${challenge?.teamLimit} people`)).toBeInTheDocument(); | ||
} | ||
}); | ||
}); | ||
serapieTuyishime marked this conversation as resolved.
Show resolved
Hide resolved
|
49 changes: 49 additions & 0 deletions
49
__tests__/components/sections/challenges/Submission.test.tsx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
import "@testing-library/jest-dom"; | ||
import { screen } from "@testing-library/react"; | ||
import Submission, { FormValues } from "@/components/sections/challenges/Submission"; | ||
import { renderWithRedux } from "@__mocks__/renderWithRedux"; | ||
import { FieldErrors } from "react-hook-form"; | ||
import { challenge, mockTeam, submission } from "@__mocks__/fixtures/challenge"; | ||
import { mockUser } from "@__mocks__/fixtures/user"; | ||
|
||
describe("Submission", () => { | ||
let errors: FieldErrors<FormValues>; | ||
const canSubmit = () => { | ||
if (!challenge?.isTeamChallenge) return true; | ||
return Boolean(!!mockTeam?.organizer); | ||
}; | ||
it("renders the submission section", async () => { | ||
renderWithRedux(<Submission />, { | ||
challenges: { current: challenge, list: [challenge], loading: false, submission: submission }, | ||
teams: { current: mockTeam, loading: true }, | ||
}); | ||
const submissionsClosed = challenge?.expiresAt ? Date.parse(challenge?.expiresAt) < Date.now() : false; | ||
if (submissionsClosed) { | ||
expect(screen.getByText("communities.overview.challenge.submissions-closed")).toBeInTheDocument(); | ||
} else if (challenge.isTeamChallenge) { | ||
expect(screen.getByText("communities.overview.challenge.submission.description")).toBeInTheDocument(); | ||
} | ||
}); | ||
|
||
it("validates submission form and displays necessary elements", () => { | ||
renderWithRedux(<Submission testId="submission-form" />, { | ||
challenges: { current: challenge, list: [challenge], loading: false, submission: submission }, | ||
teams: { current: mockTeam, loading: true }, | ||
}); | ||
if (!canSubmit()) { | ||
expect(screen.getByText("communities.challenge.submission.hint")).toBeInTheDocument(); | ||
} else { | ||
expect(screen.getByTestId("submission-form")).toBeInTheDocument(); | ||
if (challenge.format && mockUser && mockUser.avatar && challenge.format.githubLink && errors) { | ||
expect(screen.getByText(mockTeam.organizer?.displayName || mockUser.displayName)).toBeInTheDocument(); | ||
expect(screen.getByText(errors.text?.message as string)).toBeInTheDocument(); | ||
expect(screen.getByText(errors.githubLink?.message as string)).toBeInTheDocument(); | ||
} | ||
expect(screen.getByText("Markdown")).toBeInTheDocument(); | ||
if (challenge?.format.disclaimer) { | ||
expect(screen.getByRole("checkbox")).toBeInTheDocument(); | ||
} | ||
expect(screen.getByText("submit")).toBeInTheDocument(); | ||
} | ||
}); | ||
}); | ||
serapieTuyishime marked this conversation as resolved.
Show resolved
Hide resolved
|
35 changes: 35 additions & 0 deletions
35
__tests__/components/sections/challenges/TeamChallenge.test.tsx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
import "@testing-library/jest-dom"; | ||
import { screen } from "@testing-library/react"; | ||
import TeamChallenge, { hackathonChallengeSteps, teamChallengeSteps } from "@/components/sections/challenges/TeamChallenge"; | ||
import { renderWithRedux } from "@__mocks__/renderWithRedux"; | ||
import { challenge, submission } from "@__mocks__/fixtures/challenge"; | ||
|
||
interface CardData { | ||
index: number; | ||
title: string; | ||
text: string; | ||
} | ||
|
||
describe("TeamChallenge", () => { | ||
const mockTeamChallengeStates = { | ||
challenges: { current: challenge, list: [challenge], loading: false, submission: submission }, | ||
}; | ||
it("should render the team challenge section", () => { | ||
renderWithRedux(<TeamChallenge />, mockTeamChallengeStates); | ||
expect(screen.getByText("Team Challenge")).toBeInTheDocument(); | ||
expect(screen.getByText("To complete the team challenge, you need to follow these steps:")).toBeInTheDocument(); | ||
}); | ||
|
||
it("should render all team challenge steps", () => { | ||
renderWithRedux(<TeamChallenge />, mockTeamChallengeStates); | ||
let teamChallengeArray: CardData[] = []; | ||
if (challenge.isHackathon) { | ||
teamChallengeArray = hackathonChallengeSteps; | ||
} else teamChallengeArray = teamChallengeSteps; | ||
|
||
teamChallengeArray.forEach((step) => { | ||
expect(screen.getByText(step.text)).toBeInTheDocument(); | ||
expect(screen.getByText(step.title)).toBeInTheDocument(); | ||
}); | ||
Samantha-KY marked this conversation as resolved.
Show resolved
Hide resolved
serapieTuyishime marked this conversation as resolved.
Show resolved
Hide resolved
|
||
}); | ||
}); |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.