| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- import { expect } from 'chai'
- import mongodb from 'mongodb-legacy'
- import nock from 'nock'
- import Core from 'overleaf-editor-core'
- import * as ProjectHistoryClient from './helpers/ProjectHistoryClient.js'
- import * as ProjectHistoryApp from './helpers/ProjectHistoryApp.js'
- import latestChunk from '../fixtures/chunks/7-8.json' with { type: 'json' }
- import previousChunk from '../fixtures/chunks/4-6.json' with { type: 'json' }
- import firstChunk from '../fixtures/chunks/0-3.json' with { type: 'json' }
- const { ObjectId } = mongodb
- const MockHistoryStore = () => nock('http://127.0.0.1:3100')
- const MockWeb = () => nock('http://127.0.0.1:3000')
- const fixture = path => new URL(`../fixtures/${path}`, import.meta.url)
- describe('GetChangesSince', function () {
- let projectId, historyId
- beforeEach(function (done) {
- projectId = new ObjectId().toString()
- historyId = new ObjectId().toString()
- ProjectHistoryApp.ensureRunning(error => {
- if (error) throw error
- MockHistoryStore().post('/api/projects').reply(200, {
- projectId: historyId,
- })
- ProjectHistoryClient.initializeProject(historyId, (error, olProject) => {
- if (error) throw error
- MockWeb()
- .get(`/project/${projectId}/details`)
- .reply(200, {
- name: 'Test Project',
- overleaf: { history: { id: olProject.id } },
- })
- MockHistoryStore()
- .get(`/api/projects/${historyId}/latest/history`)
- .replyWithFile(200, fixture('chunks/7-8.json'))
- MockHistoryStore()
- .get(`/api/projects/${historyId}/versions/6/history`)
- .replyWithFile(200, fixture('chunks/4-6.json'))
- MockHistoryStore()
- .get(`/api/projects/${historyId}/versions/3/history`)
- .replyWithFile(200, fixture('chunks/0-3.json'))
- done()
- })
- })
- })
- afterEach(function () {
- nock.cleanAll()
- })
- function expectChangesSince(version, changes, done) {
- ProjectHistoryClient.getChangesSince(
- projectId,
- version,
- {},
- (error, got) => {
- if (error) throw error
- expect(got.map(c => Core.Change.fromRaw(c))).to.deep.equal(
- changes.map(c => Core.Change.fromRaw(c))
- )
- done()
- }
- )
- }
- it('should return zero changes since the latest version', function (done) {
- expectChangesSince(8, [], done)
- })
- it('should return one change when behind one version', function (done) {
- expectChangesSince(7, [latestChunk.chunk.history.changes[1]], done)
- })
- it('should return changes when at the chunk boundary', function (done) {
- expect(latestChunk.chunk.startVersion).to.equal(6)
- expectChangesSince(6, latestChunk.chunk.history.changes, done)
- })
- it('should return changes spanning multiple chunks', function (done) {
- expectChangesSince(
- 1,
- [
- ...firstChunk.chunk.history.changes.slice(1),
- ...previousChunk.chunk.history.changes,
- ...latestChunk.chunk.history.changes,
- ],
- done
- )
- })
- it('should return all changes when going back to the beginning', function (done) {
- expectChangesSince(
- 0,
- [
- ...firstChunk.chunk.history.changes,
- ...previousChunk.chunk.history.changes,
- ...latestChunk.chunk.history.changes,
- ],
- done
- )
- })
- it('should return an error when past the end version', function (done) {
- ProjectHistoryClient.getChangesSince(
- projectId,
- 9,
- { allowErrors: true },
- (error, body, statusCode) => {
- if (error) throw error
- expect(statusCode).to.equal(500)
- expect(body).to.deep.equal({ message: 'an internal error occurred' })
- done()
- }
- )
- })
- })
|