mattermost-mobile-upstream/app/screens/draft_scheduled_post_options/index.test.tsx
Elias Nahum b6fc85385e
Migrate from RNN to Expo router (#9402)
* Expo-Router partial migration

* Full migration to ExpoRouter

* i18n

* add tests

* Merge branch 'main' into expo-router

* align package-lock.json

* i18n

* feedback review

* feedback review

* android 16kb patch

* Refactored emoji picker keyboard using a state machine

* set android launch_screen in drawables instead of layout

* no conditional hooks

* remove duplicate call in test

* address feedback

* fix tests and address more feedback

* small corrections

* small corrections

* small corrections

* fix draft test

* fix draft test 2

* remove navigateToScreen in draff test

* fix nit in draft test

* remove doc file

* Feedback review

* fix snapshots

* improve test coverage

* fix i18n

* Upgrade t o RN 0.83, other dependencies and new architecture (#9737)

* library hardware-keyboard android new arch support fix

* library rnshare android new arch support fix

* library rnutils android new arch support fix

* library secure-pdf-viewer add new arch support

* Enable new arch on iOS and Android

* update emm and network client with new-arch

* update intune to use new-arch

* performance improvements

* fix tests

* fixes post input on new-arch

* fix android emoji picker

* remove doc

* run tests in parallel

* upgrade to React Native 0.83.9, Expo 55, React 19, and New Architecture

Bumps core dependencies to their latest versions:
- React Native 0.77.3 → 0.83.9 (New Architecture enabled)
- React 18.3.1 → 19.2.5
- Expo SDK 52 → 55
- TypeScript 5.8.3 → 6.0.3
- Node.js 22.16.0 → 24.15.0
- react-native-reanimated 3.17.3 → 4.3.0
- Various other dependency upgrades

Migrates iOS AppDelegate from Objective-C to Swift, updates Android
build tooling and Gradle wrapper, refreshes all patches and font
assets, and adapts app code, tests, and CI workflows throughout for
API changes introduced by these upgrades.

* remove unecessary dismissKeyboard in notifications

* feedback review

* update intune to use new-arch

* update @mattermost deps

* missing i18n string

* additional fixes

* update fastlane
2026-05-13 17:44:55 +08:00

126 lines
4.6 KiB
TypeScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {cleanup, screen} from '@testing-library/react-native';
import React from 'react';
import {ActionType} from '@constants';
import {DRAFT_TYPE_DRAFT, DRAFT_TYPE_SCHEDULED} from '@constants/draft';
import DatabaseManager from '@database/manager';
import {renderWithEverything} from '@test/intl-test-helper';
import TestHelper from '@test/test_helper';
import DraftScheduledPostOptions from './index';
import type {Database} from '@nozbe/watermelondb';
import type DraftModel from '@typings/database/models/servers/draft';
import type ScheduledPostModel from '@typings/database/models/servers/scheduled_post';
jest.mock('@hooks/device', () => ({
useIsTablet: jest.fn().mockReturnValue(false),
}));
describe('DraftScheduledPostOptions', () => {
let database: Database;
let drafts: DraftModel[] | undefined;
let scheduled: ScheduledPostModel[] | undefined;
const baseProps: Parameters<typeof DraftScheduledPostOptions>[0] = {
draftType: DRAFT_TYPE_DRAFT,
channelId: 'channel-id',
rootId: '',
draftId: 'draft-id',
draftReceiverUserName: 'username',
};
beforeAll(async () => {
const server = await TestHelper.setupServerDatabase();
database = server.database;
drafts = await server.operator.handleDraft({
drafts: [{
channel_id: TestHelper.basicChannel!.id,
root_id: '',
message: 'This is a draft message',
update_at: Date.now(),
}],
prepareRecordsOnly: false,
});
scheduled = await server.operator.handleScheduledPosts({
scheduledPosts: [{
id: 'draft-id',
channel_id: TestHelper.basicChannel!.id,
root_id: '',
message: 'This is a scheduled post message',
scheduled_at: Date.now() + 3600000, // 1 hour in the future
update_at: Date.now(),
create_at: Date.now(),
user_id: TestHelper.basicUser!.id,
}],
actionType: ActionType.SCHEDULED_POSTS.RECEIVED_ALL_SCHEDULED_POSTS,
prepareRecordsOnly: false,
});
});
afterEach(async () => {
cleanup();
// Allow observables to settle before next test
await new Promise((resolve) => setTimeout(resolve, 0));
});
afterAll(async () => {
await DatabaseManager.destroyServerDatabase('https://appv1.mattermost.com');
});
it('renders draft options correctly', () => {
renderWithEverything(
<DraftScheduledPostOptions
{...baseProps}
draftId={drafts![0].id}
channelId={drafts![0].channelId}
/>, {database},
);
expect(screen.getByText('Draft actions')).toBeTruthy();
expect(screen.getByText('Copy Text')).toBeTruthy();
expect(screen.getByTestId('edit_draft')).toBeTruthy();
expect(screen.getByTestId('send_draft_button')).toBeTruthy();
expect(screen.getByTestId('delete_draft')).toBeTruthy();
});
it('renders scheduled post options correctly', async () => {
const scheduledProps = {
...baseProps,
channelId: scheduled![0].channelId,
draftType: DRAFT_TYPE_SCHEDULED,
draftId: scheduled![0].id,
scheduledAt: scheduled![0].scheduledAt,
};
renderWithEverything(
<DraftScheduledPostOptions {...scheduledProps}/>, {database},
);
expect(screen.getByText('Message actions')).toBeTruthy();
expect(screen.getByText('Copy Text')).toBeTruthy();
expect(screen.getByTestId('send_draft_button')).toBeTruthy();
expect(screen.getByTestId('rescheduled_draft')).toBeTruthy();
expect(screen.getByTestId('delete_draft')).toBeTruthy();
expect(screen.queryByTestId('edit_draft')).toBeFalsy(); // Edit option should not be present for scheduled posts
});
it('renders tablet view without header', () => {
jest.requireMock('@hooks/device').useIsTablet.mockReturnValueOnce(true);
renderWithEverything(
<DraftScheduledPostOptions
{...baseProps}
draftId={drafts![0].id}
channelId={drafts![0].channelId}
/>, {database},
);
expect(screen.queryByText('Draft actions')).toBeTruthy(); // Header should also be present in tablet view
expect(screen.getByTestId('edit_draft')).toBeTruthy(); // Verify some content is rendered
});
});