TokenAccessHandlerTests.coffee 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611
  1. should = require('chai').should()
  2. SandboxedModule = require('sandboxed-module')
  3. assert = require('assert')
  4. path = require('path')
  5. sinon = require('sinon')
  6. modulePath = path.join __dirname, "../../../../app/js/Features/TokenAccess/TokenAccessHandler"
  7. expect = require("chai").expect
  8. ObjectId = require("mongojs").ObjectId
  9. describe "TokenAccessHandler", ->
  10. beforeEach ->
  11. @token = 'sometokenthing'
  12. @projectId = ObjectId()
  13. @project =
  14. _id: @projectId
  15. publicAccesLevel: 'tokenBased'
  16. @userId = ObjectId()
  17. @req = {}
  18. @TokenAccessHandler = SandboxedModule.require modulePath, requires:
  19. '../../models/Project': {Project: @Project = {}}
  20. 'settings-sharelatex': @settings = {}
  21. '../Collaborators/CollaboratorsHandler': @CollaboratorsHandler = {}
  22. '../User/UserGetter': @UserGetter = {}
  23. '../V1/V1Api': @V1Api = {
  24. request: sinon.stub()
  25. }
  26. describe 'findProjectWithReadOnlyToken', ->
  27. beforeEach ->
  28. @Project.findOne = sinon.stub().callsArgWith(2, null, @project)
  29. it 'should call Project.findOne', (done) ->
  30. @TokenAccessHandler.findProjectWithReadOnlyToken @token, (err, project) =>
  31. expect(@Project.findOne.callCount).to.equal 1
  32. expect(@Project.findOne.calledWith({
  33. 'tokens.readOnly': @token
  34. })).to.equal true
  35. done()
  36. it 'should produce a project object with no error', (done) ->
  37. @TokenAccessHandler.findProjectWithReadOnlyToken @token, (err, project) =>
  38. expect(err).to.not.exist
  39. expect(project).to.exist
  40. expect(project).to.deep.equal @project
  41. done()
  42. it 'should return projectExists flag as true', (done) ->
  43. @TokenAccessHandler.findProjectWithReadOnlyToken @token, (err, project, projectExists) ->
  44. expect(projectExists).to.equal true
  45. done()
  46. describe 'when Project.findOne produces an error', ->
  47. beforeEach ->
  48. @Project.findOne = sinon.stub().callsArgWith(2, new Error('woops'))
  49. it 'should produce an error', (done) ->
  50. @TokenAccessHandler.findProjectWithReadOnlyToken @token, (err, project) =>
  51. expect(err).to.exist
  52. expect(project).to.not.exist
  53. expect(err).to.be.instanceof Error
  54. done()
  55. describe 'when project does not have tokenBased access level', ->
  56. beforeEach ->
  57. @project.publicAccesLevel = 'private'
  58. @Project.findOne = sinon.stub().callsArgWith(2, null, @project, true)
  59. it 'should not return a project', (done) ->
  60. @TokenAccessHandler.findProjectWithReadOnlyToken @token, (err, project) ->
  61. expect(err).to.not.exist
  62. expect(project).to.not.exist
  63. done()
  64. it 'should return projectExists flag as true', (done) ->
  65. @TokenAccessHandler.findProjectWithReadOnlyToken @token, (err, project, projectExists) ->
  66. expect(projectExists).to.equal true
  67. done()
  68. describe 'when project does not exist', ->
  69. beforeEach ->
  70. @Project.findOne = sinon.stub().callsArgWith(2, null, null)
  71. it 'should not return a project', (done) ->
  72. @TokenAccessHandler.findProjectWithReadOnlyToken @token, (err, project) ->
  73. expect(err).to.not.exist
  74. expect(project).to.not.exist
  75. done()
  76. it 'should return projectExists flag as false', (done) ->
  77. @TokenAccessHandler.findProjectWithReadOnlyToken @token, (err, project, projectExists) ->
  78. expect(projectExists).to.equal false
  79. done()
  80. describe 'findProjectWithReadAndWriteToken', ->
  81. beforeEach ->
  82. @token = '1234bcdf'
  83. @tokenPrefix = '1234'
  84. @project.tokens = {
  85. readOnly: 'atntntn'
  86. readAndWrite: @token,
  87. readAndWritePrefix: @tokenPrefix
  88. }
  89. @Project.findOne = sinon.stub().callsArgWith(2, null, @project)
  90. it 'should call Project.findOne', (done) ->
  91. @TokenAccessHandler.findProjectWithReadAndWriteToken @token, (err, project) =>
  92. expect(@Project.findOne.callCount).to.equal 1
  93. expect(@Project.findOne.calledWith({
  94. 'tokens.readAndWritePrefix': @tokenPrefix
  95. })).to.equal true
  96. done()
  97. it 'should produce a project object with no error', (done) ->
  98. @TokenAccessHandler.findProjectWithReadAndWriteToken @token, (err, project) =>
  99. expect(err).to.not.exist
  100. expect(project).to.exist
  101. expect(project).to.deep.equal @project
  102. done()
  103. it 'should return projectExists flag as true', (done) ->
  104. @TokenAccessHandler.findProjectWithReadAndWriteToken @token, (err, project, projectExists) ->
  105. expect(projectExists).to.equal true
  106. done()
  107. describe 'when Project.findOne produces an error', ->
  108. beforeEach ->
  109. @Project.findOne = sinon.stub().callsArgWith(2, new Error('woops'))
  110. it 'should produce an error', (done) ->
  111. @TokenAccessHandler.findProjectWithReadAndWriteToken @token, (err, project) =>
  112. expect(err).to.exist
  113. expect(project).to.not.exist
  114. expect(err).to.be.instanceof Error
  115. done()
  116. describe 'when project does not have tokenBased access level', ->
  117. beforeEach ->
  118. @project.publicAccesLevel = 'private'
  119. @Project.findOne = sinon.stub().callsArgWith(2, null, @project, true)
  120. it 'should not return a project', (done) ->
  121. @TokenAccessHandler.findProjectWithReadAndWriteToken @token, (err, project) ->
  122. expect(err).to.not.exist
  123. expect(project).to.not.exist
  124. done()
  125. it 'should return projectExists flag as true', (done) ->
  126. @TokenAccessHandler.findProjectWithReadAndWriteToken @token, (err, project, projectExists) ->
  127. expect(projectExists).to.equal true
  128. done()
  129. describe 'when the tokens have different lengths', ->
  130. beforeEach ->
  131. @project.tokens = {
  132. readOnly: 'atntntn'
  133. readAndWrite: @token + "some-other-characters",
  134. readAndWritePrefix: @tokenPrefix
  135. }
  136. @Project.findOne = sinon.stub().callsArgWith(2, null, @project)
  137. it 'should not return a project', (done) ->
  138. @TokenAccessHandler.findProjectWithReadAndWriteToken @token, (err, project) ->
  139. expect(err).to.not.exist
  140. expect(project).to.not.exist
  141. done()
  142. describe 'findProjectWithHigherAccess', ->
  143. describe 'when user does have higher access', ->
  144. beforeEach ->
  145. @Project.findOne = sinon.stub().callsArgWith(2, null, @project)
  146. @CollaboratorsHandler.isUserInvitedMemberOfProject = sinon.stub()
  147. .callsArgWith(2, null, true)
  148. it 'should call Project.findOne', (done) ->
  149. @TokenAccessHandler.findProjectWithHigherAccess @token, @userId, (err, project) =>
  150. expect(@Project.findOne.callCount).to.equal 1
  151. expect(@Project.findOne.calledWith({
  152. 'tokens.readOnly': @token
  153. })).to.equal true
  154. done()
  155. it 'should call isUserInvitedMemberOfProject', (done) ->
  156. @TokenAccessHandler.findProjectWithHigherAccess @token, @userId, (err, project) =>
  157. expect(@CollaboratorsHandler.isUserInvitedMemberOfProject.callCount)
  158. .to.equal 1
  159. expect(@CollaboratorsHandler.isUserInvitedMemberOfProject.calledWith(
  160. @userId, @project._id
  161. )).to.equal true
  162. done()
  163. it 'should produce a project object', (done) ->
  164. @TokenAccessHandler.findProjectWithHigherAccess @token, @userId, (err, project) =>
  165. expect(err).to.not.exist
  166. expect(project).to.exist
  167. expect(project).to.deep.equal @project
  168. done()
  169. describe 'when user does not have higher access', ->
  170. beforeEach ->
  171. @Project.findOne = sinon.stub().callsArgWith(2, null, @project)
  172. @CollaboratorsHandler.isUserInvitedMemberOfProject = sinon.stub()
  173. .callsArgWith(2, null, false)
  174. it 'should call Project.findOne', (done) ->
  175. @TokenAccessHandler.findProjectWithHigherAccess @token, @userId, (err, project) =>
  176. expect(@Project.findOne.callCount).to.equal 1
  177. expect(@Project.findOne.calledWith({
  178. 'tokens.readOnly': @token
  179. })).to.equal true
  180. done()
  181. it 'should call isUserInvitedMemberOfProject', (done) ->
  182. @TokenAccessHandler.findProjectWithHigherAccess @token, @userId, (err, project) =>
  183. expect(@CollaboratorsHandler.isUserInvitedMemberOfProject.callCount)
  184. .to.equal 1
  185. expect(@CollaboratorsHandler.isUserInvitedMemberOfProject.calledWith(
  186. @userId, @project._id
  187. )).to.equal true
  188. done()
  189. it 'should not produce a project', (done) ->
  190. @TokenAccessHandler.findProjectWithHigherAccess @token, @userId, (err, project) =>
  191. expect(err).to.not.exist
  192. expect(project).to.not.exist
  193. done()
  194. describe 'when Project.findOne produces an error', ->
  195. beforeEach ->
  196. @Project.findOne = sinon.stub().callsArgWith(2, new Error('woops'))
  197. it 'should produce an error', (done) ->
  198. @TokenAccessHandler.findProjectWithHigherAccess @token, @userId, (err, project) =>
  199. expect(err).to.exist
  200. expect(project).to.not.exist
  201. expect(err).to.be.instanceof Error
  202. done()
  203. describe 'when isUserInvitedMemberOfProject produces an error', ->
  204. beforeEach ->
  205. @Project.findOne = sinon.stub().callsArgWith(2, null, @project)
  206. @CollaboratorsHandler.isUserInvitedMemberOfProject = sinon.stub()
  207. .callsArgWith(2, new Error('woops'))
  208. it 'should produce an error', (done) ->
  209. @TokenAccessHandler.findProjectWithHigherAccess @token, @userId, (err, project) =>
  210. expect(err).to.exist
  211. expect(project).to.not.exist
  212. expect(err).to.be.instanceof Error
  213. done()
  214. describe 'addReadOnlyUserToProject', ->
  215. beforeEach ->
  216. @Project.update = sinon.stub().callsArgWith(2, null)
  217. it 'should call Project.update', (done) ->
  218. @TokenAccessHandler.addReadOnlyUserToProject @userId, @projectId, (err) =>
  219. expect(@Project.update.callCount).to.equal 1
  220. expect(@Project.update.calledWith({
  221. _id: @projectId
  222. })).to.equal true
  223. expect(@Project.update.lastCall.args[1]['$addToSet'])
  224. .to.have.keys 'tokenAccessReadOnly_refs'
  225. done()
  226. it 'should not produce an error', (done) ->
  227. @TokenAccessHandler.addReadOnlyUserToProject @userId, @projectId, (err) =>
  228. expect(err).to.not.exist
  229. done()
  230. describe 'when Project.update produces an error', ->
  231. beforeEach ->
  232. @Project.update = sinon.stub().callsArgWith(2, new Error('woops'))
  233. it 'should produce an error', (done) ->
  234. @TokenAccessHandler.addReadOnlyUserToProject @userId, @projectId, (err) =>
  235. expect(err).to.exist
  236. done()
  237. describe 'addReadAndWriteUserToProject', ->
  238. beforeEach ->
  239. @Project.update = sinon.stub().callsArgWith(2, null)
  240. it 'should call Project.update', (done) ->
  241. @TokenAccessHandler.addReadAndWriteUserToProject @userId, @projectId, (err) =>
  242. expect(@Project.update.callCount).to.equal 1
  243. expect(@Project.update.calledWith({
  244. _id: @projectId
  245. })).to.equal true
  246. expect(@Project.update.lastCall.args[1]['$addToSet'])
  247. .to.have.keys 'tokenAccessReadAndWrite_refs'
  248. done()
  249. it 'should not produce an error', (done) ->
  250. @TokenAccessHandler.addReadAndWriteUserToProject @userId, @projectId, (err) =>
  251. expect(err).to.not.exist
  252. done()
  253. describe 'when Project.update produces an error', ->
  254. beforeEach ->
  255. @Project.update = sinon.stub().callsArgWith(2, new Error('woops'))
  256. it 'should produce an error', (done) ->
  257. @TokenAccessHandler.addReadAndWriteUserToProject @userId, @projectId, (err) =>
  258. expect(err).to.exist
  259. done()
  260. describe 'grantSessionTokenAccess', ->
  261. beforeEach ->
  262. @req = {session: {}, headers: {}}
  263. it 'should add the token to the session', (done) ->
  264. @TokenAccessHandler.grantSessionTokenAccess(@req, @projectId, @token)
  265. expect(@req.session.anonTokenAccess[@projectId.toString()])
  266. .to.equal @token
  267. done()
  268. describe 'isValidToken', ->
  269. describe 'when a read-only project is found', ->
  270. beforeEach ->
  271. @TokenAccessHandler.findProjectWithReadAndWriteToken = sinon.stub()
  272. .callsArgWith(1, null, null)
  273. @TokenAccessHandler.findProjectWithReadOnlyToken = sinon.stub()
  274. .callsArgWith(1, null, @project)
  275. it 'should try to find projects with both kinds of token', (done) ->
  276. @TokenAccessHandler.isValidToken @projectId, @token, (err, allowed) =>
  277. expect(@TokenAccessHandler.findProjectWithReadAndWriteToken.callCount)
  278. .to.equal 1
  279. expect(@TokenAccessHandler.findProjectWithReadOnlyToken.callCount)
  280. .to.equal 1
  281. done()
  282. it 'should allow read-only access', (done) ->
  283. @TokenAccessHandler.isValidToken @projectId, @token, (err, rw, ro) =>
  284. expect(err).to.not.exist
  285. expect(rw).to.equal false
  286. expect(ro).to.equal true
  287. done()
  288. describe 'when a read-and-write project is found', ->
  289. beforeEach ->
  290. @TokenAccessHandler.findProjectWithReadAndWriteToken = sinon.stub()
  291. .callsArgWith(1, null, @project)
  292. @TokenAccessHandler.findProjectWithReadOnlyToken = sinon.stub()
  293. .callsArgWith(1, null, null)
  294. it 'should try to find projects with both kinds of token', (done) ->
  295. @TokenAccessHandler.isValidToken @projectId, @token, (err, allowed) =>
  296. expect(@TokenAccessHandler.findProjectWithReadAndWriteToken.callCount)
  297. .to.equal 1
  298. expect(@TokenAccessHandler.findProjectWithReadOnlyToken.callCount)
  299. .to.equal 1
  300. done()
  301. it 'should allow read-and-write access', (done) ->
  302. @TokenAccessHandler.isValidToken @projectId, @token, (err, rw, ro) =>
  303. expect(err).to.not.exist
  304. expect(rw).to.equal true
  305. expect(ro).to.equal false
  306. done()
  307. describe 'when no project is found', ->
  308. beforeEach ->
  309. @TokenAccessHandler.findProjectWithReadAndWriteToken = sinon.stub()
  310. .callsArgWith(1, null, null)
  311. @TokenAccessHandler.findProjectWithReadOnlyToken = sinon.stub()
  312. .callsArgWith(1, null, null)
  313. it 'should try to find projects with both kinds of token', (done) ->
  314. @TokenAccessHandler.isValidToken @projectId, @token, (err, allowed) =>
  315. expect(@TokenAccessHandler.findProjectWithReadAndWriteToken.callCount)
  316. .to.equal 1
  317. expect(@TokenAccessHandler.findProjectWithReadOnlyToken.callCount)
  318. .to.equal 1
  319. done()
  320. it 'should not allow any access', (done) ->
  321. @TokenAccessHandler.isValidToken @projectId, @token, (err, rw, ro) =>
  322. expect(err).to.not.exist
  323. expect(rw).to.equal false
  324. expect(ro).to.equal false
  325. done()
  326. describe 'when findProject produces an error', ->
  327. beforeEach ->
  328. @TokenAccessHandler.findProjectWithReadAndWriteToken = sinon.stub()
  329. .callsArgWith(1, null, null)
  330. @TokenAccessHandler.findProjectWithReadOnlyToken = sinon.stub()
  331. .callsArgWith(1, new Error('woops'))
  332. it 'should try to find projects with both kinds of token', (done) ->
  333. @TokenAccessHandler.isValidToken @projectId, @token, (err, allowed) =>
  334. expect(@TokenAccessHandler.findProjectWithReadAndWriteToken.callCount)
  335. .to.equal 1
  336. expect(@TokenAccessHandler.findProjectWithReadOnlyToken.callCount)
  337. .to.equal 1
  338. done()
  339. it 'should produce an error and not allow access', (done) ->
  340. @TokenAccessHandler.isValidToken @projectId, @token, (err, rw, ro) =>
  341. expect(err).to.exist
  342. expect(err).to.be.instanceof Error
  343. expect(rw).to.equal undefined
  344. expect(ro).to.equal undefined
  345. done()
  346. describe 'when project is not set to token-based access', ->
  347. beforeEach ->
  348. @project.publicAccesLevel = 'private'
  349. describe 'for read-and-write project', ->
  350. beforeEach ->
  351. @TokenAccessHandler.findProjectWithReadAndWriteToken = sinon.stub()
  352. .callsArgWith(1, null, @project)
  353. @TokenAccessHandler.findProjectWithReadOnlyToken = sinon.stub()
  354. .callsArgWith(1, null, null)
  355. it 'should try to find projects with both kinds of token', (done) ->
  356. @TokenAccessHandler.isValidToken @projectId, @token, (err, allowed) =>
  357. expect(@TokenAccessHandler.findProjectWithReadAndWriteToken.callCount)
  358. .to.equal 1
  359. expect(@TokenAccessHandler.findProjectWithReadOnlyToken.callCount)
  360. .to.equal 1
  361. done()
  362. it 'should not allow any access', (done) ->
  363. @TokenAccessHandler.isValidToken @projectId, @token, (err, rw, ro) =>
  364. expect(err).to.not.exist
  365. expect(rw).to.equal false
  366. expect(ro).to.equal false
  367. done()
  368. describe 'for read-only project', ->
  369. beforeEach ->
  370. @TokenAccessHandler.findProjectWithReadAndWriteToken = sinon.stub()
  371. .callsArgWith(1, null, null)
  372. @TokenAccessHandler.findProjectWithReadOnlyToken = sinon.stub()
  373. .callsArgWith(1, null, @project)
  374. it 'should try to find projects with both kinds of token', (done) ->
  375. @TokenAccessHandler.isValidToken @projectId, @token, (err, allowed) =>
  376. expect(@TokenAccessHandler.findProjectWithReadAndWriteToken.callCount)
  377. .to.equal 1
  378. expect(@TokenAccessHandler.findProjectWithReadOnlyToken.callCount)
  379. .to.equal 1
  380. done()
  381. it 'should not allow any access', (done) ->
  382. @TokenAccessHandler.isValidToken @projectId, @token, (err, rw, ro) =>
  383. expect(err).to.not.exist
  384. expect(rw).to.equal false
  385. expect(ro).to.equal false
  386. done()
  387. describe 'with nothing', ->
  388. beforeEach ->
  389. @TokenAccessHandler.findProjectWithReadAndWriteToken = sinon.stub()
  390. .callsArgWith(1, null, @project)
  391. @TokenAccessHandler.findProjectWithReadOnlyToken = sinon.stub()
  392. .callsArgWith(1, null, null)
  393. it 'should not call findProjectWithReadOnlyToken', (done) ->
  394. @TokenAccessHandler.isValidToken @projectId, null, (err, allowed) =>
  395. expect(@TokenAccessHandler.findProjectWithReadOnlyToken.callCount)
  396. .to.equal 0
  397. done()
  398. it 'should try to find projects with both kinds of token', (done) ->
  399. @TokenAccessHandler.isValidToken @projectId, null, (err, allowed) =>
  400. expect(@TokenAccessHandler.findProjectWithReadAndWriteToken.callCount)
  401. .to.equal 0
  402. expect(@TokenAccessHandler.findProjectWithReadOnlyToken.callCount)
  403. .to.equal 0
  404. done()
  405. it 'should not allow any access', (done) ->
  406. @TokenAccessHandler.isValidToken @projectId, null, (err, rw, ro) =>
  407. expect(err).to.not.exist
  408. expect(rw).to.equal false
  409. expect(ro).to.equal false
  410. done()
  411. describe 'protectTokens', ->
  412. beforeEach ->
  413. @project = {tokens: {readAndWrite: 'rw', readOnly: 'ro', readAndWritePrefix: 'pre'}}
  414. it 'should hide write token from read-only user', ->
  415. @TokenAccessHandler.protectTokens(@project, 'readOnly')
  416. expect(@project.tokens.readAndWrite).to.equal ''
  417. expect(@project.tokens.readAndWritePrefix).to.equal ''
  418. expect(@project.tokens.readOnly).to.equal 'ro'
  419. it 'should hide read token from read-write user', ->
  420. @TokenAccessHandler.protectTokens(@project, 'readAndWrite')
  421. expect(@project.tokens.readAndWrite).to.equal 'rw'
  422. expect(@project.tokens.readOnly).to.equal ''
  423. it 'should leave tokens in place for owner', ->
  424. @TokenAccessHandler.protectTokens(@project, 'owner')
  425. expect(@project.tokens.readAndWrite).to.equal 'rw'
  426. expect(@project.tokens.readOnly).to.equal 'ro'
  427. describe 'getDocPublishedInfo', ->
  428. beforeEach ->
  429. @callback = sinon.stub()
  430. describe 'when v1 api not set', ->
  431. beforeEach ->
  432. @TokenAccessHandler.getV1DocPublishedInfo @token, @callback
  433. it 'should not check access and return default info', ->
  434. expect(@V1Api.request.called).to.equal false
  435. expect(@callback.calledWith null, {
  436. allow: true
  437. }).to.equal true
  438. describe 'when v1 api is set', ->
  439. beforeEach ->
  440. @settings.apis = { v1: 'v1' }
  441. describe 'on V1Api.request success', ->
  442. beforeEach ->
  443. @V1Api.request = sinon.stub().callsArgWith(1, null, null, 'mock-data')
  444. @TokenAccessHandler.getV1DocPublishedInfo @token, @callback
  445. it 'should return response body', ->
  446. expect(@V1Api.request.calledWith { url: "/api/v1/sharelatex/docs/#{@token}/is_published" }).to.equal true
  447. expect(@callback.calledWith null, 'mock-data').to.equal true
  448. describe 'on V1Api.request error', ->
  449. beforeEach ->
  450. @V1Api.request = sinon.stub().callsArgWith(1, 'error')
  451. @TokenAccessHandler.getV1DocPublishedInfo @token, @callback
  452. it 'should callback with error', ->
  453. expect(@callback.calledWith 'error').to.equal true
  454. describe 'getV1DocInfo', ->
  455. beforeEach ->
  456. @v2UserId = 123
  457. @callback = sinon.stub()
  458. describe 'when v1 api not set', ->
  459. beforeEach ->
  460. @TokenAccessHandler.getV1DocInfo @token, @v2UserId, @callback
  461. it 'should not check access and return default info', ->
  462. expect(@V1Api.request.called).to.equal false
  463. expect(@callback.calledWith null, {
  464. exists: true
  465. exported: false
  466. }).to.equal true
  467. describe 'when v1 api is set', ->
  468. beforeEach ->
  469. @settings.apis = { v1: 'v1' }
  470. describe 'on UserGetter.getUser success', ->
  471. beforeEach ->
  472. @UserGetter.getUser = sinon.stub().yields(null, {
  473. overleaf: { id: 1 }
  474. })
  475. @TokenAccessHandler.getV1DocInfo @token, @v2UserId, @callback
  476. it 'should get user', ->
  477. expect(@UserGetter.getUser.calledWith(@v2UserId)).to.equal true
  478. describe 'on UserGetter.getUser error', ->
  479. beforeEach ->
  480. @error = new Error('failed to get user')
  481. @UserGetter.getUser = sinon.stub().yields(@error)
  482. @TokenAccessHandler.getV1DocInfo @token, @v2UserId, @callback
  483. it 'should callback with error', ->
  484. expect(@callback.calledWith @error).to.equal true
  485. describe 'on V1Api.request success', ->
  486. beforeEach ->
  487. @v1UserId = 1
  488. @UserGetter.getUser = sinon.stub().yields(null, {
  489. overleaf: { id: @v1UserId }
  490. })
  491. @V1Api.request = sinon.stub().callsArgWith(1, null, null, 'mock-data')
  492. @TokenAccessHandler.getV1DocInfo @token, @v2UserId, @callback
  493. it 'should return response body', ->
  494. expect(@V1Api.request.calledWith { url: "/api/v1/sharelatex/users/#{@v1UserId}/docs/#{@token}/info" }).to.equal true
  495. expect(@callback.calledWith null, 'mock-data').to.equal true
  496. describe 'on V1Api.request error', ->
  497. beforeEach ->
  498. @UserGetter.getUser = sinon.stub().yields(null, {
  499. overleaf: { id: 1 }
  500. })
  501. @V1Api.request = sinon.stub().callsArgWith(1, 'error')
  502. @TokenAccessHandler.getV1DocInfo @token, @v2UserId, @callback
  503. it 'should callback with error', ->
  504. expect(@callback.calledWith 'error').to.equal true