UNPKG

appcenter-cli

Version:

Command line tool for Visual Studio App Center

219 lines (177 loc) 7.47 kB
import { expect } from "chai"; import * as Nock from "nock"; import * as Temp from "temp"; import * as _ from "lodash"; import EditReleaseCommand from "../../../../src/commands/distribute/releases/edit"; import { CommandArgs, CommandResult, CommandFailedResult } from "../../../../src/util/commandline"; Temp.track(); describe("distribute releases edit command", async () => { const fakeAppOwner = "fakeAppOwner"; const fakeAppName = "fakeAppName"; const fakeAppIdentifier = `${fakeAppOwner}/${fakeAppName}`; const fakeToken = "c1o3d3e7"; const fakeReleaseId = "5"; /* tslint:disable-next-line:no-http-string */ const fakeHost = "http://localhost:1700"; const releaseIdOption = "--release-id"; before(() => { Nock.disableNetConnect(); }); afterEach(() => { Nock.cleanAll(); }); after(() => { Nock.enableNetConnect(); }); context("completes successfully", () => { it("if enable release", async () => { // Arrange const executionScope = _.flow(setupReleaseDetailsResponse, setupUpdateReleaseResponse)(Nock(fakeHost)); // Act const command = new EditReleaseCommand(getCommandArgs([releaseIdOption, fakeReleaseId, "enabled"])); const result = await command.execute(); testCommandSuccess(result, executionScope); }); it("if disable release", async () => { // Arrange const executionScope = _.flow(setupReleaseDetailsResponse, setupUpdateReleaseResponse)(Nock(fakeHost)); // Act const command = new EditReleaseCommand(getCommandArgs([releaseIdOption, fakeReleaseId, "disabled"])); const result = await command.execute(); testCommandSuccess(result, executionScope); }); }); context("failed", () => { it("if --release-id option wasn't specified", async () => { // Arrange let errorMessage: string; const expectedErrorMessage = "Missing required option -r / --release-id"; let command; // Act try { command = new EditReleaseCommand(getCommandArgs([releaseIdOption])); } catch (e) { errorMessage = e.message; } // Assert expect(errorMessage).to.eql(expectedErrorMessage); }); it("if --release-id option value is not valid", async () => { // Arrange const expectedErrorMessage = "notanumber is not a valid release id"; // Act const command = new EditReleaseCommand(getCommandArgs([releaseIdOption, "notanumber", "disabled"])); const result = await command.execute(); // Assert expect((result as CommandFailedResult).errorMessage).to.eql(expectedErrorMessage); }); it("if state option wasn't specified", async () => { // Arrange let errorMessage: string; const expectedErrorMessage = "Missing required positional argument State"; // Act let command; try { command = new EditReleaseCommand(getCommandArgs([releaseIdOption, "1"])); } catch (e) { errorMessage = e.message; } // Assert expect(errorMessage).to.eql(expectedErrorMessage); }); it("if state option value is invalid", async () => { // Arrange const expectedErrorMessage = `"invalidvalue" is not a valid release state. Available states are "enabled" or "disabled".`; // Act const command = new EditReleaseCommand(getCommandArgs([releaseIdOption, "1", "invalidvalue"])); const result = await command.execute(); // Assert expect((result as CommandFailedResult).errorMessage).to.eql(expectedErrorMessage); }); it("if release does not exist", async () => { // Arrange const expectedErrorMessage = `release ${fakeReleaseId} doesn't exist`; const executionScope = setupReleaseDetailsNotFoundResponse(Nock(fakeHost)); // Act const command = new EditReleaseCommand(getCommandArgs([releaseIdOption, fakeReleaseId, "disabled"])); const result = await command.execute(); // Assert expect((result as CommandFailedResult).errorMessage).to.eql(expectedErrorMessage); testCommandFailure(executionScope); }); it("if failed to load release details", async () => { // Arrange const expectedErrorMessage = "failed to load release details"; const executionScope = setupReleaseDetailsServiceUnavailableResponse(Nock(fakeHost)); // Act const command = new EditReleaseCommand(getCommandArgs([releaseIdOption, fakeReleaseId, "disabled"])); const result = await command.execute(); // Assert expect((result as CommandFailedResult).errorMessage).to.eql(expectedErrorMessage); testCommandFailure(executionScope); }); it("if failed to update release state", async () => { // Arrange const expectedErrorMessage = "failed to disable the release"; const executionScope = _.flow(setupReleaseDetailsResponse, setupUpdateReleaseServiceUnavailableResponse)(Nock(fakeHost)); // Act const command = new EditReleaseCommand(getCommandArgs([releaseIdOption, fakeReleaseId, "disabled"])); const result = await command.execute(); // Assert expect((result as CommandFailedResult).errorMessage).to.eql(expectedErrorMessage); testCommandFailure(executionScope); }); }); function testCommandSuccess(result: CommandResult, executionScope: Nock.Scope, abortScope?: Nock.Scope) { expect(result.succeeded).to.eql(true, "Command should be successfully completed"); if (abortScope) { expect(abortScope.isDone()).to.eql(false, "Unexpected requests were made"); } executionScope.done(); // All normal API calls are executed } function testCommandFailure(executionScope: Nock.Scope, abortScope?: Nock.Scope) { if (abortScope) { expect(abortScope.isDone()).to.eql(false, "Unexpected requests were made"); } executionScope.done(); // All normal API calls are executed } function getCommandArgs(additionalArgs: string[]): CommandArgs { const args: string[] = ["-a", fakeAppIdentifier, "--token", fakeToken, "--env", "local"].concat(additionalArgs); return { args, command: ["distribute", "releases", "edit"], commandPath: "FAKE_COMMAND_PATH" }; } function setupReleaseDetailsNotFoundResponse(nockScope: Nock.Scope) { return nockScope.get(`/v0.1/apps/${fakeAppOwner}/${fakeAppName}/releases/${fakeReleaseId}`) .reply(404, { error: { code: "NotFound", message: `Could not find release with id ${fakeReleaseId}` } }); } function setupReleaseDetailsResponse(nockScope: Nock.Scope) { return nockScope.get(`/v0.1/apps/${fakeAppOwner}/${fakeAppName}/releases/${fakeReleaseId}`) .reply(200, { shortVersion: "1.1", version: "1.1" }); } function setupReleaseDetailsServiceUnavailableResponse(nockScope: Nock.Scope) { return nockScope.get(`/v0.1/apps/${fakeAppOwner}/${fakeAppName}/releases/${fakeReleaseId}`) .reply(400); } function setupUpdateReleaseServiceUnavailableResponse(nockScope: Nock.Scope) { return nockScope.put(`/v0.1/apps/${fakeAppOwner}/${fakeAppName}/releases/${fakeReleaseId}`) .reply(400); } function setupUpdateReleaseResponse(nockScope: Nock.Scope) { return nockScope.put(`/v0.1/apps/${fakeAppOwner}/${fakeAppName}/releases/${fakeReleaseId}`) .reply(200, { shortVersion: "1.1", version: "1.1" }); } });