mattermost-mobile/test/service/actions/channels.test.js
enahum 81526fbb09 Channel drawer (#154)
* Channel list drawer
* Get channels by category
* Fix and connect websocket
* Fix Select first team using the team members

* create loadMe and fix login actions to loads the teams

* Add android back button handler for the channel drawer

* Channel drawer styling and functionality

* Mark channel as viewed and fixed reset unread counts

* Unread above/below indicators

* Improve performance replacing ScrollView with ListView

* Fix unread indicators

* Addressing review feedback
2017-01-03 19:49:28 -03:00

398 lines
15 KiB
JavaScript

// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
import assert from 'assert';
import * as Actions from 'service/actions/channels';
import {getProfilesByIds} from 'service/actions/users';
import Client from 'service/client';
import configureStore from 'app/store';
import {RequestStatus} from 'service/constants';
import TestHelper from 'test/test_helper';
describe('Actions.Channels', () => {
let store;
let secondChannel;
before(async () => {
await TestHelper.initBasic(Client);
});
beforeEach(() => {
store = configureStore();
});
after(async () => {
await TestHelper.basicClient.logout();
});
it('selectChannel', async () => {
const channelId = TestHelper.generateId();
await Actions.selectChannel(channelId)(store.dispatch, store.getState);
const state = store.getState();
assert.equal(state.entities.channels.currentId, channelId);
});
it('createChannel', async () => {
const channel = {
team_id: TestHelper.basicTeam.id,
name: 'redux-test',
display_name: 'Redux Test',
purpose: 'This is to test redux',
header: 'MM with Redux',
type: 'O'
};
await Actions.createChannel(channel, TestHelper.basicUser.id)(store.dispatch, store.getState);
const createRequest = store.getState().requests.channels.createChannel;
const membersRequest = store.getState().requests.channels.myMembers;
if (createRequest.status === RequestStatus.FAILURE) {
throw new Error(JSON.stringify(createRequest.error));
} else if (membersRequest.status === RequestStatus.FAILURE) {
throw new Error(JSON.stringify(membersRequest.error));
}
const {channels, myMembers} = store.getState().entities.channels;
const channelsCount = Object.keys(channels).length;
const membersCount = Object.keys(myMembers).length;
assert.ok(channels);
assert.ok(myMembers);
assert.ok(channels[Object.keys(myMembers)[0]]);
assert.ok(myMembers[Object.keys(channels)[0]]);
assert.equal(myMembers[Object.keys(channels)[0]].user_id, TestHelper.basicUser.id);
assert.equal(channelsCount, membersCount);
assert.equal(channelsCount, 1);
assert.equal(membersCount, 1);
});
it('createDirectChannel', async () => {
const user = await TestHelper.basicClient.createUserWithInvite(
TestHelper.fakeUser(),
null,
null,
TestHelper.basicTeam.invite_id
);
await getProfilesByIds([user.id])(store.dispatch, store.getState);
await Actions.createDirectChannel(TestHelper.basicTeam.id, TestHelper.basicUser.id, user.id)(store.dispatch, store.getState);
const createRequest = store.getState().requests.channels.createChannel;
if (createRequest.status === RequestStatus.FAILURE) {
throw new Error(createRequest.error);
}
const state = store.getState();
const {channels, myMembers} = state.entities.channels;
const profiles = state.entities.users.profiles;
const preferences = state.entities.preferences.myPreferences;
const channelsCount = Object.keys(channels).length;
const membersCount = Object.keys(myMembers).length;
assert.ok(channels, 'channels is empty');
assert.ok(myMembers, 'members is empty');
assert.ok(profiles[user.id], 'profiles does not have userId');
assert.ok(Object.keys(preferences).length, 'preferences is empty');
assert.ok(channels[Object.keys(myMembers)[0]], 'channels should have the member');
assert.ok(myMembers[Object.keys(channels)[0]], 'members should belong to channel');
assert.equal(myMembers[Object.keys(channels)[0]].user_id, TestHelper.basicUser.id);
assert.equal(channelsCount, membersCount);
assert.equal(channels[Object.keys(channels)[0]].type, 'D');
assert.equal(channelsCount, 1);
assert.equal(membersCount, 1);
});
it('updateChannel', async () => {
const channel = {
...TestHelper.basicChannel,
purpose: 'This is to test redux',
header: 'MM with Redux'
};
await Actions.updateChannel(channel)(store.dispatch, store.getState);
const updateRequest = store.getState().requests.channels.updateChannel;
if (updateRequest.status === RequestStatus.FAILURE) {
throw new Error(JSON.stringify(updateRequest.error));
}
const {channels} = store.getState().entities.channels;
const channelId = Object.keys(channels)[0];
assert.ok(channelId);
assert.ok(channels[channelId]);
assert.strictEqual(channels[channelId].header, 'MM with Redux');
});
it('getChannel', async () => {
await Actions.getChannel(TestHelper.basicTeam.id, TestHelper.basicChannel.id)(store.dispatch, store.getState);
const channelRequest = store.getState().requests.channels.getChannel;
if (channelRequest.status === RequestStatus.FAILURE) {
throw new Error(JSON.stringify(channelRequest.error));
}
const {channels, myMembers} = store.getState().entities.channels;
assert.ok(channels[TestHelper.basicChannel.id]);
assert.ok(myMembers[TestHelper.basicChannel.id]);
});
it('fetchMyChannelsAndMembers', async () => {
await Actions.fetchMyChannelsAndMembers(TestHelper.basicTeam.id)(store.dispatch, store.getState);
const channelsRequest = store.getState().requests.channels.getChannels;
const membersRequest = store.getState().requests.channels.myMembers;
if (channelsRequest.status === RequestStatus.FAILURE) {
throw new Error(JSON.stringify(channelsRequest.error));
} else if (membersRequest.status === RequestStatus.FAILURE) {
throw new Error(JSON.stringify(membersRequest.error));
}
const {channels, myMembers} = store.getState().entities.channels;
assert.ok(channels);
assert.ok(myMembers);
assert.ok(channels[Object.keys(myMembers)[0]]);
assert.ok(myMembers[Object.keys(channels)[0]]);
assert.equal(Object.keys(channels).length, Object.keys(myMembers).length);
});
it('updateChannelNotifyProps', async () => {
const notifyProps = {
mark_unread: 'mention',
desktop: 'none'
};
await Actions.fetchMyChannelsAndMembers(TestHelper.basicTeam.id)(store.dispatch, store.getState);
await Actions.updateChannelNotifyProps(
TestHelper.basicUser.id,
TestHelper.basicTeam.id,
TestHelper.basicChannel.id,
notifyProps)(store.dispatch, store.getState);
const updateRequest = store.getState().requests.channels.updateChannelNotifyProps;
if (updateRequest.status === RequestStatus.FAILURE) {
throw new Error(JSON.stringify(updateRequest.error));
}
const members = store.getState().entities.channels.myMembers;
const member = members[TestHelper.basicChannel.id];
assert.ok(member);
assert.equal(member.notify_props.mark_unread, 'mention');
assert.equal(member.notify_props.desktop, 'none');
});
it('leaveChannel', async () => {
await Actions.leaveChannel(
TestHelper.basicTeam.id,
TestHelper.basicChannel.id
)(store.dispatch, store.getState);
const leaveRequest = store.getState().requests.channels.leaveChannel;
if (leaveRequest.status === RequestStatus.FAILURE) {
throw new Error(JSON.stringify(leaveRequest.error));
}
const {channels, myMembers} = store.getState().entities.channels;
assert.ifError(channels[TestHelper.basicChannel.id]);
assert.ifError(myMembers[TestHelper.basicChannel.id]);
});
it('joinChannel', async () => {
await Actions.joinChannel(
TestHelper.basicUser.id,
TestHelper.basicTeam.id,
TestHelper.basicChannel.id
)(store.dispatch, store.getState);
const joinRequest = store.getState().requests.channels.joinChannel;
if (joinRequest.status === RequestStatus.FAILURE) {
throw new Error(JSON.stringify(joinRequest.error));
}
const {channels, myMembers} = store.getState().entities.channels;
assert.ok(channels[TestHelper.basicChannel.id]);
assert.ok(myMembers[TestHelper.basicChannel.id]);
});
it('joinChannelByName', async () => {
const secondClient = TestHelper.createClient();
const user = await TestHelper.basicClient.createUserWithInvite(
TestHelper.fakeUser(),
null,
null,
TestHelper.basicTeam.invite_id
);
await secondClient.login(user.email, 'password1');
secondChannel = await secondClient.createChannel(
TestHelper.fakeChannel(TestHelper.basicTeam.id));
await Actions.joinChannel(
TestHelper.basicUser.id,
TestHelper.basicTeam.id,
null,
secondChannel.name
)(store.dispatch, store.getState);
const joinRequest = store.getState().requests.channels.joinChannel;
if (joinRequest.status === RequestStatus.FAILURE) {
throw new Error(JSON.stringify(joinRequest.error));
}
const {channels, myMembers} = store.getState().entities.channels;
assert.ok(channels[secondChannel.id]);
assert.ok(myMembers[secondChannel.id]);
});
it('deleteChannel', async () => {
await Actions.fetchMyChannelsAndMembers(TestHelper.basicTeam.id)(store.dispatch, store.getState);
await Actions.deleteChannel(
TestHelper.basicTeam.id,
secondChannel.id
)(store.dispatch, store.getState);
const deleteRequest = store.getState().requests.channels.deleteChannel;
if (deleteRequest.status === RequestStatus.FAILURE) {
throw new Error(JSON.stringify(deleteRequest.error));
}
const {channels, myMembers} = store.getState().entities.channels;
assert.ifError(channels[secondChannel.id]);
assert.ifError(myMembers[secondChannel.id]);
});
it('viewChannel', async () => {
const userChannel = await Client.createChannel(
TestHelper.fakeChannel(TestHelper.basicTeam.id)
);
await Actions.fetchMyChannelsAndMembers(TestHelper.basicTeam.id)(store.dispatch, store.getState);
let members = store.getState().entities.channels.myMembers;
let member = members[TestHelper.basicChannel.id];
let otherMember = members[userChannel.id];
assert.ok(member);
assert.ok(otherMember);
const lastViewed = member.last_viewed_at;
await Actions.viewChannel(
TestHelper.basicTeam.id,
TestHelper.basicChannel.id,
userChannel.id
)(store.dispatch, store.getState);
const updateRequest = store.getState().requests.channels.updateLastViewedAt;
if (updateRequest.status === RequestStatus.FAILURE) {
throw new Error(JSON.stringify(updateRequest.error));
}
members = store.getState().entities.channels.myMembers;
member = members[TestHelper.basicChannel.id];
otherMember = members[userChannel.id];
assert.ok(member.last_viewed_at > lastViewed);
assert.ok(otherMember.last_viewed_at > lastViewed);
});
it('getMoreChannels', async () => {
const userClient = TestHelper.createClient();
const user = await TestHelper.basicClient.createUserWithInvite(
TestHelper.fakeUser(),
null,
null,
TestHelper.basicTeam.invite_id
);
await userClient.login(user.email, 'password1');
const userChannel = await userClient.createChannel(
TestHelper.fakeChannel(TestHelper.basicTeam.id)
);
await Actions.getMoreChannels(TestHelper.basicTeam.id, 0)(store.dispatch, store.getState);
const moreRequest = store.getState().requests.channels.getMoreChannels;
if (moreRequest.status === RequestStatus.FAILURE) {
throw new Error(JSON.stringify(moreRequest.error));
}
const {channels, myMembers} = store.getState().entities.channels;
const channel = channels[userChannel.id];
assert.ok(channel);
assert.ifError(myMembers[channel.id]);
});
it('getChannelStats', async () => {
await Actions.getChannelStats(
TestHelper.basicTeam.id,
TestHelper.basicChannel.id
)(store.dispatch, store.getState);
const statsRequest = store.getState().requests.channels.getChannelStats;
if (statsRequest.status === RequestStatus.FAILURE) {
throw new Error(JSON.stringify(statsRequest.error));
}
const {stats} = store.getState().entities.channels;
const stat = stats[TestHelper.basicChannel.id];
assert.ok(stat);
assert.equal(stat.member_count, 1);
});
it('addChannelMember', async () => {
const user = await TestHelper.basicClient.createUserWithInvite(
TestHelper.fakeUser(),
null,
null,
TestHelper.basicTeam.invite_id
);
await Actions.addChannelMember(
TestHelper.basicTeam.id,
TestHelper.basicChannel.id,
user.id
)(store.dispatch, store.getState);
const addRequest = store.getState().requests.channels.addChannelMember;
if (addRequest.status === RequestStatus.FAILURE) {
throw new Error(JSON.stringify(addRequest.error));
}
const {profilesInChannel, profilesNotInChannel} = store.getState().entities.users;
const channel = profilesInChannel[TestHelper.basicChannel.id];
const notChannel = profilesNotInChannel[TestHelper.basicChannel.id];
assert.ok(channel);
assert.ok(notChannel);
assert.ok(channel.has(user.id));
assert.ifError(notChannel.has(user.id));
});
it('removeChannelMember', async () => {
const user = await TestHelper.basicClient.createUserWithInvite(
TestHelper.fakeUser(),
null,
null,
TestHelper.basicTeam.invite_id
);
await Actions.addChannelMember(
TestHelper.basicTeam.id,
TestHelper.basicChannel.id,
user.id
)(store.dispatch, store.getState);
await Actions.removeChannelMember(
TestHelper.basicTeam.id,
TestHelper.basicChannel.id,
user.id
)(store.dispatch, store.getState);
const removeRequest = store.getState().requests.channels.removeChannelMember;
if (removeRequest.status === RequestStatus.FAILURE) {
throw new Error(JSON.stringify(removeRequest.error));
}
const {profilesInChannel, profilesNotInChannel} = store.getState().entities.users;
const channel = profilesInChannel[TestHelper.basicChannel.id];
const notChannel = profilesNotInChannel[TestHelper.basicChannel.id];
assert.ok(channel);
assert.ok(notChannel);
assert.ok(notChannel.has(user.id));
assert.ifError(channel.has(user.id));
});
});