Skip to content
Merged
Show file tree
Hide file tree
Changes from 14 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
30 changes: 25 additions & 5 deletions __tests__/components/DefaultWinnerDrop.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,14 @@ jest.mock("@/components/waves/drops/WaveDropActions", () => (props: any) => (
<button data-testid="reply" onClick={props.onReply} />
));
jest.mock("@/components/waves/drops/WaveDropRatings", () => () => <div />);
jest.mock("@/components/waves/drops/WaveDropMetadata", () => () => (
<div data-testid="metadata" />
));
const WaveDropMetadataMock = jest.fn(() => <div data-testid="metadata" />);
jest.mock("@/components/waves/drops/WaveDropMetadata", () => (props: any) => {
WaveDropMetadataMock(props);
return <div data-testid="metadata" />;
});
jest.mock("@/components/waves/winners/identity/WaveWinnerIdentity", () => ({
WaveWinnerIdentity: () => <div data-testid="identity" />,
}));
jest.mock("@/components/waves/drops/WaveDropMobileMenu", () => () => <div />);
jest.mock("@/hooks/isMobileDevice", () => () => false);

Expand All @@ -32,6 +37,10 @@ describe("DefaultWinnerDrop", () => {
author: { cic: "g" },
};

beforeEach(() => {
WaveDropMetadataMock.mockClear();
});

it("calls reply handler", async () => {
const user = userEvent.setup();
const onReply = jest.fn();
Expand All @@ -55,13 +64,20 @@ describe("DefaultWinnerDrop", () => {
expect(onReply).toHaveBeenCalled();
});

it("renders metadata when provided", () => {
it("renders identity and filtered metadata when provided", () => {
const { container } = render(
<DefaultWinnerDrop
drop={{
...drop,
rank: 1,
metadata: [{ data_key: "k", data_value: "v" }],
wave: {
...drop.wave,
submission_type: "IDENTITY",
},
metadata: [
{ data_key: "identity", data_value: "0xabc" },
{ data_key: "k", data_value: "v" },
],
}}
previousDrop={null}
nextDrop={null}
Expand All @@ -76,7 +92,11 @@ describe("DefaultWinnerDrop", () => {
onQuoteClick={jest.fn()}
/>
);
expect(screen.getByTestId("identity")).toBeInTheDocument();
const meta = container.querySelector('[data-testid="metadata"]');
expect(meta).toBeInTheDocument();
expect(WaveDropMetadataMock.mock.calls.at(-1)?.[0]?.metadata).toEqual([
{ data_key: "k", data_value: "v" },
]);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,12 @@ jest.mock("next/navigation", () => ({
}));

let mockIsMemesWave = false;
let mockIsCurationWave = false;
jest.mock("@/hooks/useWave", () => ({
useWave: () => ({ isMemesWave: mockIsMemesWave }),
useWave: () => ({
isMemesWave: mockIsMemesWave,
isCurationWave: mockIsCurationWave,
}),
}));

jest.mock("@/components/brain/my-stream/layout/LayoutContext", () => ({
Expand Down Expand Up @@ -91,7 +95,7 @@ jest.mock("@/services/api/common-api", () => ({
commonApiPostWithoutBodyAndResponse: jest.fn().mockResolvedValue(undefined),
}));

const wave = { id: "10", metrics: { muted: false } } as any;
const wave = { id: "10", participation: {}, metrics: { muted: false } } as any;
const mockOnDropClick = jest.fn();

describe("MyStreamWaveChat", () => {
Expand All @@ -104,6 +108,7 @@ describe("MyStreamWaveChat", () => {
searchParamsMock.toString.mockReset();
searchParamsMock.toString.mockReturnValue("");
mockIsMemesWave = false;
mockIsCurationWave = false;
mockOnDropClick.mockClear();
mockSetUnreadDividerSerialNo.mockClear();
mockRemoveWaveDeliveredNotifications.mockClear();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,57 @@ describe("MyStreamWaveLeaderboard", () => {
expect(screen.getByTestId("memes")).toBeInTheDocument();
});

it("keeps identity submission on the normal inline create path", async () => {
const user = userEvent.setup();
useWave.mockReturnValue({
isMemesWave: false,
isCurationWave: false,
participation: {
isEligible: true,
canSubmitNow: true,
hasReachedLimit: false,
},
});
useLocalPreference.mockReturnValueOnce(["list", jest.fn()]);
useLocalPreference.mockReturnValueOnce([
WaveDropsLeaderboardSort.RANK,
jest.fn(),
]);

render(
<AuthContext.Provider
value={
{
connectedProfile: { handle: "tester" },
activeProfileProxy: null,
} as any
}
>
<MyStreamWaveLeaderboard
wave={{
...wave,
participation: {
submission_strategy: {
type: "IDENTITY",
config: {
who_can_be_submitted: "EVERYONE",
duplicates: "NEVER_ALLOW",
},
},
},
}}
onDropClick={jest.fn()}
/>
</AuthContext.Provider>
);

await user.click(screen.getByTestId("header"));

expect(screen.getByTestId("create-drop")).toBeInTheDocument();
expect(screen.queryByTestId("memes")).not.toBeInTheDocument();
expect(screen.queryByTestId("curation-modal")).not.toBeInTheDocument();
});

it("renders non-meme content-only grid mode", () => {
useWave.mockReturnValue({
isMemesWave: false,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import { render, screen } from "@testing-library/react";
import BrainRightSidebarContent from "@/components/brain/right-sidebar/BrainRightSidebarContent";

const captured: string[] = [];

jest.mock(
"@/components/waves/leaderboard/sidebar/WaveLeaderboardRightSidebarBoostedDrops",
() => ({
__esModule: true,
WaveLeaderboardRightSidebarBoostedDrops: (props: any) => {
captured.push(`boosted:${props.wave.id}`);
return <div data-testid="boosted-drops" />;
},
})
);

jest.mock("@/components/waves/specs/WaveSpecs", () => ({
__esModule: true,
default: (props: any) => {
captured.push(`specs:${props.wave.id}`);
return <div data-testid="wave-specs" />;
},
}));

jest.mock("@/components/waves/specs/WaveIdentitySubmissionSpecs", () => ({
__esModule: true,
default: (props: any) => {
captured.push(`identity:${props.wave.id}`);
return <div data-testid="identity-submission-specs" />;
},
}));

jest.mock("@/components/waves/groups/WaveGroups", () => ({
__esModule: true,
default: (props: any) => {
captured.push(`groups:${props.wave.id}`);
return <div data-testid="wave-groups" />;
},
}));

describe("BrainRightSidebarContent", () => {
beforeEach(() => {
captured.length = 0;
});

it("renders sidebar sections in the expected order", () => {
render(<BrainRightSidebarContent wave={{ id: "wave-1" } as any} />);

expect(screen.getByTestId("boosted-drops")).toBeInTheDocument();
expect(screen.getByTestId("wave-specs")).toBeInTheDocument();
expect(screen.getByTestId("identity-submission-specs")).toBeInTheDocument();
expect(screen.getByTestId("wave-groups")).toBeInTheDocument();
expect(captured).toEqual([
"boosted:wave-1",
"specs:wave-1",
"identity:wave-1",
"groups:wave-1",
]);
});
});
82 changes: 61 additions & 21 deletions __tests__/components/memes/drops/MemeWinnerDrop.test.tsx
Original file line number Diff line number Diff line change
@@ -1,32 +1,72 @@
import React from 'react';
import { render, screen, fireEvent } from '@testing-library/react';
import MemeWinnerDrop from '@/components/memes/drops/MemeWinnerDrop';
import React from "react";
import { render, screen, fireEvent } from "@testing-library/react";
import MemeWinnerDrop from "@/components/memes/drops/MemeWinnerDrop";

jest.mock('@/hooks/isMobileDevice', () => jest.fn(() => false));
jest.mock('@/components/waves/drops/WaveDropActions', () => (props: any) => (
<button data-testid='reply' onClick={() => props.onReply({})} />
jest.mock("@/hooks/isMobileDevice", () => jest.fn(() => false));
jest.mock("@/components/waves/drops/WaveDropActions", () => (props: any) => (
<button data-testid="reply" onClick={() => props.onReply({})} />
));
jest.mock('@/components/memes/drops/MemeWinnerHeader', () => (props: any) => <div>{props.title}</div>);
jest.mock('@/components/memes/drops/MemeWinnerDescription', () => (props: any) => <p>{props.description}</p>);
jest.mock('@/components/memes/drops/MemeWinnerArtistInfo', () => () => <div data-testid='artist'/>);
jest.mock('@/components/memes/drops/MemeDropTraits', () => () => <div data-testid='traits'/>);
jest.mock('@/components/waves/drops/DropMobileMenuHandler', () => (props: any) => <div>{props.children}</div>);
jest.mock('@/components/drops/view/item/content/media/DropListItemContentMedia', () => (props: any) => <img data-testid='media' src={props.media_url}/>);
jest.mock("@/components/memes/drops/MemeWinnerHeader", () => (props: any) => (
<div>{props.title}</div>
));
jest.mock(
"@/components/memes/drops/MemeWinnerDescription",
() => (props: any) => <p>{props.description}</p>
);
jest.mock("@/components/memes/drops/MemeWinnerArtistInfo", () => () => (
<div data-testid="artist" />
));
jest.mock("@/components/memes/drops/MemeDropTraits", () => () => (
<div data-testid="traits" />
));
jest.mock("@/components/waves/winners/identity/WaveWinnerIdentity", () => ({
WaveWinnerIdentity: () => <div data-testid="identity" />,
}));
jest.mock(
"@/components/waves/drops/DropMobileMenuHandler",
() => (props: any) => <div>{props.children}</div>
);
jest.mock(
"@/components/drops/view/item/content/media/DropListItemContentMedia",
() => (props: any) => <img data-testid="media" src={props.media_url} />
);

jest.mock('@/components/waves/drops/DropContext', () => ({ useDropContext: () => ({ location: 'WAVE' }) }));
jest.mock("@/components/waves/drops/DropContext", () => ({
useDropContext: () => ({ location: "WAVE" }),
}));

const drop: any = { parts: [{ part_id:1, media:[{ url:'u', mime_type:'image/png'}] }], metadata: [] , author:{}, wave:{} };
const drop: any = {
parts: [{ part_id: 1, media: [{ url: "u", mime_type: "image/png" }] }],
metadata: [],
author: {},
wave: {},
};

test('renders actions on desktop', () => {
test("renders actions on desktop", () => {
const onReply = jest.fn();
render(<MemeWinnerDrop drop={drop} showReplyAndQuote onReply={onReply} onQuote={jest.fn()} />);
fireEvent.click(screen.getByTestId('reply'));
render(
<MemeWinnerDrop
drop={drop}
showReplyAndQuote
onReply={onReply}
onQuote={jest.fn()}
/>
);
Comment thread
simo6529 marked this conversation as resolved.
expect(screen.getByTestId("identity")).toBeInTheDocument();
fireEvent.click(screen.getByTestId("reply"));
expect(onReply).toHaveBeenCalled();
});

test('hides actions when mobile', () => {
const useMobile = require('@/hooks/isMobileDevice');
test("hides actions when mobile", () => {
const useMobile = require("@/hooks/isMobileDevice");
(useMobile as jest.Mock).mockReturnValue(true);
const { queryByTestId } = render(<MemeWinnerDrop drop={drop} showReplyAndQuote onReply={jest.fn()} onQuote={jest.fn()} />);
expect(queryByTestId('reply')).toBeNull();
const { queryByTestId } = render(
<MemeWinnerDrop
drop={drop}
showReplyAndQuote
onReply={jest.fn()}
onQuote={jest.fn()}
/>
);
Comment thread
simo6529 marked this conversation as resolved.
expect(queryByTestId("reply")).toBeNull();
});
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,23 @@ describe("MobileWrapperDialog", () => {

expect(screen.getByTestId("child-content")).toBeInTheDocument();
});

it("allows content overflow when allowOverflow is true", () => {
render(
<MobileWrapperDialog
{...defaultProps}
isOpen={true}
allowOverflow={true}
/>
);

expect(
document.querySelector(".tw-rounded-t-xl.tw-overflow-visible")
).toBeInTheDocument();
expect(
document.querySelector(".tw-flex-1.tw-overflow-visible")
).toBeInTheDocument();
});
});

describe("user interactions", () => {
Expand Down
Loading
Loading