mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2025-05-12 17:04:57 +00:00
* Migrate to NG17 * [ci:force] - fixed deps * [ci:force] - fixed build for testing 1 * Fixed build for all the packages * [ci:force] - fixing lint * [ci:force] - Fixed lint * AAE-26163 Fix infinite loop when authentication error event occured (#10272) * AAE-26163 Logout user after 3 login attempts failed, avoiding infinite loop when an authentication error occured, like when a user machine clock is significantly out of sync * AAE-26163 Wait to discovery document to be loaded and user not authenticated to perform a ssoLogin, logout user if login fails after 3 attempts * AAE-26163 Fix missed id_token_hint invoking logout when a login error occured due to a clock significantly out of sync * AAE-26163 Add fake observable to unit test * AAE-26163 Show oauth event logs if showDebugInformation is enabled, remove auth items if access token is not valid * AAE-26163 Improve tryLogin error message * AAE-26163 Check if token has expired to fix case when user access the application after the token is expired and with a clock significantly out of sync * AAE-26163 Test logout when clock is out of sync * AAE-26163 Create a service to check if local machine time is out of sync * AAE-26163 Update oauthErrorEvent$ and combinedOAuthErrorsStream$ to return errors * AAE-26163 Output error within combined oauth error event subscription * AAE-26163 Fix lint problems * AAE-26163 Logout user when token refresh error happens for the second time, if the token is not refreshed properly after first refresh error * AAE-26163 Logout user once an oauth error event occur due to clock out of sync * AAE-26163 Fix retry login error message if the OAuthErrorEvent doesn t return reason * AAE-26163 Fix the issue where the logout API call is canceled by the authorize call when login fails due to clock synchronization problems, causing an infinite loop. * remove console.log * AAE-26163 Fix retry login error message if the OAuthErrorEvent reason is an empty object * Cherry picked commit from oidc and run fix lint * [MIGRATION] - fixed build and lint * [MIGRATION] - Added injectionContext to avoid error NG0203 for unit tests * [MIGRATION] - Moving mocha to jest * [MIGRATION] - Fixing failing migrated tests * [MIGRATION] - Migrating to Jest - working but some tests fails * Trying to fix js-api unit tests * Removing testing lib to sync with develop * Fixed two excluded unit tests * Removed unused project parts * Removed unused project parts * Reduced tserrors on building storybook * Fixed sonarqube errors * Removing temporarily eslint rule from publishing * [MIGRATION] - Fixed lint * [MIGRATION] - Fixed type * [MIGRATION] - Rebased * [MIGRATION] - Readded removed action * [MIGRATION] - Checking deps * [MIGRATION] - updated lock * [ACS-9052] manage versions close button is too low (#10466) * [ci:force] - Fixed lint * [ACS-9052] Fixed close button in version manager position * [ACS-9052] Reverted unwanted changes --------- Co-authored-by: VitoAlbano <vito.albano.123@gmail.com> * [MIGRATION] - fixed storybook builds * [MIGRATION] - Checking if now eslint is releasable * [MIGRATION] - Changing the building executor for eslint-rules * Readded rule for peer deps * Fixed wrong rule * [ACS-9075] Fixed incorrect buttons labels color (#10489) * Update package.json * Fix ACA pipeline * [ACS-9084] Fixed incorrect color for notification bell icon (#10513) * Change dialog label padding * [AAE-26767] - Fixed lint * [AAE-26767] - Fixed lint * updated dependencies * AAE-30733 Fix incorrect alignment of icons in permission list header * [MIGRATION] - sync package-lock * [MIGRATION] - Fixed package on core lib * [MIGRATION] - Removed unused lock * Fixed licence * [MIGRATION] - sync lock file * [MIGRATION] - fixed lint issues * [ACS-9271][ACA] Login page input labels are cut if the input is not empty (#10637) * AAE-31453 Override card-view-textitem readonly color --------- Co-authored-by: Amedeo Lepore <amedeo.lepore@hyland.com> Co-authored-by: Ehsan Rezaei <ehsan.rezaei@hyland.com> Co-authored-by: AleksanderSklorz <115619721+AleksanderSklorz@users.noreply.github.com> Co-authored-by: DominikIwanek <dominik.iwanek@hyland.com> Co-authored-by: swapnil-verma-gl <92505353+swapnil-verma-gl@users.noreply.github.com> Co-authored-by: Wojciech Duda <69160975+wojd0@users.noreply.github.com> Co-authored-by: dominikiwanekhyland <141320833+dominikiwanekhyland@users.noreply.github.com>
324 lines
11 KiB
TypeScript
324 lines
11 KiB
TypeScript
/*!
|
|
* @license
|
|
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
import assert from 'assert';
|
|
import { EcmAuthMock, UploadMock } from './mockObjects';
|
|
import { createReadStream } from 'fs';
|
|
import { join } from 'path';
|
|
import { UploadApi, AlfrescoApi } from '../src';
|
|
|
|
describe('Upload', () => {
|
|
let authResponseMock: EcmAuthMock;
|
|
let uploadMock: UploadMock;
|
|
let alfrescoJsApi: AlfrescoApi;
|
|
let uploadApi: UploadApi;
|
|
|
|
const createTestFileStream = (fileName: string) => createReadStream(join(__dirname, 'mockObjects/assets', fileName));
|
|
|
|
beforeEach(async () => {
|
|
const hostEcm = 'https://127.0.0.1:8080';
|
|
|
|
authResponseMock = new EcmAuthMock(hostEcm);
|
|
uploadMock = new UploadMock(hostEcm);
|
|
|
|
authResponseMock.get201Response();
|
|
alfrescoJsApi = new AlfrescoApi({
|
|
hostEcm
|
|
});
|
|
|
|
uploadApi = new UploadApi(alfrescoJsApi);
|
|
|
|
await alfrescoJsApi.login('admin', 'admin');
|
|
});
|
|
|
|
describe('Upload File', () => {
|
|
it('upload file should return 200 if is all ok', async () => {
|
|
uploadMock.get201CreationFile();
|
|
|
|
const file = createTestFileStream('testFile.txt');
|
|
|
|
const data = await uploadApi.uploadFile(file);
|
|
assert.equal(data.entry.isFile, true);
|
|
assert.equal(data.entry.name, 'testFile.txt');
|
|
});
|
|
|
|
it('upload file should get 409 if new name clashes with an existing file in the current parent folder', (done) => {
|
|
uploadMock.get409CreationFileNewNameClashes();
|
|
|
|
const file = createTestFileStream('testFile.txt');
|
|
|
|
uploadApi.uploadFile(file).catch((error: any) => {
|
|
assert.equal(error.status, 409);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('upload file should get 200 and rename if the new name clashes with an existing file in the current parent folder and autorename is true', async () => {
|
|
uploadMock.get201CreationFileAutoRename();
|
|
|
|
const file = createTestFileStream('testFile.txt');
|
|
|
|
const data = await uploadApi.uploadFile(file, null, null, null, { autoRename: true });
|
|
|
|
assert.equal(data.entry.isFile, true);
|
|
assert.equal(data.entry.name, 'testFile-2.txt');
|
|
});
|
|
|
|
it('Abort should stop the file file upload', (done) => {
|
|
const file = createTestFileStream('testFile.txt');
|
|
|
|
const promise: any = uploadApi.uploadFile(file, null, null, null, { autoRename: true });
|
|
promise.once('abort', () => {
|
|
done();
|
|
});
|
|
|
|
promise.abort();
|
|
});
|
|
});
|
|
|
|
describe('Events', () => {
|
|
it('Upload should fire done event at the end of an upload', (done) => {
|
|
uploadMock.get201CreationFile();
|
|
|
|
const file = createTestFileStream('testFile.txt');
|
|
|
|
const uploadPromise: any = uploadApi.uploadFile(file);
|
|
|
|
uploadPromise.catch(() => {});
|
|
uploadPromise.on('success', () => {
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('Upload should fire error event if something go wrong', (done) => {
|
|
uploadMock.get409CreationFileNewNameClashes();
|
|
|
|
const file = createTestFileStream('testFile.txt');
|
|
|
|
const uploadPromise: any = uploadApi.uploadFile(file);
|
|
uploadPromise.catch(() => {});
|
|
uploadPromise.on('error', () => {
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('Upload should fire unauthorized event if get 401', (done) => {
|
|
uploadMock.get401Response();
|
|
|
|
const file = createTestFileStream('testFile.txt');
|
|
|
|
const uploadPromise: any = uploadApi.uploadFile(file);
|
|
|
|
uploadPromise.catch(() => {});
|
|
uploadPromise.on('unauthorized', () => {
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('Upload should fire progress event during the upload', (done) => {
|
|
uploadMock.get201CreationFile();
|
|
|
|
const file = createTestFileStream('testFile.txt');
|
|
const uploadPromise: any = uploadApi.uploadFile(file);
|
|
|
|
uploadPromise.once('progress', () => done());
|
|
});
|
|
|
|
it('Multiple Upload should fire progress events on the right promise during the upload', (done) => {
|
|
const file = createTestFileStream('testFile.txt');
|
|
const fileTwo = createTestFileStream('testFile2.txt');
|
|
|
|
let progressOneOk = false;
|
|
let progressTwoOk = false;
|
|
|
|
const promiseProgressOne = new Promise((resolve) => {
|
|
uploadMock.get201CreationFile();
|
|
|
|
const promise: any = uploadApi.uploadFile(file);
|
|
promise.once('success', () => {
|
|
progressOneOk = true;
|
|
resolve('Resolving');
|
|
});
|
|
});
|
|
|
|
const promiseProgressTwo = new Promise((resolve) => {
|
|
uploadMock.get201CreationFile();
|
|
|
|
const promise: any = uploadApi.uploadFile(fileTwo);
|
|
promise.once('success', () => {
|
|
progressTwoOk = true;
|
|
resolve('Resolving');
|
|
});
|
|
});
|
|
|
|
Promise.all([promiseProgressOne, promiseProgressTwo]).then(() => {
|
|
assert.equal(progressOneOk, true);
|
|
assert.equal(progressTwoOk, true);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('Multiple Upload should fire error events on the right promise during the upload', (done) => {
|
|
const file = createTestFileStream('testFile.txt');
|
|
const fileTwo = createTestFileStream('testFile2.txt');
|
|
|
|
let errorOneOk = false;
|
|
let errorTwoOk = false;
|
|
|
|
const promiseErrorOne = new Promise((resolve) => {
|
|
uploadMock.get201CreationFile();
|
|
|
|
const uploadPromise: any = uploadApi.uploadFile(file);
|
|
uploadPromise.catch(() => {});
|
|
uploadPromise.once('success', () => {
|
|
errorOneOk = true;
|
|
resolve('Resolving');
|
|
});
|
|
});
|
|
|
|
const promiseErrorTwo = new Promise((resolve) => {
|
|
uploadMock.get201CreationFile();
|
|
|
|
const uploadPromise: any = uploadApi.uploadFile(fileTwo);
|
|
uploadPromise.catch(() => {});
|
|
uploadPromise.once('success', () => {
|
|
errorTwoOk = true;
|
|
resolve('Resolving');
|
|
});
|
|
});
|
|
|
|
Promise.all([promiseErrorOne, promiseErrorTwo]).then(() => {
|
|
assert.equal(errorOneOk, true);
|
|
assert.equal(errorTwoOk, true);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('Multiple Upload should fire success events on the right promise during the upload', (done) => {
|
|
const file = createTestFileStream('testFile.txt');
|
|
const fileTwo = createTestFileStream('testFile2.txt');
|
|
|
|
let successOneOk = false;
|
|
let successTwoOk = false;
|
|
|
|
const promiseSuccessOne = new Promise((resolve) => {
|
|
uploadMock.get201CreationFile();
|
|
|
|
const uploadPromiseOne: any = uploadApi.uploadFile(file);
|
|
uploadPromiseOne.catch(() => {});
|
|
uploadPromiseOne.once('success', () => {
|
|
successOneOk = true;
|
|
resolve('Resolving');
|
|
});
|
|
});
|
|
|
|
const promiseSuccessTwo = new Promise((resolve) => {
|
|
uploadMock.get201CreationFile();
|
|
|
|
const uploadPromiseTwo: any = uploadApi.uploadFile(fileTwo);
|
|
uploadPromiseTwo.catch(() => {});
|
|
uploadPromiseTwo.once('success', () => {
|
|
successTwoOk = true;
|
|
resolve('Resolving');
|
|
});
|
|
});
|
|
|
|
Promise.all([promiseSuccessOne, promiseSuccessTwo]).then(() => {
|
|
assert.equal(successOneOk, true);
|
|
assert.equal(successTwoOk, true);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('Multiple Upload should resolve the correct promise', (done) => {
|
|
const file = createTestFileStream('testFile.txt');
|
|
const fileTwo = createTestFileStream('testFile2.txt');
|
|
|
|
let resolveOneOk = false;
|
|
let resolveTwoOk = false;
|
|
|
|
uploadMock.get201CreationFile();
|
|
|
|
const p1 = uploadApi.uploadFile(file).then(() => {
|
|
resolveOneOk = true;
|
|
});
|
|
|
|
uploadMock.get201CreationFile();
|
|
|
|
const p2 = uploadApi.uploadFile(fileTwo).then(() => {
|
|
resolveTwoOk = true;
|
|
});
|
|
|
|
Promise.all([p1, p2]).then(() => {
|
|
assert.equal(resolveOneOk, true);
|
|
assert.equal(resolveTwoOk, true);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('Multiple Upload should reject the correct promise', (done) => {
|
|
const file = createTestFileStream('testFile.txt');
|
|
const fileTwo = createTestFileStream('testFile2.txt');
|
|
|
|
let rejectOneOk = false;
|
|
let rejectTwoOk = false;
|
|
|
|
uploadMock.get409CreationFileNewNameClashes();
|
|
|
|
const p1 = uploadApi.uploadFile(file).then(null, () => {
|
|
rejectOneOk = true;
|
|
});
|
|
|
|
uploadMock.get409CreationFileNewNameClashes();
|
|
|
|
const p2 = uploadApi.uploadFile(fileTwo).then(null, () => {
|
|
rejectTwoOk = true;
|
|
});
|
|
|
|
Promise.all([p1, p2]).then(() => {
|
|
assert.equal(rejectOneOk, true);
|
|
assert.equal(rejectTwoOk, true);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('Is possible use chain events', (done) => {
|
|
const file = createTestFileStream('testFile.txt');
|
|
|
|
uploadMock.get401Response();
|
|
|
|
let promiseProgressOne = {};
|
|
let promiseProgressTwo = {};
|
|
|
|
const uploadPromise: any = uploadApi.uploadFile(file);
|
|
uploadPromise.catch(() => {});
|
|
|
|
uploadPromise
|
|
.once('error', () => {
|
|
promiseProgressOne = Promise.resolve('Resolving');
|
|
})
|
|
.once('unauthorized', () => {
|
|
promiseProgressTwo = Promise.resolve('Resolving');
|
|
});
|
|
|
|
Promise.all([promiseProgressOne, promiseProgressTwo]).then(() => {
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
});
|