import { strict as assert } from 'assert';
import { checkSnapsBlockList } from './snaps-utilities';

describe('Snaps Controller utilities', function () {
  describe('checkSnapsBlockList', function () {
    it('returns one of the given snaps as blocked by its version', async function () {
      const mockBlocklist = [
        {
          id: 'npm:@consensys/starknet-snap',
          versionRange: '<0.1.11',
        },
      ];
      const mockSnapsToBeChecked = {
        'npm:exampleA': {
          version: '1.0.0',
          shasum: 'F5IapP6v1Bp7bl16NkCszfOhtVSZAm362X5zl7wgMhI=',
        },
        'npm:exampleB': {
          version: '1.0.0',
          shasum: 'eCYGZiYvZ3/uxkKI3npfl79kTQXS/5iD9ojsBS4A3rI=',
        },
        'npm:@consensys/starknet-snap': {
          version: '0.1.10',
          shasum: 'A83r5/ZIcKuKwuAnQHHByVFCuofj7jGK5hOStmHY6A0=',
        },
      };

      const blockedSnaps = await checkSnapsBlockList(
        mockSnapsToBeChecked,
        mockBlocklist,
      );
      assert.deepEqual(blockedSnaps, {
        'npm:exampleA': { blocked: false },
        'npm:exampleB': { blocked: false },
        'npm:@consensys/starknet-snap': {
          blocked: true,
          reason: undefined,
          infoUrl: undefined,
        },
      });
    });

    it('returns given snap as blocked by its shasum', async function () {
      const mockBlocklist = [
        {
          shasum: 'A83r5/ZIcKuKwuAnQHHByVFCuofj7jGK5hOStmHY6A0=',
        },
      ];
      const mockSnapsToBeChecked = {
        'npm:@consensys/starknet-snap': {
          version: '0.3.15', // try to fake version with the same source sha
          shasum: 'A83r5/ZIcKuKwuAnQHHByVFCuofj7jGK5hOStmHY6A0=',
        },
      };

      const blockedSnaps = await checkSnapsBlockList(
        mockSnapsToBeChecked,
        mockBlocklist,
      );
      assert.deepEqual(blockedSnaps, {
        'npm:@consensys/starknet-snap': {
          blocked: true,
          reason: undefined,
          infoUrl: undefined,
        },
      });
    });

    it('returns false for blocked for the same blocklisted snap but different version', async function () {
      const mockBlocklist = [
        {
          id: 'npm:@consensys/starknet-snap',
          versionRange: '<0.1.11',
        },
      ];
      const mockSnapsToBeChecked = {
        'npm:@consensys/starknet-snap': {
          version: '0.2.1',
          shasum: 'Z4jo37WG1E2rxqF05WaXOSUDxR5upUmOdaTvmgVY/L0=',
        },
      };

      const blockedSnaps = await checkSnapsBlockList(
        mockSnapsToBeChecked,
        mockBlocklist,
      );
      assert.deepEqual(blockedSnaps, {
        'npm:@consensys/starknet-snap': {
          blocked: false,
        },
      });
    });

    it('returns false for blocked for multiple snaps that are not on the blocklist', async function () {
      const mockBlocklist = [
        {
          id: 'npm:@consensys/starknet-snap',
          versionRange: '<0.1.11',
        },
      ];
      const mockSnapsToBeChecked = {
        'npm:exampleA': {
          version: '1.0.0',
          shasum: 'F5IapP6v1Bp7bl16NkCszfOhtVSZAm362X5zl7wgMhI=',
        },
        'npm:exampleB': {
          version: '2.1.3',
          shasum: 'eCYGZiYvZ3/uxkKI3npfl79kTQXS/5iD9ojsBS4A3rI=',
        },
        'npm:exampleC': {
          version: '3.7.9',
          shasum: '2QqUxo5joo4kKKr7yiCjdYsZOZcIFBnIBEdwU9Yx7+M=',
        },
      };

      const blockedSnaps = await checkSnapsBlockList(
        mockSnapsToBeChecked,
        mockBlocklist,
      );
      assert.deepEqual(blockedSnaps, {
        'npm:exampleA': { blocked: false },
        'npm:exampleB': { blocked: false },
        'npm:exampleC': { blocked: false },
      });
    });
  });
});