* Added scaffolding for unrevealed BoR post * Displayed reveal UI * Displayed expiry timer * WIP * Displayed own post indicator and blur text * restored button * Ungrouped BoR posts * WIP * WIP * DIsplayed error message on revealing * Added last run check on mobile app cleanup job * Cleanup * lint fix * i18n-fix * Added tests * test: add test suite for revealBoRPost function * test: add unrevealed burn on read post test file * feat: add tests for UnrevealedBurnOnReadPost component * test: update UnrevealedBurnOnReadPost test with PostModel type * test: replace toBeTruthy with toBeVisible for component visibility assertions * test: add initial test file for expiry timer component * test: add comprehensive tests for ExpiryCountdown component * refactor: clean up test formatting and remove redundant test case * fix: adjust test timing for ExpiryCountdown onExpiry callback * test: fix timer test by advancing timers in smaller increments * Added tests * Updated tests * fixed accidental change * restored package.resolved * WIP review fixes * Review fixes * Review fixes * Fixed tests * restored package.resolved * WIP * test: add test for skipping BoR post cleanup within 15 minutes * test: add comprehensive test cases for expiredBoRPostCleanup * WIP * WIP * test: add bor.test.ts placeholder file * test: add comprehensive tests for BoR utility functions * test: add comprehensive tests for formatTime function * WIP * test: add comprehensive tests for getLastBoRPostCleanupRun function * Added tests * removed a commented code * post list optimization * test: add test case for updating unrevealed burn-on-read post * fix: handle error logging in expiredBoRPostCleanup test * test: add test case for updateLastBoRCleanupRun error handling * review fixes * lint fixes * Added WS event handling (#9320) * Added WS event handling * test: add burn on read websocket action test * test: add tests for handleBoRPostRevealedEvent in burn_on_read * Added tests * test: add comprehensive error handling test cases for burn on read * Added tests and error handling * BoR post - restricted actions (#9315) * Restricted post actions for BoR post type * Prevent opening thread fr nBoR post * WIP * fix: remove redundant observable wrapping in post options * fixed a change * removed broken * restored package.resolved * Added tests * Awaiting for last run to be set * Added tests for validating expiry timer behaviour (#9338) * Added tests for validating expiry timer behaviour * No need of use event setup * Bor ux fixes (#9336) * WIP * UI and delete fixes * lint fixes * fixed tests * Improved mocking * Improved test
102 lines
3.2 KiB
TypeScript
102 lines
3.2 KiB
TypeScript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
import {fireEvent, screen} from '@testing-library/react-native';
|
|
import React, {act} from 'react';
|
|
import {DeviceEventEmitter} from 'react-native';
|
|
|
|
import {switchToGlobalDrafts} from '@actions/local/draft';
|
|
import {Events} from '@constants';
|
|
import {DRAFT} from '@constants/screens';
|
|
import {renderWithIntlAndTheme} from '@test/intl-test-helper';
|
|
import TestHelper from '@test/test_helper';
|
|
|
|
import ScheduledPostIndicator from '.';
|
|
|
|
jest.mock('@utils/theme', () => ({
|
|
changeOpacity: jest.fn().mockReturnValue('rgba(0,0,0,0.5)'),
|
|
makeStyleSheetFromTheme: jest.fn().mockReturnValue(() => ({
|
|
wrapper: {},
|
|
container: {},
|
|
text: {},
|
|
link: {},
|
|
})),
|
|
}));
|
|
|
|
jest.mock('@actions/local/draft', () => ({
|
|
switchToGlobalDrafts: jest.fn().mockResolvedValue({error: null}),
|
|
}));
|
|
|
|
jest.mock('@components/formatted_time', () => {
|
|
const MockFormattedTime = (props: any) => {
|
|
// Store props for test assertions
|
|
MockFormattedTime.mockProps = props;
|
|
return null;
|
|
};
|
|
MockFormattedTime.mockProps = {};
|
|
return MockFormattedTime;
|
|
});
|
|
|
|
describe('ScheduledPostIndicator', () => {
|
|
const baseProps = {
|
|
isMilitaryTime: false,
|
|
scheduledPostCount: 1,
|
|
};
|
|
|
|
test('should render multiple posts message when scheduledPostCount is greater than 1', () => {
|
|
const props = {
|
|
...baseProps,
|
|
scheduledPostCount: 2,
|
|
channelId: 'channel_id',
|
|
};
|
|
|
|
renderWithIntlAndTheme(<ScheduledPostIndicator {...props}/>);
|
|
expect(screen.getByText(/2 scheduled messages in channel/i)).toBeVisible();
|
|
});
|
|
|
|
test('should render thread message when isThread is true', () => {
|
|
const props = {
|
|
...baseProps,
|
|
scheduledPostCount: 2,
|
|
isThread: true,
|
|
channelId: 'channel_id',
|
|
};
|
|
|
|
renderWithIntlAndTheme(<ScheduledPostIndicator {...props}/>);
|
|
expect(screen.getByText(/2 scheduled messages in thread/i)).toBeVisible();
|
|
});
|
|
|
|
test('should render correct message when there is only one scheduled post', () => {
|
|
const props = {
|
|
...baseProps,
|
|
scheduledPostCount: 1,
|
|
isThread: true,
|
|
channelId: 'channel_id',
|
|
};
|
|
|
|
renderWithIntlAndTheme(<ScheduledPostIndicator {...props}/>);
|
|
expect(screen.getByText(/1 scheduled message in thread/i)).toBeVisible();
|
|
});
|
|
|
|
test('should handle see all scheduled posts click', async () => {
|
|
const props = {
|
|
...baseProps,
|
|
scheduledPostCount: 2,
|
|
channelId: 'channel_id',
|
|
};
|
|
const emitSpy = jest.spyOn(DeviceEventEmitter, 'emit');
|
|
|
|
renderWithIntlAndTheme(<ScheduledPostIndicator {...props}/>);
|
|
|
|
jest.mocked(switchToGlobalDrafts).mockResolvedValue({error: null});
|
|
const button = screen.getByText('See all.');
|
|
|
|
await act(async () => {
|
|
fireEvent.press(button);
|
|
await TestHelper.wait(0);
|
|
});
|
|
|
|
expect(emitSpy).toHaveBeenCalledWith(Events.ACTIVE_SCREEN, DRAFT);
|
|
expect(emitSpy).toHaveBeenCalledTimes(1);
|
|
});
|
|
});
|