diff --git a/.drone.yml b/.drone.yml index 5db9dbb..65b5c79 100644 --- a/.drone.yml +++ b/.drone.yml @@ -54,7 +54,7 @@ steps: path: /docs commands: #- cd Documentation/doxygen - #- doxygen Doxyfile + #- doxygen Doxyfile - /entrypoint.sh when: branch: diff --git a/Sources/EFLol/ChampionEntity.cs b/Sources/EFLol/ChampionEntity.cs index 8c8ac7f..b23a534 100644 --- a/Sources/EFLol/ChampionEntity.cs +++ b/Sources/EFLol/ChampionEntity.cs @@ -1,15 +1,23 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Collections.ObjectModel; +using System.ComponentModel.DataAnnotations; namespace EFLol { public class ChampionEntity { public int Id { get; set; } + + [MaxLength(30, ErrorMessage = "Name cannot be longer than 30 characters.")] public string Name { get; set; } + + [MaxLength(256, ErrorMessage = "Bio cannot be longer than 256 characters.")] public string Bio { get; set; } + + //public ChampionClass Class { get; set; } + //public string Icon { get; set; } + //public LargeImage Image { get; set; } + //public ReadOnlyDictionary Characteristics { get; private set; } + //private HashSet skills = new HashSet(); + public ReadOnlyCollection Skins { get; set; } } } diff --git a/Sources/EFLol/ChampionContext.cs b/Sources/EFLol/MyDbContext.cs similarity index 50% rename from Sources/EFLol/ChampionContext.cs rename to Sources/EFLol/MyDbContext.cs index 4a2654d..17ad759 100644 --- a/Sources/EFLol/ChampionContext.cs +++ b/Sources/EFLol/MyDbContext.cs @@ -7,14 +7,15 @@ using Microsoft.EntityFrameworkCore; namespace EFLol { - public class ChampionContext : DbContext + public class MyDbContext : DbContext { public DbSet Champions { get; set; } + public DbSet Skins { get; set; } - public ChampionContext() + public MyDbContext() { } - public ChampionContext(DbContextOptions options) + public MyDbContext(DbContextOptions options) : base(options) { } @@ -22,9 +23,15 @@ namespace EFLol { if (!optionsBuilder.IsConfigured) { - //optionsBuilder.UseSqlServer("Data Source=loldb.db"); optionsBuilder.UseSqlite("Data Source=loldb.db"); } } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + modelBuilder.Entity().Property(c => c.Id).ValueGeneratedOnAdd(); + modelBuilder.Entity().Property(s => s.Id).ValueGeneratedOnAdd(); + } } } diff --git a/Sources/EFLol/Program.cs b/Sources/EFLol/Program.cs index 47f659d..fbac836 100644 --- a/Sources/EFLol/Program.cs +++ b/Sources/EFLol/Program.cs @@ -1,37 +1,67 @@ -using EFLol; +using System.Collections.ObjectModel; +using EFLol; -/*ChampionEntity Zeus = new ChampionEntity + +using (var context = new MyDbContext()) +{ + // Clean the DB before starting + Console.WriteLine("Clean the DB before starting"); + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); +} + +SkinEntity black = new SkinEntity { Name = "Black", Description = "Black skin", Icon = "black.png", Price = 0.99f }; +SkinEntity white = new SkinEntity { Name = "White", Description = "White skin", Icon = "white.png", Price = 150.99f }; +SkinEntity green = new SkinEntity { Name = "Green", Description = "Green skin", Icon = "green.png", Price = 4.99f }; + +ChampionEntity Zeus = new ChampionEntity { Name = "Zeus", - Bio = "Zeus is the king of the gods." + Bio = "Zeus is the god of the sky", + Skins = new ReadOnlyCollection(new List { black, white }) + }; +ChampionEntity Hera = new ChampionEntity +{ + Name = "Hera", + Bio = "Hera is the goddess of marriage", + Skins = new ReadOnlyCollection(new List { green }) -using (var context = new ChampionContext()) +}; +ChampionEntity Poseidon = new ChampionEntity { Name = "Poseidon", Bio = "Poseidon is the god of the sea" }; + + + +using (var context = new MyDbContext()) { - Console.WriteLine("Adding Zeus to the database..."); - context.Champions.Add(Zeus); + // Crée des champions et les insère dans la base + Console.WriteLine("Creates and inserts new Champions"); + context.Add(Zeus); + context.Add(Hera); + context.Add(Poseidon); context.SaveChanges(); -}*/ +} -ChampionEntity chewie = new ChampionEntity { Name = "Chewbacca", Bio = "Zeus is the king of the gods." }; -ChampionEntity yoda = new ChampionEntity { Name = "Yoda", Bio = "Zeus is the king of the gods." }; -ChampionEntity ewok = new ChampionEntity { Name = "Ewok" , Bio = "Zeus is the king of the gods." }; -using (var context = new ChampionContext()) +using (var context = new MyDbContext()) { - // Crée des nounours et les insère dans la base - Console.WriteLine("Creates and inserts new Nounours"); - context.Add(chewie); - context.Add(yoda); - context.Add(ewok); - context.SaveChanges(); + foreach (var n in context.Champions) + { + // Use LINQ to display the skins for each champion + var skins = from s in context.Skins + where n.Id == s.Id + select s; + + Console.WriteLine($"Champion n°{n.Id} - {n.Name}"); + } + context.SaveChanges(); } -using (var context = new ChampionContext()) +using (var context = new MyDbContext()) { - foreach (var n in context.Champions) - { - Console.WriteLine($"{n.Id} - {n.Name}"); - } - context.SaveChanges(); + foreach (var n in context.Skins) + { + Console.WriteLine($"Skin n°{n.Id} - {n.Name}" + (n.Price != null ? $" - {n.Price}" : "")); + } + context.SaveChanges(); } \ No newline at end of file diff --git a/Sources/EFLol/SkinEntity.cs b/Sources/EFLol/SkinEntity.cs new file mode 100644 index 0000000..125d962 --- /dev/null +++ b/Sources/EFLol/SkinEntity.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EFLol +{ + public class SkinEntity + { + public int Id { get; set; } + public string Name { get; set; } + public string Description { get; set; } + public string Icon { get; set; } + public float Price { get; set; } + } +} diff --git a/Sources/TestUnitaire/TestEfLol.cs b/Sources/TestUnitaire/TestEfLol.cs index 00b1923..d9bae90 100644 --- a/Sources/TestUnitaire/TestEfLol.cs +++ b/Sources/TestUnitaire/TestEfLol.cs @@ -1,97 +1,117 @@ -using EFLol; -using Microsoft.Data.Sqlite; -using Microsoft.EntityFrameworkCore; - -namespace TestUnitaire -{ - public class TestEfLol - { - [Fact] - public async Task TestAddInMemory() - { - // Arrange - var connection = new SqliteConnection("DataSource=:memory:"); - connection.Open(); - - var options = new DbContextOptionsBuilder() - .UseSqlite(connection) - .Options; - - // Act - using (var context = new ChampionContext(options)) - { - await context.Database.EnsureCreatedAsync(); - var Zeus = new ChampionEntity - { - Name = "Zeus", - Bio = "Zeus is the king of the gods." - }; - var Poseidon = new ChampionEntity - { - Name = "Poseidon", - Bio = "Poseidon is the king of the sea." - }; - - ChampionEntity found = await context.Champions.SingleOrDefaultAsync(c => c.Name == "Zeus"); - Assert.Null(found); - - await context.Champions.AddAsync(Zeus); - await context.Champions.AddAsync(Poseidon); - await context.SaveChangesAsync(); - - found = await context.Champions.SingleOrDefaultAsync(c => c.Name == "Zeus"); - Assert.NotNull(found); - - Assert.Equal(2, await context.Champions.CountAsync()); - Assert.Equal("Zeus", found.Name); - } - } - - [Fact] - public void ModifyTestInMemory() - { - var options = new DbContextOptionsBuilder() - .UseInMemoryDatabase(databaseName: "Modify_Test_database") - .Options; - - //prepares the database with one instance of the context - - using (var context = new ChampionContext(options)) - { - ChampionEntity chewie = new ChampionEntity { Name = "Chewbacca", Bio = "Zeus is the king of the gods." }; - ChampionEntity yoda = new ChampionEntity { Name = "Yoda", Bio = "Zeus is the king of the gods." }; - ChampionEntity ewok = new ChampionEntity { Name = "Ewok", Bio = "Zeus is the king of the gods." }; - - context.Champions.Add(chewie); - context.Champions.Add(yoda); - context.Champions.Add(ewok); - context.SaveChanges(); - } - - //prepares the database with one instance of the context - using (var context = new ChampionContext(options)) - { - string nameToFind = "ew"; - Assert.Equal(2, context.Champions.Where(n => n.Name.ToLower().Contains(nameToFind)).Count()); - nameToFind = "ewo"; - Assert.Equal(1, context.Champions.Where(n => n.Name.ToLower().Contains(nameToFind)).Count()); - var ewok = context.Champions.Where(n => n.Name.ToLower().Contains(nameToFind)).First(); - ewok.Name = "Wicket"; - context.SaveChanges(); - } - - //prepares the database with one instance of the context - using (var context = new ChampionContext(options)) - { - string nameToFind = "ew"; - Assert.Equal(1, context.Champions.Where(n => n.Name.ToLower().Contains(nameToFind)).Count()); - nameToFind = "wick"; - Assert.Equal(1, context.Champions.Where(n => n.Name.ToLower().Contains(nameToFind)).Count()); - } - } - } -} - - - - +using EFLol; +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; + +namespace TestUnitaire +{ + public class TestEfLol + { + + [Theory] + + [InlineData("Zeus", "Dieu de la foudre", true)] + [InlineData("Hades", "Dieu des enfers", true)] + [InlineData("Aphrodite", "Déesse de l'amour", true)] + [InlineData("AresAresAresAresAresAresAresAresAresAres", + "Dieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerre" + + "Dieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerre" + + "Dieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerre", false)] + public async Task TestAddInMemory(String name, String bio, bool expected) + { + var connection = new SqliteConnection("DataSource=:memory:"); + connection.Open(); + + var options = new DbContextOptionsBuilder() + .UseSqlite(connection) + .Options; + + using (var context = new MyDbContext(options)) + { + await context.Database.EnsureCreatedAsync(); + var Dieu = new ChampionEntity + { + Name = name, + Bio = bio + }; + + ChampionEntity found = await context.Champions.SingleOrDefaultAsync(c => c.Name == "Zeus"); + Assert.Null(found); + + await context.Champions.AddAsync(Dieu); + await context.SaveChangesAsync(); + + found = await context.Champions.SingleOrDefaultAsync(c => c.Name == name); + Assert.NotNull(found); + + Assert.Equal(1, await context.Champions.CountAsync()); + Assert.Equal(name, found.Name); + + // Test if the max length of the name is respected (30) and the max length of the bio is respected (256) + if (expected) + { + Assert.True(found.Name.Length <= 30); + Assert.True(found.Bio.Length <= 256); + } + else + { + Assert.False(found.Bio.Length <= 256); + Assert.False(found.Name.Length <= 30); + } + } + + } + + [Fact] + public void ModifyTestInMemory() + { + var connection = new SqliteConnection("DataSource=:memory:"); + connection.Open(); + + var options = new DbContextOptionsBuilder() + .UseSqlite(connection) + .Options; + + //prepares the database with one instance of the context + using (var context = new MyDbContext(options)) + { + //context.Database.OpenConnection(); + context.Database.EnsureCreated(); + + ChampionEntity chewie = new ChampionEntity { Name = "Chewbacca", Bio = "Zeus is the king of the gods." }; + ChampionEntity yoda = new ChampionEntity { Name = "Yoda", Bio = "Zeus is the king of the gods." }; + ChampionEntity ewok = new ChampionEntity { Name = "Ewok", Bio = "Zeus is the king of the gods." }; + + + context.Champions.Add(chewie); + context.Champions.Add(yoda); + context.Champions.Add(ewok); + context.SaveChanges(); + } + + //uses another instance of the context to do the tests + using (var context = new MyDbContext(options)) + { + context.Database.EnsureCreated(); + + string nameToFind = "ew"; + Assert.Equal(2, context.Champions.Where(n => n.Name.ToLower().Contains(nameToFind)).Count()); + nameToFind = "wo"; + Assert.Equal(1, context.Champions.Where(n => n.Name.ToLower().Contains(nameToFind)).Count()); + var ewok = context.Champions.Where(n => n.Name.ToLower().Contains(nameToFind)).First(); + ewok.Name = "Wicket"; + context.SaveChanges(); + } + + //uses another instance of the context to do the tests + using (var context = new MyDbContext(options)) + { + context.Database.EnsureCreated(); + + string nameToFind = "ew"; + Assert.Equal(1, context.Champions.Where(n => n.Name.ToLower().Contains(nameToFind)).Count()); + nameToFind = "wick"; + Assert.Equal(1, context.Champions.Where(n => n.Name.ToLower().Contains(nameToFind)).Count()); + } + } + } +} \ No newline at end of file diff --git a/Sources/apiLOL/Controllers/ControllerChampions.cs b/Sources/apiLOL/Controllers/ControllerChampions.cs index 18bb600..5e129e5 100644 --- a/Sources/apiLOL/Controllers/ControllerChampions.cs +++ b/Sources/apiLOL/Controllers/ControllerChampions.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNetCore.Mvc; +using System.Security.Cryptography; +using Microsoft.AspNetCore.Mvc; using Model; // For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 @@ -116,4 +117,4 @@ namespace apiLOL.Controllers } } -} +} \ No newline at end of file