text: 
  'use strict';
  
  const assert = require('assert');
  const Stream = require('stream');
  const Koa = require('../..');
  const Request = require('../helpers/context').request;
  
  describe('req.ip', () => {
    describe('with req.ips present', () => {
      it('should return req.ips[0]', () => {
        const app = new Koa();
        const req = { headers: {}, socket: new Stream.Duplex() };
        app.proxy = true;
        req.headers['x-forwarded-for'] = '127.0.0.1';
        req.socket.remoteAddress = '127.0.0.2';
        const request = Request(req, undefined, app);
        assert.equal(request.ip, '127.0.0.1');
      });
    });
  
    describe('with no req.ips present', () => {
      it('should return req.socket.remoteAddress', () => {
        const req = { socket: new Stream.Duplex() };
        req.socket.remoteAddress = '127.0.0.2';
        const request = Request(req);
        assert.equal(request.ip, '127.0.0.2');
      });
  
      describe('with req.socket.remoteAddress not present', () => {
        it('should return an empty string', () => {
          const socket = new Stream.Duplex();
          Object.defineProperty(socket, 'remoteAddress', {
            get: () => undefined, // So that the helper doesn't override it with a reasonable value
            set: () => {}
          });
          assert.equal(Request({ socket }).ip, '');
        });
      });
    });
  
    it('should be lazy inited and cached', () => {
      const req = { socket: new Stream.Duplex() };
      req.socket.remoteAddress = '127.0.0.2';
      const request = Request(req);
      assert.equal(request.ip, '127.0.0.2');
      req.socket.remoteAddress = '127.0.0.1';
      assert.equal(request.ip, '127.0.0.2');
    });
  
    it('should reset ip work', () => {
      const req = { socket: new Stream.Duplex() };
      req.socket.remoteAddress = '127.0.0.2';
      const request = Request(req);
      assert.equal(request.ip, '127.0.0.2');
      request.ip = '127.0.0.1';
      assert.equal(request.ip, '127.0.0.1');
    });
  });
  