Back to Repositories

Testing Request Hostname Resolution in Koa.js

This test suite verifies the hostname resolution functionality in Koa’s request handling, focusing on various host header scenarios including IPv6 addresses and X-Forwarded-Host headers. The tests ensure proper extraction of hostnames from different request configurations.

Test Coverage Overview

The test suite provides comprehensive coverage of hostname resolution scenarios:

  • Basic hostname extraction without port numbers
  • Empty host header handling
  • IPv6 address parsing with various port configurations
  • X-Forwarded-Host header processing with proxy trust settings

Implementation Analysis

The testing approach utilizes Node’s native test framework with a modular structure. Tests are organized using nested describe blocks for logical grouping of related scenarios. The implementation leverages custom request helpers and strict assertions to validate hostname parsing behavior.

Technical Details

  • Testing Framework: Node.js native test module
  • Assertion Library: Node’s assert module
  • Custom Helpers: test-helpers/context for request simulation
  • Test Structure: Hierarchical describe/it blocks

Best Practices Demonstrated

The test suite exemplifies several testing best practices:

  • Isolated test cases with clear descriptions
  • Comprehensive edge case coverage
  • Consistent test structure and organization
  • Proper setup and teardown patterns
  • Clear separation of test scenarios

koajs/koa

__tests__/request/hostname.test.js

            
'use strict'

const { describe, it } = require('node:test')
const request = require('../../test-helpers/context').request
const assert = require('assert')

describe('req.hostname', () => {
  it('should return hostname void of port', () => {
    const req = request()
    req.header.host = 'foo.com:3000'
    assert.strictEqual(req.hostname, 'foo.com')
  })

  describe('with no host present', () => {
    it('should return ""', () => {
      const req = request()
      assert.strictEqual(req.hostname, '')
    })
  })

  describe('with IPv6 in host', () => {
    it('should parse localhost void of port', () => {
      const req = request()
      req.header.host = '[::1]'
      assert.strictEqual(req.hostname, '[::1]')
    })

    it('should parse localhost with port 80', () => {
      const req = request()
      req.header.host = '[::1]:80'
      assert.strictEqual(req.hostname, '[::1]')
    })

    it('should parse localhost with non-special schema port', () => {
      const req = request()
      req.header.host = '[::1]:1337'
      assert.strictEqual(req.hostname, '[::1]')
    })

    it('should reduce IPv6 with non-special schema port as hostname', () => {
      const req = request()
      req.header.host = '[2001:cdba:0000:0000:0000:0000:3257:9652]:1337'
      assert.strictEqual(req.hostname, '[2001:cdba::3257:9652]')
    })

    it('should return empty string when invalid', () => {
      const req = request()
      req.header.host = '[invalidIPv6]'
      assert.strictEqual(req.hostname, '')
    })
  })

  describe('when X-Forwarded-Host is present', () => {
    describe('and proxy is not trusted', () => {
      it('should be ignored', () => {
        const req = request()
        req.header['x-forwarded-host'] = 'bar.com'
        req.header.host = 'foo.com'
        assert.strictEqual(req.hostname, 'foo.com')
      })
    })

    describe('and proxy is trusted', () => {
      it('should be used', () => {
        const req = request()
        req.app.proxy = true
        req.header['x-forwarded-host'] = 'bar.com, baz.com'
        req.header.host = 'foo.com'
        assert.strictEqual(req.hostname, 'bar.com')
      })
    })
  })
})