anonymous-student
Version:
Anonymous student is used to retrieve and save information from our website users.
203 lines (159 loc) • 7.59 kB
text/typescript
import { IEventAggregationService } from '@studyportals/event-aggregation-service-interface';
import { ITokenBasedSessionService, SessionServiceReadyEvent } from '@studyportals/student-interfaces';
import { StudentField } from '@studyportals/studentdomain';
import { suite, test } from '@testdeck/mocha';
import * as Moq from 'typemoq';
import { Actor } from '../../../interfaces';
import { Deferred } from '../../../src/domain/deferred';
import { OfflineStudentRepositoryState } from '../../../src/domain/states/offline-student-repository-state';
import { OnlineStudentRepositoryState } from '../../../src/domain/states/online-student-repository-state';
import { PendingStudentRepositoryState } from '../../../src/domain/states/pending-student-repository-state';
import { StudentRepository } from '../../../src/domain/student-repository';
class PendingStudentRepositoryStateTest {
private testInstanceMock: Moq.IMock<PendingStudentRepositoryState>;
private eventAggregationServiceMock: Moq.IMock<IEventAggregationService>;
private sessionServiceMock: Moq.IMock<ITokenBasedSessionService>;
private studentRepositoryMock: Moq.IMock<StudentRepository>;
private lockMock: Moq.IMock<Deferred>;
private offlineStudentRepositoryStateMock: Moq.IMock<OfflineStudentRepositoryState>;
private onlineStudentRepositoryStateMock: Moq.IMock<OnlineStudentRepositoryState>;
private get onlineStudentRepositoryState(): OnlineStudentRepositoryState {
return this.onlineStudentRepositoryStateMock.object;
}
private get offlineStudentRepositoryState(): OfflineStudentRepositoryState {
return this.offlineStudentRepositoryStateMock.object;
}
private get lock(): Deferred {
return this.lockMock.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 testInstance(): PendingStudentRepositoryState {
return this.testInstanceMock.object;
}
public before(): void {
this.testInstanceMock = Moq.Mock.ofType(PendingStudentRepositoryState);
this.testInstanceMock.callBase = true;
this.eventAggregationServiceMock = Moq.Mock.ofType<IEventAggregationService>();
this.sessionServiceMock = Moq.Mock.ofType<ITokenBasedSessionService>();
this.studentRepositoryMock = Moq.Mock.ofType<StudentRepository>();
this.lockMock = Moq.Mock.ofType<Deferred>();
this.offlineStudentRepositoryStateMock = Moq.Mock.ofType<OfflineStudentRepositoryState>();
this.onlineStudentRepositoryStateMock = Moq.Mock.ofType<OnlineStudentRepositoryState>();
this.testInstanceMock
.setup((x) => x['lock'])
.returns(() => this.lock);
this.testInstanceMock
.setup((x) => x['studentRepository'])
.returns(() => this.studentRepository);
this.testInstanceMock
.setup((x) => x['sessionService'])
.returns(() => this.sessionService);
this.testInstanceMock
.setup((x) => x['eventAggregationService'])
.returns(() => this.eventAggregationService);
this.studentRepositoryMock
.setup((x) => x['offlineState'])
.returns(() => this.offlineStudentRepositoryState);
this.studentRepositoryMock
.setup((x) => x['onlineState'])
.returns(() => this.onlineStudentRepositoryState);
}
public notify_Should_Call_onSesionServiceReady_When_Called(): void {
// given
const providedSessionService = 'potato' as any;
this.testInstanceMock.setup((x) => x['onSessionServiceReady'](Moq.It.isAny()));
const providedEvent = new SessionServiceReadyEvent(providedSessionService);
// when
this.testInstance.notify(providedEvent);
// then
this.testInstanceMock.verify((x) => x['onSessionServiceReady'](providedEvent.sessionService), Moq.Times.once());
}
public async onSessionServiceReady_Should_Switch_State_To_Online_Sync_Offline_When_Session_Is_Not_Null(): Promise<void> {
// given
const providedSessionService = { getSession: () => 'something' as any } as any;
// when
await this.testInstance['onSessionServiceReady'](providedSessionService);
// then
this.studentRepositoryMock.verify((x) => x.updateState(this.onlineStudentRepositoryState), Moq.Times.once());
this.lockMock.verify((x) => x.open(), Moq.Times.once());
this.offlineStudentRepositoryStateMock.verify((x) => x.syncData(), Moq.Times.once());
}
public async onSessionServiceReady_Should_Switch_State_To_Offline_When_Session_Is_Null(): Promise<void> {
// given
const providedSessionService = { getSession: () => null } as any;
// when
await this.testInstance['onSessionServiceReady'](providedSessionService);
// then
this.studentRepositoryMock.verify((x) => x.updateState(this.offlineStudentRepositoryState), Moq.Times.once());
this.lockMock.verify((x) => x.open(), Moq.Times.once());
}
public async setStudentData_Should_Await_Till_Lock_Opens_To_Call_State_When_Lock_Is_Closed(): Promise<void> {
// given
this.testInstance['state'] = this.offlineStudentRepositoryState;
const expectedStudentData = 'hello I am student data' as any;
const expectedActor = Actor.AUTOMATION;
this.lockMock.setup((x) => x.untilOpen()).returns(
async () => { return; },
);
// when
await this.testInstance.setStudentData(expectedStudentData, expectedActor);
// then
this.lockMock.verify((x) => x.untilOpen(), Moq.Times.once());
this.offlineStudentRepositoryStateMock.verify((x) => x.setStudentData(expectedStudentData, expectedActor), Moq.Times.once());
}
public async getStudentData_Should_Await_Till_Lock_Opens_To_Call_State_When_Lock_Is_Closed(): Promise<void> {
// given
this.testInstance['state'] = this.offlineStudentRepositoryState;
const providedStudentData = 'hello I am student data' as any;
this.lockMock.setup((x) => x.untilOpen()).returns(
async () => { return; },
);
// when
await this.testInstance.getStudentData(providedStudentData);
// then
this.lockMock.verify((x) => x.untilOpen(), Moq.Times.once());
this.offlineStudentRepositoryStateMock.verify((x) => x.getStudentData(providedStudentData), Moq.Times.once());
}
public async addToCollection_Should_Await_Till_Lock_Opens_To_Call_State_When_Lock_Is_Closed(): Promise<void> {
// given
this.testInstance['state'] = this.offlineStudentRepositoryState;
const providedDisciplines = 'hello I am disciplines' as any;
this.lockMock.setup((x) => x.untilOpen()).returns(
async () => { return; },
);
// when
await this.testInstance.addToCollection(StudentField.DISCIPLINES, providedDisciplines);
// then
this.lockMock.verify((x) => x.untilOpen(), Moq.Times.once());
this.offlineStudentRepositoryStateMock.verify((x) => x.addToCollection(StudentField.DISCIPLINES, providedDisciplines), Moq.Times.once());
}
public async removeFromCollection_Should_Await_Till_Lock_Opens_To_Call_State_When_Lock_Is_Closed(): Promise<void> {
// given
this.testInstance['state'] = this.offlineStudentRepositoryState;
const providedDisciplines = 'hello I am disciplines' as any;
this.lockMock.setup((x) => x.untilOpen()).returns(
async () => { return; },
);
// when
await this.testInstance.removeFromCollection(StudentField.DISCIPLINES, providedDisciplines);
// then
this.lockMock.verify((x) => x.untilOpen(), Moq.Times.once());
this.offlineStudentRepositoryStateMock.verify((x) => x.removeFromCollection(StudentField.DISCIPLINES, providedDisciplines), Moq.Times.once());
}
}