diff --git a/.gitignore b/.gitignore index 84e14c4..1840025 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,4 @@ deploy/* *.suo *.cache packages/ - +src/TestResults/* diff --git a/src/AppHarbor.Tests/Commands/LoginUserCommandTest.cs b/src/AppHarbor.Tests/Commands/LoginUserCommandTest.cs index a7d67c6..edd5894 100644 --- a/src/AppHarbor.Tests/Commands/LoginUserCommandTest.cs +++ b/src/AppHarbor.Tests/Commands/LoginUserCommandTest.cs @@ -1,37 +1,50 @@ -using System.IO; -using AppHarbor.Commands; -using Moq; -using Ploeh.AutoFixture.Xunit; -using Xunit; -using Xunit.Extensions; - -namespace AppHarbor.Tests.Commands -{ - public class LoginUserCommandTest - { - [Theory, AutoCommandData] - public void ShouldSetAppHarborTokenIfUserIsntLoggedIn([Frozen]Mock writer, [Frozen]Mock maskedConsoleInput, [Frozen]Mock reader, [Frozen]Mock accessTokenConfigurationMock, Mock loginCommand, string username, string password, string token) - { - reader.SetupSequence(x => x.ReadLine()).Returns(username).Returns(password); - accessTokenConfigurationMock.Setup(x => x.GetAccessToken()).Returns((string)null); - loginCommand.Setup(x => x.GetAccessToken(username, password)).Returns(token); - - maskedConsoleInput.Setup(x => x.Get()).Returns(password); - - loginCommand.Object.Execute(new string[] { }); - - writer.Verify(x => x.Write("Username: "), Times.Once()); - writer.Verify(x => x.Write("Password: "), Times.Once()); - writer.Verify(x => x.WriteLine("Successfully logged in as {0}", username), Times.Once()); - accessTokenConfigurationMock.Verify(x => x.SetAccessToken(token), Times.Once()); - } - - [Theory, AutoCommandData] - public void ShouldThrowIfUserIsAlreadyLoggedIn([Frozen]Mock accessTokenConfigurationMock, LoginUserCommand loginCommand) - { - accessTokenConfigurationMock.Setup(x => x.GetAccessToken()).Returns("foo"); - var exception = Assert.Throws(() => loginCommand.Execute(new string[] { })); - Assert.Equal("You're already logged in. You need to log out (\"logout\") before you can log in again.", exception.Message); - } - } -} +using System.IO; +using AppHarbor.Commands; +using Moq; +using Ploeh.AutoFixture.Xunit; +using Xunit; +using Xunit.Extensions; + +namespace AppHarbor.Tests.Commands +{ + public class LoginUserCommandTest + { + [Theory, AutoCommandData] + public void ShouldSetAppHarborTokenIfUserIsntLoggedInUseArgs([Frozen]Mock writer, [Frozen]Mock accessTokenConfigurationMock, Mock loginCommand, string username, string password, string token) + { + accessTokenConfigurationMock.Setup(x => x.GetAccessToken()).Returns((string)null); + loginCommand.Setup(x => x.GetAccessToken(username, password)).Returns(token); + + loginCommand.Object.Execute(new string[] {username,password}); + + writer.Verify(x => x.WriteLine("Using parameterized Credentials."), Times.Once()); + writer.Verify(x => x.WriteLine("Successfully logged in as {0}", username), Times.Once()); + accessTokenConfigurationMock.Verify(x => x.SetAccessToken(token), Times.Once()); + } + + [Theory, AutoCommandData] + public void ShouldSetAppHarborTokenIfUserIsntLoggedIn([Frozen]Mock writer, [Frozen]Mock maskedConsoleInput, [Frozen]Mock reader, [Frozen]Mock accessTokenConfigurationMock, Mock loginCommand, string username, string password, string token) + { + reader.SetupSequence(x => x.ReadLine()).Returns(username).Returns(password); + accessTokenConfigurationMock.Setup(x => x.GetAccessToken()).Returns((string)null); + loginCommand.Setup(x => x.GetAccessToken(username, password)).Returns(token); + + maskedConsoleInput.Setup(x => x.Get()).Returns(password); + + loginCommand.Object.Execute(new string[] { }); + + writer.Verify(x => x.Write("Username: "), Times.Once()); + writer.Verify(x => x.Write("Password: "), Times.Once()); + writer.Verify(x => x.WriteLine("Successfully logged in as {0}", username), Times.Once()); + accessTokenConfigurationMock.Verify(x => x.SetAccessToken(token), Times.Once()); + } + + [Theory, AutoCommandData] + public void ShouldThrowIfUserIsAlreadyLoggedIn([Frozen]Mock accessTokenConfigurationMock, LoginUserCommand loginCommand) + { + accessTokenConfigurationMock.Setup(x => x.GetAccessToken()).Returns("foo"); + var exception = Assert.Throws(() => loginCommand.Execute(new string[] { })); + Assert.Equal("You're already logged in. You need to log out (\"logout\") before you can log in again.", exception.Message); + } + } +} diff --git a/src/AppHarbor/Commands/LoginUserCommand.cs b/src/AppHarbor/Commands/LoginUserCommand.cs index 2da2fdc..e03eac6 100644 --- a/src/AppHarbor/Commands/LoginUserCommand.cs +++ b/src/AppHarbor/Commands/LoginUserCommand.cs @@ -1,62 +1,86 @@ -using System.IO; -using RestSharp; -using RestSharp.Contrib; - -namespace AppHarbor.Commands -{ - [CommandHelp("Login to AppHarbor", alias: "login")] - public class LoginUserCommand : Command - { - private readonly IAccessTokenConfiguration _accessTokenConfiguration; - private readonly IMaskedInput _maskedInput; - private readonly TextReader _reader; - private readonly TextWriter _writer; - - public LoginUserCommand(IAccessTokenConfiguration accessTokenConfiguration, IMaskedInput maskedInput, TextReader reader, TextWriter writer) - { - _accessTokenConfiguration = accessTokenConfiguration; - _maskedInput = maskedInput; - _reader = reader; - _writer = writer; - } - - protected override void InnerExecute(string[] arguments) - { - if (_accessTokenConfiguration.GetAccessToken() != null) - { - throw new CommandException("You're already logged in. You need to log out (\"logout\") before you can log in again."); - } - - _writer.Write("Username: "); - var username = _reader.ReadLine(); - - _writer.Write("Password: "); - var password = _maskedInput.Get(); - _writer.WriteLine(); - - var accessToken = GetAccessToken(username, password); - _accessTokenConfiguration.SetAccessToken(accessToken); - _writer.WriteLine("Successfully logged in as {0}", username); - } - - public virtual string GetAccessToken(string username, string password) - { - //NOTE: Remove when merged into AppHarbor.NET library - var restClient = new RestClient("https://appharbor-token-client.apphb.com"); - var request = new RestRequest("/token", Method.POST); - - request.AddParameter("username", username); - request.AddParameter("password", password); - - var response = restClient.Execute(request); - var accessToken = HttpUtility.ParseQueryString(response.Content)["access_token"]; - - if (accessToken == null) - { - throw new CommandException("Couldn't log in. Try again"); - } - - return accessToken; - } - } -} +using System.IO; +using RestSharp; +using RestSharp.Contrib; +using System; + +namespace AppHarbor.Commands +{ + [CommandHelp("Login to AppHarbor", alias: "login")] + public class LoginUserCommand : Command + { + private readonly IAccessTokenConfiguration _accessTokenConfiguration; + private readonly IMaskedInput _maskedInput; + private readonly TextReader _reader; + private readonly TextWriter _writer; + + public LoginUserCommand(IAccessTokenConfiguration accessTokenConfiguration, IMaskedInput maskedInput, TextReader reader, TextWriter writer) + { + _accessTokenConfiguration = accessTokenConfiguration; + _maskedInput = maskedInput; + _reader = reader; + _writer = writer; + } + + protected override void InnerExecute(string[] arguments) + { + if (_accessTokenConfiguration.GetAccessToken() != null) + { + throw new CommandException("You're already logged in. You need to log out (\"logout\") before you can log in again."); + } + + string username = null; + string password = null; + + if (arguments == null || arguments.Length != 2) + { + _writer.WriteLine("Please supply your Credentials."); + _writer.Write("Username: "); + username = _reader.ReadLine(); + + _writer.Write("Password: "); + password = _maskedInput.Get(); + _writer.WriteLine(); + } + else + { + _writer.WriteLine("Using parameterized Credentials."); + username = arguments[0]; + password = arguments[1]; + } + + if (String.IsNullOrEmpty(username)) + { + _writer.WriteLine("No Username supplied, login failed."); + return; + } + if (String.IsNullOrEmpty(password)) + { + _writer.WriteLine("No Password supplied, login failed."); + } + + var accessToken = GetAccessToken(username, password); + _accessTokenConfiguration.SetAccessToken(accessToken); + _writer.WriteLine("Successfully logged in as {0}", username); + } + + public virtual string GetAccessToken(string username, string password) + { + //NOTE: Remove when merged into AppHarbor.NET library + var restClient = new RestClient("https://appharbor-token-client.apphb.com"); + var request = new RestRequest("/token", Method.POST); + + request.AddParameter("username", username); + request.AddParameter("password", password); + + var response = restClient.Execute(request); + var accessToken = HttpUtility.ParseQueryString(response.Content)["access_token"]; + + if (accessToken == null) + { + throw new CommandException("Couldn't log in. Try again"); + } + + return accessToken; + } + } +} diff --git a/src/AppHarbor/Program.cs b/src/AppHarbor/Program.cs index c8f8ace..601489b 100644 --- a/src/AppHarbor/Program.cs +++ b/src/AppHarbor/Program.cs @@ -5,7 +5,7 @@ namespace AppHarbor { class Program { - static void Main(string[] args) + static int Main(string[] args) { var container = new WindsorContainer() .Install(new AppHarborInstaller()); @@ -14,7 +14,8 @@ static void Main(string[] args) try { - commandDispatcher.Dispatch(args); + commandDispatcher.Dispatch(args); + return 0; // no there was no problems :) } catch (DispatchException exception) { @@ -22,7 +23,8 @@ static void Main(string[] args) using (new ForegroundColor(ConsoleColor.Red)) { Console.WriteLine("Error: {0}", exception.Message); - } + } + return 1; // yes, there was a problem :( } } }