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 Refactoring/Store.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public void Purchase(string productId, int quantity)
throw new OutOfStockException();
}

product.Quantity = product.Quantity - quantity+1;
product.Quantity = product.Quantity - quantity;
user.Balance = user.Balance - product.Price * quantity;

dataManager.SaveUser(user);
Expand Down
177 changes: 177 additions & 0 deletions UnitTestProject/AuthenticatorTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
using NUnit.Framework;
using Refactoring;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UnitTestProject
{
[TestFixture]
class AuthenticatorTests
{
private User createTestUser(string name, string password, double balance)
{
User testUser = new User();
testUser.Name = name;
testUser.Password = password;
testUser.Balance = balance;

return testUser;
}

[Test]
public void Test_AuthenticateReturnsValidUser_SingleUserExists()
{
//Arrange
const string TEST_USER = "Test User A";
const string TEST_USER_PASSWORD = "password";

var users = new List<User>();
users.Add(createTestUser(TEST_USER, TEST_USER_PASSWORD, 10.00));

var authenticate = new Authenticator(users);

//Act
var validUser = authenticate.Authenticate(TEST_USER, TEST_USER_PASSWORD);

//Assert
Assert.IsTrue(validUser.Name.Equals(TEST_USER) && validUser.Password.Equals(TEST_USER_PASSWORD));
}

[Test]
public void Test_AuthenticateReturnsValidUser_MultipleUsersExist()
{
//Arrange
const string TEST_USER_A = "Test User A";
const string TEST_USER_B = "Test User B";
const string TEST_USER_A_PASSWORD = "thisismypassword";
const string TEST_USER_B_PASSWORD = "12345";

var users = new List<User>();
users.Add(createTestUser(TEST_USER_A, TEST_USER_A_PASSWORD, 10.00));
users.Add(createTestUser(TEST_USER_B, TEST_USER_B_PASSWORD, 10.00));

var authenticate = new Authenticator(users);

//Act
var validUser = authenticate.Authenticate(TEST_USER_B, TEST_USER_B_PASSWORD);

//Assert
Assert.IsTrue(validUser.Name.Equals(TEST_USER_B) && validUser.Password.Equals(TEST_USER_B_PASSWORD));
}

[Test]
public void Test_AuthenticateInvalidCredentialsReturnsNoUser()
{
//Arrange
const string TEST_USER = "Test User A";
const string TEST_USER_PASSWORD = "password";

var users = new List<User>();
users.Add(createTestUser(TEST_USER, TEST_USER_PASSWORD, 10.00));

var authenticate = new Authenticator(users);

//Act
var validUser = authenticate.Authenticate("Bob", "password");

//Assert
Assert.IsNull(validUser);
}

[Test]
public void Test_AuthenticateNullUsernameReturnsNoUser()
{
//Arrange
const string TEST_USER = "Test User A";
const string TEST_USER_PASSWORD = "password";

var users = new List<User>();
users.Add(createTestUser(TEST_USER, TEST_USER_PASSWORD, 10.00));

var authenticate = new Authenticator(users);

//Act
var validUser = authenticate.Authenticate(null, "password");

//Assert
Assert.IsNull(validUser);
}

[Test]
public void Test_AuthenticateNullPasswordReturnsNoUser()
{
//Arrange
const string TEST_USER = "Test User A";
const string TEST_USER_PASSWORD = "password";

var users = new List<User>();
users.Add(createTestUser(TEST_USER, TEST_USER_PASSWORD, 10.00));

var authenticate = new Authenticator(users);

//Act
var validUser = authenticate.Authenticate("Test User A", null);

//Assert
Assert.IsNull(validUser);
}

[Test]
public void Test_AuthenticateWithNullUsersListReturnsNoUser()
{
//Arrange
const string TEST_USER = "Bob";
const string TEST_USER_PASSWORD = "12345";

var authenticate = new Authenticator(null);

//Act
var validUser = authenticate.Authenticate(TEST_USER, TEST_USER_PASSWORD);

//Assert
Assert.IsNull(validUser);
}

[Test]
public void Test_AuthenticateBlankUsernameReturnsNoUser()
{
//Arrange
const string TEST_USER = "Test User A";
const string TEST_USER_PASSWORD = "password";

var users = new List<User>();
users.Add(createTestUser(TEST_USER, TEST_USER_PASSWORD, 10.00));

var authenticate = new Authenticator(users);

//Act
var validUser = authenticate.Authenticate("", "password");

//Assert
Assert.IsNull(validUser);
}

[Test]
public void Test_AuthenticateBlankPasswordReturnsNoUser()
{
//Arrange
const string TEST_USER = "Test User A";
const string TEST_USER_PASSWORD = "password";

var users = new List<User>();
users.Add(createTestUser(TEST_USER, TEST_USER_PASSWORD, 10.00));

var authenticate = new Authenticator(users);

//Act
var validUser = authenticate.Authenticate("Test User A", "");

//Assert
Assert.IsNull(validUser);
}
}
}
2 changes: 1 addition & 1 deletion UnitTestProject/IntegrationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
namespace UnitTestProject
{
[TestFixture]
//[Ignore("Disable integration tests")]
[Ignore("Disable integration tests")]
public class IntegrationTests
{
private List<User> users;
Expand Down
67 changes: 65 additions & 2 deletions UnitTestProject/StoreTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,37 +60,100 @@ public void Test_PurchaseThrowsNoErrorForValidFunds()
public void Test_PurchaseRemovesProductFromStore()
{
//Arrange
const string TEST_PRODUCT_ID = "1";

var users = new List<User>();
users.Add(createTestUser("Test User", "", 99.99));

var products = new List<Product>();
products.Add(createTestProduct(TEST_PRODUCT_ID, "Product", 9.99, 10));

var dataManager = new DataManager(users, products);
var store = new Store(users[0], dataManager);

//Act
store.Purchase(TEST_PRODUCT_ID, 9);

//Assert
//(choose the appropriate statement(s))
//Assert.AreEqual(1, products[0].Quantity);
//Assert.AreSame(1, products[0].Quantity);
//Assert.IsTrue(products[0].Quantity == 1);
Assert.IsTrue(products[0].Quantity == 1);
}

[Test]
[ExpectedException(typeof(InsufficientFundsException))]
public void Test_PurchaseThrowsExceptionWhenBalanceIsTooLow()
{
//Arrange
const string TEST_PRODUCT_ID = "1";

var users = new List<User>();
users.Add(createTestUser("Test User", "", 1.00));

var products = new List<Product>();
products.Add(createTestProduct(TEST_PRODUCT_ID, "Product", 1.01, 1));

var dataManager = new DataManager(users, products);
var store = new Store(users[0], dataManager);

//Act
store.Purchase(TEST_PRODUCT_ID, 1);

//Assert
Assert.Fail("Test shouldn't fail as user doesn't have enough funds to purchase item");
}

[Test]
public void Test_PurchaseThrowsExceptionWhenBalanceIsTooLowVersion2()
{
//Arrange
const string TEST_PRODUCT_ID = "1";

var users = new List<User>();
users.Add(createTestUser("Test User", "", 1.00));

var products = new List<Product>();
products.Add(createTestProduct(TEST_PRODUCT_ID, "Product", 1.01, 1));

var dataManager = new DataManager(users, products);
var store = new Store(users[0], dataManager);

//Act
try
{
store.Purchase(TEST_PRODUCT_ID, 1);
}
catch(InsufficientFundsException)
{
//Assert
Assert.Pass();
}
}

[Test]
[ExpectedException(typeof(OutOfStockException))]
public void Test_PurchaseThrowsExceptionWhenQuantityIsTooLow()
{
//Arrange
const string TEST_PRODUCT_ID = "1";

var users = new List<User>();
users.Add(createTestUser("Test User", "", 10.00));

var products = new List<Product>();
products.Add(createTestProduct(TEST_PRODUCT_ID, "Product", 1.00, 1));

var dataManager = new DataManager(users, products);
var store = new Store(users[0], dataManager);

//Act
store.Purchase(TEST_PRODUCT_ID, 2);

//Assert
Assert.Fail("This test shouldn't fail as there is not enough stock to purchase");
}


// THE BELOW CODE IS REQUIRED TO PREVENT THE TESTS FROM MODIFYING THE USERS/PRODUCTS ON FILE
// This is not a good unit testing pattern - the unit test dependency on the file system should
// actually be broken ... training on how to do this will be coming.
Expand Down
1 change: 1 addition & 0 deletions UnitTestProject/UnitTestProject.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@
<Otherwise />
</Choose>
<ItemGroup>
<Compile Include="AuthenticatorTests.cs" />
<Compile Include="StoreTests.cs" />
<Compile Include="IntegrationTests.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
Expand Down