import * as fs from 'fs';
import * as openpgp from '../src/openpgp';

const userInfo = {
  pgp: fs.readFileSync('.github/test-key.pgp', {
    encoding: 'utf8',
    flag: 'r'
  }),
  pgp_base64: fs.readFileSync('.github/test-key-base64.pgp', {
    encoding: 'utf8',
    flag: 'r'
  }),
  passphrase: fs.readFileSync('.github/test-key.pass', {
    encoding: 'utf8',
    flag: 'r'
  }),
  name: 'Joe Tester',
  email: 'joe@foo.bar',
  keyID: 'D523BD50DD70B0BA',
  fingerprint: '27571A53B86AF0C799B38BA77D851EB72D73BDA0',
  keygrip: '3E2D1142AA59E08E16B7E2C64BA6DDC773B1A627'
};

describe('openpgp', () => {
  describe('readPrivateKey', () => {
    it('returns a PGP private key from an armored string', async () => {
      await openpgp.readPrivateKey(userInfo.pgp).then(privateKey => {
        expect(privateKey.keyID).toEqual(userInfo.keyID);
        expect(privateKey.name).toEqual(userInfo.name);
        expect(privateKey.email).toEqual(userInfo.email);
        expect(privateKey.fingerprint).toEqual(userInfo.fingerprint);
      });
    });
    it('returns a PGP private key from a base64 armored string', async () => {
      await openpgp.readPrivateKey(userInfo.pgp_base64).then(privateKey => {
        expect(privateKey.keyID).toEqual(userInfo.keyID);
        expect(privateKey.name).toEqual(userInfo.name);
        expect(privateKey.email).toEqual(userInfo.email);
        expect(privateKey.fingerprint).toEqual(userInfo.fingerprint);
      });
    });
  });

  describe('generateKeyPair', () => {
    it('generates a PGP key pair', async () => {
      await openpgp.generateKeyPair(userInfo.name, userInfo.email, userInfo.passphrase).then(keyPair => {
        expect(keyPair).not.toBeUndefined();
        expect(keyPair.publicKey).not.toBeUndefined();
        expect(keyPair.privateKey).not.toBeUndefined();
      });
    }, 30000);
  });

  describe('isArmored', () => {
    it('returns true for armored key string', async () => {
      await openpgp.isArmored(userInfo.pgp).then(armored => {
        expect(armored).toEqual(true);
      });
    });
    it('returns false for base64 key string', async () => {
      await openpgp.isArmored(userInfo.pgp_base64).then(armored => {
        expect(armored).toEqual(false);
      });
    });
  });
});