// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. /* eslint-disable max-lines */ import {MM_TABLES} from '@constants/database'; import {serverSchema} from './index'; const { CATEGORY, CATEGORY_CHANNEL, CHANNEL, CHANNEL_INFO, CHANNEL_MEMBERSHIP, CONFIG, CUSTOM_EMOJI, DRAFT, FILE, GROUP, GROUP_CHANNEL, GROUP_MEMBERSHIP, GROUP_TEAM, MY_CHANNEL, MY_CHANNEL_SETTINGS, MY_TEAM, POST, POSTS_IN_CHANNEL, POSTS_IN_THREAD, PREFERENCE, REACTION, ROLE, SYSTEM, TEAM, TEAM_CHANNEL_HISTORY, TEAM_MEMBERSHIP, TEAM_SEARCH_HISTORY, THREAD, THREAD_PARTICIPANT, THREADS_IN_TEAM, TEAM_THREADS_SYNC, USER, } = MM_TABLES.SERVER; describe('*** Test schema for SERVER database ***', () => { it('=> The SERVER SCHEMA should strictly match', () => { expect(serverSchema).toEqual({ version: 7, unsafeSql: undefined, tables: { [CATEGORY]: { name: CATEGORY, unsafeSql: undefined, columns: { collapsed: {name: 'collapsed', type: 'boolean'}, display_name: {name: 'display_name', type: 'string'}, muted: {name: 'muted', type: 'boolean'}, sort_order: {name: 'sort_order', type: 'number'}, sorting: {name: 'sorting', type: 'string'}, team_id: {name: 'team_id', type: 'string', isIndexed: true}, type: {name: 'type', type: 'string'}, }, columnArray: [ {name: 'collapsed', type: 'boolean'}, {name: 'display_name', type: 'string'}, {name: 'muted', type: 'boolean'}, {name: 'sort_order', type: 'number'}, {name: 'sorting', type: 'string'}, {name: 'team_id', type: 'string', isIndexed: true}, {name: 'type', type: 'string'}, ], }, [CATEGORY_CHANNEL]: { name: CATEGORY_CHANNEL, unsafeSql: undefined, columns: { category_id: {name: 'category_id', type: 'string', isIndexed: true}, channel_id: {name: 'channel_id', type: 'string', isIndexed: true}, sort_order: {name: 'sort_order', type: 'number'}, }, columnArray: [ {name: 'category_id', type: 'string', isIndexed: true}, {name: 'channel_id', type: 'string', isIndexed: true}, {name: 'sort_order', type: 'number'}, ], }, [CHANNEL_INFO]: { name: CHANNEL_INFO, unsafeSql: undefined, columns: { guest_count: {name: 'guest_count', type: 'number'}, header: {name: 'header', type: 'string'}, member_count: {name: 'member_count', type: 'number'}, pinned_post_count: {name: 'pinned_post_count', type: 'number'}, purpose: {name: 'purpose', type: 'string'}, }, columnArray: [ {name: 'guest_count', type: 'number'}, {name: 'header', type: 'string'}, {name: 'member_count', type: 'number'}, {name: 'pinned_post_count', type: 'number'}, {name: 'purpose', type: 'string'}, ], }, [CHANNEL]: { name: CHANNEL, unsafeSql: undefined, columns: { create_at: {name: 'create_at', type: 'number'}, creator_id: {name: 'creator_id', type: 'string', isIndexed: true}, delete_at: {name: 'delete_at', type: 'number'}, display_name: {name: 'display_name', type: 'string'}, is_group_constrained: { name: 'is_group_constrained', type: 'boolean', }, name: {name: 'name', type: 'string', isIndexed: true}, shared: {name: 'shared', type: 'boolean'}, team_id: {name: 'team_id', type: 'string', isIndexed: true}, type: {name: 'type', type: 'string'}, update_at: {name: 'update_at', type: 'number'}, }, columnArray: [ {name: 'create_at', type: 'number'}, {name: 'creator_id', type: 'string', isIndexed: true}, {name: 'delete_at', type: 'number'}, {name: 'display_name', type: 'string'}, {name: 'is_group_constrained', type: 'boolean'}, {name: 'name', type: 'string', isIndexed: true}, {name: 'shared', type: 'boolean'}, {name: 'team_id', type: 'string', isIndexed: true}, {name: 'type', type: 'string'}, {name: 'update_at', type: 'number'}, ], }, [CHANNEL_MEMBERSHIP]: { name: CHANNEL_MEMBERSHIP, unsafeSql: undefined, columns: { channel_id: {name: 'channel_id', type: 'string', isIndexed: true}, user_id: {name: 'user_id', type: 'string', isIndexed: true}, scheme_admin: {name: 'scheme_admin', type: 'boolean'}, }, columnArray: [ {name: 'channel_id', type: 'string', isIndexed: true}, {name: 'user_id', type: 'string', isIndexed: true}, {name: 'scheme_admin', type: 'boolean'}, ], }, [CONFIG]: { name: CONFIG, unsafeSql: undefined, columns: { value: {name: 'value', type: 'string'}, }, columnArray: [ {name: 'value', type: 'string'}, ], }, [CUSTOM_EMOJI]: { name: CUSTOM_EMOJI, unsafeSql: undefined, columns: { name: {name: 'name', type: 'string', isIndexed: true}, }, columnArray: [{name: 'name', type: 'string', isIndexed: true}], }, [MY_CHANNEL]: { name: MY_CHANNEL, unsafeSql: undefined, columns: { is_unread: {name: 'is_unread', type: 'boolean'}, last_post_at: {name: 'last_post_at', type: 'number'}, last_viewed_at: {name: 'last_viewed_at', type: 'number'}, manually_unread: {name: 'manually_unread', type: 'boolean'}, mentions_count: {name: 'mentions_count', type: 'number'}, message_count: {name: 'message_count', type: 'number'}, roles: {name: 'roles', type: 'string'}, viewed_at: {name: 'viewed_at', type: 'number'}, last_fetched_at: {name: 'last_fetched_at', type: 'number', isIndexed: true}, }, columnArray: [ {name: 'is_unread', type: 'boolean'}, {name: 'last_post_at', type: 'number'}, {name: 'last_viewed_at', type: 'number'}, {name: 'manually_unread', type: 'boolean'}, {name: 'mentions_count', type: 'number'}, {name: 'message_count', type: 'number'}, {name: 'roles', type: 'string'}, {name: 'viewed_at', type: 'number'}, {name: 'last_fetched_at', type: 'number', isIndexed: true}, ], }, [MY_CHANNEL_SETTINGS]: { name: MY_CHANNEL_SETTINGS, unsafeSql: undefined, columns: { notify_props: {name: 'notify_props', type: 'string'}, }, columnArray: [ {name: 'notify_props', type: 'string'}, ], }, [POSTS_IN_CHANNEL]: { name: POSTS_IN_CHANNEL, unsafeSql: undefined, columns: { channel_id: {name: 'channel_id', type: 'string', isIndexed: true}, earliest: {name: 'earliest', type: 'number'}, latest: {name: 'latest', type: 'number'}, }, columnArray: [ {name: 'channel_id', type: 'string', isIndexed: true}, {name: 'earliest', type: 'number'}, {name: 'latest', type: 'number'}, ], }, [DRAFT]: { name: DRAFT, unsafeSql: undefined, columns: { channel_id: {name: 'channel_id', type: 'string', isIndexed: true}, files: {name: 'files', type: 'string'}, message: {name: 'message', type: 'string'}, root_id: {name: 'root_id', type: 'string', isIndexed: true}, }, columnArray: [ {name: 'channel_id', type: 'string', isIndexed: true}, {name: 'files', type: 'string'}, {name: 'message', type: 'string'}, {name: 'root_id', type: 'string', isIndexed: true}, ], }, [FILE]: { name: FILE, unsafeSql: undefined, columns: { extension: {name: 'extension', type: 'string'}, height: {name: 'height', type: 'number'}, image_thumbnail: {name: 'image_thumbnail', type: 'string'}, local_path: {name: 'local_path', type: 'string', isOptional: true}, mime_type: {name: 'mime_type', type: 'string'}, name: {name: 'name', type: 'string'}, post_id: {name: 'post_id', type: 'string', isIndexed: true}, size: {name: 'size', type: 'number'}, width: {name: 'width', type: 'number'}, }, columnArray: [ {name: 'extension', type: 'string'}, {name: 'height', type: 'number'}, {name: 'image_thumbnail', type: 'string'}, {name: 'local_path', type: 'string', isOptional: true}, {name: 'mime_type', type: 'string'}, {name: 'name', type: 'string'}, {name: 'post_id', type: 'string', isIndexed: true}, {name: 'size', type: 'number'}, {name: 'width', type: 'number'}, ], }, [GROUP]: { name: GROUP, unsafeSql: undefined, columns: { display_name: {name: 'display_name', type: 'string'}, name: {name: 'name', type: 'string', isIndexed: true}, description: {name: 'description', type: 'string'}, source: {name: 'source', type: 'string'}, remote_id: {name: 'remote_id', type: 'string', isIndexed: true}, created_at: {name: 'created_at', type: 'number'}, updated_at: {name: 'updated_at', type: 'number'}, deleted_at: {name: 'deleted_at', type: 'number'}, member_count: {name: 'member_count', type: 'number'}, }, columnArray: [ {name: 'display_name', type: 'string'}, {name: 'name', type: 'string', isIndexed: true}, {name: 'description', type: 'string'}, {name: 'source', type: 'string'}, {name: 'remote_id', type: 'string', isIndexed: true}, {name: 'created_at', type: 'number'}, {name: 'updated_at', type: 'number'}, {name: 'deleted_at', type: 'number'}, {name: 'member_count', type: 'number'}, ], }, [GROUP_CHANNEL]: { name: GROUP_CHANNEL, unsafeSql: undefined, columns: { group_id: {name: 'group_id', type: 'string', isIndexed: true}, channel_id: {name: 'channel_id', type: 'string', isIndexed: true}, created_at: {name: 'created_at', type: 'number'}, updated_at: {name: 'updated_at', type: 'number'}, deleted_at: {name: 'deleted_at', type: 'number'}, }, columnArray: [ {name: 'group_id', type: 'string', isIndexed: true}, {name: 'channel_id', type: 'string', isIndexed: true}, {name: 'created_at', type: 'number'}, {name: 'updated_at', type: 'number'}, {name: 'deleted_at', type: 'number'}, ], }, [GROUP_MEMBERSHIP]: { name: GROUP_MEMBERSHIP, unsafeSql: undefined, columns: { group_id: {name: 'group_id', type: 'string', isIndexed: true}, user_id: {name: 'user_id', type: 'string', isIndexed: true}, created_at: {name: 'created_at', type: 'number'}, updated_at: {name: 'updated_at', type: 'number'}, deleted_at: {name: 'deleted_at', type: 'number'}, }, columnArray: [ {name: 'group_id', type: 'string', isIndexed: true}, {name: 'user_id', type: 'string', isIndexed: true}, {name: 'created_at', type: 'number'}, {name: 'updated_at', type: 'number'}, {name: 'deleted_at', type: 'number'}, ], }, [GROUP_TEAM]: { name: GROUP_TEAM, unsafeSql: undefined, columns: { group_id: {name: 'group_id', type: 'string', isIndexed: true}, team_id: {name: 'team_id', type: 'string', isIndexed: true}, created_at: {name: 'created_at', type: 'number'}, updated_at: {name: 'updated_at', type: 'number'}, deleted_at: {name: 'deleted_at', type: 'number'}, }, columnArray: [ {name: 'group_id', type: 'string', isIndexed: true}, {name: 'team_id', type: 'string', isIndexed: true}, {name: 'created_at', type: 'number'}, {name: 'updated_at', type: 'number'}, {name: 'deleted_at', type: 'number'}, ], }, [POSTS_IN_THREAD]: { name: POSTS_IN_THREAD, unsafeSql: undefined, columns: { earliest: {name: 'earliest', type: 'number'}, latest: {name: 'latest', type: 'number'}, root_id: {name: 'root_id', type: 'string', isIndexed: true}, }, columnArray: [ {name: 'earliest', type: 'number'}, {name: 'latest', type: 'number'}, {name: 'root_id', type: 'string', isIndexed: true}, ], }, [POST]: { name: POST, unsafeSql: undefined, columns: { channel_id: {name: 'channel_id', type: 'string', isIndexed: true}, create_at: {name: 'create_at', type: 'number'}, delete_at: {name: 'delete_at', type: 'number'}, edit_at: {name: 'edit_at', type: 'number'}, is_pinned: {name: 'is_pinned', type: 'boolean'}, message: {name: 'message', type: 'string'}, metadata: {name: 'metadata', type: 'string', isOptional: true}, original_id: {name: 'original_id', type: 'string'}, pending_post_id: {name: 'pending_post_id', type: 'string', isIndexed: true}, previous_post_id: {name: 'previous_post_id', type: 'string'}, props: {name: 'props', type: 'string'}, root_id: {name: 'root_id', type: 'string'}, type: {name: 'type', type: 'string'}, update_at: {name: 'update_at', type: 'number'}, user_id: {name: 'user_id', type: 'string', isIndexed: true}, }, columnArray: [ {name: 'channel_id', type: 'string', isIndexed: true}, {name: 'create_at', type: 'number'}, {name: 'delete_at', type: 'number'}, {name: 'edit_at', type: 'number'}, {name: 'is_pinned', type: 'boolean'}, {name: 'message', type: 'string'}, {name: 'metadata', type: 'string', isOptional: true}, {name: 'original_id', type: 'string'}, {name: 'pending_post_id', type: 'string', isIndexed: true}, {name: 'previous_post_id', type: 'string'}, {name: 'props', type: 'string'}, {name: 'root_id', type: 'string'}, {name: 'type', type: 'string'}, {name: 'update_at', type: 'number'}, {name: 'user_id', type: 'string', isIndexed: true}, ], }, [PREFERENCE]: { name: PREFERENCE, unsafeSql: undefined, columns: { category: {name: 'category', type: 'string', isIndexed: true}, name: {name: 'name', type: 'string'}, user_id: {name: 'user_id', type: 'string', isIndexed: true}, value: {name: 'value', type: 'string'}, }, columnArray: [ {name: 'category', type: 'string', isIndexed: true}, {name: 'name', type: 'string'}, {name: 'user_id', type: 'string', isIndexed: true}, {name: 'value', type: 'string'}, ], }, [REACTION]: { name: REACTION, unsafeSql: undefined, columns: { create_at: {name: 'create_at', type: 'number'}, emoji_name: {name: 'emoji_name', type: 'string'}, post_id: {name: 'post_id', type: 'string', isIndexed: true}, user_id: {name: 'user_id', type: 'string', isIndexed: true}, }, columnArray: [ {name: 'create_at', type: 'number'}, {name: 'emoji_name', type: 'string'}, {name: 'post_id', type: 'string', isIndexed: true}, {name: 'user_id', type: 'string', isIndexed: true}, ], }, [MY_TEAM]: { name: MY_TEAM, unsafeSql: undefined, columns: { roles: {name: 'roles', type: 'string'}, }, columnArray: [ {name: 'roles', type: 'string'}, ], }, [ROLE]: { name: ROLE, unsafeSql: undefined, columns: { name: {name: 'name', type: 'string', isIndexed: true}, permissions: {name: 'permissions', type: 'string'}, }, columnArray: [ {name: 'name', type: 'string', isIndexed: true}, {name: 'permissions', type: 'string'}, ], }, [SYSTEM]: { name: SYSTEM, unsafeSql: undefined, columns: { value: {name: 'value', type: 'string'}, }, columnArray: [ {name: 'value', type: 'string'}, ], }, [TEAM]: { name: TEAM, unsafeSql: undefined, columns: { allowed_domains: {name: 'allowed_domains', type: 'string'}, description: {name: 'description', type: 'string'}, display_name: {name: 'display_name', type: 'string'}, is_allow_open_invite: { name: 'is_allow_open_invite', type: 'boolean', }, is_group_constrained: { name: 'is_group_constrained', type: 'boolean', }, last_team_icon_updated_at: { name: 'last_team_icon_updated_at', type: 'number', }, name: {name: 'name', type: 'string'}, type: {name: 'type', type: 'string'}, update_at: {name: 'update_at', type: 'number'}, invite_id: {name: 'invite_id', type: 'string'}, }, columnArray: [ {name: 'allowed_domains', type: 'string'}, {name: 'description', type: 'string'}, {name: 'display_name', type: 'string'}, {name: 'is_allow_open_invite', type: 'boolean'}, {name: 'is_group_constrained', type: 'boolean'}, {name: 'last_team_icon_updated_at', type: 'number'}, {name: 'name', type: 'string'}, {name: 'type', type: 'string'}, {name: 'update_at', type: 'number'}, {name: 'invite_id', type: 'string'}, ], }, [TEAM_CHANNEL_HISTORY]: { name: TEAM_CHANNEL_HISTORY, unsafeSql: undefined, columns: { channel_ids: {name: 'channel_ids', type: 'string'}, }, columnArray: [ {name: 'channel_ids', type: 'string'}, ], }, [TEAM_MEMBERSHIP]: { name: TEAM_MEMBERSHIP, unsafeSql: undefined, columns: { team_id: {name: 'team_id', type: 'string', isIndexed: true}, user_id: {name: 'user_id', type: 'string', isIndexed: true}, scheme_admin: {name: 'scheme_admin', type: 'boolean'}, }, columnArray: [ {name: 'team_id', type: 'string', isIndexed: true}, {name: 'user_id', type: 'string', isIndexed: true}, {name: 'scheme_admin', type: 'boolean'}, ], }, [TEAM_SEARCH_HISTORY]: { name: TEAM_SEARCH_HISTORY, unsafeSql: undefined, columns: { created_at: {name: 'created_at', type: 'number'}, display_term: {name: 'display_term', type: 'string'}, team_id: {name: 'team_id', type: 'string', isIndexed: true}, term: {name: 'term', type: 'string'}, }, columnArray: [ {name: 'created_at', type: 'number'}, {name: 'display_term', type: 'string'}, {name: 'team_id', type: 'string', isIndexed: true}, {name: 'term', type: 'string'}, ], }, [THREAD]: { name: THREAD, unsafeSql: undefined, columns: { is_following: {name: 'is_following', type: 'boolean'}, last_reply_at: {name: 'last_reply_at', type: 'number'}, last_viewed_at: {name: 'last_viewed_at', type: 'number'}, reply_count: {name: 'reply_count', type: 'number'}, unread_mentions: {name: 'unread_mentions', type: 'number'}, unread_replies: {name: 'unread_replies', type: 'number'}, viewed_at: {name: 'viewed_at', type: 'number'}, last_fetched_at: {name: 'last_fetched_at', type: 'number', isIndexed: true}, }, columnArray: [ {name: 'is_following', type: 'boolean'}, {name: 'last_reply_at', type: 'number'}, {name: 'last_viewed_at', type: 'number'}, {name: 'reply_count', type: 'number'}, {name: 'unread_mentions', type: 'number'}, {name: 'unread_replies', type: 'number'}, {name: 'viewed_at', type: 'number'}, {name: 'last_fetched_at', type: 'number', isIndexed: true}, ], }, [THREAD_PARTICIPANT]: { name: THREAD_PARTICIPANT, unsafeSql: undefined, columns: { thread_id: {name: 'thread_id', type: 'string', isIndexed: true}, user_id: {name: 'user_id', type: 'string', isIndexed: true}, }, columnArray: [ {name: 'thread_id', type: 'string', isIndexed: true}, {name: 'user_id', type: 'string', isIndexed: true}, ], }, [THREADS_IN_TEAM]: { name: THREADS_IN_TEAM, unsafeSql: undefined, columns: { team_id: {name: 'team_id', type: 'string', isIndexed: true}, thread_id: {name: 'thread_id', type: 'string', isIndexed: true}, }, columnArray: [ {name: 'team_id', type: 'string', isIndexed: true}, {name: 'thread_id', type: 'string', isIndexed: true}, ], }, [TEAM_THREADS_SYNC]: { name: TEAM_THREADS_SYNC, unsafeSql: undefined, columns: { earliest: {name: 'earliest', type: 'number'}, latest: {name: 'latest', type: 'number'}, }, columnArray: [ {name: 'earliest', type: 'number'}, {name: 'latest', type: 'number'}, ], }, [USER]: { name: USER, unsafeSql: undefined, columns: { auth_service: {name: 'auth_service', type: 'string'}, delete_at: {name: 'delete_at', type: 'number'}, email: {name: 'email', type: 'string'}, first_name: {name: 'first_name', type: 'string'}, is_bot: {name: 'is_bot', type: 'boolean'}, is_guest: {name: 'is_guest', type: 'boolean'}, last_name: {name: 'last_name', type: 'string'}, last_picture_update: {name: 'last_picture_update', type: 'number'}, locale: {name: 'locale', type: 'string'}, nickname: {name: 'nickname', type: 'string'}, notify_props: {name: 'notify_props', type: 'string'}, position: {name: 'position', type: 'string'}, props: {name: 'props', type: 'string'}, remote_id: {name: 'remote_id', type: 'string', isOptional: true}, roles: {name: 'roles', type: 'string'}, status: {name: 'status', type: 'string'}, timezone: {name: 'timezone', type: 'string'}, update_at: {name: 'update_at', type: 'number'}, username: {name: 'username', type: 'string'}, terms_of_service_create_at: {name: 'terms_of_service_create_at', type: 'number'}, terms_of_service_id: {name: 'terms_of_service_id', type: 'string'}, }, columnArray: [ {name: 'auth_service', type: 'string'}, {name: 'delete_at', type: 'number'}, {name: 'email', type: 'string'}, {name: 'first_name', type: 'string'}, {name: 'is_bot', type: 'boolean'}, {name: 'is_guest', type: 'boolean'}, {name: 'last_name', type: 'string'}, {name: 'last_picture_update', type: 'number'}, {name: 'locale', type: 'string'}, {name: 'nickname', type: 'string'}, {name: 'notify_props', type: 'string'}, {name: 'position', type: 'string'}, {name: 'props', type: 'string'}, {name: 'remote_id', type: 'string', isOptional: true}, {name: 'roles', type: 'string'}, {name: 'status', type: 'string'}, {name: 'timezone', type: 'string'}, {name: 'update_at', type: 'number'}, {name: 'username', type: 'string'}, {name: 'terms_of_service_id', type: 'string'}, {name: 'terms_of_service_create_at', type: 'number'}, ], }, }, }); }); });