jsonCompression.test.ts 1.3 KB

12345678910111213141516171819202122232425
  1. // @vitest-environment node
  2. import Koa from 'koa'
  3. import request from 'supertest'
  4. import { expect, it } from 'vitest'
  5. import { jsonCompression } from '../../src/server/jsonCompression.js'
  6. it('compresses JSON for supported clients and leaves identity and SSE responses intact', async () => {
  7. const app = new Koa(), value = { content: 'large result'.repeat(2000) }
  8. app.use(jsonCompression)
  9. app.use(ctx => {
  10. if (ctx.path === '/api/events') { ctx.type = 'text/event-stream';ctx.body = 'event: ready\ndata: {}\n\n' }
  11. else ctx.body = value
  12. })
  13. const compressed = await request(app.callback()).get('/api/snapshot').set('Accept-Encoding', 'gzip').expect(200)
  14. expect(compressed.headers['content-encoding']).toBe('gzip')
  15. expect(compressed.headers.vary).toContain('Accept-Encoding')
  16. expect(compressed.body).toEqual(value)
  17. expect(Number(compressed.headers['content-length'])).toBeLessThan(1024)
  18. const identity = await request(app.callback()).get('/api/snapshot').set('Accept-Encoding', 'identity').expect(200)
  19. expect(identity.headers['content-encoding']).toBeUndefined()
  20. expect(identity.body).toEqual(value)
  21. const stream = await request(app.callback()).get('/api/events').set('Accept-Encoding', 'gzip').expect(200)
  22. expect(stream.headers['content-encoding']).toBeUndefined()
  23. expect(stream.text).toBe('event: ready\ndata: {}\n\n')
  24. })