anonymous-student
Version:
Anonymous student is used to retrieve and save information from our website users.
205 lines (157 loc) • 6.66 kB
text/typescript
import { DataStorage } from '@studyportals/data-storage/dist/classes/DataStorage';
import { StudentField } from '@studyportals/studentdomain';
import { suite, test } from '@testdeck/mocha';
import { assert } from 'chai';
import * as Moq from 'typemoq';
import { IMock } from 'typemoq/Api/IMock';
import { InterestType } from '../../interfaces/enumerations';
import { AnonymousStudentEventBroadcaster } from '../../src/infrastructure/anonymous-student-event-broadcaster';
import { LocalStudentClient } from '../../src/infrastructure/clients/local-student-client';
class LocalStudentClientTest {
protected testInstanceMock: IMock<LocalStudentClient>;
protected get testInstance(): LocalStudentClient {
return this.testInstanceMock.object;
}
protected anonymousStudentEventBroadcasterMock: IMock<AnonymousStudentEventBroadcaster>;
protected get anonymousStudentEventBroadcaster(): AnonymousStudentEventBroadcaster {
return this.anonymousStudentEventBroadcasterMock.object;
}
protected localStorageMock: IMock<DataStorage>;
protected get localStorage(): DataStorage {
return this.localStorageMock.object;
}
public before(): void {
this.testInstanceMock = Moq.Mock.ofType(LocalStudentClient);
this.testInstanceMock.callBase = true;
this.anonymousStudentEventBroadcasterMock = Moq.Mock.ofType<AnonymousStudentEventBroadcaster>();
this.localStorageMock = Moq.Mock.ofType<DataStorage>();
this.testInstanceMock
.setup((x) => x['anonymousStudentEventBroadcaster'])
.returns(() => this.anonymousStudentEventBroadcaster);
this.testInstanceMock
.setup((x) => x['localStorage'])
.returns(() => this.localStorage);
}
public async cleanUp_Should_Call_Remove_On_LocalStorage_When_Called(): Promise<void> {
// given
const givenStorageKey = 'myKey';
this.testInstanceMock.setup((x) => x['storageKey']).returns(() => givenStorageKey);
// when
await this.testInstance.cleanUp();
// then
this.localStorageMock.verify((x) => x.remove(givenStorageKey), Moq.Times.once());
}
public async getData_Should_Only_Return_Request_Fields_When_Called(): Promise<void> {
// given
const givenFields = [StudentField.BIRTH_DATE, StudentField.ACCOMPLISHMENTS];
const givenData = {
[StudentField.BIRTH_DATE]: '12-12-2020',
[StudentField.ACCOMPLISHMENTS]: 'Mate, i wasnt even born.',
};
this.testInstanceMock
.setup((x) => x['retrieveDataFromLocalStorage']())
.returns(() => givenData);
// when
const result = await this.testInstance.getData(givenFields);
// then
assert.deepEqual(result, givenData);
}
public async getData_Should_Only_Return_Request_Fields_When_Already_Saved_Fields_Are_Given(): Promise<void> {
// given
const givenFields = [StudentField.BIRTH_DATE, StudentField.ACCOMPLISHMENTS];
const givenData = {
[StudentField.BIRTH_DATE]: '12-12-2020',
};
this.testInstanceMock
.setup((x) => x['retrieveDataFromLocalStorage']())
.returns(() => givenData);
// when
const result = await this.testInstance.getData(givenFields);
// then
assert.isFalse(Object.keys(result).includes(StudentField.ACCOMPLISHMENTS));
}
public async setData_Should_Merge_Existing_AND_New_Data_When_Called_With_Data(): Promise<void> {
// given
const givenData = {[StudentField.FIRST_NAME]: 'Harry', [StudentField.LAST_NAME]: 'NonOfYourBusiness'};
const existingData = {[StudentField.FIRST_NAME]: 'Henk', [StudentField.EMAIL]: 'myEmail@email.com'};
const expectedData = {
[StudentField.EMAIL]: existingData[StudentField.EMAIL],
[StudentField.FIRST_NAME]: givenData[StudentField.FIRST_NAME],
[StudentField.LAST_NAME]: givenData[StudentField.LAST_NAME],
};
this.testInstanceMock
.setup((x) => x['retrieveDataFromLocalStorage']())
.returns(() => existingData);
this.testInstanceMock.setup((x) => x['setDataInLocalStorage'](Moq.It.isAny()));
this.testInstanceMock.setup((x) => x['broadcastChanges'](Moq.It.isAny()));
// when
await this.testInstance.setData(givenData);
// then
this.testInstanceMock.verify((x) => x['setDataInLocalStorage'](expectedData), Moq.Times.once());
}
public async setData_Should_Broadcast_Given_Changes_When_Called(): Promise<void> {
// given
const givenData = {[StudentField.FIRST_NAME]: 'Harry', [StudentField.LAST_NAME]: 'NonOfYourBusiness'};
this.testInstanceMock
.setup((x) => x['retrieveDataFromLocalStorage']())
.returns(() => {});
this.testInstanceMock.setup((x) => x['setDataInLocalStorage'](Moq.It.isAny()));
this.testInstanceMock.setup((x) => x['broadcastChanges'](Moq.It.isAny()));
// when
await this.testInstance.setData(givenData);
// then
this.testInstanceMock.verify((x) => x['broadcastChanges'](givenData), Moq.Times.once());
}
public async addToCollection_Should_Call_AddToIdList_With_Correct_Ids_And_Key_When_Called(): Promise<void> {
// given
const expectedKey = StudentField.DISCIPLINES;
const givenIds = [1, 2, 5, 6];
this.testInstanceMock.setup((x) => x['addToIdListInLocalStorage'](Moq.It.isAny(), Moq.It.isAny()));
// when
await this.testInstance.addToCollection(expectedKey, givenIds);
// then
this.testInstanceMock.verify((x) => x['addToIdListInLocalStorage'](expectedKey, givenIds), Moq.Times.once());
}
public async removeFromCollection_Should_Call_RemoveFromIdList_With_Correct_Ids_And_Key_When_Called(): Promise<void> {
// given
const expectedKey = StudentField.DISCIPLINES;
const givenIds = [1, 2, 5, 6];
this.testInstanceMock.setup((x) => x['addToIdListInLocalStorage'](Moq.It.isAny(), Moq.It.isAny()));
// when
await this.testInstance.removeFromCollection(expectedKey, givenIds);
// then
this.testInstanceMock.verify((x) => x['removeFromIdListInLocalStorage'](expectedKey, givenIds), Moq.Times.once());
}
public async retrieveDataFromLocalStorage_Should_Return_Parsed_Object_When_Retrieving_A_Saved_Stringified_Object(): Promise<void> {
// given
const givenData = {[StudentField.FIRST_NAME]: 'Henk'};
this.localStorageMock
.setup((x) => x.retrieve(Moq.It.isAny()))
.returns(() => JSON.stringify(givenData));
// when
const result = this.testInstance['retrieveDataFromLocalStorage']();
// then
assert.deepEqual(result, givenData);
}
public async retrieveDataFromLocalStorage_Should_Return_Empty_Object_When_No_Saved_Data(): Promise<void> {
// given
const givenData = undefined;
this.localStorageMock
.setup((x) => x.retrieve(Moq.It.isAny()))
.returns(() => givenData);
// when
const result = this.testInstance['retrieveDataFromLocalStorage']();
// then
assert.deepEqual(result, {});
}
}