// Copyright (c) 2017, 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:test/test.dart';

import '../descriptor.dart' as d;
import '../test_pub.dart';

main() {
  forBothPubGetAndUpgrade((command) {
    test('sends metadata headers for a direct dependency', () async {
      await servePackages((builder) {
        builder.serve("foo", "1.0.0");
      });

      await d.appDir({"foo": "1.0.0"}).create();

      await pubCommand(command,
          silent: allOf([
            contains("X-Pub-OS: ${Platform.operatingSystem}"),
            contains("X-Pub-Command: ${command.name}"),
            contains("X-Pub-Session-ID:"),
            contains("X-Pub-Environment: test-environment"),

            // We should send the reason when we request the pubspec and when we
            // request the tarball.
            matchesMultiple("X-Pub-Reason: direct", 2),
            isNot(contains("X-Pub-Reason: dev")),
          ]));
    });

    test('sends metadata headers for a dev dependency', () async {
      await servePackages((builder) {
        builder.serve("foo", "1.0.0");
      });

      await d.dir(appPath, [
        d.pubspec({
          "name": "myapp",
          "dev_dependencies": {"foo": "1.0.0"}
        })
      ]).create();

      await pubCommand(command,
          silent: allOf([
            contains("X-Pub-OS: ${Platform.operatingSystem}"),
            contains("X-Pub-Command: ${command.name}"),
            contains("X-Pub-Session-ID:"),
            contains("X-Pub-Environment: test-environment"),

            // We should send the reason when we request the pubspec and when we
            // request the tarball.
            matchesMultiple("X-Pub-Reason: dev", 2),
            isNot(contains("X-Pub-Reason: direct")),
          ]));
    });

    test('sends metadata headers for a transitive dependency', () async {
      await servePackages((builder) {
        builder.serve("bar", "1.0.0");
      });

      await d.appDir({
        "foo": {"path": "../foo"}
      }).create();

      await d.dir("foo", [
        d.libPubspec("foo", "1.0.0", deps: {"bar": "1.0.0"})
      ]).create();

      await pubCommand(command,
          silent: allOf([
            contains("X-Pub-OS: ${Platform.operatingSystem}"),
            contains("X-Pub-Command: ${command.name}"),
            contains("X-Pub-Session-ID:"),
            contains("X-Pub-Environment: test-environment"),
            isNot(contains("X-Pub-Reason:")),
          ]));
    });

    test("doesn't send metadata headers to a foreign server", () async {
      var server = await PackageServer.start((builder) {
        builder.serve("foo", "1.0.0");
      });

      await d.appDir({
        "foo": {
          "version": "1.0.0",
          "hosted": {"name": "foo", "url": "http://localhost:${server.port}"}
        }
      }).create();

      await pubCommand(command, silent: isNot(contains("X-Pub-")));
    });
  });
}
