Home Reference Source

src/users-new/UserRepository.spec.ts

import {WapiClient} from '@quobis/wapi-client';
import {expect} from 'chai';
import nanoid from 'nanoid';
import {TestScheduler} from 'rxjs/testing';
import sinon, {StubbedInstance, stubConstructor} from 'ts-sinon';

import {WacRequest} from '../wac-proxy/wac-stack/WacRequest';
import {PresenceService} from '../wac-proxy/wac-stack/presence/PresenceService';
import {PresenceDtoBuilder} from '../wac-proxy/wac-stack/presence/builders';
import {PresenceDto} from '../wac-proxy/wac-stack/presence/types';
import {UserService} from '../wac-proxy/wac-stack/user/UserService';

import {User} from './User';
import {UserRepository} from './UserRepository';
import {UserRole} from './UserRole';

const createUserModel = (presence: PresenceDto): User => ({
	id: presence.address.replace('wac-user:', ''),
	domain: presence.domain,
	username: presence.username,
	phone: '',
	email: '',
	alias: '',
	role: UserRole.USER,
	online: presence.online,
	activity: presence.activity,
	mood: presence.mood,
	note: presence.note,
	avatar: presence.avatar,
	displayName: presence.displayName,
});

describe('users-new/UsersRepository', () => {
	let testScheduler: TestScheduler;
	let presenceService: StubbedInstance<PresenceService>;
	let usersService: StubbedInstance<UserService>;

	beforeEach(() => {
		testScheduler = new TestScheduler((actual, expected) => {
			expect(actual).to.deep.equal(expected);
		});
		const wacRequest = stubConstructor(WacRequest, stubConstructor(WapiClient));
		presenceService = stubConstructor(PresenceService, wacRequest);
		usersService = stubConstructor(UserService, wacRequest);
	});

	afterEach(() => {
		sinon.restore();
	});

	it('should be lazily created', () => {
		new UserRepository(presenceService, usersService);
		sinon.assert.notCalled(presenceService.subscribeToPresences$);
	});

	it('should resolve a user using getUser$ method', () => {
		testScheduler.run(({expectObservable, cold, hot}) => {
			const id = nanoid();
			const presenceDto = PresenceDtoBuilder.of(id).build();
			usersService.getUser$.returns(cold('|'));
			presenceService.subscribeToPresences$.withArgs([`wac-user:${id}`]).returns(cold('a|', {a: [presenceDto]}));
			sinon.stub(presenceService, 'event$').value(hot('^ 499ms a 99ms b', {
				a: {body: {...presenceDto, online: false}},
				b: {body: {...presenceDto, activity: 'away'}},
			}));

			const userRepository = new UserRepository(presenceService, usersService);

			expectObservable(userRepository.getUser$(id)).toBe('100ms a 399ms b 99ms d', {
				a: createUserModel(presenceDto),
				b: createUserModel({...presenceDto, online: false}),
				d: createUserModel({...presenceDto, activity: 'away'}),
			});
		});
	});
});