Skip to content

Commit

Permalink
remove: 불필요한 currentCohort 속성 제거
Browse files Browse the repository at this point in the history
  • Loading branch information
HC-kang committed Jan 11, 2025
1 parent dcbc658 commit a4c624c
Show file tree
Hide file tree
Showing 15 changed files with 56 additions and 121 deletions.
11 changes: 2 additions & 9 deletions src/api/services/fetch/fetchService.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,6 @@ test("fetchMembers should fetch and transform members correctly", async () => {
id: member.login.toLowerCase(),
name: member.login,
profileUrl: member.avatar_url,
currentCohort: 2,
cohorts: [1, 2],
})),
);
Expand All @@ -107,7 +106,6 @@ test("fetchMembers should handle duplicate members preferring higher cohort", as
id: duplicateMember.login.toLowerCase(),
name: duplicateMember.login,
profileUrl: duplicateMember.avatar_url,
currentCohort: 2,
cohorts: [1, 2],
});
});
Expand All @@ -132,12 +130,8 @@ test("fetchMembers should handle duplicate members keeping the latest cohort", a

// same member in two different cohorts
mockGetTeamMembers
.mockResolvedValueOnce([
{ ...duplicateMember, currentCohort: 1, cohorts: [1] },
]) // earlier cohort
.mockResolvedValueOnce([
{ ...duplicateMember, currentCohort: 2, cohorts: [2] },
]); // later cohort
.mockResolvedValueOnce([{ ...duplicateMember, cohorts: [1] }]) // earlier cohort
.mockResolvedValueOnce([{ ...duplicateMember, cohorts: [2] }]); // later cohort

// Act
const result = await fetchService.fetchMembers();
Expand All @@ -148,7 +142,6 @@ test("fetchMembers should handle duplicate members keeping the latest cohort", a
id: duplicateMember.login.toLowerCase(),
name: duplicateMember.login,
profileUrl: duplicateMember.avatar_url,
currentCohort: 2,
cohorts: [1, 2],
});
});
Expand Down
11 changes: 3 additions & 8 deletions src/api/services/fetch/fetchService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ export function createFetchService(config: Config) {
id: member.login.toLocaleLowerCase(),
name: member.login,
profileUrl: member.avatar_url,
currentCohort,
cohorts: [currentCohort],
}),
);
Expand Down Expand Up @@ -60,13 +59,9 @@ const dropDuplicateMembers = (members: MemberIdentity[]): MemberIdentity[] => {
const memberMap = members.reduce((acc, member) => {
const existingMember = acc.get(member.id);
if (existingMember) {
existingMember.currentCohort = Math.max(
existingMember.currentCohort,
member.currentCohort,
);
if (!existingMember.cohorts.includes(member.currentCohort)) {
existingMember.cohorts.push(member.currentCohort);
}
existingMember.cohorts = [
...new Set([...existingMember.cohorts, ...member.cohorts]),
];
} else {
acc.set(member.id, member);
}
Expand Down
3 changes: 0 additions & 3 deletions src/api/services/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ export type Grade = "SEED" | "SPROUT" | "LEAF" | "BRANCH" | "FRUIT" | "TREE";
export type MemberIdentity = {
id: string; // lowercase
name: string;
currentCohort: number;
cohorts: number[];
profileUrl?: string;
};
Expand All @@ -25,8 +24,6 @@ export type Problem = {
export interface Member {
id: string;
name: string;
/** 현재 기수 (1기, 2기, 3기 ...) */
currentCohort: number;
/** 참여한 전체 기수 목록 */
cohorts: number[];
/** Profile Image URL */
Expand Down
54 changes: 7 additions & 47 deletions src/components/Card/Card.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,7 @@ import { expect, test } from "vitest";
import Card from "./Card";

test("render grade image", () => {
render(
<Card
id="test"
name="test"
grade={"TREE"}
currentCohort={1}
cohorts={[1]}
/>,
);
render(<Card id="test" name="test" grade={"TREE"} cohorts={[1]} />);

expect(
screen.getByRole("img", { name: `${"TREE"} image` }),
Expand All @@ -20,47 +12,23 @@ test("render grade image", () => {

test("render github name", () => {
const name = "user123";
render(
<Card
id="test"
name={name}
grade={"TREE"}
currentCohort={1}
cohorts={[1]}
/>,
);
render(<Card id="test" name={name} grade={"TREE"} cohorts={[1]} />);

expect(screen.getByRole("region", { name })).toBeInTheDocument();
});

test("render cohort", () => {
const currentCohort = 2;
render(
<Card
id="test"
name="user123"
grade={"TREE"}
currentCohort={currentCohort}
cohorts={[currentCohort]}
/>,
);
const cohorts = [2];
render(<Card id="test" name="user123" grade={"TREE"} cohorts={cohorts} />);

expect(
screen.getByRole("region", { name: `${currentCohort}기` }),
screen.getByRole("region", { name: `${cohorts.at(-1)}기` }),
).toBeInTheDocument();
});

test("render progress link", () => {
const id = "test";
render(
<Card
id={id}
name="user123"
grade={"TREE"}
currentCohort={1}
cohorts={[1]}
/>,
);
render(<Card id={id} name="user123" grade={"TREE"} cohorts={[1]} />);

const link = within(
screen.getByRole("region", { name: `카드-네비게이션-${id}` }),
Expand All @@ -72,15 +40,7 @@ test("render progress link", () => {

test("render certificate link", () => {
const id = "test";
render(
<Card
id={id}
name="user123"
grade={"TREE"}
currentCohort={1}
cohorts={[1]}
/>,
);
render(<Card id={id} name="user123" grade={"TREE"} cohorts={[1]} />);

const link = within(
screen.getByRole("region", { name: `카드-네비게이션-${id}` }),
Expand Down
11 changes: 2 additions & 9 deletions src/components/Card/Card.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,13 @@ import styles from "./Card.module.css";
interface CardProps {
id: string;
name: string;
currentCohort: number;
cohorts: number[];
grade: Grade;
}

export default function Card({
id,
name,
currentCohort,
cohorts,
grade,
}: CardProps) {
export default function Card({ id, name, cohorts, grade }: CardProps) {
const cohortString =
cohorts && cohorts.length > 0 ? cohorts.join(", ") : currentCohort;
cohorts && cohorts.length > 0 ? cohorts.join(", ") : cohorts.at(-1);
return (
<article className={styles.item}>
<GradeImage grade={grade} width={105} height={128} />
Expand Down
4 changes: 0 additions & 4 deletions src/components/Sidebar/Sidebar.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ const meta = {
solvedProblems: 16,
totalProblems: 25,
profileUrl: "https://avatars.githubusercontent.com/u/104721736?v=4",
currentCohort: 3,
cohorts: [1, 2, 3],
grade: "LEAF",
},
Expand All @@ -33,7 +32,6 @@ export const Default: StoryObj<typeof meta> = {
totalProblems: 25,
grade: "LEAF",
cohorts: [1, 2, 3],
currentCohort: 3,
githubUsername: "testuser",
profileUrl: "https://avatars.githubusercontent.com/u/104721736?v=4",
},
Expand All @@ -47,7 +45,6 @@ export const HighProgress: StoryObj<typeof meta> = {
mediumProgress: "10/10",
hardProgress: "8/10",
grade: "FRUIT",
currentCohort: 3,
cohorts: [1, 2, 3],
githubUsername: "testuser",
profileUrl: "https://avatars.githubusercontent.com/u/104721736?v=4",
Expand All @@ -62,7 +59,6 @@ export const NoProblems: StoryObj<typeof meta> = {
solvedProblems: 0,
totalProblems: 0,
grade: "SEED",
currentCohort: 3,
cohorts: [1, 2, 3],
githubUsername: "testuser",
profileUrl: "https://avatars.githubusercontent.com/u/104721736?v=4",
Expand Down
1 change: 0 additions & 1 deletion src/components/Sidebar/Sidebar.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ test("renders Sidebar with all elements", () => {
solvedProblems={17}
totalProblems={30}
profileUrl="example.png"
currentCohort={3}
cohorts={[1, 2, 3]}
grade={"TREE"}
/>,
Expand Down
4 changes: 1 addition & 3 deletions src/components/Sidebar/Sidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ interface SidebarNormalProps {
solvedProblems: number;
totalProblems: number;
profileUrl: string;
currentCohort: number;
cohorts: number[];
grade: Grade;
}
Expand Down Expand Up @@ -54,7 +53,6 @@ export default function Sidebar(props: SidebarProps) {
hardProgress,
solvedProblems,
profileUrl,
currentCohort,
cohorts,
grade,
} = props;
Expand All @@ -65,7 +63,7 @@ export default function Sidebar(props: SidebarProps) {
{ label: "HARD", progress: hardProgress, className: styles.hard },
];
const cohortString =
cohorts && cohorts.length > 0 ? cohorts.join(", ") : currentCohort;
cohorts && cohorts.length > 0 ? cohorts.join(", ") : cohorts.at(-1);

return (
<aside>
Expand Down
31 changes: 15 additions & 16 deletions src/hooks/useMembers.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,11 @@ import useMembers from "./useMembers";
import { problems } from "../api/constants/problems";

function createMockMember(custom: Partial<Member> = {}): Member {
const currentCohort = faker.number.int({ min: 1, max: 10 });
const cohort = faker.number.int({ min: 1, max: 10 });
return {
id: faker.string.uuid(),
name: faker.person.fullName(),
currentCohort,
cohorts: [currentCohort],
cohorts: [cohort],
profileUrl: faker.internet.url(),
progress: faker.number.int({ min: 0, max: 100 }),
grade: faker.helpers.arrayElement([
Expand All @@ -33,8 +32,8 @@ function createMockMember(custom: Partial<Member> = {}): Member {

test("fetch member info successfully and update state", async () => {
const expectedMembers: Member[] = [
createMockMember({ currentCohort: 1, cohorts: [1] }),
createMockMember({ currentCohort: 2, cohorts: [2] }),
createMockMember({ cohorts: [1] }),
createMockMember({ cohorts: [2] }),
];

const getMembers = vi.fn().mockResolvedValue(expectedMembers);
Expand Down Expand Up @@ -83,9 +82,9 @@ test("handle error when fetching member info fails", async () => {

test("filter members by name and cohort", async () => {
const expectedMembers: Member[] = [
createMockMember({ name: "John Doe", currentCohort: 1, cohorts: [1] }),
createMockMember({ name: "Jane Doe", currentCohort: 2, cohorts: [2] }),
createMockMember({ name: "Alice Cooper", currentCohort: 1, cohorts: [1] }),
createMockMember({ name: "John Doe", cohorts: [1] }),
createMockMember({ name: "Jane Doe", cohorts: [2] }),
createMockMember({ name: "Alice Cooper", cohorts: [1] }),
];
const [johnDoe1, janeDoe1, aliceCooper2] = expectedMembers;

Expand Down Expand Up @@ -126,11 +125,11 @@ test("filter members by name and cohort", async () => {

test("total cohorts calculated correctly", async () => {
const expectedMembers: Member[] = [
createMockMember({ currentCohort: 1, cohorts: [1] }),
createMockMember({ currentCohort: 2, cohorts: [2] }),
createMockMember({ currentCohort: 2, cohorts: [2] }),
createMockMember({ currentCohort: 3, cohorts: [3] }),
createMockMember({ currentCohort: 3, cohorts: [3] }),
createMockMember({ cohorts: [1] }),
createMockMember({ cohorts: [2] }),
createMockMember({ cohorts: [2] }),
createMockMember({ cohorts: [3] }),
createMockMember({ cohorts: [3] }),
];

const getMembers = vi.fn().mockResolvedValue(expectedMembers);
Expand All @@ -144,9 +143,9 @@ test("total cohorts calculated correctly", async () => {

test("filter members by name case-insensitively", async () => {
const expectedMembers: Member[] = [
createMockMember({ name: "John Doe", currentCohort: 1, cohorts: [1] }),
createMockMember({ name: "jane doe", currentCohort: 2, cohorts: [2] }),
createMockMember({ name: "ALICE Cooper", currentCohort: 3, cohorts: [3] }),
createMockMember({ name: "John Doe", cohorts: [1] }),
createMockMember({ name: "jane doe", cohorts: [2] }),
createMockMember({ name: "ALICE Cooper", cohorts: [3] }),
];
const [johnDoe, janeDoe, aliceCooper] = expectedMembers;

Expand Down
Loading

0 comments on commit a4c624c

Please sign in to comment.