Skip to content
Closed
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
197 changes: 141 additions & 56 deletions __tests__/components/brain/my-stream/MyStreamWaveLeaderboard.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import userEvent from "@testing-library/user-event";
import React from "react";
import { AuthContext } from "@/components/auth/Auth";
import MyStreamWaveLeaderboard from "@/components/brain/my-stream/MyStreamWaveLeaderboard";
import { WaveViewerModeProvider } from "@/components/waves/public/WaveViewerModeContext";
import type { ApiWave } from "@/generated/models/ApiWave";
import { WaveDropsLeaderboardSort } from "@/hooks/useWaveDropsLeaderboard";

Expand Down Expand Up @@ -108,19 +109,29 @@ const wave = {
wave: { type: "RANK" },
} as ApiWave;

const renderLeaderboard = () =>
render(
<AuthContext.Provider
value={
{
connectedProfile: { handle: "tester" },
activeProfileProxy: null,
} as any
}
>
<MyStreamWaveLeaderboard wave={wave} onDropClick={jest.fn()} />
const authContextValue = {
connectedProfile: { handle: "tester" },
activeProfileProxy: null,
} as any;

const leaderboardTree = ({
waveOverride = wave,
isPublicReadOnly = false,
}: {
readonly waveOverride?: ApiWave;
readonly isPublicReadOnly?: boolean;
} = {}) => (
<WaveViewerModeProvider isPublicReadOnly={isPublicReadOnly}>
<AuthContext.Provider value={authContextValue}>
<MyStreamWaveLeaderboard wave={waveOverride} onDropClick={jest.fn()} />
</AuthContext.Provider>
);
</WaveViewerModeProvider>
);

const renderLeaderboard = (options?: {
readonly waveOverride?: ApiWave;
readonly isPublicReadOnly?: boolean;
}) => render(leaderboardTree(options));

describe("MyStreamWaveLeaderboard", () => {
beforeEach(() => {
Expand Down Expand Up @@ -214,32 +225,20 @@ describe("MyStreamWaveLeaderboard", () => {
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",
},
},
renderLeaderboard({
waveOverride: {
...wave,
participation: {
submission_strategy: {
type: "IDENTITY",
config: {
who_can_be_submitted: "EVERYONE",
duplicates: "NEVER_ALLOW",
},
}}
onDropClick={jest.fn()}
/>
</AuthContext.Provider>
);
},
},
} as ApiWave,
});

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

Expand Down Expand Up @@ -333,6 +332,93 @@ describe("MyStreamWaveLeaderboard", () => {
expect(curationModalProps.wave).toEqual(wave);
});

it("resets inline create state when public read only toggles on", 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(),
]);

const { rerender } = renderLeaderboard();

await user.click(screen.getByTestId("header"));
expect(screen.getByTestId("create-drop")).toBeInTheDocument();

rerender(leaderboardTree({ isPublicReadOnly: true }));
expect(screen.queryByTestId("create-drop")).not.toBeInTheDocument();

rerender(leaderboardTree({ isPublicReadOnly: false }));
expect(screen.queryByTestId("create-drop")).not.toBeInTheDocument();
});

it("resets memes create state when public read only toggles on", async () => {
const user = userEvent.setup();
useWave.mockReturnValue({
isMemesWave: true,
isCurationWave: false,
participation: {
isEligible: true,
canSubmitNow: true,
hasReachedLimit: false,
},
});
useLocalPreference.mockReturnValueOnce(["grid", jest.fn()]);
useLocalPreference.mockReturnValueOnce([
WaveDropsLeaderboardSort.RANK,
jest.fn(),
]);

const { rerender } = renderLeaderboard();

await user.click(screen.getByTestId("header"));
expect(screen.getByTestId("memes")).toBeInTheDocument();

rerender(leaderboardTree({ isPublicReadOnly: true }));
expect(screen.queryByTestId("memes")).not.toBeInTheDocument();

rerender(leaderboardTree({ isPublicReadOnly: false }));
expect(screen.queryByTestId("memes")).not.toBeInTheDocument();
});

it("resets curation create state when public read only toggles on", async () => {
const user = userEvent.setup();
useWave.mockReturnValue({
isMemesWave: false,
isCurationWave: true,
participation: {
isEligible: true,
canSubmitNow: true,
hasReachedLimit: false,
},
});
useLocalPreference.mockReturnValueOnce(["list", jest.fn()]);
useLocalPreference.mockReturnValueOnce([
WaveDropsLeaderboardSort.RANK,
jest.fn(),
]);

const { rerender } = renderLeaderboard();

await user.click(screen.getByTestId("header"));
expect(screen.getByTestId("curation-modal")).toBeInTheDocument();

rerender(leaderboardTree({ isPublicReadOnly: true }));
expect(screen.queryByTestId("curation-modal")).not.toBeInTheDocument();

rerender(leaderboardTree({ isPublicReadOnly: false }));
expect(screen.queryByTestId("curation-modal")).not.toBeInTheDocument();
});

