import { deleteRoom, forwardRoom, leaveRoom, removedRoom, subscribeRoom, unsubscribeRoom } from '../actions/room';
import { ERoomType } from '../definitions/ERoomType';
import { mockedStore } from './mockedStore';
import { initialState } from './room';

describe('test room reducer', () => {
	it('should return initial state', () => {
		const state = mockedStore.getState().room;
		expect(state).toEqual(initialState);
	});

	it('should return modified store after subscribeRoom', () => {
		mockedStore.dispatch(subscribeRoom('GENERAL'));
		const state = mockedStore.getState().room;
		expect(state.rooms).toEqual(['GENERAL']);
	});

	it('should return empty store after remove unsubscribeRoom', () => {
		mockedStore.dispatch(unsubscribeRoom('GENERAL'));
		const state = mockedStore.getState().room;
		expect(state.rooms).toEqual([]);
	});

	it('should return initial state after leaveRoom', () => {
		mockedStore.dispatch(leaveRoom(ERoomType.c, { rid: ERoomType.c }));
		const { rid, isDeleting } = mockedStore.getState().room;
		expect(rid).toEqual(ERoomType.c);
		expect(isDeleting).toEqual(true);
	});

	it('should return initial state after deleteRoom', () => {
		mockedStore.dispatch(deleteRoom(ERoomType.l, { rid: ERoomType.l }));
		const { rid, isDeleting } = mockedStore.getState().room;
		expect(rid).toEqual(ERoomType.l);
		expect(isDeleting).toEqual(true);
	});

	it('should return initial state after forwardRoom', () => {
		const transferData = { roomId: 'FORWARDING' };
		mockedStore.dispatch(forwardRoom('FORWARDING', transferData));
		const { rid, isDeleting } = mockedStore.getState().room;
		expect(rid).toEqual('FORWARDING');
		expect(isDeleting).toEqual(true);
	});

	it('should return loading after call removedRoom', () => {
		mockedStore.dispatch(removedRoom());
		const { isDeleting } = mockedStore.getState().room;
		expect(isDeleting).toEqual(false);
	});
});
