// Copyright (c) 2012, 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.10

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() {
  forBothPubGetAndUpgrade((command) {
    test('fails gracefully if the url is invalid', () async {
      await d.dir(appPath, [
        d.appPubspec({
          'foo': {
            'hosted': {'name': 'foo', 'url': 'not@url-com'}
          }
        })
      ]).create();

      await pubCommand(
        command,
        error: contains('url scheme must be https:// or http://'),
        exitCode: exit_codes.DATA,
        environment: {
          'PUB_MAX_HTTP_RETRIES': '2',
        },
      );
    });
    test('fails gracefully if the url has querystring', () async {
      await d.dir(appPath, [
        d.appPubspec({
          'foo': {
            'hosted': {'name': 'foo', 'url': 'http://example.foo/?key=value'}
          }
        })
      ]).create();

      await pubCommand(
        command,
        error: contains('querystring'),
        exitCode: exit_codes.DATA,
        environment: {
          'PUB_MAX_HTTP_RETRIES': '2',
        },
      );
    });

    test('fails gracefully if the url has fragment', () async {
      await d.dir(appPath, [
        d.appPubspec({
          'foo': {
            'hosted': {'name': 'foo', 'url': 'http://example.foo/#hash'}
          }
        })
      ]).create();

      await pubCommand(
        command,
        error: contains('fragment'),
        exitCode: exit_codes.DATA,
        environment: {
          'PUB_MAX_HTTP_RETRIES': '2',
        },
      );
    });

    test('fails gracefully if the url has user-info (1)', () async {
      await d.dir(appPath, [
        d.appPubspec({
          'foo': {
            'hosted': {'name': 'foo', 'url': 'http://user:pwd@example.foo/'}
          }
        })
      ]).create();

      await pubCommand(
        command,
        error: contains('user-info'),
        exitCode: exit_codes.DATA,
        environment: {
          'PUB_MAX_HTTP_RETRIES': '2',
        },
      );
    });

    test('fails gracefully if the url has user-info (2)', () async {
      await d.dir(appPath, [
        d.appPubspec({
          'foo': {
            'hosted': {'name': 'foo', 'url': 'http://user@example.foo/'}
          }
        })
      ]).create();

      await pubCommand(
        command,
        error: contains('user-info'),
        exitCode: exit_codes.DATA,
        environment: {
          'PUB_MAX_HTTP_RETRIES': '2',
        },
      );
    });
  });
}
