// Copyright (c) 2015, 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.
//
// @dart=2.7

import 'dart:async';

import 'package:shelf/shelf.dart' as shelf;
import 'package:test/src/util/path_handler.dart';
import 'package:test/test.dart';

void main() {
  PathHandler handler;
  setUp(() => handler = PathHandler());

  Future<shelf.Response> _handle(shelf.Request request) =>
      Future.sync(() => handler.handler(request));

  test('returns a 404 for a root URL', () async {
    var request = shelf.Request('GET', Uri.parse('http://localhost/'));
    expect((await _handle(request)).statusCode, equals(404));
  });

  test('returns a 404 for an unregistered URL', () async {
    var request = shelf.Request('GET', Uri.parse('http://localhost/foo'));
    expect((await _handle(request)).statusCode, equals(404));
  });

  test('runs a handler for an exact URL', () async {
    var request = shelf.Request('GET', Uri.parse('http://localhost/foo'));
    handler.add('foo', expectAsync1((request) {
      expect(request.handlerPath, equals('/foo'));
      expect(request.url.path, isEmpty);
      return shelf.Response.ok('good job!');
    }));

    var response = await _handle(request);
    expect(response.statusCode, equals(200));
    expect(response.readAsString(), completion(equals('good job!')));
  });

  test('runs a handler for a suffix', () async {
    var request = shelf.Request('GET', Uri.parse('http://localhost/foo/bar'));
    handler.add('foo', expectAsync1((request) {
      expect(request.handlerPath, equals('/foo/'));
      expect(request.url.path, 'bar');
      return shelf.Response.ok('good job!');
    }));

    var response = await _handle(request);
    expect(response.statusCode, equals(200));
    expect(response.readAsString(), completion(equals('good job!')));
  });

  test('runs the longest matching handler', () async {
    var request =
        shelf.Request('GET', Uri.parse('http://localhost/foo/bar/baz'));

    handler.add(
        'foo',
        expectAsync1((_) {
          return null;
        }, count: 0));
    handler.add('foo/bar', expectAsync1((request) {
      expect(request.handlerPath, equals('/foo/bar/'));
      expect(request.url.path, 'baz');
      return shelf.Response.ok('good job!');
    }));
    handler.add(
        'foo/bar/baz/bang',
        expectAsync1((_) {
          return null;
        }, count: 0));

    var response = await _handle(request);
    expect(response.statusCode, equals(200));
    expect(response.readAsString(), completion(equals('good job!')));
  });
}
