Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
8 changes: 0 additions & 8 deletions .npmpackagejsonlintrc.json

This file was deleted.

9 changes: 9 additions & 0 deletions .playwright-mcp/page-2026-03-31T06-27-58-535Z.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
- generic [active]:
- button "Open Next.js Dev Tools" [ref=e6] [cursor=pointer]:
- generic [ref=e9]:
- text: Compiling
- generic [ref=e10]:
- generic [ref=e11]: .
- generic [ref=e12]: .
- generic [ref=e13]: .
- alert [ref=e14]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions .playwright-mcp/page-2026-03-31T13-04-45-965Z.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
- generic [active]:
- button "Open Next.js Dev Tools" [ref=e6] [cursor=pointer]:
- img [ref=e7]
- alert [ref=e10]
4 changes: 4 additions & 0 deletions .playwright-mcp/page-2026-03-31T13-15-19-347Z.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
- generic [active]:
- button "Open Next.js Dev Tools" [ref=e6] [cursor=pointer]:
- img [ref=e7]
- alert [ref=e10]
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