// Copyright (c) 2020, 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:pub/src/exit_codes.dart' as exit_codes;
import 'package:test/test.dart';

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

void main() {
  test('cannot use both --path and --git-<option> flags', () async {
    ensureGit();

    await d.git(
        'foo.git', [d.libDir('foo'), d.libPubspec('foo', '1.0.0')]).create();
    await d
        .dir('bar', [d.libDir('bar'), d.libPubspec('foo', '0.0.1')]).create();

    await d.appDir({}).create();

    await pubAdd(
        args: ['foo', '--git-url', '../foo.git', '--path', '../bar'],
        error: allOf([
          contains('Packages can only have one source, pub add flags '
              '"--git-url" and "--path" are'),
          contains('conflicting.')
        ]),
        exitCode: exit_codes.USAGE);

    await d.appDir({}).validate();
    await d.dir(appPath, [
      d.nothing('.dart_tool/package_config.json'),
      d.nothing('pubspec.lock'),
      d.nothing('.packages'),
    ]).validate();
  });

  test('cannot use both --path and --host-<option> flags', () async {
    // Make the default server serve errors. Only the custom server should
    // be accessed.
    await serveNoPackages();
    globalPackageServer.serveErrors();

    final server = await PackageServer.start((builder) {
      builder.serve('foo', '1.2.3');
    });

    await d
        .dir('bar', [d.libDir('bar'), d.libPubspec('foo', '0.0.1')]).create();
    await d.appDir({}).create();

    await pubAdd(
        args: [
          'foo',
          '--hosted-url',
          'http://localhost:${server.port}',
          '--path',
          '../bar'
        ],
        error: allOf([
          contains('Packages can only have one source, pub add flags '
              '"--hosted-url" and "--path" are'),
          contains('conflicting.')
        ]),
        exitCode: exit_codes.USAGE);

    await d.appDir({}).validate();
    await d.dir(appPath, [
      d.nothing('.dart_tool/package_config.json'),
      d.nothing('pubspec.lock'),
      d.nothing('.packages'),
    ]).validate();
  });

  test('cannot use both --hosted-url and --git-<option> flags', () async {
    // Make the default server serve errors. Only the custom server should
    // be accessed.
    await serveNoPackages();
    globalPackageServer.serveErrors();

    final server = await PackageServer.start((builder) {
      builder.serve('foo', '1.2.3');
    });

    ensureGit();

    await d.git(
        'foo.git', [d.libDir('foo'), d.libPubspec('foo', '1.0.0')]).create();
    await d.appDir({}).create();

    await pubAdd(
        args: [
          'foo',
          '--hosted-url',
          'http://localhost:${server.port}',
          '--git-url',
          '../foo.git'
        ],
        error: allOf([
          contains('Packages can only have one source, pub add flags '
              '"--git-url" and "--hosted-url"'),
          contains('are conflicting.')
        ]),
        exitCode: exit_codes.USAGE);

    await d.appDir({}).validate();
    await d.dir(appPath, [
      d.nothing('.dart_tool/package_config.json'),
      d.nothing('pubspec.lock'),
      d.nothing('.packages'),
    ]).validate();
  });
}
