'use strict';

const assert = require('assert');
const Stream = require('stream');
const http = require('http');
const Koa = require('../../');
const context = require('../helpers/context');

describe('ctx.href', () => {
  it('should return the full request url', () => {
    const socket = new Stream.Duplex();
    const req = {
      url: '/users/1?next=/dashboard',
      headers: {
        host: 'localhost'
      },
      socket: socket,
      __proto__: Stream.Readable.prototype
    };
    const ctx = context(req);
    assert.equal(ctx.href, 'http://localhost/users/1?next=/dashboard');
    // change it also work
    ctx.url = '/foo/users/1?next=/dashboard';
    assert.equal(ctx.href, 'http://localhost/users/1?next=/dashboard');
  });

  it('should work with `GET http://example.com/foo`', done => {
    const app = new Koa();
    app.use(ctx => {
      ctx.body = ctx.href;
    });
    app.listen(function(){
      const address = this.address();
      http.get({
        host: 'localhost',
        path: 'http://example.com/foo',
        port: address.port
      }, res => {
        assert.equal(res.statusCode, 200);
        let buf = '';
        res.setEncoding('utf8');
        res.on('data', s => buf += s);
        res.on('end', () => {
          assert.equal(buf, 'http://example.com/foo');
          done();
        });
      });
    });
  });
});