// 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));
    });
  });
}
