浏览代码

Added more tests. fixed small bug.

Maciej Bukowski 7 年之前
父节点
当前提交
5577aa2dca
共有 2 个文件被更改,包括 103 次插入6 次删除
  1. 3 1
      packages/ckeditor5-autosave/src/autosave.js
  2. 100 5
      packages/ckeditor5-autosave/tests/autosave.js

+ 3 - 1
packages/ckeditor5-autosave/src/autosave.js

@@ -158,7 +158,9 @@ export default class Autosave extends Plugin {
 	_save() {
 		const version = this.editor.model.document.version;
 
-		if ( !this.provider || version <= this._lastDocumentVersion ) {
+		// Marker's change may not produce an operation, so the document's version
+		// can be the same after that change.
+		if ( !this.provider || version < this._lastDocumentVersion ) {
 			this._removeAction();
 
 			return;

+ 100 - 5
packages/ckeditor5-autosave/tests/autosave.js

@@ -172,7 +172,7 @@ describe( 'Autosave', () => {
 			} );
 		} );
 
-		it( 'should filter out change batches that don\'t change content', () => {
+		it( 'should filter out changes in the selection', () => {
 			autosave.provider = {
 				save: sandbox.spy()
 			};
@@ -185,20 +185,115 @@ describe( 'Autosave', () => {
 			sinon.assert.notCalled( autosave.provider.save );
 		} );
 
-		it.skip( 'should filter out change batches that don\'t change content #2', () => {
+		it( 'should filter out markers that does not affect the data model', () => {
 			autosave.provider = {
 				save: sandbox.spy()
 			};
 
-			const operation = { name: 'user:position' };
-			editor.model.document.fire( 'change', {
-				deltas: [ { operations: [ operation ] } ]
+			const range = ModelRange.createIn( editor.model.document.getRoot().getChild( 0 ) );
+			const range2 = ModelRange.createIn( editor.model.document.getRoot().getChild( 1 ) );
+
+			editor.model.change( writer => {
+				writer.addMarker( 'name', { usingOperation: true, affectsData: false, range } );
+			} );
+
+			autosave._flush();
+
+			editor.model.change( writer => {
+				writer.updateMarker( 'name', { range: range2 } );
 			} );
 
 			autosave._flush();
+
 			sinon.assert.notCalled( autosave.provider.save );
 		} );
 
+		it( 'should filter out markers that does not affect the data model #2', () => {
+			autosave.provider = {
+				save: sandbox.spy()
+			};
+
+			const range = ModelRange.createIn( editor.model.document.getRoot().getChild( 0 ) );
+			const range2 = ModelRange.createIn( editor.model.document.getRoot().getChild( 1 ) );
+
+			editor.model.change( writer => {
+				writer.addMarker( 'name', { usingOperation: false, affectsData: false, range } );
+			} );
+
+			autosave._flush();
+
+			editor.model.change( writer => {
+				writer.updateMarker( 'name', { range: range2 } );
+			} );
+
+			autosave._flush();
+
+			sinon.assert.notCalled( autosave.provider.save );
+		} );
+
+		it( 'should call the save method when some marker affects the data model', () => {
+			autosave.provider = {
+				save: sandbox.spy()
+			};
+
+			const range = ModelRange.createIn( editor.model.document.getRoot().getChild( 0 ) );
+			const range2 = ModelRange.createIn( editor.model.document.getRoot().getChild( 1 ) );
+
+			editor.model.change( writer => {
+				writer.addMarker( 'name', { usingOperation: true, affectsData: true, range } );
+			} );
+
+			autosave._flush();
+
+			editor.model.change( writer => {
+				writer.updateMarker( 'name', { range: range2 } );
+			} );
+
+			autosave._flush();
+
+			sinon.assert.calledTwice( autosave.provider.save );
+		} );
+
+		it( 'should call the save method when some marker affects the data model #2', () => {
+			autosave.provider = {
+				save: sandbox.spy()
+			};
+
+			const range = ModelRange.createIn( editor.model.document.getRoot().getChild( 0 ) );
+			const range2 = ModelRange.createIn( editor.model.document.getRoot().getChild( 1 ) );
+
+			editor.model.change( writer => {
+				writer.addMarker( 'name', { usingOperation: false, affectsData: true, range } );
+			} );
+
+			autosave._flush();
+			sinon.assert.calledOnce( autosave.provider.save );
+
+			editor.model.change( writer => {
+				writer.updateMarker( 'name', { range: range2 } );
+			} );
+
+			autosave._flush();
+
+			sinon.assert.calledTwice( autosave.provider.save );
+		} );
+
+		it( 'should call the save method when some marker affects the data model #3', () => {
+			autosave.provider = {
+				save: sandbox.spy()
+			};
+
+			const range = ModelRange.createIn( editor.model.document.getRoot().getChild( 0 ) );
+
+			editor.model.change( writer => {
+				writer.addMarker( 'marker-not-affecting-data', { usingOperation: false, affectsData: true, range } );
+				writer.addMarker( 'marker-affecting-data', { usingOperation: false, affectsData: false, range } );
+			} );
+
+			autosave._flush();
+			sinon.assert.calledOnce( autosave.provider.save );
+		} );
+
 		it( 'should flush remaining calls after editor\'s destroy', () => {
 			const spy = sandbox.spy();
 			const savedStates = [];