postmark
Version: 
Official Node.js client library for the Postmark HTTP API - https://www.postmarkapp.com
184 lines (148 loc) • 5.98 kB
text/typescript
import * as postmark from "../../src/index";
import { expect } from "chai";
import "mocha";
import * as nconf from "nconf";
import * as sinon from "sinon";
import {InternalServerError} from "../../src/client/errors/Errors";
const testingKeys = nconf.env().file({ file: __dirname + "/../../testing_keys.json" });
const packageJson = require("../../package.json");
const clientVersion = packageJson.version;
describe("AccountClient", () => {
    let client: postmark.AccountClient;
    const accountToken: string = testingKeys.get("ACCOUNT_API_TOKEN");
    const serverToken: string = testingKeys.get("SERVER_API_TOKEN");
    beforeEach(() => {
        client = new postmark.AccountClient(accountToken);
    });
    describe("#new", () => {
        it("default clientOptions", () => {
            expect(client.getClientOptions()).to.eql({
                useHttps: true,
                requestHost: "api.postmarkapp.com",
                timeout: 180,
            });
        });
        it("clientVersion", () => {
            expect(client.clientVersion).to.equal(clientVersion);
        });
        it("httpClient initialized", () => {
            expect(client.httpClient.client.defaults).not.to.eql(180000);
        });
    });
    it("clientVersion=", () => {
        const customClientVersion: string = "test";
        client.clientVersion = customClientVersion;
        expect(client.clientVersion).to.equal(customClientVersion);
    });
    it("clientOptions=", () => {
        const requestHost = "test";
        const useHttps = false;
        const timeout = 10;
        client.setClientOptions({requestHost, useHttps, timeout});
        expect(client.getClientOptions()).to.eql({
            useHttps,
            requestHost,
            timeout,
        });
    });
    it("set clientOptions timeout", () => {
      const timeoutValue: number = 10;
      client.setClientOptions({timeout: timeoutValue});
      expect(client.getClientOptions()).to.eql({
        useHttps: true,
        requestHost: "api.postmarkapp.com",
        timeout: timeoutValue,
      });
    });
    it("set clientOptions https", () => {
      const https: boolean = false;
      client.setClientOptions({useHttps: https});
      expect(client.getClientOptions()).to.eql({
        useHttps: https,
        requestHost: "api.postmarkapp.com",
        timeout: 180,
      });
    });
    it("set clientOptions requestHost", () => {
        const host: string = "test.com";
        client.setClientOptions({requestHost: host});
        expect(client.getClientOptions()).to.eql({
            useHttps: true,
            requestHost: host,
            timeout: 180,
        });
    });
    describe("invalid requests", () => {
        it("empty token", () => {
            expect(() => new postmark.AccountClient(""))
                .to.throw("A valid API token must be provided.");
        });
        describe("httpRequest errors", () => {
            const errorType = "InternalServerError";
            const rejectError = new InternalServerError("response", 500, 500);
            let sandbox: sinon.SinonSandbox;
            beforeEach(() => {
                sandbox = sinon.createSandbox();
            });
            afterEach(() => {
                sandbox.restore();
            });
            it("promise error",() => {
                client = new postmark.AccountClient(serverToken);
                sandbox.stub(client.httpClient, "httpRequest").rejects(rejectError);
                return client.getSenderSignatures().then((result) => {
                    throw Error(`Should not be here with result: ${result}`);
                }, (error) => {
                    expect(error.name).to.equal(errorType);
                });
            });
            it("callback error",(done) => {
                client = new postmark.AccountClient("testToken");
                sandbox.stub(client.httpClient, "httpRequest").rejects(rejectError);
                client.getSenderSignatures(undefined, (error: any, data) => {
                    expect(data).to.equal(null);
                    expect(error.name).to.equal(errorType);
                    done();
                });
            });
        });
    });
    describe("valid requests", () => {
        describe("httpRequest", () => {
            const errorType = "InternalServerError";
            const rejectError = new InternalServerError("response", 500, 500);
            let sandbox: sinon.SinonSandbox;
            beforeEach(() => {
                sandbox = sinon.createSandbox();
            });
            afterEach(() => {
                sandbox.restore();
            });
            it("promise result",() => {
                const successMessage = "success!"
                client = new postmark.AccountClient(serverToken);
                sandbox.stub(client.httpClient, "httpRequest").resolves(successMessage);
                return client.getSenderSignatures().then((result) => {
                    expect(result).to.equal(successMessage)
                }, (error) => {
                    throw Error(`Should not be here with error: ${error}`);
                });
            });
            it("callback result",(done) => {
                const successMessage = "success!"
                sandbox.stub(client.httpClient, "httpRequest").resolves(successMessage);
                client.getSenderSignatures(undefined, (error: any, data) => {
                    expect(data).to.equal(successMessage);
                    expect(error).to.equal(null);
                    done();
                });
            });
            it("callback called once", async() => {
                const callback = sinon.spy();
                sandbox.stub(client.httpClient, "httpRequest").resolves("test");
                await client.getSenderSignatures(undefined, callback);
                expect(callback.calledOnce).to.be.true
            });
        });
    });
});