import assert = require("assert");
import Sinon = require("sinon");
import nedb = require("nedb");
import express = require("express");
import winston = require("winston");
import speakeasy = require("speakeasy");
import u2f = require("u2f");
import nodemailer = require("nodemailer");
import session = require("express-session");

import { AppConfiguration, UserConfiguration } from "../src/lib/configuration/Configuration";
import { GlobalDependencies, Nodemailer } from "../types/Dependencies";
import Server from "../src/lib/Server";


describe("test server configuration", function () {
  let deps: GlobalDependencies;
  let sessionMock: Sinon.SinonSpy;

  before(function () {
    const transporter = {
      sendMail: Sinon.stub().yields()
    };

    const createTransport = Sinon.stub(nodemailer, "createTransport");
    createTransport.returns(transporter);

    sessionMock = Sinon.spy(session);

    deps = {
      nodemailer: nodemailer,
      speakeasy: speakeasy,
      u2f: u2f,
      nedb: nedb,
      winston: winston,
      ldapjs: {
        createClient: Sinon.spy(function () {
          return {
            on: Sinon.spy(),
            bind: Sinon.spy(),
          };
        })
      },
      session: sessionMock as any,
      ConnectRedis: Sinon.spy(),
      dovehash: Sinon.spy() as any
    };
  });


  it("should set cookie scope to domain set in the config", function () {
    const config: UserConfiguration = {
      session: {
        domain: "example.com",
        secret: "secret"
      },
      ldap: {
        url: "http://ldap",
        user: "user",
        password: "password",
        base_dn: "dc=example,dc=com"
      },
      notifier: {
        gmail: {
          username: "user@example.com",
          password: "password"
        }
      },
      regulation: {
        max_retries: 3,
        ban_time: 5 * 60,
        find_time: 5 * 60
      },
      storage: {
        local: {
          in_memory: true
        }
      }
    };

    const server = new Server();
    server.start(config, deps);

    assert(sessionMock.calledOnce);
    assert.equal(sessionMock.getCall(0).args[0].cookie.domain, "example.com");
  });
});