Skip to content
Open
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
9 changes: 9 additions & 0 deletions app/components/Nav/Main/MainNavigator.js
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ import BonusCodeBottomSheet from '../../UI/Rewards/components/Tabs/OverviewTab/W
import RewardsClaimBottomSheetModal from '../../UI/Rewards/components/Tabs/LevelsTab/RewardsClaimBottomSheetModal';
import RewardOptInAccountGroupModal from '../../UI/Rewards/components/Settings/RewardOptInAccountGroupModal';
import EndOfSeasonClaimBottomSheet from '../../UI/Rewards/components/EndOfSeasonClaimBottomSheet/EndOfSeasonClaimBottomSheet';
import RewardsSelectSheet from '../../UI/Rewards/components/RewardsSelectSheet';
import CampaignTourStepView from '../../UI/Rewards/Views/CampaignTourStepView';
import { selectRewardsSubscriptionId } from '../../../selectors/rewards';
import SitesFullView from '../../Views/SitesFullView/SitesFullView';
Expand Down Expand Up @@ -337,6 +338,14 @@ const RewardsHome = () => {
component={EndOfSeasonClaimBottomSheet}
options={{ presentation: 'transparentModal' }}
/>
<Stack.Screen
name={Routes.MODAL.REWARDS_SELECT_SHEET}
component={RewardsSelectSheet}
options={{
presentation: 'transparentModal',
cardStyle: { backgroundColor: 'transparent' },
}}
/>
</Stack.Navigator>
);
};
Expand Down
134 changes: 96 additions & 38 deletions app/components/UI/Rewards/Views/OndoCampaignDetailsView.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import { render, fireEvent } from '@testing-library/react-native';
import OndoCampaignDetailsView, {
CAMPAIGN_DETAILS_TEST_IDS,
} from './OndoCampaignDetailsView';
import { CAMPAIGN_STATS_SUMMARY_TEST_IDS } from '../components/Campaigns/CampaignStatsSummary';
import { ONDO_PRIZE_POOL_TEST_IDS } from '../components/Campaigns/OndoPrizePool';
import { CAMPAIGN_CTA_TEST_IDS } from '../components/Campaigns/CampaignOptInCta';
import {
type CampaignDto,
Expand All @@ -13,6 +15,7 @@ import { useGetCampaignParticipantStatus } from '../hooks/useGetCampaignParticip
import { useGetOndoLeaderboard } from '../hooks/useGetOndoLeaderboard';
import { useGetOndoLeaderboardPosition } from '../hooks/useGetOndoLeaderboardPosition';
import { useGetOndoPortfolioPosition } from '../hooks/useGetOndoPortfolioPosition';
import { useGetOndoCampaignDeposits } from '../hooks/useGetOndoCampaignDeposits';
import Routes from '../../../../constants/navigation/Routes';

const mockGoBack = jest.fn();
Expand Down Expand Up @@ -139,16 +142,20 @@ jest.mock('../components/Campaigns/OndoLeaderboard', () => {
};
});

