|
@@ -7,11 +7,13 @@ import {
|
|
|
useReplayOnboardingSidebarPanel,
|
|
|
} from 'sentry/utils/replays/hooks/useReplayOnboarding';
|
|
|
import useOrganization from 'sentry/utils/useOrganization';
|
|
|
+import useProjectSdkNeedsUpdate from 'sentry/utils/useProjectSdkNeedsUpdate';
|
|
|
import ListPage from 'sentry/views/replays/list/listContent';
|
|
|
|
|
|
+jest.mock('sentry/utils/replays/hooks/useReplayOnboarding');
|
|
|
jest.mock('sentry/utils/replays/hooks/useReplayPageview');
|
|
|
jest.mock('sentry/utils/useOrganization');
|
|
|
-jest.mock('sentry/utils/replays/hooks/useReplayOnboarding');
|
|
|
+jest.mock('sentry/utils/useProjectSdkNeedsUpdate');
|
|
|
jest.mock('sentry/utils/replays/hooks/useReplayList', () => {
|
|
|
return {
|
|
|
__esModule: true,
|
|
@@ -31,6 +33,7 @@ const mockUseReplayList = jest.mocked(useReplayList);
|
|
|
const mockUseHaveSelectedProjectsSentAnyReplayEvents = jest.mocked(
|
|
|
useHaveSelectedProjectsSentAnyReplayEvents
|
|
|
);
|
|
|
+const mockUseProjectSdkNeedsUpdate = jest.mocked(useProjectSdkNeedsUpdate);
|
|
|
const mockUseReplayOnboardingSidebarPanel = jest.mocked(useReplayOnboardingSidebarPanel);
|
|
|
|
|
|
mockUseReplayOnboardingSidebarPanel.mockReturnValue({activateSidebar: jest.fn()});
|
|
@@ -56,11 +59,9 @@ function getMockContext(mockOrg: Organization) {
|
|
|
describe('ReplayList', () => {
|
|
|
beforeEach(() => {
|
|
|
mockUseReplayList.mockClear();
|
|
|
+ mockUseHaveSelectedProjectsSentAnyReplayEvents.mockClear();
|
|
|
+ mockUseProjectSdkNeedsUpdate.mockClear();
|
|
|
MockApiClient.clearMockResponses();
|
|
|
- MockApiClient.addMockResponse({
|
|
|
- url: '/organizations/org-slug/sdk-updates/',
|
|
|
- body: [],
|
|
|
- });
|
|
|
MockApiClient.addMockResponse({
|
|
|
url: '/organizations/org-slug/tags/',
|
|
|
body: [],
|
|
@@ -73,6 +74,10 @@ describe('ReplayList', () => {
|
|
|
fetching: false,
|
|
|
hasSentOneReplay: false,
|
|
|
});
|
|
|
+ mockUseProjectSdkNeedsUpdate.mockReturnValue({
|
|
|
+ isFetching: false,
|
|
|
+ needsUpdate: false,
|
|
|
+ });
|
|
|
|
|
|
render(<ListPage />, {
|
|
|
context: getMockContext(mockOrg),
|
|
@@ -90,6 +95,10 @@ describe('ReplayList', () => {
|
|
|
fetching: false,
|
|
|
hasSentOneReplay: true,
|
|
|
});
|
|
|
+ mockUseProjectSdkNeedsUpdate.mockReturnValue({
|
|
|
+ isFetching: false,
|
|
|
+ needsUpdate: false,
|
|
|
+ });
|
|
|
|
|
|
render(<ListPage />, {
|
|
|
context: getMockContext(mockOrg),
|
|
@@ -107,6 +116,10 @@ describe('ReplayList', () => {
|
|
|
fetching: false,
|
|
|
hasSentOneReplay: false,
|
|
|
});
|
|
|
+ mockUseProjectSdkNeedsUpdate.mockReturnValue({
|
|
|
+ isFetching: false,
|
|
|
+ needsUpdate: false,
|
|
|
+ });
|
|
|
|
|
|
render(<ListPage />, {
|
|
|
context: getMockContext(mockOrg),
|
|
@@ -118,12 +131,50 @@ describe('ReplayList', () => {
|
|
|
expect(mockUseReplayList).not.toHaveBeenCalled();
|
|
|
});
|
|
|
|
|
|
- it('should fetch the replay table when the org is on AM2 and sent some replays', async () => {
|
|
|
+ it('should render the rage-click sdk update banner when the org is AM2, has sent replays, but the sdk version is low', async () => {
|
|
|
+ const mockOrg = getMockOrganization({features: AM2_FEATURES});
|
|
|
+ mockUseHaveSelectedProjectsSentAnyReplayEvents.mockReturnValue({
|
|
|
+ fetching: false,
|
|
|
+ hasSentOneReplay: true,
|
|
|
+ });
|
|
|
+ mockUseProjectSdkNeedsUpdate.mockReturnValue({
|
|
|
+ isFetching: false,
|
|
|
+ needsUpdate: true,
|
|
|
+ });
|
|
|
+ mockUseReplayList.mockReturnValue({
|
|
|
+ replays: [],
|
|
|
+ isFetching: false,
|
|
|
+ fetchError: undefined,
|
|
|
+ pageLinks: null,
|
|
|
+ });
|
|
|
+
|
|
|
+ render(<ListPage />, {
|
|
|
+ context: getMockContext(mockOrg),
|
|
|
+ });
|
|
|
+
|
|
|
+ await waitFor(() => {
|
|
|
+ expect(screen.queryByText('Introducing Rage and Dead Clicks')).toBeInTheDocument();
|
|
|
+ expect(screen.queryByTestId('replay-table')).toBeInTheDocument();
|
|
|
+ });
|
|
|
+ expect(mockUseReplayList).toHaveBeenCalled();
|
|
|
+ });
|
|
|
+
|
|
|
+ it('should fetch the replay table and show dead/rage tables when the org is on AM2, has sent some replays, and has a newer SDK version', async () => {
|
|
|
const mockOrg = getMockOrganization({features: AM2_FEATURES});
|
|
|
mockUseHaveSelectedProjectsSentAnyReplayEvents.mockReturnValue({
|
|
|
fetching: false,
|
|
|
hasSentOneReplay: true,
|
|
|
});
|
|
|
+ mockUseProjectSdkNeedsUpdate.mockReturnValue({
|
|
|
+ isFetching: false,
|
|
|
+ needsUpdate: false,
|
|
|
+ });
|
|
|
+ mockUseReplayList.mockReturnValue({
|
|
|
+ replays: [],
|
|
|
+ isFetching: false,
|
|
|
+ fetchError: undefined,
|
|
|
+ pageLinks: null,
|
|
|
+ });
|
|
|
|
|
|
render(<ListPage />, {
|
|
|
context: getMockContext(mockOrg),
|