// 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.

library shelf.log_middleware_test;

import 'package:shelf/shelf.dart';
import 'package:test/test.dart';

import 'test_util.dart';

void main() {
  bool gotLog;

  setUp(() {
    gotLog = false;
  });

  var logger = (msg, isError) {
    expect(gotLog, isFalse);
    gotLog = true;
    expect(isError, isFalse);
    expect(msg, contains('GET'));
    expect(msg, contains('[200]'));
  };

  test('logs a request with a synchronous response', () {
    var handler = const Pipeline()
        .addMiddleware(logRequests(logger: logger))
        .addHandler(syncHandler);

    return makeSimpleRequest(handler).then((response) {
      expect(gotLog, isTrue);
    });
  });

  test('logs a request with an asynchronous response', () {
    var handler = const Pipeline()
        .addMiddleware(logRequests(logger: logger))
        .addHandler(asyncHandler);

    return makeSimpleRequest(handler).then((response) {
      expect(gotLog, isTrue);
    });
  });

  test('logs a request with an asynchronous error response', () {
    var handler = const Pipeline()
        .addMiddleware(logRequests(logger: (msg, isError) {
      expect(gotLog, isFalse);
      gotLog = true;
      expect(isError, isTrue);
      expect(msg, contains('\tGET\t/'));
      expect(msg, contains('testing logging throw'));
    })).addHandler((request) {
      throw 'testing logging throw';
    });

    expect(makeSimpleRequest(handler), throwsA('testing logging throw'));
  });

  test("doesn't log a HijackException", () {
    var handler = const Pipeline()
        .addMiddleware(logRequests(logger: logger))
        .addHandler((request) => throw const HijackException());

    expect(makeSimpleRequest(handler).whenComplete(() {
      expect(gotLog, isFalse);
    }), throwsA(new isInstanceOf<HijackException>()));
  });
}