const mockOndoLeaderboardPosition = jest.fn();
jest.mock('../components/Campaigns/OndoLeaderboardPosition', () => {
const mockCampaignStatsSummary = jest.fn();
jest.mock('../components/Campaigns/CampaignStatsSummary', () => {
const ReactActual = jest.requireActual('react');
const { View } = jest.requireActual('react-native');
const { CAMPAIGN_STATS_SUMMARY_TEST_IDS: actualTestIds } = jest.requireActual(
'../components/Campaigns/CampaignStatsSummary',
);
return {
__esModule: true,
CAMPAIGN_STATS_SUMMARY_TEST_IDS: actualTestIds,
default: (props: Record<string, unknown>) => {
mockOndoLeaderboardPosition(props);
mockCampaignStatsSummary(props);
return ReactActual.createElement(View, {
testID: 'ondo-leaderboard-position',
testID: actualTestIds.CONTAINER,
});
},
};
Expand Down Expand Up @@ -238,6 +245,31 @@ const mockUseGetOndoPortfolioPosition =
typeof useGetOndoPortfolioPosition
>;

jest.mock('../hooks/useGetOndoCampaignDeposits');
const mockUseGetOndoCampaignDeposits =
useGetOndoCampaignDeposits as jest.MockedFunction<
typeof useGetOndoCampaignDeposits
>;

const mockOndoPrizePool = jest.fn();
jest.mock('../components/Campaigns/OndoPrizePool', () => {
const ReactActual = jest.requireActual('react');
const { View } = jest.requireActual('react-native');
const { ONDO_PRIZE_POOL_TEST_IDS: actualTestIds } = jest.requireActual(
'../components/Campaigns/OndoPrizePool',
);
return {
__esModule: true,
ONDO_PRIZE_POOL_TEST_IDS: actualTestIds,
default: (props: Record<string, unknown>) => {
mockOndoPrizePool(props);
return ReactActual.createElement(View, {
testID: actualTestIds.CONTAINER,
});
},
};
});

jest.mock('react-redux', () => ({
useSelector: jest.fn(() => null),
}));
Expand Down Expand Up @@ -406,7 +438,7 @@ describe('OndoCampaignDetailsView', () => {
beforeEach(() => {
jest.clearAllMocks();
mockIsTokenTradingOpen.mockReturnValue(true);
mockOndoLeaderboardPosition.mockReset();
mockCampaignStatsSummary.mockReset();
mockUseRewardCampaigns.mockReturnValue(hookDefaults);
mockUseGetCampaignParticipantStatus.mockReturnValue({
status: null,
Expand Down Expand Up @@ -440,6 +472,13 @@ describe('OndoCampaignDetailsView', () => {
hasFetched: false,
refetch: jest.fn(),
});
mockUseGetOndoCampaignDeposits.mockReturnValue({
deposits: null,
isLoading: false,
hasError: false,
refetch: jest.fn(),
});
mockOndoPrizePool.mockReset();
});

it('renders the container', () => {
Expand Down Expand Up @@ -602,7 +641,7 @@ describe('OndoCampaignDetailsView', () => {
expect(queryByTestId('campaign-how-it-works')).toBeNull();
});

it('renders OndoLeaderboardPosition when participant is opted in with positions', () => {
it('renders CampaignStatsSummary when user has portfolio positions', () => {
mockUseRewardCampaigns.mockReturnValue({
...hookDefaults,
campaigns: [createTestCampaign()],
Expand All @@ -621,10 +660,12 @@ describe('OndoCampaignDetailsView', () => {
refetch: jest.fn(),
});
const { getByTestId } = render(<OndoCampaignDetailsView />);
expect(getByTestId('ondo-leaderboard-position')).toBeDefined();
expect(
getByTestId(CAMPAIGN_STATS_SUMMARY_TEST_IDS.CONTAINER),
).toBeDefined();
});

it('does not render OndoLeaderboardPosition when participant is not opted in', () => {
it('does not render CampaignStatsSummary when participant has no positions', () => {
mockUseRewardCampaigns.mockReturnValue({
...hookDefaults,
campaigns: [createTestCampaign()],
Expand All @@ -636,7 +677,9 @@ describe('OndoCampaignDetailsView', () => {
refetch: jest.fn(),
});
const { queryByTestId } = render(<OndoCampaignDetailsView />);
expect(queryByTestId('ondo-leaderboard-position')).toBeNull();
expect(
queryByTestId(CAMPAIGN_STATS_SUMMARY_TEST_IDS.CONTAINER),
).toBeNull();
});
});

Expand Down Expand Up @@ -774,8 +817,8 @@ describe('OndoCampaignDetailsView', () => {
});
});

describe('leaderboard position', () => {
it('shows OndoLeaderboardPosition when participant is opted in with positions', () => {
describe('stats summary and leaderboard', () => {
it('shows CampaignStatsSummary when participant is opted in with positions', () => {
mockUseRewardCampaigns.mockReturnValue({
...hookDefaults,
campaigns: [createTestCampaign()],
Expand All @@ -794,16 +837,20 @@ describe('OndoCampaignDetailsView', () => {
refetch: jest.fn(),
});
const { getByTestId } = render(<OndoCampaignDetailsView />);
expect(getByTestId('ondo-leaderboard-position')).toBeDefined();
expect(
getByTestId(CAMPAIGN_STATS_SUMMARY_TEST_IDS.CONTAINER),
).toBeDefined();
});

it('does not show OndoLeaderboardPosition when not opted in and campaign is active', () => {
it('does not show CampaignStatsSummary when not opted in and campaign is active', () => {
mockUseRewardCampaigns.mockReturnValue({
...hookDefaults,
campaigns: [createTestCampaign()],
});
const { queryByTestId } = render(<OndoCampaignDetailsView />);
expect(queryByTestId('ondo-leaderboard-position')).toBeNull();
expect(
queryByTestId(CAMPAIGN_STATS_SUMMARY_TEST_IDS.CONTAINER),
).toBeNull();
});

it('shows OndoLeaderboard when not opted in and campaign is complete', () => {
Expand All @@ -825,7 +872,9 @@ describe('OndoCampaignDetailsView', () => {
<OndoCampaignDetailsView />,
);
expect(getByTestId('ondo-leaderboard')).toBeDefined();
expect(queryByTestId('ondo-leaderboard-position')).toBeNull();
expect(
queryByTestId(CAMPAIGN_STATS_SUMMARY_TEST_IDS.CONTAINER),
).toBeNull();
});

it('shows OndoLeaderboard when not opted in and campaign is active', () => {
Expand All @@ -837,7 +886,18 @@ describe('OndoCampaignDetailsView', () => {
expect(getByTestId('ondo-leaderboard')).toBeDefined();
});

it('does not show leaderboard section header when campaign is complete and not opted in', () => {
it('always shows leaderboard title and navigation arrow when campaign exists', () => {
mockUseRewardCampaigns.mockReturnValue({
...hookDefaults,
campaigns: [createTestCampaign()],
});
const { getByText } = render(<OndoCampaignDetailsView />);
expect(
getByText('rewards.ondo_campaign_leaderboard.title'),
).toBeDefined();
});

it('shows leaderboard title when campaign is complete and not opted in', () => {
const lastMonth = new Date();
lastMonth.setMonth(lastMonth.getMonth() - 1);
const yesterday = new Date();
Expand All @@ -852,28 +912,6 @@ describe('OndoCampaignDetailsView', () => {
}),
],
});
const { queryByText } = render(<OndoCampaignDetailsView />);
expect(queryByText('rewards.ondo_campaign_leaderboard.title')).toBeNull();
});

it('shows leaderboard section header when opted in with positions', () => {
mockUseRewardCampaigns.mockReturnValue({
...hookDefaults,
campaigns: [createTestCampaign()],
});
mockUseGetCampaignParticipantStatus.mockReturnValue({
status: { optedIn: true, participantCount: 1 },
isLoading: false,
hasError: false,
refetch: jest.fn(),
});
mockUseGetOndoPortfolioPosition.mockReturnValue({
portfolio: { positions: [{}], summary: {}, computedAt: '' } as never,
isLoading: false,
hasError: false,
hasFetched: true,
refetch: jest.fn(),
});
const { getByText } = render(<OndoCampaignDetailsView />);
expect(
getByText('rewards.ondo_campaign_leaderboard.title'),
Expand Down Expand Up @@ -932,4 +970,24 @@ describe('OndoCampaignDetailsView', () => {
expect(queryByTestId('account-picker-sheet')).toBeNull();
});
});

describe('prize pool', () => {
it('renders OndoPrizePool when campaign exists', () => {
mockUseRewardCampaigns.mockReturnValue({
...hookDefaults,
campaigns: [createTestCampaign()],
});
const { getByTestId } = render(<OndoCampaignDetailsView />);
expect(getByTestId(ONDO_PRIZE_POOL_TEST_IDS.CONTAINER)).toBeDefined();
});

it('does not render OndoPrizePool when no campaign', () => {
mockUseRewardCampaigns.mockReturnValue({
...hookDefaults,
campaigns: [],
});
const { queryByTestId } = render(<OndoCampaignDetailsView />);
expect(queryByTestId(ONDO_PRIZE_POOL_TEST_IDS.CONTAINER)).toBeNull();
});
});
});
Loading
Loading