// Copyright (c) 2016, 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 'dart:io';

import 'package:package_resolver/package_resolver.dart';
import 'package:path/path.dart' as p;
import 'package:shelf/shelf.dart';
import 'package:shelf_packages_handler/shelf_packages_handler.dart';
import 'package:test/test.dart';

void main() {
  String dir;
  setUp(() {
    dir =
        Directory.systemTemp.createTempSync("shelf_packages_handler_test").path;
    Directory(dir).createSync();
    Directory("$dir/foo").createSync();
    File("$dir/foo/foo.dart")
        .writeAsStringSync("void main() => print('in foo');");
  });

  tearDown(() {
    Directory(dir).deleteSync(recursive: true);
  });

  group("packagesHandler", () {
    test("defaults to the current method of package resolution", () async {
      var handler = packagesHandler();
      var request = Request(
          "GET",
          Uri.parse("http://example.com/shelf_packages_handler/"
              "shelf_packages_handler.dart"));
      var response = await handler(request);
      expect(response.statusCode, equals(200));
      expect(
          await response.readAsString(), contains("Handler packagesHandler"));
    });

    group("with a package root", () {
      PackageResolver resolver;
      setUp(() => resolver = PackageResolver.root(p.toUri(dir)));

      test("looks up a real file", () async {
        var handler = packagesHandler(resolver: resolver);
        var request =
            Request("GET", Uri.parse("http://example.com/foo/foo.dart"));
        var response = await handler(request);
        expect(response.statusCode, equals(200));
        expect(await response.readAsString(), contains("in foo"));
      });

      test("404s for a nonexistent file", () async {
        var handler = packagesHandler(resolver: resolver);
        var request =
            Request("GET", Uri.parse("http://example.com/foo/bar.dart"));
        var response = await handler(request);
        expect(response.statusCode, equals(404));
      });
    });

    group("with a package config", () {
      PackageResolver resolver;
      setUp(() {
        resolver = PackageResolver.config({"foo": p.toUri("$dir/foo")});
      });

      test("looks up a real file", () async {
        var handler = packagesHandler(resolver: resolver);
        var request =
            Request("GET", Uri.parse("http://example.com/foo/foo.dart"));
        var response = await handler(request);
        expect(response.statusCode, equals(200));
        expect(await response.readAsString(), contains("in foo"));
      });

      test("404s for a nonexistent package", () async {
        var handler = packagesHandler(resolver: resolver);
        var request =
            Request("GET", Uri.parse("http://example.com/bar/foo.dart"));
        var response = await handler(request);
        expect(response.statusCode, equals(404));
      });

      test("404s for a nonexistent file", () async {
        var handler = packagesHandler(resolver: resolver);
        var request =
            Request("GET", Uri.parse("http://example.com/foo/bar.dart"));
        var response = await handler(request);
        expect(response.statusCode, equals(404));
      });
    });
  });

  group("packagesDirHandler", () {
    test("supports a directory at the root of the URL", () async {
      var handler = packagesDirHandler();
      var request = Request(
          "GET",
          Uri.parse("http://example.com/packages/shelf_packages_handler/"
              "shelf_packages_handler.dart"));
      var response = await handler(request);
      expect(response.statusCode, equals(200));
      expect(
          await response.readAsString(), contains("Handler packagesHandler"));
    });

    test("supports a directory deep in the URL", () async {
      var handler = packagesDirHandler();
      var request = Request(
          "GET",
          Uri.parse("http://example.com/foo/bar/very/deep/packages/"
              "shelf_packages_handler/shelf_packages_handler.dart"));
      var response = await handler(request);
      expect(response.statusCode, equals(200));
      expect(
          await response.readAsString(), contains("Handler packagesHandler"));
    });

    test("404s for a URL without a packages directory", () async {
      var handler = packagesDirHandler();
      var request = Request(
          "GET",
          Uri.parse("http://example.com/shelf_packages_handler/"
              "shelf_packages_handler.dart"));
      var response = await handler(request);
      expect(response.statusCode, equals(404));
    });

    test("404s for a non-existent file within a packages directory", () async {
      var handler = packagesDirHandler();
      var request = Request(
          "GET",
          Uri.parse("http://example.com/packages/shelf_packages_handler/"
              "non_existent.dart"));
      var response = await handler(request);
      expect(response.statusCode, equals(404));
    });
  });
}