it("updates URL when curation filter changes", () => {
useWave.mockReturnValue({
isMemesWave: false,
Expand Down Expand Up @@ -426,23 +512,20 @@ describe("MyStreamWaveLeaderboard", () => {
jest.fn(),
]);

const authContextValue = {
connectedProfile: { handle: "tester" },
activeProfileProxy: null,
} as any;

const waveA = { ...wave, id: "1" } as ApiWave;
const waveB = { ...wave, id: "2" } as ApiWave;
const onDropClick = jest.fn();

const { rerender } = render(
<AuthContext.Provider value={authContextValue}>
<MyStreamWaveLeaderboard
key={waveA.id}
wave={waveA}
onDropClick={onDropClick}
/>
</AuthContext.Provider>
<WaveViewerModeProvider>
<AuthContext.Provider value={authContextValue}>
<MyStreamWaveLeaderboard
key={waveA.id}
wave={waveA}
onDropClick={onDropClick}
/>
</AuthContext.Provider>
</WaveViewerModeProvider>
);

act(() => {
Expand All @@ -453,13 +536,15 @@ describe("MyStreamWaveLeaderboard", () => {
expect(dropsProps.maxPrice).toBe(5);

rerender(
<AuthContext.Provider value={authContextValue}>
<MyStreamWaveLeaderboard
key={waveB.id}
wave={waveB}
onDropClick={onDropClick}
/>
</AuthContext.Provider>
<WaveViewerModeProvider>
<AuthContext.Provider value={authContextValue}>
<MyStreamWaveLeaderboard
key={waveB.id}
wave={waveB}
onDropClick={onDropClick}
/>
</AuthContext.Provider>
</WaveViewerModeProvider>
);

await waitFor(() => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
import React from "react";
import MyStreamWaveTabsDefault from "@/components/brain/my-stream/tabs/MyStreamWaveTabsDefault";
import { SidebarProvider } from "@/hooks/useSidebarState";
import { WaveViewerModeProvider } from "@/components/waves/public/WaveViewerModeContext";

const mockPush = jest.fn();
const mockReplace = jest.fn();
Expand Down Expand Up @@ -536,6 +537,29 @@ describe("MyStreamWaveTabsDefault", () => {
).toBeInTheDocument();
});

it("keeps the right sidebar toggle visible in public read-only mode", () => {
useContentTab.mockReturnValue({
activeContentTab: "CHAT",
setActiveContentTab: jest.fn(),
});
render(
<SidebarProvider>
<WaveViewerModeProvider isPublicReadOnly={true}>
<MyStreamWaveTabsDefault
wave={createWave(false)}
viewMode="chat"
onToggleViewMode={mockToggleViewMode}
showGalleryToggle={true}
/>
</WaveViewerModeProvider>
</SidebarProvider>
);

expect(
screen.getByRole("button", { name: "Toggle right sidebar" })
).toBeInTheDocument();
});

it("copies in mobile right action cluster when share is unavailable", () => {
mockUseBreakpoint.mockReturnValue("S");
setNavigatorShare(undefined);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { render, screen, fireEvent } from "@testing-library/react";
import React from "react";
import MyStreamWaveTabsMeme from "@/components/brain/my-stream/tabs/MyStreamWaveTabsMeme";
import { SidebarProvider } from "@/hooks/useSidebarState";
import { WaveViewerModeProvider } from "@/components/waves/public/WaveViewerModeContext";

const mockPush = jest.fn();
const mockUseBreakpoint = jest.fn(() => "LG");
Expand Down Expand Up @@ -320,4 +321,23 @@ describe("MyStreamWaveTabsMeme", () => {
screen.getByRole("button", { name: "Show wave description" })
).toBeInTheDocument();
});

it("keeps the right sidebar toggle visible in public read-only mode", () => {
useContentTab.mockReturnValue({
activeContentTab: "CHAT",
setActiveContentTab: jest.fn(),
});

render(
<SidebarProvider>
<WaveViewerModeProvider isPublicReadOnly={true}>
<MyStreamWaveTabsMeme wave={createWave(false)} />
</WaveViewerModeProvider>
</SidebarProvider>
);

expect(
screen.getByRole("button", { name: "Toggle right sidebar" })
).toBeInTheDocument();
});
});
Loading
Loading