| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685 |
- import { expect } from 'chai'
- import sinon from 'sinon'
- import Path from 'node:path'
- import fs from 'node:fs'
- import _ from 'lodash'
- import User from './helpers/User.mjs'
- import UserHelper from './helpers/UserHelper.mjs'
- import MockDocstoreApiClass from './mocks/MockDocstoreApi.mjs'
- import MockV1HistoryApiClass from './mocks/MockV1HistoryApi.mjs'
- import { fileURLToPath } from 'node:url'
- let MockDocstoreApi, MockV1HistoryApi
- const __dirname = fileURLToPath(new URL('.', import.meta.url))
- before(function () {
- MockDocstoreApi = MockDocstoreApiClass.instance()
- MockV1HistoryApi = MockV1HistoryApiClass.instance()
- })
- describe('ProjectDuplicateNames', function () {
- beforeEach(function (done) {
- this.owner = new User()
- this.owner.login(done)
- this.project = {}
- this.callback = sinon.stub()
- })
- describe('creating a project from the example template', function () {
- beforeEach(function (done) {
- this.owner.createProject(
- 'example-project',
- { template: 'example' },
- (error, projectId) => {
- expect(error).to.not.exist
- this.example_project_id = projectId
- this.owner.getProject(projectId, (error, project) => {
- expect(error).to.not.exist
- this.project = project
- this.mainTexDoc = _.find(
- project.rootFolder[0].docs,
- doc => doc.name === 'main.tex'
- )
- this.refBibDoc = _.find(
- project.rootFolder[0].docs,
- doc => doc.name === 'sample.bib'
- )
- this.imageFile = _.find(
- project.rootFolder[0].fileRefs,
- file => file.name === 'frog.jpg'
- )
- this.rootFolderId = project.rootFolder[0]._id.toString()
- // create a folder called 'testfolder'
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/folder`,
- json: {
- name: 'testfolder',
- parent_folder_id: this.rootFolderId,
- },
- },
- (err, res, body) => {
- expect(err).to.not.exist
- this.testFolderId = body._id
- done()
- }
- )
- })
- }
- )
- })
- it('should create a project', function () {
- expect(this.project.rootFolder[0].docs.length).to.equal(2)
- expect(this.project.rootFolder[0].fileRefs.length).to.equal(1)
- })
- it('should create two docs in the docstore', function () {
- const docs = MockDocstoreApi.docs[this.example_project_id]
- expect(Object.keys(docs).length).to.equal(2)
- })
- it('should create one file in the history-v1', function () {
- const files =
- MockV1HistoryApi.blobs[this.project.overleaf.history.id.toString()]
- expect(Object.keys(files).length).to.equal(1)
- })
- describe('for an existing doc', function () {
- describe('trying to add a doc with the same name', function () {
- beforeEach(function (done) {
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/doc`,
- json: {
- name: 'main.tex',
- parent_folder_id: this.rootFolderId,
- },
- },
- (err, res, body) => {
- expect(err).to.not.exist
- this.res = res
- done()
- }
- )
- })
- it('should respond with 400 error status', function () {
- expect(this.res.statusCode).to.equal(400)
- })
- })
- describe('trying to add a folder with the same name', function () {
- beforeEach(function (done) {
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/folder`,
- json: {
- name: 'main.tex',
- parent_folder_id: this.rootFolderId,
- },
- },
- (err, res, body) => {
- expect(err).to.not.exist
- this.res = res
- done()
- }
- )
- })
- it('should respond with 400 error status', function () {
- expect(this.res.statusCode).to.equal(400)
- })
- })
- })
- describe('for an existing file', function () {
- describe('trying to add a doc with the same name', function () {
- beforeEach(function (done) {
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/doc`,
- json: {
- name: 'frog.jpg',
- parent_folder_id: this.rootFolderId,
- },
- },
- (err, res, body) => {
- expect(err).to.not.exist
- this.res = res
- done()
- }
- )
- })
- it('should respond with 400 error status', function () {
- expect(this.res.statusCode).to.equal(400)
- })
- })
- describe('trying to add a folder with the same name', function () {
- beforeEach(function (done) {
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/folder`,
- json: {
- name: 'frog.jpg',
- parent_folder_id: this.rootFolderId,
- },
- },
- (err, res, body) => {
- expect(err).to.not.exist
- this.res = res
- done()
- }
- )
- })
- it('should respond with 400 error status', function () {
- expect(this.res.statusCode).to.equal(400)
- })
- })
- describe('trying to upload a file with the same name', function () {
- beforeEach(function (done) {
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/upload`,
- json: true,
- qs: {
- folder_id: this.rootFolderId,
- qqfilename: 'frog.jpg',
- },
- formData: {
- name: 'frog.jpg',
- qqfile: {
- value: fs.createReadStream(
- Path.join(__dirname, '/../files/1pixel.png')
- ),
- options: {
- filename: 'frog.jpg',
- contentType: 'image/jpeg',
- },
- },
- },
- },
- (err, res, body) => {
- expect(err).to.not.exist
- this.body = body
- // update the image id because we have replaced the file
- this.imageFile._id = this.body.entity_id
- done()
- }
- )
- })
- it('should succeed (overwriting the file)', function () {
- expect(this.body.success).to.equal(true)
- })
- })
- })
- // at this point the @imageFile._id has changed
- describe('for an existing folder', function () {
- describe('trying to add a doc with the same name', function () {
- beforeEach(function (done) {
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/doc`,
- json: {
- name: 'testfolder',
- parent_folder_id: this.rootFolderId,
- },
- },
- (err, res, body) => {
- expect(err).to.not.exist
- this.res = res
- done()
- }
- )
- })
- it('should respond with 400 error status', function () {
- expect(this.res.statusCode).to.equal(400)
- })
- })
- describe('trying to add a folder with the same name', function () {
- beforeEach(function (done) {
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/folder`,
- json: {
- name: 'testfolder',
- parent_folder_id: this.rootFolderId,
- },
- },
- (err, res, body) => {
- expect(err).to.not.exist
- this.res = res
- done()
- }
- )
- })
- it('should respond with 400 error status', function () {
- expect(this.res.statusCode).to.equal(400)
- })
- })
- describe('trying to upload a file with the same name', function () {
- beforeEach(function (done) {
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/upload`,
- json: true,
- qs: {
- folder_id: this.rootFolderId,
- qqfilename: 'frog.jpg',
- },
- formData: {
- qqfile: {
- value: fs.createReadStream(
- Path.join(__dirname, '/../files/1pixel.png')
- ),
- options: {
- filename: 'testfolder',
- contentType: 'image/jpeg',
- },
- },
- },
- },
- (err, res, body) => {
- expect(err).to.not.exist
- this.body = body
- done()
- }
- )
- })
- it('should respond with failure status', function () {
- expect(this.body.success).to.equal(false)
- })
- })
- })
- describe('rename for an existing doc', function () {
- describe('trying to rename a doc to the same name', function () {
- beforeEach(function (done) {
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/doc/${this.refBibDoc._id}/rename`,
- json: {
- name: 'main.tex',
- },
- },
- (err, res, body) => {
- expect(err).to.not.exist
- this.res = res
- done()
- }
- )
- })
- it('should respond with 400 error status', function () {
- expect(this.res.statusCode).to.equal(400)
- })
- })
- describe('trying to rename a folder to the same name', function () {
- beforeEach(function (done) {
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/folder/${this.testFolderId}/rename`,
- json: {
- name: 'main.tex',
- },
- },
- (err, res, body) => {
- expect(err).to.not.exist
- this.res = res
- done()
- }
- )
- })
- it('should respond with 400 error status', function () {
- expect(this.res.statusCode).to.equal(400)
- })
- })
- describe('trying to rename a file to the same name', function () {
- beforeEach(function (done) {
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/file/${this.imageFile._id}/rename`,
- json: {
- name: 'main.tex',
- },
- },
- (err, res, body) => {
- expect(err).to.not.exist
- this.res = res
- done()
- }
- )
- })
- it('should respond with failure status', function () {
- expect(this.res.statusCode).to.equal(400)
- })
- })
- })
- describe('rename for an existing file', function () {
- describe('trying to rename a doc to the same name', function () {
- beforeEach(function (done) {
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/doc/${this.refBibDoc._id}/rename`,
- json: {
- name: 'frog.jpg',
- },
- },
- (err, res, body) => {
- expect(err).to.not.exist
- this.res = res
- done()
- }
- )
- })
- it('should respond with 400 error status', function () {
- expect(this.res.statusCode).to.equal(400)
- })
- })
- describe('trying to rename a folder to the same name', function () {
- beforeEach(function (done) {
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/folder/${this.testFolderId}/rename`,
- json: {
- name: 'frog.jpg',
- },
- },
- (err, res, body) => {
- expect(err).to.not.exist
- this.res = res
- done()
- }
- )
- })
- it('should respond with 400 error status', function () {
- expect(this.res.statusCode).to.equal(400)
- })
- })
- describe('trying to rename a file to the same name', function () {
- beforeEach(function (done) {
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/file/${this.imageFile._id}/rename`,
- json: {
- name: 'frog.jpg',
- },
- },
- (err, res, body) => {
- expect(err).to.not.exist
- this.res = res
- done()
- }
- )
- })
- it('should respond with failure status', function () {
- expect(this.res.statusCode).to.equal(400)
- })
- })
- })
- describe('rename for an existing folder', function () {
- describe('trying to rename a doc to the same name', function () {
- beforeEach(function (done) {
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/doc/${this.refBibDoc._id}/rename`,
- json: {
- name: 'testfolder',
- },
- },
- (err, res, body) => {
- expect(err).to.not.exist
- this.res = res
- done()
- }
- )
- })
- it('should respond with 400 error status', function () {
- expect(this.res.statusCode).to.equal(400)
- })
- })
- describe('trying to rename a folder to the same name', function () {
- beforeEach(function (done) {
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/folder/${this.testFolderId}/rename`,
- json: {
- name: 'testfolder',
- },
- },
- (err, res, body) => {
- expect(err).to.not.exist
- this.res = res
- done()
- }
- )
- })
- it('should respond with 400 error status', function () {
- expect(this.res.statusCode).to.equal(400)
- })
- })
- describe('trying to rename a file to the same name', function () {
- beforeEach(function (done) {
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/file/${this.imageFile._id}/rename`,
- json: {
- name: 'testfolder',
- },
- },
- (err, res, body) => {
- expect(err).to.not.exist
- this.res = res
- done()
- }
- )
- })
- it('should respond with failure status', function () {
- expect(this.res.statusCode).to.equal(400)
- })
- })
- })
- describe('for an existing folder with a file with the same name', function () {
- beforeEach(function (done) {
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/doc`,
- json: {
- name: 'main.tex',
- parent_folder_id: this.testFolderId,
- },
- },
- (err, res, body) => {
- if (err) {
- throw err
- }
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/doc`,
- json: {
- name: 'frog.jpg',
- parent_folder_id: this.testFolderId,
- },
- },
- (err, res, body) => {
- if (err) {
- throw err
- }
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/folder`,
- json: {
- name: 'otherFolder',
- parent_folder_id: this.testFolderId,
- },
- },
- (err, res, body) => {
- if (err) {
- throw err
- }
- this.subFolderId = body._id
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/folder`,
- json: {
- name: 'otherFolder',
- parent_folder_id: this.rootFolderId,
- },
- },
- (err, res, body) => {
- if (err) {
- throw err
- }
- this.otherFolderId = body._id
- done()
- }
- )
- }
- )
- }
- )
- }
- )
- })
- describe('trying to move a doc into the folder', function () {
- beforeEach(function (done) {
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/doc/${this.mainTexDoc._id}/move`,
- json: {
- folder_id: this.testFolderId,
- },
- },
- (err, res, body) => {
- expect(err).to.not.exist
- this.res = res
- done()
- }
- )
- })
- it('should respond with 400 error status', function () {
- expect(this.res.statusCode).to.equal(400)
- })
- })
- describe('trying to move a file into the folder', function () {
- beforeEach(function (done) {
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/file/${this.imageFile._id}/move`,
- json: {
- folder_id: this.testFolderId,
- },
- },
- (err, res, body) => {
- expect(err).to.not.exist
- this.res = res
- done()
- }
- )
- })
- it('should respond with 400 error status', function () {
- expect(this.res.statusCode).to.equal(400)
- })
- })
- describe('trying to move a folder into the folder', function () {
- beforeEach(function (done) {
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/folder/${this.otherFolderId}/move`,
- json: {
- folder_id: this.testFolderId,
- },
- },
- (err, res, body) => {
- expect(err).to.not.exist
- this.res = res
- done()
- }
- )
- })
- it('should respond with 400 error status', function () {
- expect(this.res.statusCode).to.equal(400)
- })
- })
- describe('trying to move a folder into a subfolder of itself', function () {
- beforeEach(function (done) {
- this.owner.request.post(
- {
- uri: `/project/${this.example_project_id}/folder/${this.testFolderId}/move`,
- json: {
- folder_id: this.subFolderId,
- },
- },
- (err, res, body) => {
- expect(err).to.not.exist
- this.res = res
- done()
- }
- )
- })
- it('should respond with 400 error status', function () {
- expect(this.res.statusCode).to.equal(400)
- })
- })
- })
- })
- describe('regex characters in title', function () {
- let response, userHelper
- beforeEach(async function () {
- userHelper = new UserHelper()
- userHelper = await UserHelper.createUser()
- userHelper = await UserHelper.loginUser(
- userHelper.getDefaultEmailPassword()
- )
- })
- it('should handle characters that would cause an invalid regular expression', async function () {
- const projectName = 'Example (test'
- response = await userHelper.fetch('/project/new', {
- method: 'POST',
- body: new URLSearchParams([['projectName', projectName]]),
- })
- const body = await response.json()
- expect(response.status).to.equal(200) // can create project
- response = await userHelper.fetch(`/project/${body.project_id}`)
- expect(response.status).to.equal(200) // can open project
- })
- })
- })
|