|
|
@@ -1,20 +1,4 @@
|
|
|
-/* eslint-disable
|
|
|
- no-undef,
|
|
|
- no-unused-vars,
|
|
|
-*/
|
|
|
-// TODO: This file was created by bulk-decaffeinate.
|
|
|
-// Fix any style issues and re-enable lint.
|
|
|
-/*
|
|
|
- * decaffeinate suggestions:
|
|
|
- * DS102: Remove unnecessary code created because of implicit returns
|
|
|
- * DS207: Consider shorter variations of null checks
|
|
|
- * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
|
|
- */
|
|
|
-import sinon from 'sinon'
|
|
|
import { expect } from 'chai'
|
|
|
-import Settings from '@overleaf/settings'
|
|
|
-import request from 'request'
|
|
|
-import assert from 'node:assert'
|
|
|
import mongodb from 'mongodb-legacy'
|
|
|
import nock from 'nock'
|
|
|
import * as ProjectHistoryClient from './helpers/ProjectHistoryClient.js'
|
|
|
@@ -22,228 +6,196 @@ import * as ProjectHistoryApp from './helpers/ProjectHistoryApp.js'
|
|
|
const { ObjectId } = mongodb
|
|
|
|
|
|
const MockHistoryStore = () => nock('http://127.0.0.1:3100')
|
|
|
-const MockFileStore = () => nock('http://127.0.0.1:3009')
|
|
|
const MockWeb = () => nock('http://127.0.0.1:3000')
|
|
|
|
|
|
const fixture = path => new URL(`../fixtures/${path}`, import.meta.url)
|
|
|
|
|
|
describe('Summarized updates', function () {
|
|
|
- beforeEach(function (done) {
|
|
|
+ beforeEach(async function () {
|
|
|
this.projectId = new ObjectId().toString()
|
|
|
this.historyId = new ObjectId().toString()
|
|
|
- return ProjectHistoryApp.ensureRunning(error => {
|
|
|
- if (error != null) {
|
|
|
- throw error
|
|
|
- }
|
|
|
|
|
|
- MockHistoryStore().post('/api/projects').reply(200, {
|
|
|
- projectId: this.historyId,
|
|
|
- })
|
|
|
+ await ProjectHistoryApp.promises.ensureRunning()
|
|
|
|
|
|
- return ProjectHistoryClient.initializeProject(
|
|
|
- this.historyId,
|
|
|
- (error, olProject) => {
|
|
|
- if (error != null) {
|
|
|
- throw error
|
|
|
- }
|
|
|
- MockWeb()
|
|
|
- .get(`/project/${this.projectId}/details`)
|
|
|
- .reply(200, {
|
|
|
- name: 'Test Project',
|
|
|
- overleaf: { history: { id: olProject.id } },
|
|
|
- })
|
|
|
-
|
|
|
- MockHistoryStore()
|
|
|
- .get(`/api/projects/${this.historyId}/latest/history`)
|
|
|
- .replyWithFile(200, fixture('chunks/7-8.json'))
|
|
|
- MockHistoryStore()
|
|
|
- .get(`/api/projects/${this.historyId}/versions/6/history`)
|
|
|
- .replyWithFile(200, fixture('chunks/4-6.json'))
|
|
|
- MockHistoryStore()
|
|
|
- .get(`/api/projects/${this.historyId}/versions/3/history`)
|
|
|
- .replyWithFile(200, fixture('chunks/0-3.json'))
|
|
|
-
|
|
|
- return done()
|
|
|
- }
|
|
|
- )
|
|
|
+ MockHistoryStore().post('/api/projects').reply(200, {
|
|
|
+ projectId: this.historyId,
|
|
|
})
|
|
|
+
|
|
|
+ const olProject = await ProjectHistoryClient.promises.initializeProject(
|
|
|
+ this.historyId
|
|
|
+ )
|
|
|
+
|
|
|
+ MockWeb()
|
|
|
+ .get(`/project/${this.projectId}/details`)
|
|
|
+ .reply(200, {
|
|
|
+ name: 'Test Project',
|
|
|
+ overleaf: { history: { id: olProject.id } },
|
|
|
+ })
|
|
|
+
|
|
|
+ MockHistoryStore()
|
|
|
+ .get(`/api/projects/${this.historyId}/latest/history`)
|
|
|
+ .replyWithFile(200, fixture('chunks/7-8.json'))
|
|
|
+ MockHistoryStore()
|
|
|
+ .get(`/api/projects/${this.historyId}/versions/6/history`)
|
|
|
+ .replyWithFile(200, fixture('chunks/4-6.json'))
|
|
|
+ MockHistoryStore()
|
|
|
+ .get(`/api/projects/${this.historyId}/versions/3/history`)
|
|
|
+ .replyWithFile(200, fixture('chunks/0-3.json'))
|
|
|
})
|
|
|
|
|
|
afterEach(function () {
|
|
|
return nock.cleanAll()
|
|
|
})
|
|
|
|
|
|
- it('should return the latest summarized updates from a single chunk', function (done) {
|
|
|
- return ProjectHistoryClient.getSummarizedUpdates(
|
|
|
+ it('should return the latest summarized updates from a single chunk', async function () {
|
|
|
+ const updates = await ProjectHistoryClient.promises.getSummarizedUpdates(
|
|
|
this.projectId,
|
|
|
- { min_count: 1 },
|
|
|
- (error, updates) => {
|
|
|
- if (error != null) {
|
|
|
- throw error
|
|
|
- }
|
|
|
- expect(updates).to.deep.equal({
|
|
|
- nextBeforeTimestamp: 6,
|
|
|
- updates: [
|
|
|
- {
|
|
|
- fromV: 6,
|
|
|
- toV: 8,
|
|
|
- meta: {
|
|
|
- users: ['5a5637efdac84e81b71014c4', 31],
|
|
|
- start_ts: 1512383567277,
|
|
|
- end_ts: 1512383572877,
|
|
|
- },
|
|
|
- pathnames: ['bar.tex', 'main.tex'],
|
|
|
- project_ops: [],
|
|
|
- labels: [],
|
|
|
- },
|
|
|
- ],
|
|
|
- })
|
|
|
- return done()
|
|
|
- }
|
|
|
+ { min_count: 1 }
|
|
|
)
|
|
|
+
|
|
|
+ expect(updates).to.deep.equal({
|
|
|
+ nextBeforeTimestamp: 6,
|
|
|
+ updates: [
|
|
|
+ {
|
|
|
+ fromV: 6,
|
|
|
+ toV: 8,
|
|
|
+ meta: {
|
|
|
+ users: ['5a5637efdac84e81b71014c4', 31],
|
|
|
+ start_ts: 1512383567277,
|
|
|
+ end_ts: 1512383572877,
|
|
|
+ },
|
|
|
+ pathnames: ['bar.tex', 'main.tex'],
|
|
|
+ project_ops: [],
|
|
|
+ labels: [],
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ })
|
|
|
})
|
|
|
|
|
|
- it('should return the latest summarized updates, with min_count spanning multiple chunks', function (done) {
|
|
|
- return ProjectHistoryClient.getSummarizedUpdates(
|
|
|
+ it('should return the latest summarized updates, with min_count spanning multiple chunks', async function () {
|
|
|
+ const updates = await ProjectHistoryClient.promises.getSummarizedUpdates(
|
|
|
this.projectId,
|
|
|
- { min_count: 5 },
|
|
|
- (error, updates) => {
|
|
|
- if (error != null) {
|
|
|
- throw error
|
|
|
- }
|
|
|
- expect(updates).to.deep.equal({
|
|
|
- updates: [
|
|
|
- {
|
|
|
- fromV: 6,
|
|
|
- toV: 8,
|
|
|
- meta: {
|
|
|
- users: ['5a5637efdac84e81b71014c4', 31],
|
|
|
- start_ts: 1512383567277,
|
|
|
- end_ts: 1512383572877,
|
|
|
- },
|
|
|
- pathnames: ['bar.tex', 'main.tex'],
|
|
|
- project_ops: [],
|
|
|
- labels: [],
|
|
|
- },
|
|
|
- {
|
|
|
- fromV: 5,
|
|
|
- toV: 6,
|
|
|
- meta: {
|
|
|
- users: [31],
|
|
|
- start_ts: 1512383366120,
|
|
|
- end_ts: 1512383366120,
|
|
|
- },
|
|
|
- pathnames: [],
|
|
|
- project_ops: [
|
|
|
- {
|
|
|
- atV: 5,
|
|
|
- rename: {
|
|
|
- pathname: 'foo.tex',
|
|
|
- newPathname: 'bar.tex',
|
|
|
- },
|
|
|
- },
|
|
|
- ],
|
|
|
- labels: [],
|
|
|
- },
|
|
|
- {
|
|
|
- fromV: 2,
|
|
|
- toV: 5,
|
|
|
- meta: {
|
|
|
- users: [31],
|
|
|
- start_ts: 1512383313724,
|
|
|
- end_ts: 1512383362905,
|
|
|
- },
|
|
|
- pathnames: ['foo.tex'],
|
|
|
- project_ops: [],
|
|
|
- labels: [],
|
|
|
- },
|
|
|
+ { min_count: 5 }
|
|
|
+ )
|
|
|
+
|
|
|
+ expect(updates).to.deep.equal({
|
|
|
+ updates: [
|
|
|
+ {
|
|
|
+ fromV: 6,
|
|
|
+ toV: 8,
|
|
|
+ meta: {
|
|
|
+ users: ['5a5637efdac84e81b71014c4', 31],
|
|
|
+ start_ts: 1512383567277,
|
|
|
+ end_ts: 1512383572877,
|
|
|
+ },
|
|
|
+ pathnames: ['bar.tex', 'main.tex'],
|
|
|
+ project_ops: [],
|
|
|
+ labels: [],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ fromV: 5,
|
|
|
+ toV: 6,
|
|
|
+ meta: {
|
|
|
+ users: [31],
|
|
|
+ start_ts: 1512383366120,
|
|
|
+ end_ts: 1512383366120,
|
|
|
+ },
|
|
|
+ pathnames: [],
|
|
|
+ project_ops: [
|
|
|
{
|
|
|
- fromV: 1,
|
|
|
- toV: 2,
|
|
|
- meta: {
|
|
|
- users: [31],
|
|
|
- start_ts: 1512383246874,
|
|
|
- end_ts: 1512383246874,
|
|
|
+ atV: 5,
|
|
|
+ rename: {
|
|
|
+ pathname: 'foo.tex',
|
|
|
+ newPathname: 'bar.tex',
|
|
|
},
|
|
|
- pathnames: [],
|
|
|
- project_ops: [
|
|
|
- {
|
|
|
- atV: 1,
|
|
|
- rename: {
|
|
|
- pathname: 'bar.tex',
|
|
|
- newPathname: 'foo.tex',
|
|
|
- },
|
|
|
- },
|
|
|
- ],
|
|
|
- labels: [],
|
|
|
},
|
|
|
+ ],
|
|
|
+ labels: [],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ fromV: 2,
|
|
|
+ toV: 5,
|
|
|
+ meta: {
|
|
|
+ users: [31],
|
|
|
+ start_ts: 1512383313724,
|
|
|
+ end_ts: 1512383362905,
|
|
|
+ },
|
|
|
+ pathnames: ['foo.tex'],
|
|
|
+ project_ops: [],
|
|
|
+ labels: [],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ fromV: 1,
|
|
|
+ toV: 2,
|
|
|
+ meta: {
|
|
|
+ users: [31],
|
|
|
+ start_ts: 1512383246874,
|
|
|
+ end_ts: 1512383246874,
|
|
|
+ },
|
|
|
+ pathnames: [],
|
|
|
+ project_ops: [
|
|
|
{
|
|
|
- fromV: 0,
|
|
|
- toV: 1,
|
|
|
- meta: {
|
|
|
- users: [31],
|
|
|
- start_ts: 1512383015633,
|
|
|
- end_ts: 1512383015633,
|
|
|
+ atV: 1,
|
|
|
+ rename: {
|
|
|
+ pathname: 'bar.tex',
|
|
|
+ newPathname: 'foo.tex',
|
|
|
},
|
|
|
- pathnames: ['main.tex'],
|
|
|
- project_ops: [],
|
|
|
- labels: [],
|
|
|
},
|
|
|
],
|
|
|
- })
|
|
|
- return done()
|
|
|
- }
|
|
|
- )
|
|
|
+ labels: [],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ fromV: 0,
|
|
|
+ toV: 1,
|
|
|
+ meta: {
|
|
|
+ users: [31],
|
|
|
+ start_ts: 1512383015633,
|
|
|
+ end_ts: 1512383015633,
|
|
|
+ },
|
|
|
+ pathnames: ['main.tex'],
|
|
|
+ project_ops: [],
|
|
|
+ labels: [],
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ })
|
|
|
})
|
|
|
|
|
|
- it('should return the summarized updates from a before version at the start of a chunk', function (done) {
|
|
|
+ it('should return the summarized updates from a before version at the start of a chunk', async function () {
|
|
|
MockHistoryStore()
|
|
|
.get(`/api/projects/${this.historyId}/versions/4/history`)
|
|
|
.replyWithFile(200, fixture('chunks/4-6.json'))
|
|
|
- return ProjectHistoryClient.getSummarizedUpdates(
|
|
|
+
|
|
|
+ const updates = await ProjectHistoryClient.promises.getSummarizedUpdates(
|
|
|
this.projectId,
|
|
|
- { before: 4 },
|
|
|
- (error, updates) => {
|
|
|
- if (error != null) {
|
|
|
- throw error
|
|
|
- }
|
|
|
- expect(updates.updates[0].toV).to.equal(4)
|
|
|
- return done()
|
|
|
- }
|
|
|
+ { before: 4 }
|
|
|
)
|
|
|
+
|
|
|
+ expect(updates.updates[0].toV).to.equal(4)
|
|
|
})
|
|
|
|
|
|
- it('should return the summarized updates from a before version in the middle of a chunk', function (done) {
|
|
|
+ it('should return the summarized updates from a before version in the middle of a chunk', async function () {
|
|
|
MockHistoryStore()
|
|
|
.get(`/api/projects/${this.historyId}/versions/5/history`)
|
|
|
.replyWithFile(200, fixture('chunks/4-6.json'))
|
|
|
- return ProjectHistoryClient.getSummarizedUpdates(
|
|
|
+
|
|
|
+ const updates = await ProjectHistoryClient.promises.getSummarizedUpdates(
|
|
|
this.projectId,
|
|
|
- { before: 5 },
|
|
|
- (error, updates) => {
|
|
|
- if (error != null) {
|
|
|
- throw error
|
|
|
- }
|
|
|
- expect(updates.updates[0].toV).to.equal(5)
|
|
|
- return done()
|
|
|
- }
|
|
|
+ { before: 5 }
|
|
|
)
|
|
|
+
|
|
|
+ expect(updates.updates[0].toV).to.equal(5)
|
|
|
})
|
|
|
|
|
|
- return it('should return the summarized updates from a before version at the end of a chunk', function (done) {
|
|
|
+ it('should return the summarized updates from a before version at the end of a chunk', async function () {
|
|
|
MockHistoryStore()
|
|
|
.get(`/api/projects/${this.historyId}/versions/6/history`)
|
|
|
.replyWithFile(200, fixture('chunks/4-6.json'))
|
|
|
- return ProjectHistoryClient.getSummarizedUpdates(
|
|
|
+
|
|
|
+ const updates = await ProjectHistoryClient.promises.getSummarizedUpdates(
|
|
|
this.projectId,
|
|
|
- { before: 6 },
|
|
|
- (error, updates) => {
|
|
|
- if (error != null) {
|
|
|
- throw error
|
|
|
- }
|
|
|
- expect(updates.updates[0].toV).to.equal(6)
|
|
|
- return done()
|
|
|
- }
|
|
|
+ { before: 6 }
|
|
|
)
|
|
|
+
|
|
|
+ expect(updates.updates[0].toV).to.equal(6)
|
|
|
})
|
|
|
})
|