Remove mocha and jasmine-ajax dependencies (#11813)

This commit is contained in:
Denys Vuika
2026-04-16 10:20:49 +01:00
committed by GitHub
parent b550712160
commit 6fc8dda887
31 changed files with 926 additions and 1807 deletions
@@ -26,8 +26,6 @@ import { FileModel, FileUploadStatus } from '../../common/models/file.model';
import { AlfrescoApiService } from '../../services';
import { AlfrescoApiServiceMock } from '../../mock';
declare let jasmine: any;
describe('UploadService', () => {
let service: UploadService;
let appConfigService: AppConfigService;
@@ -35,6 +33,40 @@ describe('UploadService', () => {
const mockProductInfo = new BehaviorSubject<RepositoryInfo>(null);
const createMockPromiseWithEvents = (responseData?: any, shouldError = false) => {
const handlers: any = {};
const promise: any = new Promise((resolve, reject) => {
setTimeout(() => {
if (shouldError) {
if (handlers.error) {
handlers.error(responseData || { status: 404 });
}
reject(responseData);
} else {
if (handlers.success) {
handlers.success(responseData);
}
resolve(responseData);
}
}, 0);
});
promise.on = (event: string, handler: (data?: any) => void) => {
handlers[event] = handler;
return promise;
};
promise.abort = () => {
if (handlers.abort) {
handlers.abort();
}
};
promise.catch = (handler: (error: any) => void) => Promise.prototype.catch.call(promise, handler);
return promise;
};
beforeEach(() => {
TestBed.configureTestingModule({
imports: [],
@@ -75,14 +107,9 @@ describe('UploadService', () => {
uploadFileSpy = spyOn(service.uploadApi, 'uploadFile').and.callThrough();
jasmine.Ajax.install();
mockProductInfo.next({ status: { isThumbnailGenerationEnabled: true } } as RepositoryInfo);
});
afterEach(() => {
jasmine.Ajax.uninstall();
});
it('should return an empty queue if no elements are added', () => {
expect(service.getQueue().length).toEqual(0);
});
@@ -153,53 +180,49 @@ describe('UploadService', () => {
it('should make XHR done request after the file is added in the queue', (done) => {
const emitter = new EventEmitter();
const mockResponse = { entry: { id: 'node-id' } };
const mockPromise = createMockPromiseWithEvents(mockResponse);
uploadFileSpy.and.returnValue(mockPromise);
const emitterDisposable = emitter.subscribe((e) => {
expect(e.value).toBe('File uploaded');
expect(e.value).toEqual(mockResponse);
emitterDisposable.unsubscribe();
done();
});
const fileFake = new FileModel({ name: 'fake-name', size: 10 } as File, { parentId: '-root-', path: 'fake-dir' });
service.addToQueue(fileFake);
service.uploadFilesInTheQueue(emitter);
const request = jasmine.Ajax.requests.mostRecent();
expect(request.url).toBe(
'http://localhost:9876/ecm/alfresco/api/-default-/public/alfresco/versions/1/nodes/-root-/children?autoRename=true&include=allowableOperations'
);
expect(request.method).toBe('POST');
jasmine.Ajax.requests.mostRecent().respondWith({
status: 200,
contentType: 'text/plain',
responseText: 'File uploaded'
});
expect(uploadFileSpy).toHaveBeenCalled();
});
it('should make XHR error request after an error occur', (done) => {
const emitter = new EventEmitter();
const mockPromise = createMockPromiseWithEvents({ status: 404 }, true);
uploadFileSpy.and.returnValue(mockPromise);
const emitterDisposable = emitter.subscribe((e) => {
expect(e.value).toBe('Error file uploaded');
emitterDisposable.unsubscribe();
done();
});
const fileFake = new FileModel({ name: 'fake-name', size: 10 } as File, { parentId: '-root-' });
service.addToQueue(fileFake);
service.uploadFilesInTheQueue(null, emitter);
expect(jasmine.Ajax.requests.mostRecent().url).toBe(
'http://localhost:9876/ecm/alfresco/api/-default-/public/alfresco/versions/1/nodes/-root-/children?autoRename=true&include=allowableOperations'
);
jasmine.Ajax.requests.mostRecent().respondWith({
status: 404,
contentType: 'text/plain',
responseText: 'Error file uploaded'
});
expect(uploadFileSpy).toHaveBeenCalled();
});
it('should abort file only if it is safe to abort', (done) => {
const emitter = new EventEmitter();
const mockPromise = createMockPromiseWithEvents();
uploadFileSpy.and.returnValue(mockPromise);
const emitterDisposable = emitter.subscribe((event) => {
expect(event.value).toEqual('File aborted');
emitterDisposable.unsubscribe();
@@ -217,22 +240,18 @@ describe('UploadService', () => {
it('should let file complete and then delete node if it is not safe to abort', (done) => {
const emitter = new EventEmitter();
const mockUploadResponse = { entry: { id: 'myNodeId' } };
const mockPromise = createMockPromiseWithEvents(mockUploadResponse);
uploadFileSpy.and.returnValue(mockPromise);
const deleteNodeSpy = spyOn(service.nodesApi, 'deleteNode').and.returnValue(Promise.resolve());
const emitterDisposable = emitter.subscribe((event) => {
expect(event.value).toEqual('File deleted');
emitterDisposable.unsubscribe();
const deleteRequest = jasmine.Ajax.requests.mostRecent();
expect(deleteRequest.url).toBe(
'http://localhost:9876/ecm/alfresco/api/-default-/public/alfresco/versions/1/nodes/myNodeId?permanent=true'
);
expect(deleteRequest.method).toBe('DELETE');
jasmine.Ajax.requests.mostRecent().respondWith({
status: 200,
contentType: 'text/plain',
responseText: 'File deleted'
});
done();
if (event.value === 'File deleted') {
expect(deleteNodeSpy).toHaveBeenCalledWith('myNodeId', { permanent: true });
emitterDisposable.unsubscribe();
done();
}
});
const fileFake = new FileModel({ name: 'fake-name', size: 10 } as File);
@@ -241,41 +260,30 @@ describe('UploadService', () => {
const file = service.getQueue();
service.cancelUpload(...file);
const request = jasmine.Ajax.requests.mostRecent();
expect(request.url).toBe(
'http://localhost:9876/ecm/alfresco/api/-default-/public/alfresco/versions/1/nodes/-root-/children?autoRename=true&include=allowableOperations'
);
expect(request.method).toBe('POST');
jasmine.Ajax.requests.mostRecent().respondWith({
status: 200,
contentType: 'json',
responseText: {
entry: {
id: 'myNodeId'
}
}
});
});
it('should delete node version when cancelling the upload of the new file version', (done) => {
const emitter = new EventEmitter();
const mockUploadResponse = {
entry: {
id: 'myNodeId',
properties: {
'cm:versionLabel': '1.1'
}
}
};
const mockPromise = createMockPromiseWithEvents(mockUploadResponse);
spyOn(service.nodesApi, 'updateNodeContent').and.returnValue(mockPromise);
const deleteVersionSpy = spyOn(service.versionsApi, 'deleteVersion').and.returnValue(Promise.resolve());
const emitterDisposable = emitter.subscribe((event) => {
expect(event.value).toEqual('File deleted');
emitterDisposable.unsubscribe();
const deleteRequest = jasmine.Ajax.requests.mostRecent();
expect(deleteRequest.url).toBe('http://localhost:9876/ecm/alfresco/api/-default-/public/alfresco/versions/1/nodes/myNodeId/versions/1.1');
expect(deleteRequest.method).toBe('DELETE');
jasmine.Ajax.requests.mostRecent().respondWith({
status: 200,
contentType: 'text/plain',
responseText: 'File deleted'
});
done();
if (event.value === 'File deleted') {
expect(deleteVersionSpy).toHaveBeenCalledWith('myNodeId', '1.1');
emitterDisposable.unsubscribe();
done();
}
});
const fileFake = new FileModel({ name: 'fake-name', size: 10 } as File, null, 'fakeId');
@@ -284,23 +292,6 @@ describe('UploadService', () => {
const file = service.getQueue();
service.cancelUpload(...file);
const request = jasmine.Ajax.requests.mostRecent();
expect(request.url).toContain('ecm/alfresco/api/-default-/public/alfresco/versions/1/nodes/fakeId/content?include=allowableOperations');
expect(request.method).toBe('PUT');
jasmine.Ajax.requests.mostRecent().respondWith({
status: 200,
contentType: 'json',
responseText: {
entry: {
id: 'myNodeId',
properties: {
'cm:versionLabel': '1.1'
}
}
}
});
});
it('If newVersion is set, name should be a param', () => {
@@ -331,26 +322,27 @@ describe('UploadService', () => {
it('should use custom root folder ID given to the service', (done) => {
const emitter = new EventEmitter();
const mockResponse = { entry: { id: 'node-id' } };
const mockPromise = createMockPromiseWithEvents(mockResponse);
uploadFileSpy.and.returnValue(mockPromise);
const emitterDisposable = emitter.subscribe((e) => {
expect(e.value).toBe('File uploaded');
expect(e.value).toEqual(mockResponse);
emitterDisposable.unsubscribe();
done();
});
const filesFake = new FileModel({ name: 'fake-file-name', size: 10 } as File, { parentId: '123', path: 'fake-dir' });
service.addToQueue(filesFake);
service.uploadFilesInTheQueue(emitter);
const request = jasmine.Ajax.requests.mostRecent();
expect(request.url).toContain(
'/ecm/alfresco/api/-default-/public/alfresco/versions/1/nodes/123/children?autoRename=true&include=allowableOperations'
expect(uploadFileSpy).toHaveBeenCalledWith(
jasmine.objectContaining({ name: 'fake-file-name' }),
'fake-dir',
'123',
jasmine.any(Object),
jasmine.any(Object)
);
expect(request.method).toBe('POST');
jasmine.Ajax.requests.mostRecent().respondWith({
status: 200,
contentType: 'text/plain',
responseText: 'File uploaded'
});
});
describe('versioningEnabled', () => {
@@ -437,6 +429,13 @@ describe('UploadService', () => {
});
it('should start downloading the next one if a file of the list is aborted', (done) => {
const mockResponse1 = { entry: { id: 'node-id-1' } };
const mockResponse2 = { entry: { id: 'node-id-2' } };
const mockPromise1 = createMockPromiseWithEvents(mockResponse1);
const mockPromise2 = createMockPromiseWithEvents(mockResponse2);
uploadFileSpy.and.returnValues(mockPromise1, mockPromise2);
service.fileUploadAborted.subscribe((e) => {
expect(e).not.toBeNull();
});
@@ -23,8 +23,6 @@ import { CustomResourcesService } from './custom-resources.service';
import { NodesApiService } from '../../common';
import { provideApiTesting } from '../../testing/providers';
declare let jasmine: any;
describe('DocumentListService', () => {
let service: DocumentListService;
let customResourcesService: CustomResourcesService;
@@ -79,7 +77,6 @@ describe('DocumentListService', () => {
service = TestBed.inject(DocumentListService);
customResourcesService = TestBed.inject(CustomResourcesService);
nodesApiService = TestBed.inject(NodesApiService);
jasmine.Ajax.install();
});
it('should emit resetSelection$ when resetSelection is called', (done) => {
@@ -96,11 +93,9 @@ describe('DocumentListService', () => {
service.reload();
});
afterEach(() => {
jasmine.Ajax.uninstall();
});
it('should return the folder info', fakeAsync(() => {
spyOn(service.nodes, 'listNodeChildren').and.returnValue(Promise.resolve(fakeFolder as any));
service.getFolder('/fake-root/fake-name').subscribe((res) => {
expect(res).toBeDefined();
expect(res.list).toBeDefined();
@@ -109,12 +104,6 @@ describe('DocumentListService', () => {
expect(res.list.entries[0].entry.isFolder).toBeTruthy();
expect(res.list.entries[0].entry.name).toEqual('fake-name');
});
jasmine.Ajax.requests.mostRecent().respondWith({
status: 200,
contentType: 'json',
responseText: fakeFolder
});
}));
it('should use rootFolderId provided in options', () => {
@@ -204,35 +193,33 @@ describe('DocumentListService', () => {
});
});
it('should delete the folder', fakeAsync(() => {
service.deleteNode('fake-id').subscribe((res) => {
expect(res).toBe('');
});
it('should delete the folder', (done) => {
spyOn(service.nodes, 'deleteNode').and.returnValue(Promise.resolve() as any);
jasmine.Ajax.requests.mostRecent().respondWith({
status: 204,
contentType: 'json'
service.deleteNode('fake-id').subscribe(() => {
expect(service.nodes.deleteNode).toHaveBeenCalledWith('fake-id');
done();
});
}));
});
it('should copy a node', (done) => {
service.copyNode('node-id', 'parent-id').subscribe(() => done());
const mockResponse = { entry: { id: 'copied-node-id' } } as NodeEntry;
const copyNodeSpy = spyOn(service.nodes, 'copyNode').and.returnValue(Promise.resolve(mockResponse));
expect(jasmine.Ajax.requests.mostRecent().method).toBe('POST');
expect(jasmine.Ajax.requests.mostRecent().url).toContain('/nodes/node-id/copy');
expect(jasmine.Ajax.requests.mostRecent().params).toEqual(JSON.stringify({ targetParentId: 'parent-id' }));
jasmine.Ajax.requests.mostRecent().respondWith({ status: 200, contentType: 'json' });
service.copyNode('node-id', 'parent-id').subscribe(() => {
expect(copyNodeSpy).toHaveBeenCalledWith('node-id', { targetParentId: 'parent-id' });
done();
});
});
it('should move a node', (done) => {
service.moveNode('node-id', 'parent-id').subscribe(() => done());
const mockResponse = { entry: { id: 'moved-node-id' } } as NodeEntry;
const moveNodeSpy = spyOn(service.nodes, 'moveNode').and.returnValue(Promise.resolve(mockResponse));
expect(jasmine.Ajax.requests.mostRecent().method).toBe('POST');
expect(jasmine.Ajax.requests.mostRecent().url).toContain('/nodes/node-id/move');
expect(jasmine.Ajax.requests.mostRecent().params).toEqual(JSON.stringify({ targetParentId: 'parent-id' }));
jasmine.Ajax.requests.mostRecent().respondWith({ status: 200, contentType: 'json' });
service.moveNode('node-id', 'parent-id').subscribe(() => {
expect(moveNodeSpy).toHaveBeenCalledWith('node-id', { targetParentId: 'parent-id' });
done();
});
});
it('should call isCustomSource from customResourcesService when isCustomSourceService is called', () => {
@@ -25,8 +25,6 @@ import { EMPTY, of } from 'rxjs';
import { AlfrescoApiService } from '../../services';
import { AlfrescoApiServiceMock } from '../../mock';
declare let jasmine: any;
describe('NodeCommentsService', () => {
let service: NodeCommentsService;
@@ -40,15 +38,12 @@ describe('NodeCommentsService', () => {
]
});
service = TestBed.inject(NodeCommentsService);
jasmine.Ajax.install();
});
afterEach(() => {
jasmine.Ajax.uninstall();
});
describe('Node comments', () => {
it('should add a comment node ', (done) => {
spyOn(service.commentsApi, 'createComment').and.returnValue(Promise.resolve(fakeContentComment as any));
service.add('999', 'fake-comment-message').subscribe((res: CommentModel) => {
expect(res).toBeDefined();
expect(res.id).not.toEqual(null);
@@ -59,15 +54,11 @@ describe('NodeCommentsService', () => {
expect(res.createdBy.lastName).toEqual('lastName');
done();
});
jasmine.Ajax.requests.mostRecent().respondWith({
status: 200,
contentType: 'application/json',
responseText: JSON.stringify(fakeContentComment)
});
});
it('should return the nodes comments ', (done) => {
spyOn(service.commentsApi, 'listComments').and.returnValue(Promise.resolve(fakeContentComments as any));
service.get('999').subscribe((res: CommentModel[]) => {
expect(res).toBeDefined();
expect(res.length).toEqual(2);
@@ -75,12 +66,6 @@ describe('NodeCommentsService', () => {
expect(res[1].message).toEqual('fake-message-2');
done();
});
jasmine.Ajax.requests.mostRecent().respondWith({
status: 200,
contentType: 'application/json',
responseText: JSON.stringify(fakeContentComments)
});
});
it('should return avatar image URL for given userId', () => {