// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library mock_client_test;

import 'dart:io';
import 'dart:json';
import 'dart:uri';

// TODO(nweiz): make these "package:" imports.
import '../../unittest/lib/unittest.dart';
import '../lib/http.dart' as http;
import '../lib/testing.dart';
import '../lib/src/utils.dart';
import 'utils.dart';

void main() {
  test('handles a request', () {
    var client = new MockClient((request) {
      return new Future.immediate(new http.Response(
          JSON.stringify(request.bodyFields), 200,
          headers: {'content-type': 'application/json'}));
    });

    expect(client.post("http://example.com/foo", fields: {
      'field1': 'value1',
      'field2': 'value2'
    }).transform((response) => response.body), completion(parse(equals({
      'field1': 'value1',
      'field2': 'value2'
    }))));
  });

  test('handles a streamed request', () {
    var client = new MockClient.streaming((request, bodyStream) {
      return consumeInputStream(bodyStream).transform((body) {
        var stream = new ListInputStream();
        async.then((_) {
          var bodyString = new String.fromCharCodes(body);
          stream.write('Request body was "$bodyString"'.charCodes);
          stream.markEndOfStream();
        });

        return new http.StreamedResponse(stream, 200, -1);
      });
    });

    var uri = new Uri.fromString("http://example.com/foo");
    var request = new http.Request("POST", uri);
    request.body = "hello, world";
    var future = client.send(request)
        .chain(http.Response.fromStream)
        .transform((response) => response.body);
    expect(future, completion(equals('Request body was "hello, world"')));
  });

  test('handles a request with no body', () {
    var client = new MockClient((request) {
      return new Future.immediate(new http.Response('you did it', 200));
    });

    expect(client.read("http://example.com/foo"),
        completion(equals('you did it')));
  });
}
