Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@ deploy/*
*.suo
*.cache
packages/

src/TestResults/*
87 changes: 50 additions & 37 deletions src/AppHarbor.Tests/Commands/LoginUserCommandTest.cs
Original file line number Diff line number Diff line change
@@ -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<TextWriter> writer, [Frozen]Mock<IMaskedInput> maskedConsoleInput, [Frozen]Mock<TextReader> reader, [Frozen]Mock<IAccessTokenConfiguration> accessTokenConfigurationMock, Mock<LoginUserCommand> 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<IAccessTokenConfiguration> accessTokenConfigurationMock, LoginUserCommand loginCommand)
{
accessTokenConfigurationMock.Setup(x => x.GetAccessToken()).Returns("foo");
var exception = Assert.Throws<CommandException>(() => 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<TextWriter> writer, [Frozen]Mock<IAccessTokenConfiguration> accessTokenConfigurationMock, Mock<LoginUserCommand> 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<TextWriter> writer, [Frozen]Mock<IMaskedInput> maskedConsoleInput, [Frozen]Mock<TextReader> reader, [Frozen]Mock<IAccessTokenConfiguration> accessTokenConfigurationMock, Mock<LoginUserCommand> 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<IAccessTokenConfiguration> accessTokenConfigurationMock, LoginUserCommand loginCommand)
{
accessTokenConfigurationMock.Setup(x => x.GetAccessToken()).Returns("foo");
var exception = Assert.Throws<CommandException>(() => 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);
}
}
}
148 changes: 86 additions & 62 deletions src/AppHarbor/Commands/LoginUserCommand.cs
Original file line number Diff line number Diff line change
@@ -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;
}
}
}
8 changes: 5 additions & 3 deletions src/AppHarbor/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand All @@ -14,15 +14,17 @@ static void Main(string[] args)

try
{
commandDispatcher.Dispatch(args);
commandDispatcher.Dispatch(args);
return 0; // no there was no problems :)
}
catch (DispatchException exception)
{
Console.WriteLine();
using (new ForegroundColor(ConsoleColor.Red))
{
Console.WriteLine("Error: {0}", exception.Message);
}
}
return 1; // yes, there was a problem :(
}
}
}
Expand Down