123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- /**
- * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
- * SPDX-FileCopyrightText: 2015 ownCloud, Inc.
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
- describe('OCA.Sharing external tests', function() {
- var plugin;
- var urlQueryStub;
- var promptDialogStub;
- var confirmDialogStub;
- function dummyShowDialog() {
- var deferred = $.Deferred();
- deferred.resolve();
- return deferred.promise();
- }
- beforeEach(function() {
- plugin = OCA.Sharing.ExternalShareDialogPlugin;
- urlQueryStub = sinon.stub(OC.Util.History, 'parseUrlQuery');
- confirmDialogStub = sinon.stub(OC.dialogs, 'confirm').callsFake(dummyShowDialog);
- promptDialogStub = sinon.stub(OC.dialogs, 'prompt').callsFake(dummyShowDialog);
- plugin.filesApp = {
- fileList: {
- reload: sinon.stub()
- }
- };
- });
- afterEach(function() {
- urlQueryStub.restore();
- confirmDialogStub.restore();
- promptDialogStub.restore();
- plugin = null;
- });
- describe('confirmation dialog from URL', function() {
- var testShare;
- /**
- * Checks that the server call's query matches what is
- * expected.
- *
- * @param {Object} expectedQuery expected query params
- */
- function checkRequest(expectedQuery) {
- var request = fakeServer.requests[0];
- var query = OC.parseQueryString(request.requestBody);
- expect(request.method).toEqual('POST');
- expect(query).toEqual(expectedQuery);
- request.respond(
- 200,
- {'Content-Type': 'application/json'},
- JSON.stringify({status: 'success'})
- );
- expect(plugin.filesApp.fileList.reload.calledOnce).toEqual(true);
- }
- beforeEach(function() {
- testShare = {
- remote: 'http://example.com/owncloud',
- token: 'abcdefg',
- owner: 'theowner',
- ownerDisplayName: 'The Generous Owner',
- name: 'the share name'
- };
- });
- it('does nothing when no share was passed in URL', function() {
- urlQueryStub.returns({});
- plugin.processIncomingShareFromUrl();
- expect(promptDialogStub.notCalled).toEqual(true);
- expect(confirmDialogStub.notCalled).toEqual(true);
- expect(fakeServer.requests.length).toEqual(0);
- });
- it('sends share info to server on confirm', function() {
- urlQueryStub.returns(testShare);
- plugin.processIncomingShareFromUrl();
- expect(promptDialogStub.notCalled).toEqual(true);
- expect(confirmDialogStub.calledOnce).toEqual(true);
- confirmDialogStub.getCall(0).args[2](true);
- expect(fakeServer.requests.length).toEqual(1);
- checkRequest({
- remote: 'http://example.com/owncloud',
- token: 'abcdefg',
- owner: 'theowner',
- ownerDisplayName: 'The Generous Owner',
- name: 'the share name',
- password: ''
- });
- });
- it('sends share info with password to server on confirm', function() {
- testShare = _.extend(testShare, {protected: 1});
- urlQueryStub.returns(testShare);
- plugin.processIncomingShareFromUrl();
- expect(promptDialogStub.calledOnce).toEqual(true);
- expect(confirmDialogStub.notCalled).toEqual(true);
- promptDialogStub.getCall(0).args[2](true, 'thepassword');
- expect(fakeServer.requests.length).toEqual(1);
- checkRequest({
- remote: 'http://example.com/owncloud',
- token: 'abcdefg',
- owner: 'theowner',
- ownerDisplayName: 'The Generous Owner',
- name: 'the share name',
- password: 'thepassword'
- });
- });
- it('does not send share info on cancel', function() {
- urlQueryStub.returns(testShare);
- plugin.processIncomingShareFromUrl();
- expect(promptDialogStub.notCalled).toEqual(true);
- expect(confirmDialogStub.calledOnce).toEqual(true);
- confirmDialogStub.getCall(0).args[2](false);
- expect(fakeServer.requests.length).toEqual(0);
- });
- });
- describe('show dialog for each share to confirm', function() {
- var testShare;
- /**
- * Call processSharesToConfirm() and make the fake server
- * return the passed response.
- *
- * @param {Array} response list of shares to process
- */
- function processShares(response) {
- plugin.processSharesToConfirm();
- expect(fakeServer.requests.length).toEqual(1);
- var req = fakeServer.requests[0];
- expect(req.method).toEqual('GET');
- expect(req.url).toEqual(OC.getRootPath() + '/index.php/apps/files_sharing/api/externalShares');
- req.respond(
- 200,
- {'Content-Type': 'application/json'},
- JSON.stringify(response)
- );
- }
- beforeEach(function() {
- testShare = {
- id: 123,
- remote: 'http://example.com/owncloud',
- token: 'abcdefg',
- owner: 'theowner',
- ownerDisplayName: 'The Generous Owner',
- name: 'the share name'
- };
- });
- it('does not show any dialog if no shares to confirm', function() {
- processShares([]);
- expect(confirmDialogStub.notCalled).toEqual(true);
- expect(promptDialogStub.notCalled).toEqual(true);
- });
- it('sends accept info to server on confirm', function() {
- processShares([testShare]);
- expect(promptDialogStub.notCalled).toEqual(true);
- expect(confirmDialogStub.calledOnce).toEqual(true);
- confirmDialogStub.getCall(0).args[2](true);
- expect(fakeServer.requests.length).toEqual(2);
- var request = fakeServer.requests[1];
- var query = OC.parseQueryString(request.requestBody);
- expect(request.method).toEqual('POST');
- expect(query).toEqual({id: '123'});
- expect(request.url).toEqual(
- OC.getRootPath() + '/index.php/apps/files_sharing/api/externalShares'
- );
- expect(plugin.filesApp.fileList.reload.notCalled).toEqual(true);
- request.respond(
- 200,
- {'Content-Type': 'application/json'},
- JSON.stringify({status: 'success'})
- );
- expect(plugin.filesApp.fileList.reload.calledOnce).toEqual(true);
- });
- it('sends delete info to server on cancel', function() {
- processShares([testShare]);
- expect(promptDialogStub.notCalled).toEqual(true);
- expect(confirmDialogStub.calledOnce).toEqual(true);
- confirmDialogStub.getCall(0).args[2](false);
- expect(fakeServer.requests.length).toEqual(2);
- var request = fakeServer.requests[1];
- expect(request.method).toEqual('DELETE');
- expect(request.url).toEqual(
- OC.getRootPath() + '/index.php/apps/files_sharing/api/externalShares/123'
- );
- expect(plugin.filesApp.fileList.reload.notCalled).toEqual(true);
- request.respond(
- 200,
- {'Content-Type': 'application/json'},
- JSON.stringify({status: 'success'})
- );
- expect(plugin.filesApp.fileList.reload.notCalled).toEqual(true);
- });
- xit('shows another dialog when multiple shares need to be accepted', function() {
- // TODO: enable this test when fixing multiple dialogs issue / confirm loop
- var testShare2 = _.extend({}, testShare);
- testShare2.id = 256;
- processShares([testShare, testShare2]);
- // confirm first one
- expect(confirmDialogStub.calledOnce).toEqual(true);
- confirmDialogStub.getCall(0).args[2](true);
- // next dialog not shown yet
- expect(confirmDialogStub.calledOnce);
- // respond to the first accept request
- fakeServer.requests[1].respond(
- 200,
- {'Content-Type': 'application/json'},
- JSON.stringify({status: 'success'})
- );
- // don't reload yet, there are other shares to confirm
- expect(plugin.filesApp.fileList.reload.notCalled).toEqual(true);
- // cancel second share
- expect(confirmDialogStub.calledTwice).toEqual(true);
- confirmDialogStub.getCall(1).args[2](true);
- // reload only called at the very end
- expect(plugin.filesApp.fileList.reload.calledOnce).toEqual(true);
- });
- });
- });
|