import { TotpHandler } from "../../../src/lib/authentication/totp/TotpHandler";
import Sinon = require("sinon");
import Speakeasy = require("speakeasy");
import Assert = require("assert");

describe("test TOTP validation", function() {
  let totpValidator: TotpHandler;
  let validateStub: Sinon.SinonStub;

  beforeEach(() => {
    validateStub = Sinon.stub(Speakeasy.totp, "verify");
    totpValidator = new TotpHandler(Speakeasy);
  });

  afterEach(function() {
    validateStub.restore();
  });

  it("should validate the TOTP token", function() {
    const totp_secret = "NBD2ZV64R9UV1O7K";
    const token = "token";
    validateStub.withArgs({
      secret: totp_secret,
      token: token,
      encoding: "base32",
      window: 1
    }).returns(true);
    Assert(totpValidator.validate(token, totp_secret));
  });

  it("should not validate a wrong TOTP token", function() {
    const totp_secret = "NBD2ZV64R9UV1O7K";
    const token = "wrong token";
    validateStub.returns(false);
    Assert(!totpValidator.validate(token, totp_secret));
  });
});