anonymous-student
Version:
Anonymous student is used to retrieve and save information from our website users.
215 lines (170 loc) • 7.74 kB
text/typescript
import { IEventAggregationService } from "@studyportals/event-aggregation-service-interface";
import { ITokenBasedSessionService, SessionCreatedEvent } from '@studyportals/student-interfaces';
import { AttendanceType, IStudent, StudentField } from '@studyportals/studentdomain';
import { suite, test } from '@testdeck/mocha';
import { assert } from 'chai';
import { AnonymousStudentEventBroadcaster } from 'src/infrastructure/anonymous-student-event-broadcaster';
import * as Moq from 'typemoq';
import { Actor, StudentRepositoryStateType } from '../../../interfaces';
import {
OfflineToOnlineSynchronizationService,
} from '../../../src/domain/services/offline-to-online-synchronization-service';
import { OfflineStudentRepositoryState } from '../../../src/domain/states/offline-student-repository-state';
import { OnlineStudentRepositoryState } from '../../../src/domain/states/online-student-repository-state';
import { StudentRepository } from '../../../src/domain/student-repository';
import { LocalStudentClient } from '../../../src/infrastructure/clients/local-student-client';
class OfflineStudentRepositoryStateTest {
private testInstance: OfflineStudentRepositoryState;
private eventAggregationServiceMock: Moq.IMock<IEventAggregationService>;
private sessionServiceMock: Moq.IMock<ITokenBasedSessionService>;
private studentRepositoryMock: Moq.IMock<StudentRepository>;
private onlineStudentRepositoryStateMock: Moq.IMock<OnlineStudentRepositoryState>;
private studentClientMock: Moq.IMock<LocalStudentClient>;
private anonymousStudentEventBroadcasterMock: Moq.IMock<AnonymousStudentEventBroadcaster>;
private offlineToOnlineSynchronizationServiceMock: Moq.IMock<OfflineToOnlineSynchronizationService>;
private get anonymousStudentEventBroadcaster(): AnonymousStudentEventBroadcaster {
return this.anonymousStudentEventBroadcasterMock.object;
}
private get studentClient(): LocalStudentClient {
return this.studentClientMock.object;
}
private get onlineStudentRepositoryState(): OnlineStudentRepositoryState {
return this.onlineStudentRepositoryStateMock.object;
}
private get studentRepository(): StudentRepository {
return this.studentRepositoryMock.object;
}
private get sessionService(): ITokenBasedSessionService {
return this.sessionServiceMock.object;
}
private get eventAggregationService(): IEventAggregationService {
return this.eventAggregationServiceMock.object;
}
private get offlineToOnlineSynchronizationService(): OfflineToOnlineSynchronizationService {
return this.offlineToOnlineSynchronizationServiceMock.object;
}
public before(): void {
this.eventAggregationServiceMock = Moq.Mock.ofType<IEventAggregationService>();
this.sessionServiceMock = Moq.Mock.ofType<ITokenBasedSessionService>();
this.studentRepositoryMock = Moq.Mock.ofType<StudentRepository>();
this.onlineStudentRepositoryStateMock = Moq.Mock.ofType<OnlineStudentRepositoryState>();
this.studentClientMock = Moq.Mock.ofType<LocalStudentClient>();
this.anonymousStudentEventBroadcasterMock = Moq.Mock.ofType<AnonymousStudentEventBroadcaster>();
this.offlineToOnlineSynchronizationServiceMock = Moq.Mock.ofType<OfflineToOnlineSynchronizationService>();
this.testInstance = new OfflineStudentRepositoryState(this.eventAggregationService, this.sessionService, this.studentRepository);
this.testInstance['studentClient'] = this.studentClient;
this.testInstance['anonymousStudentEventBroadcaster'] = this.anonymousStudentEventBroadcaster;
this.studentRepositoryMock
.setup((x) => x['offlineToOnlineSynchronizationService'])
.returns(() => this.offlineToOnlineSynchronizationService);
}
public initialize_Should_SubscribeToSessionCreatedEvent_When_Called(): void {
// given
this.eventAggregationServiceMock.setup((x) => x.subscribeTo(SessionCreatedEvent.EventType, Moq.It.isAny()));
// when
this.testInstance.initialize();
// then
this.eventAggregationServiceMock
.verify((x) => x.subscribeTo(SessionCreatedEvent.EventType, Moq.It.isAny()), Moq.Times.once());
}
public async notify_Should_Sync_And_SwitchState_And_Broadcast_When_Called(): Promise<void> {
// given
const expectedOnlineSessionState = 'myOnlineSessionState' as any;
const sessionCreatedEvent = {session: {}} as any;
this.studentRepositoryMock
.setup((x) => x.onlineState)
.returns(() => expectedOnlineSessionState);
// when
await this.testInstance.notify(sessionCreatedEvent);
// then
this.studentRepositoryMock
.verify(
(x) => x.updateState(expectedOnlineSessionState),
Moq.Times.once(),
);
this.offlineToOnlineSynchronizationServiceMock
.verify(
(x) => x.syncData(),
Moq.Times.once(),
);
this.studentClientMock
.verify(
(x) => x.cleanUp(),
Moq.Times.once(),
);
this.anonymousStudentEventBroadcasterMock
.verify(
(x) => x.broadcastStudentProfileSyncedEvent(Moq.It.isObjectWith({state: StudentRepositoryStateType.ONLINE} as any)),
Moq.Times.once(),
);
}
public async setStudentData_Should_Call_StudentClient_setData_When_Called(): Promise<void> {
// given
const expectedData: IStudent = {[StudentField.NATIONALITY_COUNTRY_ID]: 1};
this.studentClientMock.setup((x) => x.setData(Moq.It.isAny()));
// when
await this.testInstance.setStudentData(expectedData, Actor.USER);
// then
this.studentClientMock.verify((x) => x.setData(expectedData), Moq.Times.once());
}
public async setStudentData_Should_Call_StudentClient_AddToWriteHistory_When_Called(): Promise<void> {
// given
const expectedField = StudentField.CURRENCY;
const expectedActor = Actor.AUTOMATION;
const providedData: IStudent = {[expectedField]: 'EUR'};
this.studentClientMock.setup((x) => x.setData(Moq.It.isAny()));
this.studentClientMock.setup((x) => x.addToWriteHistory(Moq.It.isAny(), Moq.It.isAny()));
// when
await this.testInstance.setStudentData(providedData, expectedActor);
// then
this.studentClientMock
.verify(
(x) => x.addToWriteHistory([expectedField], expectedActor),
Moq.Times.once(),
);
}
public getStudentData_Should_Call_StudentClient_getData_When_Called(): void {
// given
this.studentClientMock.setup((x) => x.getData(Moq.It.isAny()));
// when
this.testInstance.getStudentData(Moq.It.isAny());
// then
this.studentClientMock.verify((x) => x.getData(Moq.It.isAny()), Moq.Times.once());
}
public async addToCollection_Should_Call_StudentRepository_addToCollection_When_Called(): Promise<void> {
// given
this.studentClientMock.setup((x) => x.addToCollection(Moq.It.isAny(), Moq.It.isAny()));
// when
await this.testInstance.addToCollection(StudentField.ATTENDANCE, [AttendanceType.ONLINE]);
// then
this.studentClientMock.verify((x) => x.addToCollection(Moq.It.isAny(), Moq.It.isAny()), Moq.Times.once());
}
public async removeFromCollection_Should_Call_StudentRepository_addToCollection_When_Called(): Promise<void> {
// given
this.studentClientMock.setup((x) => x.removeFromCollection(Moq.It.isAny(), Moq.It.isAny()));
// when
await this.testInstance.removeFromCollection(StudentField.INTERESTS_COUNTRIES, [1, 4, 76]);
// then
this.studentClientMock.verify((x) => x.removeFromCollection(Moq.It.isAny(), Moq.It.isAny()), Moq.Times.once());
}
public async getWriteHistory_Should_ReturnCorrectWriteHistory_When_Called(): Promise<void> {
// given
const expectedWriteHistory = 'someHistory' as any;
this.studentClientMock
.setup((x) => x.getWriteHistory())
.returns(() => expectedWriteHistory);
// when
const result = await this.testInstance.getWriteHistory();
// then
assert.equal(result, expectedWriteHistory);
}
}