fix: Revision skipped after identical previous autosave

This commit is contained in:
Tom Moor 2020-09-11 12:06:57 -07:00
parent 38d1831259
commit c298c73240
4 changed files with 72 additions and 6 deletions

View File

@ -18,15 +18,14 @@ const serializer = new MarkdownSerializer();
export const DOCUMENT_VERSION = 2;
const createRevision = (doc, options = {}) => {
const createRevision = async (doc, options = {}) => {
// we don't create revisions for autosaves
if (options.autosave) return;
const previous = await Revision.findLatest(doc.id);
// we don't create revisions if identical to previous
if (
doc.text === doc.previous("text") &&
doc.title === doc.previous("title")
) {
if (previous && doc.text === previous.text && doc.title === previous.title) {
return;
}

View File

@ -1,5 +1,5 @@
/* eslint-disable flowtype/require-valid-file-annotation */
import { Document } from "../models";
import { Document, Revision } from "../models";
import {
buildDocument,
buildCollection,
@ -11,6 +11,37 @@ import { flushdb } from "../test/support";
beforeEach(() => flushdb());
beforeEach(jest.resetAllMocks);
describe("#createRevision", () => {
test("should create revision on document creation", async () => {
const document = await buildDocument();
document.title = "Changed";
await document.save({ autosave: true });
const amount = await Revision.count({ where: { documentId: document.id } });
expect(amount).toBe(1);
});
test("should create revision on document update identical to previous autosave", async () => {
const document = await buildDocument();
document.title = "Changed";
await document.save({ autosave: true });
document.title = "Changed";
await document.save();
const amount = await Revision.count({ where: { documentId: document.id } });
expect(amount).toBe(2);
});
test("should not create revision if autosave", async () => {
const document = await buildDocument();
const amount = await Revision.count({ where: { documentId: document.id } });
expect(amount).toBe(1);
});
});
describe("#getSummary", () => {
test("should strip markdown", async () => {
const document = await buildDocument({

View File

@ -40,6 +40,15 @@ Revision.associate = (models) => {
);
};
Revision.findLatest = function (documentId) {
return Revision.findOne({
where: {
documentId,
},
order: [["createdAt", "DESC"]],
});
};
Revision.prototype.migrateVersion = function () {
let migrated = false;

View File

@ -0,0 +1,27 @@
/* eslint-disable flowtype/require-valid-file-annotation */
import { Revision } from "../models";
import { buildDocument } from "../test/factories";
import { flushdb } from "../test/support";
beforeEach(() => flushdb());
beforeEach(jest.resetAllMocks);
describe("#findLatest", () => {
test("should return latest revision", async () => {
const document = await buildDocument({
title: "Title",
text: "Content",
});
document.title = "Changed 1";
await document.save();
document.title = "Changed 2";
await document.save();
const revision = await Revision.findLatest(document.id);
expect(revision.title).toBe("Changed 2");
expect(revision.text).toBe("Content");
});
});