/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
import CryptoFactory from '../../../src/crypto/plugin/CryptoFactory';
import KeyStoreInMemory from '../../../src/crypto/keyStore/KeyStoreInMemory';
import { SubtleCryptoNode } from '../../../src';
import { SubtleCrypto } from 'webcrypto-core';
import { SubtleCryptoElliptic } from '@microsoft/useragent-plugin-secp256k1';
import CryptoFactoryNode from '../../../src/crypto/plugin/CryptoFactoryNode';

describe('CryptoFactory', () => {
  it('should create a crypto suite',() => {
    const keyStore = new KeyStoreInMemory();
    
    const factory = new CryptoFactory(keyStore, SubtleCryptoNode.getSubtleCrypto());
    expect(factory).toBeDefined();
    const keyEncrypter = factory.getKeyEncrypter('*');
    expect(keyEncrypter).toBeDefined();
    const macSigner = factory.getMessageAuthenticationCodeSigners('*');
    expect(macSigner).toBeDefined();
    const messageDigest = factory.getMessageDigest('*');
    expect(messageDigest).toBeDefined();
    const messageSigner = factory.getMessageSigner('*');
    expect(messageSigner).toBeDefined();
    const sharedKeyEncrypter = factory.getSharedKeyEncrypter('*');
    expect(sharedKeyEncrypter).toBeDefined();
    const symmetricEncrypter = factory.getSymmetricEncrypter('*');
    expect(symmetricEncrypter).toBeDefined();
  })

  it('should plugin a new algorithm into crypto suite',() => {
    const keyStore = new KeyStoreInMemory();
    
    const factory = new CryptoFactoryNode(keyStore, SubtleCryptoNode.getSubtleCrypto());
    const messageSigner = factory.getMessageSigner('ed25519');
    expect(messageSigner instanceof SubtleCryptoElliptic).toBeTruthy();
    expect((<any>messageSigner).providers.algorithms.includes('EDDSA')).toBeTruthy();
    expect((<any>messageSigner).providers.algorithms.includes('ECDSA')).toBeTruthy();
  })
});
