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

Dynamically monkey patch impl to check integration once instead of each request

Alasdair Smith 9 лет назад
Родитель
Сommit
e32406a4c4

+ 14 - 15
services/web/app/coffee/Features/Project/V1ProjectGetter.coffee

@@ -4,19 +4,18 @@ logger = require 'logger-sharelatex'
 
 
 INTEGRATION_MODULE_PATH = path.resolve(__dirname, '../../../../modules/overleaf-integration-web-module')
 INTEGRATION_MODULE_PATH = path.resolve(__dirname, '../../../../modules/overleaf-integration-web-module')
 
 
-module.exports = V1ProjectGetter =
-	integrationModuleExists: (callback = (error, stats) ->) ->
-		fs.stat INTEGRATION_MODULE_PATH, (error, stats) ->
-			if error? or !stats.isDirectory()
-				return callback(false)
-			return callback(true)
-
+V1ProjectGetter =
+	# Default implementation is a no-op
 	findAllUsersProjects: (userId, callback = (error, projects) ->) ->
 	findAllUsersProjects: (userId, callback = (error, projects) ->) ->
-		V1ProjectGetter.integrationModuleExists (exists) ->
-			if exists
-				logger.log {exists}, "integration module does exist, loading V1 projects"
-				V1ProjectListGetter = require(path.join(INTEGRATION_MODULE_PATH, 'app/coffee/ProjectList/ProjectListGetter'))
-				V1ProjectListGetter.findAllUsersProjects(userId, callback)
-			else
-				logger.log {exists}, "integration modules doesn't exists, not loading V1 projects"
-				return callback()
+		logger.log {}, "integration modules doesn't exist, not loading V1 projects"
+		return callback()
+
+fs.stat INTEGRATION_MODULE_PATH, (error, stats) ->
+	return if error? or !stats.isDirectory()
+	logger.log {isDirectory: stats.isDirectory}, "integration module does exist, loading V1 projects"
+	# Monkey patch impl to actually fetch projects
+	V1ProjectGetter.findAllUsersProjects = (userId, callback = (error, projects) ->) ->
+		IntegrationProjectListGetter = require(path.join(INTEGRATION_MODULE_PATH, 'app/coffee/ProjectList/ProjectListGetter'))
+		IntegrationProjectListGetter.findAllUsersProjects(userId, callback)
+
+module.exports = V1ProjectGetter

+ 16 - 11
services/web/test/UnitTests/coffee/Project/V1ProjectGetterTests.coffee

@@ -6,25 +6,24 @@ modulePath = '../../../../app/js/Features/Project/V1ProjectGetter.js'
 
 
 describe 'V1ProjectGetter', ->
 describe 'V1ProjectGetter', ->
 	beforeEach ->
 	beforeEach ->
-		@fs =
-			stat: sinon.stub()
 		@path =
 		@path =
 			resolve: sinon.stub().returns('path/to/integration/module')
 			resolve: sinon.stub().returns('path/to/integration/module')
 			join: sinon.stub().returns('path/to/file/in/integration/module')
 			join: sinon.stub().returns('path/to/file/in/integration/module')
 		@IntegrationProjectListGetter =
 		@IntegrationProjectListGetter =
 			findAllUsersProjects: sinon.stub()
 			findAllUsersProjects: sinon.stub()
-		@V1ProjectGetter = SandboxedModule.require modulePath, requires:
-			'fs': @fs
-			'path': @path
-			'logger-sharelatex': log: ->
-			'path/to/file/in/integration/module': @IntegrationProjectListGetter
 		@userId = 123
 		@userId = 123
 		@callback = sinon.stub()
 		@callback = sinon.stub()
 
 
 	describe 'without overleaf-integration-web-module', ->
 	describe 'without overleaf-integration-web-module', ->
 		beforeEach ->
 		beforeEach ->
-			# Mock not finding integration module
-			@fs.stat.yields({ code: 'mock-ENOENT-error' })
+			@fs =
+				stat: sinon.stub().yields({code: 'mock-ENOENT-error'})
+			@V1ProjectGetter = SandboxedModule.require modulePath, requires:
+				# Mock not finding integration module
+				'fs': @fs
+				'path': @path
+				'logger-sharelatex': log: ->
+				'path/to/file/in/integration/module': @IntegrationProjectListGetter
 			# Call method
 			# Call method
 			@V1ProjectGetter.findAllUsersProjects @userId, @callback
 			@V1ProjectGetter.findAllUsersProjects @userId, @callback
 
 
@@ -33,8 +32,14 @@ describe 'V1ProjectGetter', ->
 
 
 	describe 'with overleaf-integration-web-module', ->
 	describe 'with overleaf-integration-web-module', ->
 		beforeEach ->
 		beforeEach ->
-			# Mock finding integration module
-			@fs.stat.yields(null, isDirectory: sinon.stub().returns(true))
+			@fs =
+				stat: sinon.stub().yields(null, isDirectory: sinon.stub().returns(true))
+			@V1ProjectGetter = SandboxedModule.require modulePath, requires:
+				# Mock finding integration module
+				'fs': @fs
+				'path': @path
+				'logger-sharelatex': log: ->
+				'path/to/file/in/integration/module': @IntegrationProjectListGetter
 			# Mock integration module response
 			# Mock integration module response
 			@IntegrationProjectListGetter.findAllUsersProjects.yields(null, @response = {
 			@IntegrationProjectListGetter.findAllUsersProjects.yields(null, @response = {
 				projects: [{ id: '123mockV1Id', title: 'mock title' }]
 				projects: [{ id: '123mockV1Id', title: 'mock title' }]