// Copyright (c) 2014, 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.

@TestOn('vm')

import 'package:http/http.dart' as http;
import 'package:test/test.dart';

import 'utils.dart';

main() {
  group('http.', () {
    tearDown(stopServer);

    test('head', () {
      expect(
          startServer().then((_) {
            expect(
                http.head(serverUrl).then((response) {
                  expect(response.statusCode, equals(200));
                  expect(response.body, equals(''));
                }),
                completes);
          }),
          completes);
    });

    test('get', () {
      expect(
          startServer().then((_) {
            expect(
                http.get(serverUrl, headers: {
                  'X-Random-Header': 'Value',
                  'X-Other-Header': 'Other Value',
                  'User-Agent': 'Dart'
                }).then((response) {
                  expect(response.statusCode, equals(200));
                  expect(
                      response.body,
                      parse(equals({
                        'method': 'GET',
                        'path': '/',
                        'headers': {
                          'content-length': ['0'],
                          'accept-encoding': ['gzip'],
                          'user-agent': ['Dart'],
                          'x-random-header': ['Value'],
                          'x-other-header': ['Other Value']
                        },
                      })));
                }),
                completes);
          }),
          completes);
    });

    test('post', () {
      expect(
          startServer().then((_) {
            expect(
                http.post(serverUrl, headers: {
                  'X-Random-Header': 'Value',
                  'X-Other-Header': 'Other Value',
                  'Content-Type': 'text/plain',
                  'User-Agent': 'Dart'
                }).then((response) {
                  expect(response.statusCode, equals(200));
                  expect(
                      response.body,
                      parse(equals({
                        'method': 'POST',
                        'path': '/',
                        'headers': {
                          'accept-encoding': ['gzip'],
                          'content-length': ['0'],
                          'content-type': ['text/plain'],
                          'user-agent': ['Dart'],
                          'x-random-header': ['Value'],
                          'x-other-header': ['Other Value']
                        }
                      })));
                }),
                completes);
          }),
          completes);
    });

    test('post with string', () {
      expect(
          startServer().then((_) {
            expect(
                http
                    .post(serverUrl,
                        headers: {
                          'X-Random-Header': 'Value',
                          'X-Other-Header': 'Other Value',
                          'User-Agent': 'Dart'
                        },
                        body: 'request body')
                    .then((response) {
                  expect(response.statusCode, equals(200));
                  expect(
                      response.body,
                      parse(equals({
                        'method': 'POST',
                        'path': '/',
                        'headers': {
                          'content-type': ['text/plain; charset=utf-8'],
                          'content-length': ['12'],
                          'accept-encoding': ['gzip'],
                          'user-agent': ['Dart'],
                          'x-random-header': ['Value'],
                          'x-other-header': ['Other Value']
                        },
                        'body': 'request body'
                      })));
                }),
                completes);
          }),
          completes);
    });

    test('post with bytes', () {
      expect(
          startServer().then((_) {
            expect(
                http.post(serverUrl, headers: {
                  'X-Random-Header': 'Value',
                  'X-Other-Header': 'Other Value',
                  'User-Agent': 'Dart'
                }, body: [
                  104,
                  101,
                  108,
                  108,
                  111
                ]).then((response) {
                  expect(response.statusCode, equals(200));
                  expect(
                      response.body,
                      parse(equals({
                        'method': 'POST',
                        'path': '/',
                        'headers': {
                          'content-length': ['5'],
                          'accept-encoding': ['gzip'],
                          'user-agent': ['Dart'],
                          'x-random-header': ['Value'],
                          'x-other-header': ['Other Value']
                        },
                        'body': [104, 101, 108, 108, 111]
                      })));
                }),
                completes);
          }),
          completes);
    });

    test('post with fields', () {
      expect(
          startServer().then((_) {
            expect(
                http.post(serverUrl, headers: {
                  'X-Random-Header': 'Value',
                  'X-Other-Header': 'Other Value',
                  'User-Agent': 'Dart'
                }, body: {
                  'some-field': 'value',
                  'other-field': 'other value'
                }).then((response) {
                  expect(response.statusCode, equals(200));
                  expect(
                      response.body,
                      parse(equals({
                        'method': 'POST',
                        'path': '/',
                        'headers': {
                          'content-type': [
                            'application/x-www-form-urlencoded; charset=utf-8'
                          ],
                          'content-length': ['40'],
                          'accept-encoding': ['gzip'],
                          'user-agent': ['Dart'],
                          'x-random-header': ['Value'],
                          'x-other-header': ['Other Value']
                        },
                        'body': 'some-field=value&other-field=other+value'
                      })));
                }),
                completes);
          }),
          completes);
    });

    test('put', () {
      expect(
          startServer().then((_) {
            expect(
                http.put(serverUrl, headers: {
                  'X-Random-Header': 'Value',
                  'X-Other-Header': 'Other Value',
                  'Content-Type': 'text/plain',
                  'User-Agent': 'Dart'
                }).then((response) {
                  expect(response.statusCode, equals(200));
                  expect(
                      response.body,
                      parse(equals({
                        'method': 'PUT',
                        'path': '/',
                        'headers': {
                          'accept-encoding': ['gzip'],
                          'content-length': ['0'],
                          'content-type': ['text/plain'],
                          'user-agent': ['Dart'],
                          'x-random-header': ['Value'],
                          'x-other-header': ['Other Value']
                        }
                      })));
                }),
                completes);
          }),
          completes);
    });

    test('put with string', () {
      expect(
          startServer().then((_) {
            expect(
                http
                    .put(serverUrl,
                        headers: {
                          'X-Random-Header': 'Value',
                          'X-Other-Header': 'Other Value',
                          'User-Agent': 'Dart'
                        },
                        body: 'request body')
                    .then((response) {
                  expect(response.statusCode, equals(200));
                  expect(
                      response.body,
                      parse(equals({
                        'method': 'PUT',
                        'path': '/',
                        'headers': {
                          'content-type': ['text/plain; charset=utf-8'],
                          'content-length': ['12'],
                          'accept-encoding': ['gzip'],
                          'user-agent': ['Dart'],
                          'x-random-header': ['Value'],
                          'x-other-header': ['Other Value']
                        },
                        'body': 'request body'
                      })));
                }),
                completes);
          }),
          completes);
    });

    test('put with bytes', () {
      expect(
          startServer().then((_) {
            expect(
                http.put(serverUrl, headers: {
                  'X-Random-Header': 'Value',
                  'X-Other-Header': 'Other Value',
                  'User-Agent': 'Dart'
                }, body: [
                  104,
                  101,
                  108,
                  108,
                  111
                ]).then((response) {
                  expect(response.statusCode, equals(200));
                  expect(
                      response.body,
                      parse(equals({
                        'method': 'PUT',
                        'path': '/',
                        'headers': {
                          'content-length': ['5'],
                          'accept-encoding': ['gzip'],
                          'user-agent': ['Dart'],
                          'x-random-header': ['Value'],
                          'x-other-header': ['Other Value']
                        },
                        'body': [104, 101, 108, 108, 111]
                      })));
                }),
                completes);
          }),
          completes);
    });

    test('put with fields', () {
      expect(
          startServer().then((_) {
            expect(
                http.put(serverUrl, headers: {
                  'X-Random-Header': 'Value',
                  'X-Other-Header': 'Other Value',
                  'User-Agent': 'Dart'
                }, body: {
                  'some-field': 'value',
                  'other-field': 'other value'
                }).then((response) {
                  expect(response.statusCode, equals(200));
                  expect(
                      response.body,
                      parse(equals({
                        'method': 'PUT',
                        'path': '/',
                        'headers': {
                          'content-type': [
                            'application/x-www-form-urlencoded; charset=utf-8'
                          ],
                          'content-length': ['40'],
                          'accept-encoding': ['gzip'],
                          'user-agent': ['Dart'],
                          'x-random-header': ['Value'],
                          'x-other-header': ['Other Value']
                        },
                        'body': 'some-field=value&other-field=other+value'
                      })));
                }),
                completes);
          }),
          completes);
    });

    test('patch', () {
      expect(
          startServer().then((_) {
            expect(
                http.patch(serverUrl, headers: {
                  'X-Random-Header': 'Value',
                  'X-Other-Header': 'Other Value',
                  'Content-Type': 'text/plain',
                  'User-Agent': 'Dart'
                }).then((response) {
                  expect(response.statusCode, equals(200));
                  expect(
                      response.body,
                      parse(equals({
                        'method': 'PATCH',
                        'path': '/',
                        'headers': {
                          'accept-encoding': ['gzip'],
                          'content-length': ['0'],
                          'content-type': ['text/plain'],
                          'user-agent': ['Dart'],
                          'x-random-header': ['Value'],
                          'x-other-header': ['Other Value']
                        }
                      })));
                }),
                completes);
          }),
          completes);
    });

    test('patch with string', () {
      expect(
          startServer().then((_) {
            expect(
                http
                    .patch(serverUrl,
                        headers: {
                          'X-Random-Header': 'Value',
                          'X-Other-Header': 'Other Value',
                          'User-Agent': 'Dart'
                        },
                        body: 'request body')
                    .then((response) {
                  expect(response.statusCode, equals(200));
                  expect(
                      response.body,
                      parse(equals({
                        'method': 'PATCH',
                        'path': '/',
                        'headers': {
                          'content-type': ['text/plain; charset=utf-8'],
                          'content-length': ['12'],
                          'accept-encoding': ['gzip'],
                          'user-agent': ['Dart'],
                          'x-random-header': ['Value'],
                          'x-other-header': ['Other Value']
                        },
                        'body': 'request body'
                      })));
                }),
                completes);
          }),
          completes);
    });

    test('patch with bytes', () {
      expect(
          startServer().then((_) {
            expect(
                http.patch(serverUrl, headers: {
                  'X-Random-Header': 'Value',
                  'X-Other-Header': 'Other Value',
                  'User-Agent': 'Dart'
                }, body: [
                  104,
                  101,
                  108,
                  108,
                  111
                ]).then((response) {
                  expect(response.statusCode, equals(200));
                  expect(
                      response.body,
                      parse(equals({
                        'method': 'PATCH',
                        'path': '/',
                        'headers': {
                          'content-length': ['5'],
                          'accept-encoding': ['gzip'],
                          'user-agent': ['Dart'],
                          'x-random-header': ['Value'],
                          'x-other-header': ['Other Value']
                        },
                        'body': [104, 101, 108, 108, 111]
                      })));
                }),
                completes);
          }),
          completes);
    });

    test('patch with fields', () {
      expect(
          startServer().then((_) {
            expect(
                http.patch(serverUrl, headers: {
                  'X-Random-Header': 'Value',
                  'X-Other-Header': 'Other Value',
                  'User-Agent': 'Dart'
                }, body: {
                  'some-field': 'value',
                  'other-field': 'other value'
                }).then((response) {
                  expect(response.statusCode, equals(200));
                  expect(
                      response.body,
                      parse(equals({
                        'method': 'PATCH',
                        'path': '/',
                        'headers': {
                          'content-type': [
                            'application/x-www-form-urlencoded; charset=utf-8'
                          ],
                          'content-length': ['40'],
                          'accept-encoding': ['gzip'],
                          'user-agent': ['Dart'],
                          'x-random-header': ['Value'],
                          'x-other-header': ['Other Value']
                        },
                        'body': 'some-field=value&other-field=other+value'
                      })));
                }),
                completes);
          }),
          completes);
    });

    test('delete', () {
      expect(
          startServer().then((_) {
            expect(
                http.delete(serverUrl, headers: {
                  'X-Random-Header': 'Value',
                  'X-Other-Header': 'Other Value',
                  'User-Agent': 'Dart'
                }).then((response) {
                  expect(response.statusCode, equals(200));
                  expect(
                      response.body,
                      parse(equals({
                        'method': 'DELETE',
                        'path': '/',
                        'headers': {
                          'content-length': ['0'],
                          'accept-encoding': ['gzip'],
                          'user-agent': ['Dart'],
                          'x-random-header': ['Value'],
                          'x-other-header': ['Other Value']
                        }
                      })));
                }),
                completes);
          }),
          completes);
    });

    test('read', () {
      expect(
          startServer().then((_) {
            expect(
                http.read(serverUrl, headers: {
                  'X-Random-Header': 'Value',
                  'X-Other-Header': 'Other Value',
                  'User-Agent': 'Dart'
                }).then((val) => val),
                completion(parse(equals({
                  'method': 'GET',
                  'path': '/',
                  'headers': {
                    'content-length': ['0'],
                    'accept-encoding': ['gzip'],
                    'user-agent': ['Dart'],
                    'x-random-header': ['Value'],
                    'x-other-header': ['Other Value']
                  },
                }))));
          }),
          completes);
    });

    test('read throws an error for a 4** status code', () {
      expect(
          startServer().then((_) {
            expect(
                http.read(serverUrl.resolve('/error')), throwsClientException);
          }),
          completes);
    });

    test('readBytes', () {
      expect(
          startServer().then((_) {
            var future = http.readBytes(serverUrl, headers: {
              'X-Random-Header': 'Value',
              'X-Other-Header': 'Other Value',
              'User-Agent': 'Dart'
            }).then((bytes) => String.fromCharCodes(bytes));

            expect(
                future,
                completion(parse(equals({
                  'method': 'GET',
                  'path': '/',
                  'headers': {
                    'content-length': ['0'],
                    'accept-encoding': ['gzip'],
                    'user-agent': ['Dart'],
                    'x-random-header': ['Value'],
                    'x-other-header': ['Other Value']
                  },
                }))));
          }),
          completes);
    });

    test('readBytes throws an error for a 4** status code', () {
      expect(
          startServer().then((_) {
            expect(http.readBytes(serverUrl.resolve('/error')),
                throwsClientException);
          }),
          completes);
    });
  });
}
