You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

sharedfilelistSpec.js 24KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779
  1. /*
  2. * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
  3. *
  4. * This file is licensed under the Affero General Public License version 3
  5. * or later.
  6. *
  7. * See the COPYING-README file.
  8. *
  9. */
  10. describe('OCA.Sharing.FileList tests', function() {
  11. var testFiles, alertStub, notificationStub, fileList;
  12. beforeEach(function() {
  13. alertStub = sinon.stub(OC.dialogs, 'alert');
  14. notificationStub = sinon.stub(OC.Notification, 'show');
  15. // init parameters and test table elements
  16. $('#testArea').append(
  17. '<div id="app-content-container">' +
  18. // init horrible parameters
  19. '<input type="hidden" id="dir" value="/"></input>' +
  20. '<input type="hidden" id="permissions" value="31"></input>' +
  21. // dummy controls
  22. '<div id="controls">' +
  23. ' <div class="actions creatable"></div>' +
  24. ' <div class="notCreatable"></div>' +
  25. '</div>' +
  26. // dummy table
  27. // TODO: at some point this will be rendered by the fileList class itself!
  28. '<table id="filestable">' +
  29. '<thead><tr>' +
  30. '<th id="headerName" class="hidden column-name">' +
  31. '<input type="checkbox" id="select_all_files" class="select-all">' +
  32. '<a class="name columntitle" data-sort="name"><span>Name</span><span class="sort-indicator"></span></a>' +
  33. '<span class="selectedActions hidden">' +
  34. '</th>' +
  35. '<th class="hidden column-mtime">' +
  36. '<a class="columntitle" data-sort="mtime"><span class="sort-indicator"></span></a>' +
  37. '</th>' +
  38. '<th class="column-expiration">' +
  39. '<a class="columntitle"><span>Expiration date</span></a>' +
  40. '</th>' +
  41. '</tr></thead>' +
  42. '<tbody id="fileList"></tbody>' +
  43. '<tfoot></tfoot>' +
  44. '</table>' +
  45. '<div id="emptycontent">Empty content message</div>' +
  46. '</div>'
  47. );
  48. OC.Plugins.register('OCA.Files.FileList', OCA.Files.TagsPlugin);
  49. });
  50. afterEach(function() {
  51. testFiles = undefined;
  52. fileList.destroy();
  53. fileList = undefined;
  54. notificationStub.restore();
  55. alertStub.restore();
  56. });
  57. describe('loading file list for incoming shares', function() {
  58. var ocsResponse;
  59. var ocsResponseRemote;
  60. beforeEach(function() {
  61. fileList = new OCA.Sharing.FileList(
  62. $('#app-content-container'), {
  63. sharedWithUser: true
  64. }
  65. );
  66. OCA.Sharing.Util.attach(fileList);
  67. fileList.reload();
  68. /* jshint camelcase: false */
  69. ocsResponse = {
  70. ocs: {
  71. meta: {
  72. status: 'ok',
  73. statuscode: 100,
  74. message: null
  75. },
  76. data: [{
  77. id: 7,
  78. item_type: 'file',
  79. item_source: 49,
  80. item_target: '/49',
  81. file_source: 49,
  82. file_target: '/local path/local name.txt',
  83. path: 'files/something shared.txt',
  84. permissions: 31,
  85. stime: 11111,
  86. share_type: OC.Share.SHARE_TYPE_USER,
  87. share_with: 'user1',
  88. share_with_displayname: 'User One',
  89. tags: [OC.TAG_FAVORITE],
  90. mimetype: 'text/plain',
  91. uid_owner: 'user2',
  92. displayname_owner: 'User Two'
  93. }]
  94. }
  95. };
  96. /* jshint camelcase: false */
  97. ocsResponseRemote = {
  98. ocs: {
  99. meta: {
  100. status: 'ok',
  101. statuscode: 100,
  102. message: null
  103. },
  104. data: [{
  105. id: 8,
  106. remote: 'https://foo.bar/',
  107. remote_id: 42,
  108. share_token: 'abc',
  109. name: '/a.txt',
  110. owner: 'user3',
  111. user: 'user1',
  112. mountpoint: '/b.txt',
  113. mountpoint_hash: 'def',
  114. accepted: 1,
  115. mimetype: 'text/plain',
  116. mtime: 22222,
  117. permissions: 31,
  118. type: 'file',
  119. file_id: 1337
  120. }]
  121. }
  122. };
  123. });
  124. it('render file shares', function() {
  125. expect(fakeServer.requests.length).toEqual(2);
  126. expect(fakeServer.requests[0].url).toEqual(
  127. OC.linkToOCS('apps/files_sharing/api/v1') +
  128. 'shares?format=json&shared_with_me=true&include_tags=true'
  129. );
  130. expect(fakeServer.requests[1].url).toEqual(
  131. OC.linkToOCS('apps/files_sharing/api/v1') +
  132. 'remote_shares?format=json&include_tags=true'
  133. );
  134. fakeServer.requests[0].respond(
  135. 200,
  136. { 'Content-Type': 'application/json' },
  137. JSON.stringify(ocsResponse)
  138. );
  139. fakeServer.requests[1].respond(
  140. 200,
  141. { 'Content-Type': 'application/json' },
  142. JSON.stringify(ocsResponseRemote)
  143. );
  144. var $rows = fileList.$el.find('tbody tr');
  145. expect($rows.length).toEqual(2);
  146. var $tr = $rows.eq(0);
  147. expect($tr.attr('data-id')).toEqual('49');
  148. expect($tr.attr('data-type')).toEqual('file');
  149. expect($tr.attr('data-file')).toEqual('local name.txt');
  150. expect($tr.attr('data-path')).toEqual('/local path');
  151. expect($tr.attr('data-size')).not.toBeDefined();
  152. expect($tr.attr('data-permissions')).toEqual('31'); // read and delete
  153. expect($tr.attr('data-mime')).toEqual('text/plain');
  154. expect($tr.attr('data-mtime')).toEqual('11111000');
  155. expect($tr.attr('data-share-owner')).toEqual('User Two');
  156. expect($tr.attr('data-share-id')).toEqual('7');
  157. expect($tr.attr('data-favorite')).toEqual('true');
  158. expect($tr.attr('data-tags')).toEqual(OC.TAG_FAVORITE);
  159. expect($tr.find('a.name').attr('href')).toEqual(
  160. OC.webroot +
  161. '/remote.php/webdav/local%20path/local%20name.txt'
  162. );
  163. expect($tr.find('.nametext').text().trim()).toEqual('local name.txt');
  164. $tr = $rows.eq(1);
  165. expect($tr.attr('data-id')).toEqual('1337');
  166. expect($tr.attr('data-type')).toEqual('file');
  167. expect($tr.attr('data-file')).toEqual('b.txt');
  168. expect($tr.attr('data-path')).toEqual('');
  169. expect($tr.attr('data-size')).not.toBeDefined();
  170. expect(parseInt($tr.attr('data-permissions'), 10))
  171. .toEqual(OC.PERMISSION_ALL); // read and delete
  172. expect($tr.attr('data-mime')).toEqual('text/plain');
  173. expect($tr.attr('data-mtime')).toEqual('22222000');
  174. expect($tr.attr('data-share-owner')).toEqual('user3@foo.bar/');
  175. expect($tr.attr('data-share-id')).toEqual('8');
  176. expect($tr.attr('data-favorite')).not.toBeDefined();
  177. expect($tr.attr('data-tags')).toEqual('');
  178. expect($tr.find('a.name').attr('href')).toEqual(
  179. OC.webroot +
  180. '/remote.php/webdav/b.txt'
  181. );
  182. expect($tr.find('.nametext').text().trim()).toEqual('b.txt');
  183. });
  184. it('render folder shares', function() {
  185. /* jshint camelcase: false */
  186. ocsResponse.ocs.data[0] = _.extend(ocsResponse.ocs.data[0], {
  187. item_type: 'folder',
  188. file_target: '/local path/local name',
  189. path: 'files/something shared',
  190. });
  191. ocsResponseRemote.ocs.data[0] = _.extend(ocsResponseRemote.ocs.data[0], {
  192. type: 'dir',
  193. mimetype: 'httpd/unix-directory',
  194. name: '/a',
  195. mountpoint: '/b'
  196. });
  197. expect(fakeServer.requests.length).toEqual(2);
  198. expect(fakeServer.requests[0].url).toEqual(
  199. OC.linkToOCS('apps/files_sharing/api/v1') +
  200. 'shares?format=json&shared_with_me=true&include_tags=true'
  201. );
  202. expect(fakeServer.requests[1].url).toEqual(
  203. OC.linkToOCS('apps/files_sharing/api/v1') +
  204. 'remote_shares?format=json&include_tags=true'
  205. );
  206. fakeServer.requests[0].respond(
  207. 200,
  208. { 'Content-Type': 'application/json' },
  209. JSON.stringify(ocsResponse)
  210. );
  211. fakeServer.requests[1].respond(
  212. 200,
  213. { 'Content-Type': 'application/json' },
  214. JSON.stringify(ocsResponseRemote)
  215. );
  216. var $rows = fileList.$el.find('tbody tr');
  217. expect($rows.length).toEqual(2);
  218. var $tr = $rows.eq(0);
  219. expect($tr.attr('data-id')).toEqual('49');
  220. expect($tr.attr('data-type')).toEqual('dir');
  221. expect($tr.attr('data-file')).toEqual('local name');
  222. expect($tr.attr('data-path')).toEqual('/local path');
  223. expect($tr.attr('data-size')).not.toBeDefined();
  224. expect($tr.attr('data-permissions')).toEqual('31'); // read and delete
  225. expect($tr.attr('data-mime')).toEqual('httpd/unix-directory');
  226. expect($tr.attr('data-mtime')).toEqual('11111000');
  227. expect($tr.attr('data-share-owner')).toEqual('User Two');
  228. expect($tr.attr('data-share-id')).toEqual('7');
  229. expect($tr.attr('data-favorite')).toEqual('true');
  230. expect($tr.attr('data-tags')).toEqual(OC.TAG_FAVORITE);
  231. expect($tr.find('a.name').attr('href')).toEqual(
  232. OC.webroot +
  233. '/index.php/apps/files' +
  234. '?dir=/local%20path/local%20name'
  235. );
  236. expect($tr.find('.nametext').text().trim()).toEqual('local name');
  237. $tr = $rows.eq(1);
  238. expect($tr.attr('data-id')).toEqual('1337');
  239. expect($tr.attr('data-type')).toEqual('dir');
  240. expect($tr.attr('data-file')).toEqual('b');
  241. expect($tr.attr('data-path')).toEqual('');
  242. expect($tr.attr('data-size')).not.toBeDefined();
  243. expect(parseInt($tr.attr('data-permissions'), 10))
  244. .toEqual(OC.PERMISSION_ALL); // read and delete
  245. expect($tr.attr('data-mime')).toEqual('httpd/unix-directory');
  246. expect($tr.attr('data-mtime')).toEqual('22222000');
  247. expect($tr.attr('data-share-owner')).toEqual('user3@foo.bar/');
  248. expect($tr.attr('data-share-id')).toEqual('8');
  249. expect($tr.attr('data-favorite')).not.toBeDefined();
  250. expect($tr.attr('data-tags')).toEqual('');
  251. expect($tr.find('a.name').attr('href')).toEqual(
  252. OC.webroot +
  253. '/index.php/apps/files' +
  254. '?dir=/b'
  255. );
  256. expect($tr.find('.nametext').text().trim()).toEqual('b');
  257. });
  258. });
  259. describe('loading file list for outgoing shares', function() {
  260. var ocsResponse;
  261. beforeEach(function() {
  262. fileList = new OCA.Sharing.FileList(
  263. $('#app-content-container'), {
  264. sharedWithUser: false
  265. }
  266. );
  267. OCA.Sharing.Util.attach(fileList);
  268. fileList.reload();
  269. /* jshint camelcase: false */
  270. ocsResponse = {
  271. ocs: {
  272. meta: {
  273. status: 'ok',
  274. statuscode: 100,
  275. message: null
  276. },
  277. data: [{
  278. id: 7,
  279. item_type: 'file',
  280. item_source: 49,
  281. file_source: 49,
  282. path: '/local path/local name.txt',
  283. permissions: 27,
  284. stime: 11111,
  285. share_type: OC.Share.SHARE_TYPE_USER,
  286. share_with: 'user2',
  287. share_with_displayname: 'User Two',
  288. tags: [OC.TAG_FAVORITE],
  289. mimetype: 'text/plain',
  290. uid_owner: 'user1',
  291. displayname_owner: 'User One'
  292. }]
  293. }
  294. };
  295. });
  296. it('render file shares', function() {
  297. var request;
  298. expect(fakeServer.requests.length).toEqual(1);
  299. request = fakeServer.requests[0];
  300. expect(request.url).toEqual(
  301. OC.linkToOCS('apps/files_sharing/api/v1') +
  302. 'shares?format=json&shared_with_me=false&include_tags=true'
  303. );
  304. fakeServer.requests[0].respond(
  305. 200,
  306. { 'Content-Type': 'application/json' },
  307. JSON.stringify(ocsResponse)
  308. );
  309. var $rows = fileList.$el.find('tbody tr');
  310. var $tr = $rows.eq(0);
  311. expect($rows.length).toEqual(1);
  312. expect($tr.attr('data-id')).toEqual('49');
  313. expect($tr.attr('data-type')).toEqual('file');
  314. expect($tr.attr('data-file')).toEqual('local name.txt');
  315. expect($tr.attr('data-path')).toEqual('/local path');
  316. expect($tr.attr('data-size')).not.toBeDefined();
  317. expect($tr.attr('data-permissions')).toEqual('31'); // read and delete
  318. expect($tr.attr('data-mime')).toEqual('text/plain');
  319. expect($tr.attr('data-mtime')).toEqual('11111000');
  320. expect($tr.attr('data-share-owner')).not.toBeDefined();
  321. expect($tr.attr('data-share-id')).toEqual('7');
  322. expect($tr.attr('data-favorite')).toEqual('true');
  323. expect($tr.attr('data-tags')).toEqual(OC.TAG_FAVORITE);
  324. expect($tr.find('a.name').attr('href')).toEqual(
  325. OC.webroot +
  326. '/remote.php/webdav/local%20path/local%20name.txt'
  327. );
  328. expect($tr.find('.nametext').text().trim()).toEqual('local name.txt');
  329. });
  330. it('render folder shares', function() {
  331. var request;
  332. /* jshint camelcase: false */
  333. ocsResponse.ocs.data[0] = _.extend(ocsResponse.ocs.data[0], {
  334. item_type: 'folder',
  335. path: '/local path/local name',
  336. });
  337. expect(fakeServer.requests.length).toEqual(1);
  338. request = fakeServer.requests[0];
  339. expect(request.url).toEqual(
  340. OC.linkToOCS('apps/files_sharing/api/v1') +
  341. 'shares?format=json&shared_with_me=false&include_tags=true'
  342. );
  343. fakeServer.requests[0].respond(
  344. 200,
  345. { 'Content-Type': 'application/json' },
  346. JSON.stringify(ocsResponse)
  347. );
  348. var $rows = fileList.$el.find('tbody tr');
  349. var $tr = $rows.eq(0);
  350. expect($rows.length).toEqual(1);
  351. expect($tr.attr('data-id')).toEqual('49');
  352. expect($tr.attr('data-type')).toEqual('dir');
  353. expect($tr.attr('data-file')).toEqual('local name');
  354. expect($tr.attr('data-path')).toEqual('/local path');
  355. expect($tr.attr('data-size')).not.toBeDefined();
  356. expect($tr.attr('data-permissions')).toEqual('31'); // read and delete
  357. expect($tr.attr('data-mime')).toEqual('httpd/unix-directory');
  358. expect($tr.attr('data-mtime')).toEqual('11111000');
  359. expect($tr.attr('data-share-owner')).not.toBeDefined();
  360. expect($tr.attr('data-share-id')).toEqual('7');
  361. expect($tr.attr('data-favorite')).toEqual('true');
  362. expect($tr.attr('data-tags')).toEqual(OC.TAG_FAVORITE);
  363. expect($tr.find('a.name').attr('href')).toEqual(
  364. OC.webroot +
  365. '/index.php/apps/files' +
  366. '?dir=/local%20path/local%20name'
  367. );
  368. expect($tr.find('.nametext').text().trim()).toEqual('local name');
  369. });
  370. it('render link shares', function() {
  371. /* jshint camelcase: false */
  372. var request;
  373. ocsResponse.ocs.data[0] = {
  374. id: 7,
  375. item_type: 'file',
  376. item_source: 49,
  377. file_source: 49,
  378. path: '/local path/local name.txt',
  379. permissions: 1,
  380. stime: 11111,
  381. share_type: OC.Share.SHARE_TYPE_LINK,
  382. share_with: null,
  383. token: 'abc',
  384. mimetype: 'text/plain',
  385. uid_owner: 'user1',
  386. displayname_owner: 'User One',
  387. tags: [OC.TAG_FAVORITE]
  388. };
  389. expect(fakeServer.requests.length).toEqual(1);
  390. request = fakeServer.requests[0];
  391. expect(request.url).toEqual(
  392. OC.linkToOCS('apps/files_sharing/api/v1') +
  393. 'shares?format=json&shared_with_me=false&include_tags=true'
  394. );
  395. fakeServer.requests[0].respond(
  396. 200,
  397. { 'Content-Type': 'application/json' },
  398. JSON.stringify(ocsResponse)
  399. );
  400. var $rows = fileList.$el.find('tbody tr');
  401. var $tr = $rows.eq(0);
  402. expect($rows.length).toEqual(1);
  403. expect($tr.attr('data-id')).toEqual('49');
  404. expect($tr.attr('data-type')).toEqual('file');
  405. expect($tr.attr('data-file')).toEqual('local name.txt');
  406. expect($tr.attr('data-path')).toEqual('/local path');
  407. expect($tr.attr('data-size')).not.toBeDefined();
  408. expect($tr.attr('data-permissions')).toEqual('31'); // read and delete
  409. expect($tr.attr('data-mime')).toEqual('text/plain');
  410. expect($tr.attr('data-mtime')).toEqual('11111000');
  411. expect($tr.attr('data-share-owner')).not.toBeDefined();
  412. expect($tr.attr('data-share-id')).toEqual('7');
  413. expect($tr.attr('data-favorite')).toEqual('true');
  414. expect($tr.attr('data-tags')).toEqual(OC.TAG_FAVORITE);
  415. expect($tr.find('a.name').attr('href')).toEqual(
  416. OC.webroot + '/remote.php/webdav/local%20path/local%20name.txt'
  417. );
  418. expect($tr.find('.nametext').text().trim()).toEqual('local name.txt');
  419. });
  420. it('groups link shares with regular shares', function() {
  421. /* jshint camelcase: false */
  422. var request;
  423. // link share
  424. ocsResponse.ocs.data.push({
  425. id: 8,
  426. item_type: 'file',
  427. item_source: 49,
  428. file_source: 49,
  429. path: '/local path/local name.txt',
  430. permissions: 1,
  431. stime: 11111,
  432. share_type: OC.Share.SHARE_TYPE_LINK,
  433. share_with: null,
  434. token: 'abc',
  435. mimetype: 'text/plain',
  436. uid_owner: 'user1',
  437. displayname_owner: 'User One',
  438. tags: [OC.TAG_FAVORITE],
  439. });
  440. // another share of the same file
  441. ocsResponse.ocs.data.push({
  442. id: 9,
  443. item_type: 'file',
  444. item_source: 49,
  445. file_source: 49,
  446. path: '/local path/local name.txt',
  447. permissions: 27,
  448. stime: 22222,
  449. share_type: OC.Share.SHARE_TYPE_USER,
  450. share_with: 'user3',
  451. share_with_displayname: 'User Three',
  452. mimetype: 'text/plain',
  453. uid_owner: 'user1',
  454. displayname_owner: 'User One'
  455. });
  456. expect(fakeServer.requests.length).toEqual(1);
  457. request = fakeServer.requests[0];
  458. expect(request.url).toEqual(
  459. OC.linkToOCS('apps/files_sharing/api/v1') +
  460. 'shares?format=json&shared_with_me=false&include_tags=true'
  461. );
  462. fakeServer.requests[0].respond(
  463. 200,
  464. { 'Content-Type': 'application/json' },
  465. JSON.stringify(ocsResponse)
  466. );
  467. var $rows = fileList.$el.find('tbody tr');
  468. var $tr = $rows.eq(0);
  469. expect($rows.length).toEqual(1);
  470. expect($tr.attr('data-id')).toEqual('49');
  471. expect($tr.attr('data-type')).toEqual('file');
  472. expect($tr.attr('data-file')).toEqual('local name.txt');
  473. expect($tr.attr('data-path')).toEqual('/local path');
  474. expect($tr.attr('data-size')).not.toBeDefined();
  475. expect($tr.attr('data-permissions')).toEqual('31'); // read and delete
  476. expect($tr.attr('data-mime')).toEqual('text/plain');
  477. // always use the most recent stime
  478. expect($tr.attr('data-mtime')).toEqual('22222000');
  479. expect($tr.attr('data-share-owner')).not.toBeDefined();
  480. expect($tr.attr('data-share-id')).toEqual('7,8,9');
  481. expect($tr.attr('data-favorite')).toEqual('true');
  482. expect($tr.attr('data-tags')).toEqual(OC.TAG_FAVORITE);
  483. expect($tr.find('a.name').attr('href')).toEqual(
  484. OC.webroot + '/remote.php/webdav/local%20path/local%20name.txt'
  485. );
  486. expect($tr.find('.nametext').text().trim()).toEqual('local name.txt');
  487. });
  488. });
  489. describe('loading file list for link shares', function() {
  490. var ocsResponse;
  491. beforeEach(function() {
  492. fileList = new OCA.Sharing.FileList(
  493. $('#app-content-container'), {
  494. linksOnly: true
  495. }
  496. );
  497. OCA.Sharing.Util.attach(fileList);
  498. fileList.reload();
  499. var expirationDateInADay = moment()
  500. .add(1, 'days').format('YYYY-MM-DD HH:mm:ss');
  501. /* jshint camelcase: false */
  502. ocsResponse = {
  503. ocs: {
  504. meta: {
  505. status: 'ok',
  506. statuscode: 100,
  507. message: null
  508. },
  509. data: [{
  510. id: 7,
  511. item_type: 'file',
  512. item_source: 49,
  513. file_source: 49,
  514. path: '/local path/local name.txt',
  515. permissions: 1,
  516. stime: 11111,
  517. expiration: null,
  518. share_type: OC.Share.SHARE_TYPE_LINK,
  519. share_with: null,
  520. token: 'abc',
  521. mimetype: 'text/plain',
  522. uid_owner: 'user1',
  523. displayname_owner: 'User One',
  524. tags: [OC.TAG_FAVORITE]
  525. },{
  526. id: 8,
  527. item_type: 'file',
  528. item_source: 50,
  529. file_source: 50,
  530. path: '/local path2/local name2.txt',
  531. permissions: 1,
  532. stime: 11112,
  533. expiration: expirationDateInADay,
  534. share_type: OC.Share.SHARE_TYPE_LINK,
  535. share_with: null,
  536. token: 'abcd',
  537. mimetype: 'text/plain2',
  538. uid_owner: 'user2',
  539. displayname_owner: 'User One2'
  540. }]
  541. }
  542. };
  543. });
  544. it('render only link shares', function() {
  545. /* jshint camelcase: false */
  546. var request;
  547. ocsResponse.ocs.data.push({
  548. // non-link share
  549. id: 8,
  550. item_type: 'file',
  551. item_source: 49,
  552. file_source: 49,
  553. path: '/local path/local name.txt',
  554. permissions: 27,
  555. stime: 11111,
  556. share_type: OC.Share.SHARE_TYPE_USER,
  557. share_with: 'user2',
  558. share_with_displayname: 'User Two',
  559. mimetype: 'text/plain',
  560. uid_owner: 'user1',
  561. displayname_owner: 'User One',
  562. tags: [OC.TAG_FAVORITE]
  563. });
  564. expect(fakeServer.requests.length).toEqual(1);
  565. request = fakeServer.requests[0];
  566. expect(request.url).toEqual(
  567. OC.linkToOCS('apps/files_sharing/api/v1') +
  568. 'shares?format=json&shared_with_me=false&include_tags=true'
  569. );
  570. fakeServer.requests[0].respond(
  571. 200,
  572. { 'Content-Type': 'application/json' },
  573. JSON.stringify(ocsResponse)
  574. );
  575. // only renders the link share entries
  576. var $rows = fileList.$el.find('tbody tr');
  577. var $tr = $rows.eq(0);
  578. expect($rows.length).toEqual(2);
  579. expect($tr.attr('data-id')).toEqual('49');
  580. expect($tr.attr('data-type')).toEqual('file');
  581. expect($tr.attr('data-file')).toEqual('local name.txt');
  582. expect($tr.attr('data-path')).toEqual('/local path');
  583. expect($tr.attr('data-size')).not.toBeDefined();
  584. expect($tr.attr('data-permissions')).toEqual('31'); // read and delete
  585. expect($tr.attr('data-mime')).toEqual('text/plain');
  586. expect($tr.attr('data-mtime')).toEqual('11111000');
  587. expect($tr.attr('data-share-recipients')).not.toBeDefined();
  588. expect($tr.attr('data-share-owner')).not.toBeDefined();
  589. expect($tr.attr('data-share-id')).toEqual('7');
  590. expect($tr.attr('data-favorite')).toEqual('true');
  591. expect($tr.attr('data-tags')).toEqual(OC.TAG_FAVORITE);
  592. expect($tr.find('a.name').attr('href')).toEqual(
  593. OC.webroot + '/remote.php/webdav/local%20path/local%20name.txt'
  594. );
  595. expect($tr.attr('data-expiration')).toEqual('0');
  596. expect($tr.find('td:last-child span').text()).toEqual('');
  597. expect($tr.find('.nametext').text().trim()).toEqual('local name.txt');
  598. // change to next row
  599. $tr = $rows.eq(1);
  600. expect($tr.attr('data-id')).toEqual('50');
  601. expect($tr.attr('data-file')).toEqual('local name2.txt');
  602. expect($tr.attr('data-expiration')).not.toEqual('0');
  603. expect($tr.attr('data-favorite')).not.toBeDefined();
  604. expect($tr.attr('data-tags')).toEqual('');
  605. expect($tr.find('td:last-child span').text()).toEqual('in a day');
  606. });
  607. it('does not show virtual token recipient as recipient when password was set', function() {
  608. /* jshint camelcase: false */
  609. var request;
  610. // when a password is set, share_with contains an auth token
  611. ocsResponse.ocs.data[0].share_with = 'abc01234/01234abc';
  612. ocsResponse.ocs.data[0].share_with_displayname = 'abc01234/01234abc';
  613. expect(fakeServer.requests.length).toEqual(1);
  614. request = fakeServer.requests[0];
  615. expect(request.url).toEqual(
  616. OC.linkToOCS('apps/files_sharing/api/v1') +
  617. 'shares?format=json&shared_with_me=false&include_tags=true'
  618. );
  619. fakeServer.requests[0].respond(
  620. 200,
  621. { 'Content-Type': 'application/json' },
  622. JSON.stringify(ocsResponse)
  623. );
  624. // only renders the link share entry
  625. var $rows = fileList.$el.find('tbody tr');
  626. var $tr = $rows.eq(0);
  627. expect($rows.length).toEqual(2);
  628. expect($tr.attr('data-id')).toEqual('49');
  629. expect($tr.attr('data-type')).toEqual('file');
  630. expect($tr.attr('data-file')).toEqual('local name.txt');
  631. expect($tr.attr('data-path')).toEqual('/local path');
  632. expect($tr.attr('data-size')).not.toBeDefined();
  633. expect($tr.attr('data-permissions')).toEqual('31'); // read and delete
  634. expect($tr.attr('data-mime')).toEqual('text/plain');
  635. expect($tr.attr('data-mtime')).toEqual('11111000');
  636. expect($tr.attr('data-share-recipients')).not.toBeDefined();
  637. expect($tr.attr('data-share-owner')).not.toBeDefined();
  638. expect($tr.attr('data-share-id')).toEqual('7');
  639. expect($tr.attr('data-favorite')).toEqual('true');
  640. expect($tr.attr('data-tags')).toEqual(OC.TAG_FAVORITE);
  641. expect($tr.find('a.name').attr('href')).toEqual(
  642. OC.webroot +
  643. '/remote.php/webdav/local%20path/local%20name.txt');
  644. expect($tr.find('.nametext').text().trim()).toEqual('local name.txt');
  645. });
  646. });
  647. describe('setting share permissions for files', function () {
  648. beforeEach(function () {
  649. var $content = $('<div id="content"></div>');
  650. $('#testArea').append($content);
  651. // dummy file list
  652. var $div = $(
  653. '<div>' +
  654. '<table id="filestable">' +
  655. '<thead></thead>' +
  656. '<tbody id="fileList"></tbody>' +
  657. '</table>' +
  658. '</div>');
  659. $('#content').append($div);
  660. fileList = new OCA.Files.FileList($div);
  661. OCA.Sharing.Util.attach(fileList);
  662. });
  663. it('external storage root folder', function () {
  664. var $tr;
  665. OC.Share.statuses = {1: {link: false, path: '/subdir'}};
  666. fileList.setFiles([{
  667. id: 1,
  668. type: 'dir',
  669. name: 'One.txt',
  670. path: '/subdir',
  671. mimetype: 'text/plain',
  672. size: 12,
  673. permissions: OC.PERMISSION_READ,
  674. etag: 'abc',
  675. shareOwner: 'User One',
  676. recipients: 'User Two',
  677. mountType: 'external-root'
  678. }]);
  679. $tr = fileList.$el.find('tr:first');
  680. expect(parseInt($tr.attr('data-share-permissions'), 10)).toEqual(OC.PERMISSION_ALL - OC.PERMISSION_SHARE);
  681. });
  682. it('external storage root folder reshare', function () {
  683. var $tr;
  684. OC.Share.statuses = {1: {link: false, path: '/subdir'}};
  685. fileList.setFiles([{
  686. id: 1,
  687. type: 'dir',
  688. name: 'One.txt',
  689. path: '/subdir',
  690. mimetype: 'text/plain',
  691. size: 12,
  692. permissions: OC.PERMISSION_READ + OC.PERMISSION_SHARE,
  693. etag: 'abc',
  694. shareOwner: 'User One',
  695. recipients: 'User Two',
  696. mountType: 'external-root'
  697. }]);
  698. $tr = fileList.$el.find('tr:first');
  699. expect(parseInt($tr.attr('data-share-permissions'), 10)).toEqual(OC.PERMISSION_ALL);
  700. });
  701. it('external storage root folder file', function () {
  702. var $tr;
  703. OC.Share.statuses = {1: {link: false, path: '/subdir'}};
  704. fileList.setFiles([{
  705. id: 1,
  706. type: 'file',
  707. name: 'One.txt',
  708. path: '/subdir',
  709. mimetype: 'text/plain',
  710. size: 12,
  711. permissions: OC.PERMISSION_READ,
  712. etag: 'abc',
  713. shareOwner: 'User One',
  714. recipients: 'User Two',
  715. mountType: 'external-root'
  716. }]);
  717. $tr = fileList.$el.find('tr:first');
  718. expect(parseInt($tr.attr('data-share-permissions'), 10))
  719. .toEqual(OC.PERMISSION_ALL - OC.PERMISSION_SHARE - OC.PERMISSION_DELETE - OC.PERMISSION_CREATE);
  720. });
  721. });
  722. });