Просмотр исходного кода

Refactor and improve acceptance tests

James Allen 12 лет назад
Родитель
Сommit
80af34895b

+ 61 - 58
services/track-changes/test/acceptance/coffee/AppendingUpdatesTests.coffee

@@ -9,12 +9,25 @@ Settings = require "settings-sharelatex"
 request = require "request"
 rclient = require("redis").createClient() # Only works locally for now
 
+flushAndGetCompressedUpdates = (doc_id, callback = (error, updates) ->) ->
+	request.post {
+		url: "http://localhost:#{Settings.port}/doc/#{doc_id}/flush"
+	}, (error, response, body) =>
+		response.statusCode.should.equal 204
+		db.docHistory
+			.find(doc_id: ObjectId(doc_id))
+			.sort("meta.end_ts": 1)
+			.toArray callback
+
+pushRawUpdates = (doc_id, updates, callback = (error) ->) ->
+	rclient.rpush "UncompressedHistoryOps:#{doc_id}", (JSON.stringify(u) for u in updates)..., callback
+
 describe "Appending doc ops to the history", ->
 	describe "when the history does not exist yet", ->
 		before (done) ->
 			@doc_id = ObjectId().toString()
 			@user_id = ObjectId().toString()
-			updates = [{
+			pushRawUpdates @doc_id, [{
 				op: [{ i: "f", p: 3 }]
 				meta: { ts: Date.now(), user_id: @user_id }
 				v: 3
@@ -26,106 +39,96 @@ describe "Appending doc ops to the history", ->
 				op: [{ i: "o", p: 5 }]
 				meta: { ts: Date.now(), user_id: @user_id }
 				v: 5
-			}]
-
-			rclient.rpush "UncompressedHistoryOps:#{@doc_id}", (JSON.stringify(u) for u in updates)...
-
-			request.post {
-				url: "http://localhost:#{Settings.port}/doc/#{@doc_id}/flush"
-			}, (@error, @response, @body) =>
-				db.docHistory
-					.find(doc_id: ObjectId(@doc_id))
-					.sort("meta.end_ts": -1)
-					.toArray (error, updates) =>
-						@update = updates[0]
-						done()
-
-		it "should return a successful response", ->
-			@response.statusCode.should.equal 204
+			}], (error) =>
+				throw error if error?
+				flushAndGetCompressedUpdates @doc_id, (error, @updates) =>
+					throw error if error?
+					done()
 
 		it "should insert the compressed op into mongo", ->
-			expect(@update.op).to.deep.equal {
+			expect(@updates[0].op).to.deep.equal {
 				p: 3, i: "foo"
 			}
 
 		it "should insert the correct version number into mongo", ->
-			expect(@update.v).to.equal 5
+			expect(@updates[0].v).to.equal 5
 
-			###
 	describe "when the history has already been started", ->
 		beforeEach (done) ->
 			@doc_id = ObjectId().toString()
 			@user_id = ObjectId().toString()
-			updates = [{
+			pushRawUpdates @doc_id, [{
 				op: [{ i: "f", p: 3 }]
 				meta: { ts: Date.now(), user_id: @user_id }
+				v: 3
 			}, {
 				op: [{ i: "o", p: 4 }]
 				meta: { ts: Date.now(), user_id: @user_id }
+				v: 4
 			}, {
 				op: [{ i: "o", p: 5 }]
 				meta: { ts: Date.now(), user_id: @user_id }
-			}]
-			@version = 3
-
-			request.post {
-				url: "http://localhost:#{Settings.port}/doc/#{@doc_id}/history"
-				json:
-					version: @version
-					docOps: updates
-			}, (@error, @response, @body) =>
-				done()
+				v: 5
+			}], (error) =>
+				throw error if error?
+				flushAndGetCompressedUpdates @doc_id, (error, updates) =>
+					throw error if error?
+					done()
 
 		describe "when the updates are recent and from the same user", ->
 			beforeEach (done) ->
-				updates = [{
+				pushRawUpdates @doc_id, [{
 					op: [{ i: "b", p: 6 }]
 					meta: { ts: Date.now(), user_id: @user_id }
+					v: 6
 				}, {
 					op: [{ i: "a", p: 7 }]
 					meta: { ts: Date.now(), user_id: @user_id }
+					v: 7
 				}, {
 					op: [{ i: "r", p: 8 }]
 					meta: { ts: Date.now(), user_id: @user_id }
-				}]
-				@version = 6
+					v: 8
+				}], (error) =>
+					throw error if error?
+					flushAndGetCompressedUpdates @doc_id, (error, @updates) =>
+						throw error if error?
+						done()
 
-				request.post {
-					url: "http://localhost:#{Settings.port}/doc/#{@doc_id}/history"
-					json:
-						version: @version
-						docOps: updates
-				}, (@error, @response, @body) =>
-					done()
+			it "should combine all the updates into one", ->
+				expect(@updates[0].op).to.deep.equal {
+					p: 3, i: "foobar"
+				}
 
-			it "should return a successful response", ->
-				@response.statusCode.should.equal 204
+			it "should insert the correct version number into mongo", ->
+				expect(@updates[0].v).to.equal 8
 
 
 		describe "when the updates are far apart", ->
 			beforeEach (done) ->
 				oneDay = 24 * 60 * 60 * 1000
-				updates = [{
+				pushRawUpdates @doc_id, [{
 					op: [{ i: "b", p: 6 }]
 					meta: { ts: Date.now() + oneDay, user_id: @user_id }
+					v: 6
 				}, {
 					op: [{ i: "a", p: 7 }]
 					meta: { ts: Date.now() + oneDay, user_id: @user_id }
+					v: 7
 				}, {
 					op: [{ i: "r", p: 8 }]
 					meta: { ts: Date.now() + oneDay, user_id: @user_id }
-				}]
-				@version = 6
-
-				request.post {
-					url: "http://localhost:#{Settings.port}/doc/#{@doc_id}/history"
-					json:
-						version: @version
-						docOps: updates
-				}, (@error, @response, @body) =>
-					done()
-
-			it "should return a successful response", ->
-				@response.statusCode.should.equal 204
+					v: 8
+				}], (error) =>
+					throw error if error?
+					flushAndGetCompressedUpdates @doc_id, (error, @updates) =>
+						throw error if error?
+						done()
 
-###
+			it "should keep the updates separate", ->
+				expect(@updates[0].op).to.deep.equal {
+					p: 3, i: "foo"
+				}
+				expect(@updates[1].op).to.deep.equal {
+					p: 6, i: "bar"
+				}