From 3a069f2ddd7d660952c300a28a1acc3390e9f4a5 Mon Sep 17 00:00:00 2001 From: WTobor Date: Sun, 8 Jul 2018 12:22:33 +0200 Subject: [PATCH] added server side validation for gamer --- .../BoardGamesNook.Tests.csproj | 1 + BoardGamesNook.Tests/GamerValidationTest.cs | 146 ++++++++++++++++++ BoardGamesNook/BoardGamesNook.csproj | 1 + BoardGamesNook/Controllers/GamerController.cs | 27 +++- BoardGamesNook/Validators/GamerValidator.cs | 30 ++++ .../ViewModels/Gamer/GamerViewModel.cs | 6 +- 6 files changed, 203 insertions(+), 8 deletions(-) create mode 100644 BoardGamesNook.Tests/GamerValidationTest.cs create mode 100644 BoardGamesNook/Validators/GamerValidator.cs diff --git a/BoardGamesNook.Tests/BoardGamesNook.Tests.csproj b/BoardGamesNook.Tests/BoardGamesNook.Tests.csproj index e05e6a0..0e912f1 100644 --- a/BoardGamesNook.Tests/BoardGamesNook.Tests.csproj +++ b/BoardGamesNook.Tests/BoardGamesNook.Tests.csproj @@ -73,6 +73,7 @@ + diff --git a/BoardGamesNook.Tests/GamerValidationTest.cs b/BoardGamesNook.Tests/GamerValidationTest.cs new file mode 100644 index 0000000..9b78ed5 --- /dev/null +++ b/BoardGamesNook.Tests/GamerValidationTest.cs @@ -0,0 +1,146 @@ +using BoardGamesNook.Validators; +using BoardGamesNook.ViewModels.Gamer; +using FluentValidation.TestHelper; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace BoardGamesNook.Tests +{ + [TestClass] + public class GamerValidationTest + { + private readonly GamerValidator _gamerValidator; + + public GamerValidationTest() + { + _gamerValidator = new GamerValidator(); + } + + [DataTestMethod] + [DataRow("")] + [DataRow("a")] + [DataRow("aa")] + public void NicknameThrowsError(string nick) + { + var gamer = new GamerViewModel + { + Nickname = nick + }; + _gamerValidator.ShouldHaveValidationErrorFor(x => x.Nickname, gamer); + } + + [DataTestMethod] + [DataRow("aaa")] + [DataRow("aaaa")] + public void NicknamePasses(string nick) + { + var gamer = new GamerViewModel + { + Nickname = nick + }; + _gamerValidator.ShouldNotHaveValidationErrorFor(x => x.Nickname, gamer); + } + + [DataTestMethod] + [DataRow("")] + [DataRow("a")] + [DataRow("aa")] + [DataRow("1234")] + public void NameThrowsError(string name) + { + var gamer = new GamerViewModel + { + Name = name + }; + _gamerValidator.ShouldHaveValidationErrorFor(x => x.Name, gamer); + } + + [DataTestMethod] + [DataRow("aaa")] + [DataRow("aaaa")] + public void NamePasses(string name) + { + var gamer = new GamerViewModel + { + Name = name + }; + _gamerValidator.ShouldNotHaveValidationErrorFor(x => x.Name, gamer); + } + + [DataTestMethod] + [DataRow("")] + [DataRow("a")] + [DataRow("aa")] + [DataRow("1234")] + public void SurnameThrowsError(string surname) + { + var gamer = new GamerViewModel + { + Surname = surname + }; + _gamerValidator.ShouldHaveValidationErrorFor(x => x.Surname, gamer); + } + + [DataTestMethod] + [DataRow("aaa")] + [DataRow("aaaa")] + public void SurnamePasses(string surname) + { + var gamer = new GamerViewModel + { + Surname = surname + }; + _gamerValidator.ShouldNotHaveValidationErrorFor(x => x.Surname, gamer); + } + + [DataTestMethod] + [DataRow("")] + [DataRow("a")] + [DataRow("aa@")] + public void EmailThrowsError(string email) + { + var gamer = new GamerViewModel + { + Email = email + }; + _gamerValidator.ShouldHaveValidationErrorFor(x => x.Email, gamer); + } + + [DataTestMethod] + [DataRow("test@test.pl")] + [DataRow("a@test.com")] + public void EmailPasses(string email) + { + var gamer = new GamerViewModel + { + Email = email + }; + _gamerValidator.ShouldNotHaveValidationErrorFor(x => x.Email, gamer); + } + + [DataTestMethod] + [DataRow("")] + [DataRow("a")] + [DataRow("aa")] + [DataRow("1234")] + public void CityThrowsError(string city) + { + var gamer = new GamerViewModel + { + City = city + }; + _gamerValidator.ShouldHaveValidationErrorFor(x => x.City, gamer); + } + + [DataTestMethod] + [DataRow("aaa")] + [DataRow("aaaa")] + public void CityPasses(string city) + { + var gamer = new GamerViewModel + { + City = city + }; + _gamerValidator.ShouldNotHaveValidationErrorFor(x => x.City, gamer); + } + } +} \ No newline at end of file diff --git a/BoardGamesNook/BoardGamesNook.csproj b/BoardGamesNook/BoardGamesNook.csproj index 4fabf7b..2ef0bdd 100644 --- a/BoardGamesNook/BoardGamesNook.csproj +++ b/BoardGamesNook/BoardGamesNook.csproj @@ -245,6 +245,7 @@ + diff --git a/BoardGamesNook/Controllers/GamerController.cs b/BoardGamesNook/Controllers/GamerController.cs index 351c78b..6857d86 100644 --- a/BoardGamesNook/Controllers/GamerController.cs +++ b/BoardGamesNook/Controllers/GamerController.cs @@ -44,18 +44,29 @@ public JsonResult GetAll() [HttpPost] public JsonResult Add(GamerViewModel gamerViewModel) { - if (!(Session["user"] is User loggedUser)) - return Json(Errors.GamerNotLoggedIn, JsonRequestBehavior.AllowGet); + if (ModelState.IsValid) + { + if (!(Session["user"] is User loggedUser)) + return Json(Errors.GamerNotLoggedIn, JsonRequestBehavior.AllowGet); - var gamer = GetGamerObj(gamerViewModel, loggedUser); - _gamerService.AddGamer(gamer); + var gamer = GetGamerObj(gamerViewModel, loggedUser); + _gamerService.AddGamer(gamer); - return Json(null, JsonRequestBehavior.AllowGet); + return Json(null, JsonRequestBehavior.AllowGet); + } + + var errors = Helpers.GetErrorMessages(ModelState.Values); + return Json(errors, JsonRequestBehavior.AllowGet); } [HttpPost] - public JsonResult Edit(Gamer gamer) + public JsonResult Edit(GamerViewModel gamerViewModel) { + if (!(Session["user"] is User loggedUser)) + return Json(Errors.GamerNotLoggedIn, JsonRequestBehavior.AllowGet); + + var gamer = GetGamerObj(gamerViewModel, loggedUser); + _gamerService.EditGamer(gamer); return Json(null, JsonRequestBehavior.AllowGet); @@ -71,7 +82,9 @@ public JsonResult Deactivate(string id) public JsonResult GetCurrentGamerNickname() { - var currentGamerNick = !(Session["gamer"] is Gamer currentGamer) ? string.Empty : currentGamer.Nickname; + var currentGamerNick = !(Session["gamerViewModel"] is Gamer currentGamer) + ? string.Empty + : currentGamer.Nickname; return Json(currentGamerNick, JsonRequestBehavior.AllowGet); } diff --git a/BoardGamesNook/Validators/GamerValidator.cs b/BoardGamesNook/Validators/GamerValidator.cs new file mode 100644 index 0000000..c42a32f --- /dev/null +++ b/BoardGamesNook/Validators/GamerValidator.cs @@ -0,0 +1,30 @@ +using BoardGamesNook.ViewModels.Gamer; +using FluentValidation; + +namespace BoardGamesNook.Validators +{ + public class GamerValidator : AbstractValidator + { + public GamerValidator() + { + RuleFor(gamer => gamer.Nickname) + .NotEmpty().WithMessage("Podaj nick!") + .MinimumLength(3).WithMessage("Nickname musi się składać z minimum 3 znaków!"); + RuleFor(gamer => gamer.Name) + .NotEmpty().WithMessage("Podaj imię!") + .MinimumLength(3).WithMessage("Imię musi się składać z minimum 3 znaków!") + .Matches("^[a-zA-Z\\s]+$").WithMessage("Imię musi się składać z liter!"); + RuleFor(gamer => gamer.Surname) + .NotEmpty().WithMessage("Podaj nazwisko!") + .MinimumLength(3).WithMessage("Nazwisko musi się składać z minimum 3 znaków!") + .Matches("^[a-zA-Z\\s]+$").WithMessage("Nazwisko musi się składać z liter!"); + RuleFor(gamer => gamer.Email) + .NotEmpty().WithMessage("Podaj adres email!") + .EmailAddress().WithMessage("Nieprawidłowy adres email!"); + RuleFor(gamer => gamer.City) + .NotEmpty().WithMessage("Podaj miasto!") + .MinimumLength(3).WithMessage("Nazwa miasta musi się składać z minimum 3 znaków!") + .Matches("^[a-zA-Z\\s]+$").WithMessage("Miasto musi się składać z liter!"); + } + } +} \ No newline at end of file diff --git a/BoardGamesNook/ViewModels/Gamer/GamerViewModel.cs b/BoardGamesNook/ViewModels/Gamer/GamerViewModel.cs index 5d0521b..446b553 100644 --- a/BoardGamesNook/ViewModels/Gamer/GamerViewModel.cs +++ b/BoardGamesNook/ViewModels/Gamer/GamerViewModel.cs @@ -1,5 +1,9 @@ -namespace BoardGamesNook.ViewModels.Gamer +using BoardGamesNook.Validators; +using FluentValidation.Attributes; + +namespace BoardGamesNook.ViewModels.Gamer { + [Validator(typeof(GamerValidator))] public class GamerViewModel { public string Id { get; set; }