mirrored_repositories/awesome-flutter/examples/plugins/script/tool/test
// Copyright 2013 The Flutter Authors. 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:convert';
import 'dart:io';

import 'package:flutter_plugin_tools/src/common/pub_version_finder.dart';
import 'package:http/http.dart' as http;
import 'package:http/testing.dart';
import 'package:mockito/mockito.dart';
import 'package:pub_semver/pub_semver.dart';
import 'package:test/test.dart';

void main() {
  test('Package does not exist.', () async {
    final MockClient mockClient = MockClient((http.Request request) async {
      return http.Response('', 404);
    });
    final PubVersionFinder finder = PubVersionFinder(httpClient: mockClient);
    final PubVersionFinderResponse response =
        await finder.getPackageVersion(package: 'some_package');

    expect(response.versions, isEmpty);
    expect(response.result, PubVersionFinderResult.noPackageFound);
    expect(response.httpResponse.statusCode, 404);
    expect(response.httpResponse.body, '');
  });

  test('HTTP error when getting versions from pub', () async {
    final MockClient mockClient = MockClient((http.Request request) async {
      return http.Response('', 400);
    });
    final PubVersionFinder finder = PubVersionFinder(httpClient: mockClient);
    final PubVersionFinderResponse response =
        await finder.getPackageVersion(package: 'some_package');

    expect(response.versions, isEmpty);
    expect(response.result, PubVersionFinderResult.fail);
    expect(response.httpResponse.statusCode, 400);
    expect(response.httpResponse.body, '');
  });

  test('Get a correct list of versions when http response is OK.', () async {
    const Map<String, dynamic> httpResponse = <String, dynamic>{
      'name': 'some_package',
      'versions': <String>[
        '0.0.1',
        '0.0.2',
        '0.0.2+2',
        '0.1.1',
        '0.0.1+1',
        '0.1.0',
        '0.2.0',
        '0.1.0+1',
        '0.0.2+1',
        '2.0.0',
        '1.2.0',
        '1.0.0',
      ],
    };
    final MockClient mockClient = MockClient((http.Request request) async {
      return http.Response(json.encode(httpResponse), 200);
    });
    final PubVersionFinder finder = PubVersionFinder(httpClient: mockClient);
    final PubVersionFinderResponse response =
        await finder.getPackageVersion(package: 'some_package');

    expect(response.versions, <Version>[
      Version.parse('2.0.0'),
      Version.parse('1.2.0'),
      Version.parse('1.0.0'),
      Version.parse('0.2.0'),
      Version.parse('0.1.1'),
      Version.parse('0.1.0+1'),
      Version.parse('0.1.0'),
      Version.parse('0.0.2+2'),
      Version.parse('0.0.2+1'),
      Version.parse('0.0.2'),
      Version.parse('0.0.1+1'),
      Version.parse('0.0.1'),
    ]);
    expect(response.result, PubVersionFinderResult.success);
    expect(response.httpResponse.statusCode, 200);
    expect(response.httpResponse.body, json.encode(httpResponse));
  });
}

class MockProcessResult extends Mock implements ProcessResult {}
