Skip to content

Commit 8ef475f

Browse files
fix(web-server): Update config on every request
This updates the `client`, `customContextFile` and `customDebugFile` config properties on every request in the karma middleware. Closes #1972
1 parent b765c33 commit 8ef475f

3 files changed

Lines changed: 107 additions & 12 deletions

File tree

lib/middleware/karma.js

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ var path = require('path')
1515
var util = require('util')
1616
var url = require('url')
1717

18+
var log = require('../logger').create('middleware:karma')
19+
1820
var urlparse = function (urlStr) {
1921
var urlObj = url.parse(urlStr, true)
2022
urlObj.query = urlObj.query || {}
@@ -59,10 +61,20 @@ var getXUACompatibleUrl = function (url) {
5961
return value
6062
}
6163

62-
var createKarmaMiddleware = function (filesPromise, serveStaticFile, serveFile,
63-
/* config.basePath */ basePath, /* config.urlRoot */ urlRoot, /* config.client */ client,
64-
/* config.customContextFile */ customContextFile, /* config.customDebugFile */ customDebugFile) {
64+
var createKarmaMiddleware = function (
65+
filesPromise,
66+
serveStaticFile,
67+
serveFile,
68+
injector,
69+
/* config.basePath */ basePath,
70+
/* config.urlRoot */ urlRoot
71+
) {
6572
return function (request, response, next) {
73+
// These config values should be up to date on every request
74+
var client = injector.get('config.client')
75+
var customContextFile = injector.get('config.customContextFile')
76+
var customDebugFile = injector.get('config.customDebugFile')
77+
6678
var requestUrl = request.normalizedUrl.replace(/\?.*/, '')
6779

6880
// redirect /__karma__ to /__karma__ (trailing slash)
@@ -110,13 +122,17 @@ var createKarmaMiddleware = function (filesPromise, serveStaticFile, serveFile,
110122
return filesPromise.then(function (files) {
111123
var fileServer
112124
var requestedFileUrl
125+
log.debug('custom files', customContextFile, customDebugFile)
113126
if (isRequestingContextFile && customContextFile) {
127+
log.debug('Serving customContextFile %s', customContextFile)
114128
fileServer = serveFile
115129
requestedFileUrl = customContextFile
116130
} else if (isRequestingDebugFile && customDebugFile) {
131+
log.debug('Serving customDebugFile %s', customDebugFile)
117132
fileServer = serveFile
118133
requestedFileUrl = customDebugFile
119134
} else {
135+
log.debug('Serving static request %s', requestUrl)
120136
fileServer = serveStaticFile
121137
requestedFileUrl = requestUrl
122138
}
@@ -197,9 +213,5 @@ var createKarmaMiddleware = function (filesPromise, serveStaticFile, serveFile,
197213
}
198214
}
199215

200-
createKarmaMiddleware.$inject = ['filesPromise', 'serveStaticFile', 'serveFile',
201-
'config.basePath', 'config.urlRoot', 'config.client', 'config.customContextFile',
202-
'config.customDebugFile']
203-
204216
// PUBLIC API
205217
exports.create = createKarmaMiddleware

lib/web-server.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ var createWebServer = function (injector, emitter, fileList) {
5555

5656
var proxyMiddlewareInstance = injector.invoke(proxyMiddleware.create)
5757

58+
log.debug('Instantiating middleware')
5859
var handler = connect()
5960
.use(injector.invoke(runnerMiddleware.create))
6061
.use(injector.invoke(stopperMiddleware.create))

test/unit/middleware/karma.spec.js

Lines changed: 87 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,31 @@ describe('middleware.karma', () => {
3434

3535
var handler = serveFile = filesDeferred = nextSpy = response = null
3636

37+
var clientConfig = {foo: 'bar'}
38+
var injector = {
39+
get (val) {
40+
switch (val) {
41+
case 'config.client':
42+
return clientConfig
43+
default:
44+
return null
45+
}
46+
}
47+
}
48+
3749
beforeEach(() => {
38-
var clientConfig = {foo: 'bar'}
3950
nextSpy = sinon.spy()
4051
response = new HttpResponseMock()
4152
filesDeferred = helper.defer()
4253
serveFile = createServeFile(fsMock, '/karma/static')
43-
handler = createKarmaMiddleware(filesDeferred.promise, serveFile, null, '/base/path', '/__karma__/', clientConfig)
54+
handler = createKarmaMiddleware(
55+
filesDeferred.promise,
56+
serveFile,
57+
null,
58+
injector,
59+
'/base/path',
60+
'/__karma__/'
61+
)
4462
})
4563

4664
// helpers
@@ -92,7 +110,14 @@ describe('middleware.karma', () => {
92110
})
93111

94112
it('should serve client.html', (done) => {
95-
handler = createKarmaMiddleware(null, serveFile, null, '/base', '/')
113+
handler = createKarmaMiddleware(
114+
null,
115+
serveFile,
116+
null,
117+
injector,
118+
'/base',
119+
'/'
120+
)
96121

97122
response.once('end', () => {
98123
expect(nextSpy).not.to.have.been.called
@@ -104,7 +129,14 @@ describe('middleware.karma', () => {
104129
})
105130

106131
it('should serve /?id=xxx', (done) => {
107-
handler = createKarmaMiddleware(null, serveFile, null, '/base', '/')
132+
handler = createKarmaMiddleware(
133+
null,
134+
serveFile,
135+
null,
136+
injector,
137+
'/base',
138+
'/'
139+
)
108140

109141
response.once('end', () => {
110142
expect(nextSpy).not.to.have.been.called
@@ -116,7 +148,14 @@ describe('middleware.karma', () => {
116148
})
117149

118150
it('should serve /?x-ua-compatible with replaced values', (done) => {
119-
handler = createKarmaMiddleware(null, serveFile, null, '/base', '/')
151+
handler = createKarmaMiddleware(
152+
null,
153+
serveFile,
154+
null,
155+
injector,
156+
'/base',
157+
'/'
158+
)
120159

121160
response.once('end', () => {
122161
expect(nextSpy).not.to.have.been.called
@@ -351,4 +390,47 @@ describe('middleware.karma', () => {
351390
done()
352391
})
353392
})
393+
394+
it('should update handle updated configs', (done) => {
395+
let i = 0
396+
handler = createKarmaMiddleware(
397+
filesDeferred.promise,
398+
serveFile,
399+
null,
400+
{
401+
get (val) {
402+
if (val === 'config.client') {
403+
i++
404+
if (i === 1) {
405+
return {foo: 'bar'}
406+
} else {
407+
return {foo: 'baz'}
408+
}
409+
} else {
410+
return null
411+
}
412+
}
413+
},
414+
'/base/path',
415+
'/__karma__/'
416+
)
417+
418+
includedFiles([
419+
new MockFile('/first.js')
420+
])
421+
fsMock._touchFile('/karma/static/debug.html', 1, '%CLIENT_CONFIG%')
422+
423+
response.once('end', () => {
424+
expect(response).to.beServedAs(200, 'window.__karma__.config = {"foo":"bar"};\n')
425+
426+
response = new HttpResponseMock()
427+
callHandlerWith('/__karma__/debug.html')
428+
response.once('end', () => {
429+
expect(response).to.beServedAs(200, 'window.__karma__.config = {"foo":"baz"};\n')
430+
done()
431+
})
432+
})
433+
434+
callHandlerWith('/__karma__/debug.html')
435+
})
354436
})

0 commit comments

Comments
 (0)