diff --git a/LISENCE b/LICENSE similarity index 100% rename from LISENCE rename to LICENSE diff --git a/README.md b/README.md index 5f92bfc69915f72e0489979f5f6c05ba73bb4006..58b8742eba6d37e075cb6fe592b8cb2473e3d01a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,45 @@ [](https://opensource.org/licenses/MIT) - -# IQB Testcenter +# Testcenter Frontend 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* diff --git a/e2e/src/app.e2e-spec.ts b/e2e/src/app.e2e-spec.ts index 985b0d8fa9db0e869600f8af8a7c98a78a00e5ca..d98bef60c0a68cc58765b07394d637ec4d249947 100644 --- a/e2e/src/app.e2e-spec.ts +++ b/e2e/src/app.e2e-spec.ts @@ -1,14 +1,9 @@ -import { AppPage } from './app.po'; +import LoginPage from './app.po'; -describe('workspace-project App', () => { - let page: AppPage; - - beforeEach(() => { - page = new AppPage(); - }); - - it('should display welcome message', () => { - page.navigateTo(); - expect(page.getParagraphText()).toEqual('Welcome to itc-ng!'); +describe('Testcenter Frontend', () => { + it('should display title texts', async () => { + await LoginPage.navigateTo(); + await expect(LoginPage.getFirstCardTitle()).toEqual('Anmelden'); + await expect(LoginPage.getSecondCardTitle()).toEqual('IQB-Testcenter'); }); }); diff --git a/e2e/src/app.po.ts b/e2e/src/app.po.ts index 82ea75ba504ab2726e4bd08d89e69e99b7a711ba..4adb244fdb6b925aab1d97e70ca17d712515df56 100644 --- a/e2e/src/app.po.ts +++ b/e2e/src/app.po.ts @@ -1,11 +1,15 @@ import { browser, by, element } from 'protractor'; -export class AppPage { - navigateTo() { - return browser.get('/'); +export default class LoginPage { + static navigateTo(): Promise<void> { + return browser.get(browser.baseUrl) as Promise<any>; } - getParagraphText() { - return element(by.css('app-root h1')).getText(); + static async getFirstCardTitle(): Promise<string> { + 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(); } } diff --git a/package-lock.json b/package-lock.json index bf838f19f6b9c2ec4ccd901ffa6b1f485c73531c..15a5bde563374bc44b144ed10b9488a20e3528f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6761,9 +6761,9 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" }, "lodash.clonedeep": { "version": "4.5.0", @@ -7765,9 +7765,9 @@ } }, "npm-registry-fetch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.3.tgz", - "integrity": "sha512-WGvUx0lkKFhu9MbiGFuT9nG2NpfQ+4dCJwRwwtK2HK5izJEvwDxMeUyqbuMS7N/OkpVCqDorV6rO5E4V9F8lJw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.5.tgz", + "integrity": "sha512-yQ0/U4fYpCCqmueB2g8sc+89ckQ3eXpmU4+Yi2j5o/r0WkKvE2+Y0tK3DEILAtn2UaQTkjTHxIXe2/CSdit+/Q==", "dev": true, "requires": { "JSONStream": "^1.3.4", @@ -7780,9 +7780,9 @@ }, "dependencies": { "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true } } @@ -13883,9 +13883,9 @@ } }, "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, "when": { diff --git a/src/app/sys-check/backend.service.ts b/src/app/sys-check/backend.service.ts index ced27bc09e2f8668e06697738948d9acbc5121db..12d00969d7db247fee5620ae422a6cfadc08b30b 100644 --- a/src/app/sys-check/backend.service.ts +++ b/src/app/sys-check/backend.service.ts @@ -23,7 +23,6 @@ export class BackendService { public getCheckConfigData(workspaceId: number, sysCheckName: string): Observable<CheckConfig> { - return this.http .get<CheckConfig>(this.serverUrl + `workspace/${workspaceId}/sys-check/${sysCheckName}`) .pipe( @@ -36,14 +35,12 @@ export class BackendService { public saveReport(workspaceId: number, sysCheckName: string, sysCheckReport: SysCheckReport): Observable<Boolean|ServerError> { - 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> { - const startingTime = BackendService.getMostPreciseTimestampBrowserCanProvide(); return this.http .get<UnitAndPlayerContainer>(this.serverUrl + `workspace/${workspaceId}/sys-check/${sysCheckName}/unit-and-player`) @@ -57,7 +54,6 @@ export class BackendService { public benchmarkDownloadRequest(requestedDownloadSize: number): Promise<NetworkRequestTestResult> { - const serverUrl = this.serverUrl; const cacheKiller = '&uid=' + (new Date().getTime()); const testResult: NetworkRequestTestResult = { @@ -69,7 +65,6 @@ export class BackendService { }; return new Promise(function(resolve) { - const xhr = new XMLHttpRequest(); xhr.open('GET', serverUrl + `speed-test/random-package/${requestedDownloadSize}${cacheKiller}`, true); @@ -109,7 +104,6 @@ export class BackendService { public benchmarkUploadRequest(requestedUploadSize: number): Promise<NetworkRequestTestResult> { - const serverUrl = this.serverUrl; const randomContent = BackendService.generateRandomContent(requestedUploadSize); const testResult: NetworkRequestTestResult = { @@ -176,7 +170,6 @@ export class BackendService { // tslint:disable-next-line:member-ordering private static getMostPreciseTimestampBrowserCanProvide(): number { - if (typeof performance !== 'undefined') { const timeOrigin = (typeof performance.timeOrigin !== 'undefined') ? performance.timeOrigin : performance.timing.navigationStart; if (typeof timeOrigin !== 'undefined' && timeOrigin) { @@ -189,7 +182,6 @@ export class BackendService { // tslint:disable-next-line:member-ordering private static generateRandomContent(length: number): string { - const base64Characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcefghijklmnopqrstuvwxyz0123456789+/'; let randomString = ''; for (let i = 1; i <= length; i++) {