import 'package:test/test.dart';
import 'package:fxtest/fxtest.dart';

void main() {
  group('reads package repository information correctly', () {
    test('parsing package-repositories.json', () {
      List<dynamic> manifestTestJson = [
        {
          'blobs': 'amber-files/repository/blobs',
          'path': 'amber-files/repository',
          'targets': 'amber-files/repository/targets.json'
        }
      ];
      PackageRepository repository =
          PackageRepository.fromJson(manifestTestJson);
      expect(repository.targetsFile, 'amber-files/repository/targets.json');
      expect(repository.blobsDirectory, 'amber-files/repository/blobs');
      expect(repository.rootPath, 'amber-files/repository');
    });

    test(
        'refuse to parse a package-repositories.json with multiple repositories',
        () {
      List<dynamic> manifestTestJson = [
        {
          'blobs': 'amber-files/repository/blobs',
          'path': 'amber-files/repository',
          'targets': 'amber-files/repository/targets.json'
        },
        {
          'blobs': 'amber-files2/repository/blobs',
          'path': 'amber-files2/repository',
          'targets': 'amber-files2/repository/targets.json'
        }
      ];
      expect(() => PackageRepository.fromJson(manifestTestJson),
          throwsA(TypeMatcher<PackageRepositoryException>()));
    });

    test('parsing targets.json', () async {
      // This is adapted from an actual targets.json, intentially keeping the unused
      // fields to ensure they don't impact parsing.
      Map<String, dynamic> targetsJson = {
        'signatures': [
          {
            'keyid':
                'ffffffffff69aa5eb30d6c4be6b9170737813be937206345c4b2e19ffffffffff',
            'method': 'ed25519',
            'sig':
                'ffffffffffbbbec5c8840dd15f0fba8fdda835e98bbcb91db7a6ffff95ea3f03f5697b654c8133ec86045bb21f8f907c959de494ea11319bec5f90ffffffffff'
          }
        ],
        'signed': {
          '_type': 'targets',
          'expires': '2020-08-13T00:19:56Z',
          'spec_version': '1.0',
          'targets': {
            'my-demo/0': {
              'custom': {
                'merkle':
                    '913cdd63ab4aa794694448450505efaa2a8fe27fb33888e5156da9db60ac0a29',
                'size': 16384
              },
              'hashes': {
                'sha512':
                    '2a5294cc86c41df4651e9168ea8d526edd732fa4e7e329abfe5070228b61319c66f56902517d4a1edf5293e21523f669ff0211f51f3e696c4deb3d678edb7f00'
              },
              'length': 16384
            },
            'my_lib/0': {
              'custom': {
                'merkle':
                    '7a604498e05fa012391b6b51da9cc74ff6a6a9d25b1376de98125c194232bfa1',
                'size': 61440
              },
              'hashes': {
                'sha512':
                    '93430eb8b66cc507d3c36f4a15fc5d7ba3e25d0a1569dddad46355762386a606e90798ec429d35b3defc2df7a67408fa8e4e253d04042624c18e7ce22659a314'
              },
              'length': 61440
            }
          }
        }
      };
      PackageRepository repository = PackageRepository('does', 'not', 'matter');
      await repository.loadTargetsFromJson(Stream.value(targetsJson));

      expect(repository.asMap().length, 2);
      expect(repository['my-demo'].merkle,
          '913cdd63ab4aa794694448450505efaa2a8fe27fb33888e5156da9db60ac0a29');
      expect(repository['my_lib'].merkle,
          '7a604498e05fa012391b6b51da9cc74ff6a6a9d25b1376de98125c194232bfa1');
    });

    test('parsing targets.json with multiple versions of the same package name',
        () async {
      Map<String, dynamic> targetsJson = {
        'signed': {
          'targets': {
            'my-demo/0': {
              'custom': {
                'merkle':
                    '913cdd63ab4aa794694448450505efaa2a8fe27fb33888e5156da9db60ac0a29'
              }
            },
            'my-demo/1': {
              'custom': {
                'merkle':
                    '7a604498e05fa012391b6b51da9cc74ff6a6a9d25b1376de98125c194232bfa1'
              }
            }
          }
        }
      };
      PackageRepository repository = PackageRepository('does', 'not', 'matter');
      await repository.loadTargetsFromJson(Stream.value(targetsJson));

      expect(repository.asMap().length, 1);
      expect(repository['my-demo']['0'],
          '913cdd63ab4aa794694448450505efaa2a8fe27fb33888e5156da9db60ac0a29');
      expect(repository['my-demo']['1'],
          '7a604498e05fa012391b6b51da9cc74ff6a6a9d25b1376de98125c194232bfa1');
      expect(repository['another-package'], isNull);

      // merkle getter should throw an exception when there are multiple versions,
      // since it cannot reliably decide which version to return.
      expect(() => repository['my-demo'].merkle,
          throwsA(TypeMatcher<PackageRepositoryException>()));
    });
  });
}
