Skip to content
Snippets Groups Projects
Commit 7990d328 authored by paf's avatar paf
Browse files

Merge branch 'master' into group-monitor

parents d75e51fb 838873e9
No related branches found
No related tags found
No related merge requests found
File moved
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square)](https://opensource.org/licenses/MIT) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square)](https://opensource.org/licenses/MIT)
# Testcenter Frontend
# IQB Testcenter
Diese Angular-Programmierung ist die clientseitige Web-Anwendung für das Online-Testen des IQB. Über diesen Weg wird die Programmierung allen Interessierten zur Verfügung gestellt. Eine Anleitung zum Installieren und Konfigurieren wird schrittweise an dieser Stelle folgen. Diese Angular-Programmierung ist die clientseitige Web-Anwendung für das Online-Testen des IQB. Über diesen Weg wird die Programmierung allen Interessierten zur Verfügung gestellt. Eine Anleitung zum Installieren und Konfigurieren wird schrittweise an dieser Stelle folgen.
***
This is the frontend of the Testcenter application. It's written in Typescript using Angular 9.
You can find the backend [here](https://github.com/iqb-berlin/testcenter-backend).
## Documentation
*TBA*
## Bug Reports
File bug reports, feature requests etc. [here](https://github.com/iqb-berlin/testcenter-frontend/issues).
## Installation
### With Docker (recommended)
Find Docker files for a complete setup of the application [here](https://github.com/iqb-berlin/testcenter-setup).
### Manual Compilation
#### Prerequisites
* node 12+
#### Compilation Steps
```
npm install
ng build --prod
```
Find compiled App in src folder and open in Browser or serve with `ng serve`.
## Tests
*TBA*
## Development
### Coding Standards
*TBA*
import { AppPage } from './app.po'; import LoginPage from './app.po';
describe('workspace-project App', () => { describe('Testcenter Frontend', () => {
let page: AppPage; it('should display title texts', async () => {
await LoginPage.navigateTo();
beforeEach(() => { await expect(LoginPage.getFirstCardTitle()).toEqual('Anmelden');
page = new AppPage(); await expect(LoginPage.getSecondCardTitle()).toEqual('IQB-Testcenter');
});
it('should display welcome message', () => {
page.navigateTo();
expect(page.getParagraphText()).toEqual('Welcome to itc-ng!');
}); });
}); });
import { browser, by, element } from 'protractor'; import { browser, by, element } from 'protractor';
export class AppPage { export default class LoginPage {
navigateTo() { static navigateTo(): Promise<void> {
return browser.get('/'); return browser.get(browser.baseUrl) as Promise<any>;
} }
getParagraphText() { static async getFirstCardTitle(): Promise<string> {
return element(by.css('app-root h1')).getText(); return element(by.css('.root-body mat-card.mat-card:nth-child(1) mat-card-title')).getText();
}
static async getSecondCardTitle(): Promise<string> {
return element(by.css('.root-body mat-card.mat-card:nth-child(2) mat-card-title')).getText();
} }
} }
...@@ -6761,9 +6761,9 @@ ...@@ -6761,9 +6761,9 @@
} }
}, },
"lodash": { "lodash": {
"version": "4.17.15", "version": "4.17.19",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ=="
}, },
"lodash.clonedeep": { "lodash.clonedeep": {
"version": "4.5.0", "version": "4.5.0",
...@@ -7765,9 +7765,9 @@ ...@@ -7765,9 +7765,9 @@
} }
}, },
"npm-registry-fetch": { "npm-registry-fetch": {
"version": "4.0.3", "version": "4.0.5",
"resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.3.tgz", "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.5.tgz",
"integrity": "sha512-WGvUx0lkKFhu9MbiGFuT9nG2NpfQ+4dCJwRwwtK2HK5izJEvwDxMeUyqbuMS7N/OkpVCqDorV6rO5E4V9F8lJw==", "integrity": "sha512-yQ0/U4fYpCCqmueB2g8sc+89ckQ3eXpmU4+Yi2j5o/r0WkKvE2+Y0tK3DEILAtn2UaQTkjTHxIXe2/CSdit+/Q==",
"dev": true, "dev": true,
"requires": { "requires": {
"JSONStream": "^1.3.4", "JSONStream": "^1.3.4",
...@@ -7780,9 +7780,9 @@ ...@@ -7780,9 +7780,9 @@
}, },
"dependencies": { "dependencies": {
"safe-buffer": { "safe-buffer": {
"version": "5.2.0", "version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"dev": true "dev": true
} }
} }
...@@ -13883,9 +13883,9 @@ ...@@ -13883,9 +13883,9 @@
} }
}, },
"websocket-extensions": { "websocket-extensions": {
"version": "0.1.3", "version": "0.1.4",
"resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
"integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
"dev": true "dev": true
}, },
"when": { "when": {
......
...@@ -23,7 +23,6 @@ export class BackendService { ...@@ -23,7 +23,6 @@ export class BackendService {
public getCheckConfigData(workspaceId: number, sysCheckName: string): Observable<CheckConfig> { public getCheckConfigData(workspaceId: number, sysCheckName: string): Observable<CheckConfig> {
return this.http return this.http
.get<CheckConfig>(this.serverUrl + `workspace/${workspaceId}/sys-check/${sysCheckName}`) .get<CheckConfig>(this.serverUrl + `workspace/${workspaceId}/sys-check/${sysCheckName}`)
.pipe( .pipe(
...@@ -36,14 +35,12 @@ export class BackendService { ...@@ -36,14 +35,12 @@ export class BackendService {
public saveReport(workspaceId: number, sysCheckName: string, sysCheckReport: SysCheckReport): Observable<Boolean|ServerError> { public saveReport(workspaceId: number, sysCheckName: string, sysCheckReport: SysCheckReport): Observable<Boolean|ServerError> {
return this.http return this.http
.put<boolean>(this.serverUrl + `workspace/${workspaceId}/sys-check/${sysCheckName}/report`, {...sysCheckReport}) .put<boolean>(this.serverUrl + `workspace/${workspaceId}/sys-check/${sysCheckName}/report`, {...sysCheckReport});
} }
public getUnitAndPlayer(workspaceId: number, sysCheckName: string): Observable<UnitAndPlayerContainer|ServerError> { public getUnitAndPlayer(workspaceId: number, sysCheckName: string): Observable<UnitAndPlayerContainer|ServerError> {
const startingTime = BackendService.getMostPreciseTimestampBrowserCanProvide(); const startingTime = BackendService.getMostPreciseTimestampBrowserCanProvide();
return this.http return this.http
.get<UnitAndPlayerContainer>(this.serverUrl + `workspace/${workspaceId}/sys-check/${sysCheckName}/unit-and-player`) .get<UnitAndPlayerContainer>(this.serverUrl + `workspace/${workspaceId}/sys-check/${sysCheckName}/unit-and-player`)
...@@ -57,7 +54,6 @@ export class BackendService { ...@@ -57,7 +54,6 @@ export class BackendService {
public benchmarkDownloadRequest(requestedDownloadSize: number): Promise<NetworkRequestTestResult> { public benchmarkDownloadRequest(requestedDownloadSize: number): Promise<NetworkRequestTestResult> {
const serverUrl = this.serverUrl; const serverUrl = this.serverUrl;
const cacheKiller = '&uid=' + (new Date().getTime()); const cacheKiller = '&uid=' + (new Date().getTime());
const testResult: NetworkRequestTestResult = { const testResult: NetworkRequestTestResult = {
...@@ -69,7 +65,6 @@ export class BackendService { ...@@ -69,7 +65,6 @@ export class BackendService {
}; };
return new Promise(function(resolve) { return new Promise(function(resolve) {
const xhr = new XMLHttpRequest(); const xhr = new XMLHttpRequest();
xhr.open('GET', serverUrl + `speed-test/random-package/${requestedDownloadSize}${cacheKiller}`, true); xhr.open('GET', serverUrl + `speed-test/random-package/${requestedDownloadSize}${cacheKiller}`, true);
...@@ -109,7 +104,6 @@ export class BackendService { ...@@ -109,7 +104,6 @@ export class BackendService {
public benchmarkUploadRequest(requestedUploadSize: number): Promise<NetworkRequestTestResult> { public benchmarkUploadRequest(requestedUploadSize: number): Promise<NetworkRequestTestResult> {
const serverUrl = this.serverUrl; const serverUrl = this.serverUrl;
const randomContent = BackendService.generateRandomContent(requestedUploadSize); const randomContent = BackendService.generateRandomContent(requestedUploadSize);
const testResult: NetworkRequestTestResult = { const testResult: NetworkRequestTestResult = {
...@@ -176,7 +170,6 @@ export class BackendService { ...@@ -176,7 +170,6 @@ export class BackendService {
// tslint:disable-next-line:member-ordering // tslint:disable-next-line:member-ordering
private static getMostPreciseTimestampBrowserCanProvide(): number { private static getMostPreciseTimestampBrowserCanProvide(): number {
if (typeof performance !== 'undefined') { if (typeof performance !== 'undefined') {
const timeOrigin = (typeof performance.timeOrigin !== 'undefined') ? performance.timeOrigin : performance.timing.navigationStart; const timeOrigin = (typeof performance.timeOrigin !== 'undefined') ? performance.timeOrigin : performance.timing.navigationStart;
if (typeof timeOrigin !== 'undefined' && timeOrigin) { if (typeof timeOrigin !== 'undefined' && timeOrigin) {
...@@ -189,7 +182,6 @@ export class BackendService { ...@@ -189,7 +182,6 @@ export class BackendService {
// tslint:disable-next-line:member-ordering // tslint:disable-next-line:member-ordering
private static generateRandomContent(length: number): string { private static generateRandomContent(length: number): string {
const base64Characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcefghijklmnopqrstuvwxyz0123456789+/'; const base64Characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcefghijklmnopqrstuvwxyz0123456789+/';
let randomString = ''; let randomString = '';
for (let i = 1; i <= length; i++) { for (let i = 1; i <= length; i++) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment