Skip to content

Instantly share code, notes, and snippets.

@nyngwang
Created March 9, 2020 09:35
Show Gist options
  • Save nyngwang/436d706c6faa257da7584a14b0e7b6d5 to your computer and use it in GitHub Desktop.
Save nyngwang/436d706c6faa257da7584a14b0e7b6d5 to your computer and use it in GitHub Desktop.
2020/3/9 TDD
namespace OnlineStoreBackend
{
public interface IPersistenceManager
{
bool UsernameExists(string username);
void SaveAccount(string username, string password);
}
}
using System;
using System.Linq;
using System.Text.RegularExpressions;
namespace OnlineStoreBackend
{
public class RegistrationManager
{
private IPersistenceManager persistMgr;
public RegistrationManager(IPersistenceManager persistMgr)
{
this.persistMgr = persistMgr;
}
public bool RegisterAccount(string username, string password)
{
//persistMgr.SaveAccount(username, password);
return Account(username) && Password(password) && CheckAndSavesAccount(username, password);
}
public bool Account(string username)
{
if (username == null)
return false;
if (username.Length < 3 || username.Length > 10)
return false;
if (!username.All(c => char.IsLetterOrDigit(c)))
return false;
Regex regEx = new Regex("[A-Za-z0-9]{3,10}");
if (!regEx.IsMatch(username))
return false;
return true;
}
public bool Password(string password)
{
if (password == null)
return false;
if (password.Length < 6 || password.Length > 10)
return false;
if (!password.All(c => char.IsLetterOrDigit(c)))
return false;
//if (!password.Any(c => char.IsUpper(c))
// || !password.Any(c => char.IsDigit(c))
// || !password.Any(c => char.IsLower(c)))
// return false;
Regex regEx = new Regex("^(?=.{6,10}$)(?:(?!.*[^A-Za-z0-9])(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]))");
if (!regEx.IsMatch(password))
return false;
return true;
}
public bool CheckAndSavesAccount(string username, string password)
{
if (persistMgr.UsernameExists(username))
return false;
persistMgr.SaveAccount(username, password);
return true;
}
}
}
using NSubstitute;
using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OnlineStoreBackend.Tests.Unit
{
[TestFixture]
public class RegistrationManagerTest
{
[Test]
public void AcceptsAndSavesAccountWhenUsernameAndPasswordAreValidAndUsernameDoesNotAlreadyExists()
{
// Arrange
IPersistenceManager persistMgr = Substitute.For<IPersistenceManager>();
RegistrationManager regMgr = new RegistrationManager(persistMgr);
persistMgr.UsernameExists("usr").Returns(false);
// Act
bool result = regMgr.RegisterAccount("usr", "NtuCsie999");
// Assert
Assert.True(result);
persistMgr.Received().SaveAccount("usr", "NtuCsie999");
}
[TestCase(null)]
[TestCase("")]
[TestCase("u")]
[TestCase("us")]
[TestCase("user5678901")]
public void RejectAndDoesNotSaveAccountWhenUsernameHasInvalidLength(string username)
{
// Arrange
IPersistenceManager persistMgr = Substitute.For<IPersistenceManager>();
RegistrationManager regMgr = new RegistrationManager(persistMgr);
// Act
bool result = regMgr.RegisterAccount(username, "NtuCsie999");
// Assert
Assert.False(result);
persistMgr.DidNotReceiveWithAnyArgs().SaveAccount(default(string), default(string));
}
[TestCase("user@123")]
[TestCase("!user")]
public void RejectsAndDoesNotSaveAccountWhenUsernameHasInvalidChars(string username)
{
// Arrange
IPersistenceManager persistMgr = Substitute.For<IPersistenceManager>();
RegistrationManager regMgr = new RegistrationManager(persistMgr);
// Act
bool result = regMgr.RegisterAccount(username, "NtuCsie999");
// Assert
Assert.False(result);
persistMgr.DidNotReceiveWithAnyArgs().SaveAccount(default(string), default(string));
}
[TestCase("")]
[TestCase("1")]
[TestCase("A2")]
[TestCase("aB35D")]
[TestCase("aLongPassword555")]
public void RejectsAndDoesNotSaveAccountWhenPasswordHasInvalidLength(string password)
{
// Arrange
IPersistenceManager persistMgr = Substitute.For<IPersistenceManager>();
RegistrationManager regMgr = new RegistrationManager(persistMgr);
// Act
bool result = regMgr.RegisterAccount("usr", password);
// Assert
Assert.False(result);
persistMgr.DidNotReceiveWithAnyArgs().SaveAccount(default(string), default(string));
}
[TestCase("Tsmc@1234")]
[TestCase("&Tsmc@1234")]
[TestCase("taipei101")]
[TestCase("TAIPEI101")]
public void RejectsAndDoesNotSaveAccountWhenPasswordHasInvalidChars(string password)
{
// Arrange
IPersistenceManager persistMgr = Substitute.For<IPersistenceManager>();
RegistrationManager regMgr = new RegistrationManager(persistMgr);
// Act
bool result = regMgr.RegisterAccount("usr", password);
// Assert
Assert.False(result);
persistMgr.DidNotReceiveWithAnyArgs().SaveAccount(default(string), default(string));
}
[Test]
public void QueriesUsernameExistenceUsernameAreValid()
{
// Arrange
IPersistenceManager persistMgr = Substitute.For<IPersistenceManager>();
RegistrationManager regMgr = new RegistrationManager(persistMgr);
// Act
regMgr.RegisterAccount("usr", "NtuCsie999");
// Assert
persistMgr.Received().UsernameExists("usr"); // Received(): is called once
}
[Test]
public void RejectsAccountWhenUsernamePasswordAreValidButUsernameAlreadyExists()
{
// Arrange
IPersistenceManager persistMgr = Substitute.For<IPersistenceManager>();
RegistrationManager regMgr = new RegistrationManager(persistMgr);
persistMgr.UsernameExists("usr").Returns(true);
// Act
bool result = regMgr.RegisterAccount("usr", "NtuCsie999");
// Assert
Assert.False(result);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment