/// import * as assert from "assert"; import * as Q from "q"; import AccountManager = require("../script/management-sdk"); var request = require("superagent"); var manager: AccountManager; describe("Management SDK", () => { beforeEach(() => { manager = new AccountManager(/*accessKey=*/ "dummyAccessKey", /*customHeaders=*/ null, /*serverUrl=*/ "http://localhost"); }); after(() => { // Prevent an exception that occurs due to how superagent-mock overwrites methods request.Request.prototype._callback = function() { }; }); it("methods reject the promise with status code info when an error occurs", (done: MochaDone) => { mockReturn("Text", 404); var methodsWithErrorHandling: any[] = [ manager.addApp.bind(manager, "appName"), manager.getApp.bind(manager, "appName"), manager.renameApp.bind(manager, "appName", {}), manager.removeApp.bind(manager, "appName"), manager.transferApp.bind(manager, "appName", "email1"), manager.addDeployment.bind(manager, "appName", "deploymentName"), manager.getDeployment.bind(manager, "appName", "deploymentName"), manager.getDeployments.bind(manager, "appName"), manager.renameDeployment.bind(manager, "appName", "deploymentName", { name: "newDeploymentName" }), manager.removeDeployment.bind(manager, "appName", "deploymentName"), manager.addCollaborator.bind(manager, "appName", "email1"), manager.getCollaborators.bind(manager, "appName"), manager.removeCollaborator.bind(manager, "appName", "email1"), manager.patchRelease.bind(manager, "appName", "deploymentName", "label", { description: "newDescription" }), manager.promote.bind(manager, "appName", "deploymentName", "newDeploymentName", { description: "newDescription" }), manager.rollback.bind(manager, "appName", "deploymentName", "targetReleaseLabel") ]; var result = Q(null); methodsWithErrorHandling.forEach(function(f) { result = result.then(() => { return testErrors(f); }); }); result.done(() => { done(); }); // Test that the proper error code and text is passed through on a server error function testErrors(method: any): Q.Promise { return Q.Promise((resolve: any, reject: any, notify: any) => { method().done(() => { assert.fail("Should have thrown an error"); reject(); }, (error: any) => { assert.equal(error.message, "Text"); resolve(); }); }); } }); it("isAuthenticated handles successful auth", (done: MochaDone) => { mockReturn(JSON.stringify({ authenticated: true }), 200, {}); manager.isAuthenticated() .done((authenticated: boolean) => { assert(authenticated, "Should be authenticated"); done(); }); }); it("isAuthenticated handles unsuccessful auth", (done: MochaDone) => { mockReturn("Unauthorized", 401, {}); manager.isAuthenticated() .done((authenticated: boolean) => { assert(!authenticated, "Should not be authenticated"); done(); }); }); it("isAuthenticated handles unexpected status codes", (done: MochaDone) => { mockReturn("Not Found", 404, {}); manager.isAuthenticated() .done((authenticated: boolean) => { assert.fail("isAuthenticated should have rejected the promise"); done(); }, (err) => { assert.equal(err.message, "Not Found", "Error message should be 'Not Found'"); done(); }); }); it("addApp handles successful response", (done: MochaDone) => { mockReturn(JSON.stringify({ success: true }), 201, { location: "/appName" }); manager.addApp("appName") .done((obj) => { assert.ok(obj); done(); }, rejectHandler); }); it("addApp handles error response", (done: MochaDone) => { mockReturn(JSON.stringify({ success: false }), 404, {}); manager.addApp("appName") .done((obj) => { throw new Error("Call should not complete successfully"); }, (error: Error) => done()); }); it("getApp handles JSON response", (done: MochaDone) => { mockReturn(JSON.stringify({ app: {} }), 200, {}); manager.getApp("appName") .done((obj: any) => { assert.ok(obj); done(); }, rejectHandler); }); it("updateApp handles success response", (done: MochaDone) => { mockReturn(JSON.stringify({ apps: [] }), 200, {}); manager.renameApp("appName", "newAppName") .done((obj: any) => { assert.ok(!obj); done(); }, rejectHandler); }); it("removeApp handles success response", (done: MochaDone) => { mockReturn("", 200, {}); manager.removeApp("appName") .done((obj: any) => { assert.ok(!obj); done(); }, rejectHandler); }); it("transferApp handles successful response", (done: MochaDone) => { mockReturn("", 201); manager.transferApp("appName", "email1") .done((obj) => { assert.ok(!obj); done(); }, rejectHandler); }); it("addDeployment handles success response", (done: MochaDone) => { mockReturn(JSON.stringify({ deployment: { name: "name", key: "key" } }), 201, { location: "/deploymentName" }); manager.addDeployment("appName", "deploymentName") .done((obj: any) => { assert.ok(obj); done(); }, rejectHandler); }); it("getDeployment handles JSON response", (done: MochaDone) => { mockReturn(JSON.stringify({ deployment: {} }), 200, {}); manager.getDeployment("appName", "deploymentName") .done((obj: any) => { assert.ok(obj); done(); }, rejectHandler); }); it("getDeployments handles JSON response", (done: MochaDone) => { mockReturn(JSON.stringify({ deployments: [] }), 200, {}); manager.getDeployments("appName") .done((obj: any) => { assert.ok(obj); done(); }, rejectHandler); }); it("renameDeployment handles success response", (done: MochaDone) => { mockReturn(JSON.stringify({ apps: [] }), 200, {}); manager.renameDeployment("appName", "deploymentName", "newDeploymentName") .done((obj: any) => { assert.ok(!obj); done(); }, rejectHandler); }); it("removeDeployment handles success response", (done: MochaDone) => { mockReturn("", 200, {}); manager.removeDeployment("appName", "deploymentName") .done((obj: any) => { assert.ok(!obj); done(); }, rejectHandler); }); it("getDeploymentHistory handles success response with no packages", (done: MochaDone) => { mockReturn(JSON.stringify({ history: [] }), 200); manager.getDeploymentHistory("appName", "deploymentName") .done((obj: any) => { assert.ok(obj); assert.equal(obj.length, 0); done(); }, rejectHandler); }); it("getDeploymentHistory handles success response with two packages", (done: MochaDone) => { mockReturn(JSON.stringify({ history: [{ label: "v1" }, { label: "v2" }] }), 200); manager.getDeploymentHistory("appName", "deploymentName") .done((obj: any) => { assert.ok(obj); assert.equal(obj.length, 2); assert.equal(obj[0].label, "v1"); assert.equal(obj[1].label, "v2"); done(); }, rejectHandler); }); it("getDeploymentHistory handles error response", (done: MochaDone) => { mockReturn("", 404); manager.getDeploymentHistory("appName", "deploymentName") .done((obj: any) => { throw new Error("Call should not complete successfully"); }, (error: Error) => done()); }); it("clearDeploymentHistory handles success response", (done: MochaDone) => { mockReturn("", 204); manager.clearDeploymentHistory("appName", "deploymentName") .done((obj: any) => { assert.ok(!obj); done(); }, rejectHandler); }); it("clearDeploymentHistory handles error response", (done: MochaDone) => { mockReturn("", 404); manager.clearDeploymentHistory("appName", "deploymentName") .done((obj: any) => { throw new Error("Call should not complete successfully"); }, (error: Error) => done()); }); it("addCollaborator handles successful response", (done: MochaDone) => { mockReturn("", 201, { location: "/collaborators" }); manager.addCollaborator("appName", "email1") .done((obj) => { assert.ok(!obj); done(); }, rejectHandler); }); it("addCollaborator handles error response", (done: MochaDone) => { mockReturn("", 404, {}); manager.addCollaborator("appName", "email1") .done((obj) => { throw new Error("Call should not complete successfully"); }, (error: Error) => done()); }); it("getCollaborators handles success response with no collaborators", (done: MochaDone) => { mockReturn(JSON.stringify({ collaborators: {} }), 200); manager.getCollaborators("appName") .done((obj: any) => { assert.ok(obj); assert.equal(Object.keys(obj).length, 0); done(); }, rejectHandler); }); it("getCollaborators handles success response with multiple collaborators", (done: MochaDone) => { mockReturn(JSON.stringify({ collaborators: { "email1": { permission: "Owner", isCurrentAccount: true }, "email2": { permission: "Collaborator", isCurrentAccount: false } } }), 200); manager.getCollaborators("appName") .done((obj: any) => { assert.ok(obj); assert.equal(obj["email1"].permission, "Owner"); assert.equal(obj["email2"].permission, "Collaborator"); done(); }, rejectHandler); }); it("removeCollaborator handles success response", (done: MochaDone) => { mockReturn("", 200, {}); manager.removeCollaborator("appName", "email1") .done((obj: any) => { assert.ok(!obj); done(); }, rejectHandler); }); it("patchRelease handles success response", (done: MochaDone) => { mockReturn(JSON.stringify({ package: { description: "newDescription" } }), 200); manager.patchRelease("appName", "deploymentName", "label", { description: "newDescription" }) .done((obj: any) => { assert.ok(!obj); done(); }, rejectHandler); }); it("patchRelease handles error response", (done: MochaDone) => { mockReturn("", 400); manager.patchRelease("appName", "deploymentName", "label", {}) .done((obj: any) => { throw new Error("Call should not complete successfully"); }, (error: Error) => done()); }); it("promote handles success response", (done: MochaDone) => { mockReturn(JSON.stringify({ package: { description: "newDescription" } }), 200); manager.promote("appName", "deploymentName", "newDeploymentName", { description: "newDescription" }) .done((obj: any) => { assert.ok(!obj); done(); }, rejectHandler); }); it("promote handles error response", (done: MochaDone) => { mockReturn("", 400); manager.promote("appName", "deploymentName", "newDeploymentName", { rollout: 123 }) .done((obj: any) => { throw new Error("Call should not complete successfully"); }, (error: Error) => done()); }); it("rollback handles success response", (done: MochaDone) => { mockReturn(JSON.stringify({ package: { label: "v1" } }), 200); manager.rollback("appName", "deploymentName", "v1") .done((obj: any) => { assert.ok(!obj); done(); }, rejectHandler); }); it("rollback handles error response", (done: MochaDone) => { mockReturn("", 400); manager.rollback("appName", "deploymentName", "v1") .done((obj: any) => { throw new Error("Call should not complete successfully"); }, (error: Error) => done()); }); }); // Helper method that is used everywhere that an assert.fail() is needed in a promise handler function rejectHandler(val: any): void { assert.fail(); } // Wrapper for superagent-mock that abstracts away information not needed for SDK tests function mockReturn(bodyText: string, statusCode: number, header = {}): void { require("superagent-mock")(request, [{ pattern: "http://localhost/(\\w+)/?", fixtures: function(match: any, params: any): any { var isOk = statusCode >= 200 && statusCode < 300; if (!isOk) { var err: any = new Error(bodyText); err.status = statusCode; throw err; } return { text: bodyText, status: statusCode, ok: isOk, header: header, headers: {} }; }, callback: function(match: any, data: any): any { return data; } }]); }