diff --git a/src/device-state/target-state.ts b/src/device-state/target-state.ts index e3fff4c8..a941cf21 100644 --- a/src/device-state/target-state.ts +++ b/src/device-state/target-state.ts @@ -150,7 +150,7 @@ export const update = async ( .getAsync(endpoint, params) .timeout(apiTimeout); - if (statusCode === 304) { + if (statusCode === 304 && cache?.etag != null) { // There's no change so no need to update the cache // only emit the target state if it hasn't been emitted yet cache.emitted = emitTargetState(cache, force, isFromApi); diff --git a/test/40-target-state.spec.ts b/test/40-target-state.spec.ts index 469e9e4c..f051e9b0 100644 --- a/test/40-target-state.spec.ts +++ b/test/40-target-state.spec.ts @@ -37,7 +37,7 @@ const req = { Promise.resolve([ { statusCode: 200, - headers: {}, + headers: { etag: 'abc' }, } as any, JSON.stringify(stateEndpointBody), ]), @@ -60,6 +60,25 @@ describe('Target state', () => { }); describe('update', () => { + it('should throw if a 304 is received but no local cache exists', async () => { + // new request returns 304 + const newReq = { + getAsync: () => + Promise.resolve([ + { + statusCode: 304, + headers: {}, + } as any, + ]), + }; + + (request.getRequestInstance as SinonStub).resolves(newReq as any); + + // Perform target state request + await expect(TargetState.update()).to.be.rejected; + expect(request.getRequestInstance).to.be.calledOnce; + }); + it('should emit target state when a new one is available', async () => { // Setup target state listener const listener = stub();