In dit deel van de oefening bouwen we validatie in voor de CRUD operaties van product en bouwen we authenticatie en autorisatie in. De starter is gebaseerd op een .NET Core, ASP.NET Core 3.0 webapplicatie, MVC template met Individual User Account authenticatie. Er werd een nieuw project aangemaakt. De Data, Controllers, Models en Views en Filters uit 08solSportsStore_Part2 werden aan dit project toegevoegd.
Clone deze repository
Pas de connectionstring in de appSettings.json aan, zorg dat er gebruik wordt gemaakt van localhost en benoem de databank SportsStore09.
Voeg Display annotaties toe zodat de Index pagina als volgt wordt weergegeven.
- De Display annotaties voor de enum
Availabilityvoeg je toe in deEnumklasse zelf. - Maak in de
Indexview gebruik van de gegeven extension methodeGetDisplayName()in de statische klasseEnumHelpersin de Helpers namespace voor het ophalen van de annotatie. - Vergeet hierbij geen
usingstatement te gebruiken in de view!
Bekijk de code in de EnumHelpers. Zoek onderstaande op via de Object Browser of maak gebruik van F12: Goto definition
- Wat doet
typeof(). - Wat doet de extension methode
GetMembervan het geretourneerde type? Wat retourneert deze methode? - Wat doet Methode
GetCustomAttribute<DisplayAttribute>? - Tot welke
namespacebehoren deze methodes en klassen?
Voeg annotaties toe voor de weergave.
- Pas de view aan zodat de Property
AvailableTillook wordt weergegeven. - Voeg annotaties toe zodat de labels correct worden weergegeven en
AvailableTillalsDateinput field wordt weergegeven.
Voeg annotaties toe voor volgende validatie. Geef gepaste foutmeldingen.
Name,price,availabilityencategoryzijn verplichtNameis minstens5karakters lang en maximum100Priceis gelegen tussen1en3000.
Voor de client-side validatie zijn er nog enkele wijzigingen nodig aan de view.
- Pas de View aan zodat de foutmeldingen getoond worden (een overzicht van de foutmelding en de foutmelding per property).
- Maak gebruik van de validation tag helpers.
- Voeg de nodige scripts toe.
Opgelet: de decimale , die gebruikt wordt voor de Price zal niet naar behoren werken indien je een locale verschillend van en-US gebruikt. Deze issue werd in deze oplossing niet aangepakt, je geeft dus gehele getallen in voor de Price. Zie dotnet/AspNetCore.Docs#4076 en dotnet/AspNetCore.Docs#8585
Schrijf eerst de volgende unit testen voor de Edit methode. Train indien nodig verder de mock. Bekijk ook de overige unit testen binnen de region Edit
EditHttpPost_ProductNotFound_ReturnsNotFoundResult()EditHttpPost_ModelStateErrors_DoesNotChangeNorPersistTheProduct()EditHttpPost_ModelStateErrors_PassesEditViewModelInViewResultModelAndPassesSelectListsInViewData()- Wijzig de
Edit-HttpPostmethode zodat de testen slagen.
Indien je hulp nodig hebt, vind je deze in de slides van hoofdstuk 8 en 9.
Schrijf volgende unit testen
-
CreateHttpPost_ModelStateErrors_DoesNotChangeNorPersistTheProduct() -
CreateHttpPost_ModelStateErrors_PassesEditViewModelInViewResultModelAndPassesSelectListsInViewData() -
Vervolledig dan de
Create-HttpPostmethode in deProductControllerzodat de unit testen slagen.
Je merkt dat we heel vaak in het Assert gedeelte van onze test methodes dezelfde training voor onze mocks moeten instellen. Refactor de ProductControllerTest klasse en verplaats de herhalende mock trainingen naar de constructor van de klasse.
Schrijf volgende unit test
-
DeleteHttpPost_ProductNotFound_ReturnsNotFound() -
Pas de
DeleteConfirmedmethode aan zodat de test slaagt
Merk op dat het Identity Framework reeds werd geïntegreerd in het project. Pas SportsStoreDataInitializer aan, zodat bij de seeding ook de IdentityUsers worden aangemaakt:
-
Injecteer de
UserManagervia de constructor in deSportsStoreDataInitializer. (De methodeInitializeDatazal moeten gebruik maken van de geïnjecteerde klasse). -
Maak een
IdentityUsermet emailadmin@sportsstore.beaan met wachtwoordP@ssword1.Merk op: de
UserManagermaakt gebruik vanasyncmethodes. Pas de signatuur van de methodeInitializeDataaan naar het volgendepublic async Task InitializeData().
wijzig daarnaast de aanroep vanuit deStartUpConfigure methode naar:sportsStoreDataInitializer.InitializeData().Wait(); -
Maak voor elke klant uit de
InitializereenIdentityUseraan met alsUsername, deCustomerNamevan de klant gevolgd door@hogent.be. Zorg dat zijnEmailidentiek is aan zijnUsernameen stel hetwachtwoordin opP@ssword1. -
Run de applicatie en log in eens als admin en eens als student1.
- Definieer de authorizatie
policyin deStartupklasse. Voorzie 2 rollen:adminencustomer. - Pas de
SportsStoreDataInitializeraan zodat deadmintot de roladminbehoort en deklantentot de rolcustomer.In principe moet een nieuwe klant zich ook kunnen registreren, zie volgend hoofdstuk.
- Pas de Controllers aan:
- Enkel een
adminkan deproductenzien en beheren. - De shop is voor iedereen toegankelijk.
- Enkel gebruikers van de rol customer kunnen een checkout doen van het winkelmandje. Voeg hiervoor eerst een methode
Checkouttoe aan deCartController. Deze methode retourneert voorlopig een emptyView without model. (maak ook de view aan met enkel een pagina titel)
- Enkel een
- Pas de
_Layoutview aan zodat het menu itemProductsenkel zichtbaar is als eenAdministratoris aangemeld. Meer info op https://docs.microsoft.com/en-us/aspnet/core/security/authorization/views?tabs=aspnetcore2x