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

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

import 'test_util.dart';

void main() {
  var accessLocation = 0;

  setUp(() {
    accessLocation = 0;
  });

  Handler middlewareA(Handler innerHandler) => (request) {
        expect(accessLocation, 0);
        accessLocation = 1;
        final response = innerHandler(request);
        expect(accessLocation, 4);
        accessLocation = 5;
        return response;
      };

  Handler middlewareB(Handler innerHandler) => (request) {
        expect(accessLocation, 1);
        accessLocation = 2;
        final response = innerHandler(request);
        expect(accessLocation, 3);
        accessLocation = 4;
        return response;
      };

  Response innerHandler(Request request) {
    expect(accessLocation, 2);
    accessLocation = 3;
    return syncHandler(request);
  }

  test('compose middleware with Pipeline', () async {
    var handler = const Pipeline()
        .addMiddleware(middlewareA)
        .addMiddleware(middlewareB)
        .addHandler(innerHandler);

    final response = await makeSimpleRequest(handler);
    expect(response, isNotNull);
    expect(accessLocation, 5);
  });

  test('Pipeline can be used as middleware', () async {
    var innerPipeline =
        const Pipeline().addMiddleware(middlewareA).addMiddleware(middlewareB);

    var handler = const Pipeline()
        .addMiddleware(innerPipeline.middleware)
        .addHandler(innerHandler);

    final response = await makeSimpleRequest(handler);
    expect(response, isNotNull);
    expect(accessLocation, 5);
  });
}
